Compare commits

..

3 Commits

Author SHA1 Message Date
madeline 1520205403 Merge branch 'main' of https://github.com/TakaRikka/dusk into vmem 2026-04-28 02:52:17 -07:00
madeline d2d7459d05 more granular heap grows 2026-04-28 02:49:24 -07:00
madeline c71272af05 virtual memory and actor spawner 2026-04-28 02:25:18 -07:00
2160 changed files with 16365 additions and 137099 deletions
+2 -2
View File
@@ -1,8 +1,8 @@
--- ---
Language: Cpp Language: Cpp
Standard: c++20 Standard: C++03
AccessModifierOffset: -4 AccessModifierOffset: -4
AlignAfterOpenBracket: DontAlign AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false AlignConsecutiveDeclarations: false
AlignOperands: true AlignOperands: true
-116
View File
@@ -1,116 +0,0 @@
name: Bug Report
description: Report an issue with Dusklight
type: Bug
body:
- type: checkboxes
id: official-build-certification
attributes:
label: Mods and Forks
description: Certify that this issue exists on the official builds of Dusklight
options:
- label: The bug occurs on an **official release** of Dusklight, without any forks or third-party patches installed
required: true
validations:
required: true
- type: input
id: dusklight-version
attributes:
label: Dusklight Version
placeholder: ex. 1.3.1
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: Bug Description
placeholder: Describe the bug you are encountering
validations:
required: true
- type: textarea
id: repro-steps
attributes:
label: Steps to Reproduce
placeholder: |
1. Load save
2. Go to Hyrule Field
3. See bug
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
placeholder: Describe what should be happening
- type: textarea
id: current-behavior
attributes:
label: Current Behavior
placeholder: Describe what is happening instead
- type: dropdown
id: system-os-architecture
attributes:
label: OS / Architecture
description: The operating system and architecture you are running Dusklight on
options:
- Windows x86-64
- Windows ARM64
- MacOS ARM64
- MacOS x86-64
- Linux ARM64
- Linux x84-64
- Android ARM64
- iOS ARM64
validations:
required: true
- type: dropdown
id: game-region
attributes:
label: Game Region
description: The game region you are playing on
options:
- NTSC-U (North America)
- PAL (Europe)
validations:
required: true
- type: input
id: game-language
attributes:
label: Game Language
description: The language you are playing the game in
placeholder: ex. English, Spanish, etc.
- type: dropdown
attributes:
label: Graphics Backend
options:
- Vulkan
- D3D12
- Metal
- D3D11
- OpenGL ES
- Unsure / Default
default: 5
- type: textarea
id: texture-packs-mods
attributes:
label: Texture Packs and Mods
placeholder: List any texture packs or mods you had installed
- type: upload
id: logs-upload
attributes:
label: Logs and Other Files
description: Include any relevant logs, config files, or saves to reproduce the bug
- type: textarea
id: additional-context
attributes:
label: Additional Context
placeholder: Any other information that might be helpful
@@ -1,24 +0,0 @@
name: Feature Request
description: Request a new Dusklight feature. Not all requests can/will be included, but we will take these ideas into consideration.
type: Feature
body:
- type: textarea
id: feature-description
attributes:
label: Feature Description
placeholder: Describe the feature you are requesting
validations:
required: true
- type: input
id: feature-platform
attributes:
label: Platform
description: If applicable, list the platforms this feature applies to. If it is for all platforms, feel free to leave this field blank.
placeholder: ex. Mac, Android, Steam Deck, etc.
- type: textarea
id: feature-related-info
attributes:
label: Additional Information
placeholder: Any other information that might be helpful (related features, existing implementations, open pull requests or issues, etc.)
+38 -120
View File
@@ -5,19 +5,10 @@ on:
paths-ignore: paths-ignore:
- '*.md' - '*.md'
- '*LICENSE' - '*LICENSE'
- 'docs/**'
pull_request: pull_request:
paths-ignore:
- '*.md'
- '*LICENSE'
- 'docs/**'
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 }}
@@ -31,13 +22,13 @@ jobs:
matrix: matrix:
include: include:
- name: GCC x86_64 - name: GCC x86_64
runner: ubuntu-24.04 runner: [self-hosted, Linux]
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
@@ -50,16 +41,18 @@ jobs:
submodules: recursive submodules: recursive
- name: Install dependencies - name: Install dependencies
if: 'false' # disabled for self-hosted
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get -y install ninja-build clang lld mold openssl libcurl4-openssl-dev \ sudo apt-get -y install ninja-build clang lld openssl libcurl4-openssl-dev \
zlib1g-dev libglu1-mesa-dev libdbus-1-dev libvulkan-dev libxi-dev libxrandr-dev libasound2-dev \ zlib1g-dev libglu1-mesa-dev libdbus-1-dev libvulkan-dev libxi-dev libxrandr-dev libasound2-dev \
libpulse-dev libudev-dev libpng-dev libncurses5-dev libx11-xcb-dev libfreetype-dev \ libpulse-dev libudev-dev libpng-dev libncurses5-dev libx11-xcb-dev libfreetype-dev \
libxinerama-dev libxcursor-dev python3-markupsafe libgtk-3-dev libssl-dev \ libxinerama-dev libxcursor-dev python3-markupsafe libgtk-3-dev libssl-dev \
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 if: 'false' # disabled for self-hosted
uses: mozilla-actions/sccache-action@v0.0.9
- name: Print sccache stats - name: Print sccache stats
run: sccache --show-stats run: sccache --show-stats
@@ -74,17 +67,17 @@ jobs:
run: ci/build-appimage.sh run: ci/build-appimage.sh
- name: Upload artifacts - name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags/v')
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/install/sdk/
build-apple: build-apple:
name: Build Apple (${{matrix.name}}) name: Build Apple (${{matrix.name}})
runs-on: macos-latest runs-on: [self-hosted, macOS]
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -93,14 +86,14 @@ jobs:
platform: macos platform: macos
preset: x-macos-ci-arm64 preset: x-macos-ci-arm64
artifact_name: macos-appleclang-arm64 artifact_name: macos-appleclang-arm64
- name: AppleClang macOS x86_64 # - name: AppleClang macOS x86_64
platform: macos # platform: macos
preset: x-macos-ci-x86_64 # preset: x-macos-ci-x86_64
artifact_name: macos-appleclang-x86_64 # artifact_name: macos-appleclang-x86_64
- name: AppleClang iOS arm64 # - name: AppleClang iOS arm64
platform: ios # platform: ios
preset: x-ios-ci # preset: x-ios-ci
artifact_name: ios-appleclang-arm64 # artifact_name: ios-appleclang-arm64
# - name: AppleClang tvOS arm64 # - name: AppleClang tvOS arm64
# platform: tvos # platform: tvos
# preset: x-tvos-ci # preset: x-tvos-ci
@@ -113,6 +106,7 @@ jobs:
submodules: recursive submodules: recursive
- name: Install dependencies - name: Install dependencies
if: 'false'
run: brew install cmake ninja run: brew install cmake ninja
- name: Install Rust iOS target - name: Install Rust iOS target
@@ -134,7 +128,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}}
@@ -143,89 +137,13 @@ jobs:
run: cmake --build --preset ${{matrix.preset}} run: cmake --build --preset ${{matrix.preset}}
- name: Upload artifacts - name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags/v')
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/install/sdk/
build-android:
name: Build Android (${{matrix.name}})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- name: Clang arm64-v8a
preset: x-android-ci-arm64
abi: arm64-v8a
artifact_arch: arm64
rust_target: aarch64-linux-android
env:
ANDROID_NDK_VERSION: "29.0.14206865"
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get -y install ninja-build
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- name: Setup Android SDK
uses: android-actions/setup-android@v4
- name: Install Android SDK packages
run: sdkmanager "platforms;android-36" "build-tools;36.1.0" "ndk;${ANDROID_NDK_VERSION}"
- name: Install Rust Android target
run: |
rustup toolchain install stable
rustup target add ${{matrix.rust_target}}
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.10
- name: Configure CMake
run: cmake --preset ${{matrix.preset}}
- name: Build native library
run: cmake --build --preset ${{matrix.preset}} --target dusklight
- name: Build bundled mods
run: cmake --build --preset ${{matrix.preset}} --target dusklight_mods
- name: Stage stripped JNI library
run: ANDROID_STAGE_ABIS="${{matrix.abi}}" platforms/android/scripts/stage-jni-libs.sh
- name: Build APK
working-directory: platforms/android
run: ./gradlew :app:assembleRelease --rerun-tasks
- name: Stage artifacts
run: |
mkdir -p upload/sdk
cp build/*/stub-android-*.so upload/sdk/
cp platforms/android/app/build/outputs/apk/release/app-${{matrix.abi}}-release-unsigned.apk upload/
- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
name: dusklight-${{env.DUSK_VERSION}}-android-${{matrix.artifact_arch}}
path: upload/
build-windows: build-windows:
name: Build Windows (${{matrix.name}}) name: Build Windows (${{matrix.name}})
@@ -236,17 +154,17 @@ jobs:
matrix: matrix:
include: include:
- name: MSVC x86_64 - name: MSVC x86_64
runner: windows-latest runner: [self-hosted, Windows]
preset: msvc preset: msvc
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
@@ -273,9 +191,10 @@ jobs:
uses: mozilla-actions/sccache-action@v0.0.9 uses: mozilla-actions/sccache-action@v0.0.9
- name: Install dependencies - name: Install dependencies
if: 'false' # disabled for self-hosted
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}}
@@ -284,13 +203,12 @@ jobs:
run: cmake --build --preset x-windows-ci-${{matrix.preset}} run: cmake --build --preset x-windows-ci-${{matrix.preset}}
- name: Upload artifacts - name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags/v')
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
build/install/res/ build/install/res/
build/install/mods/
build/install/debug.7z build/install/debug.7z
build/install/sdk/
-4
View File
@@ -41,10 +41,6 @@ compile_commands.json
# MacOS # MacOS
.DS_Store .DS_Store
# direnv / nix
.direnv/
.envrc
# ISOs # ISOs
*.iso *.iso
+1 -1
View File
@@ -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 -1
View File
@@ -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"
+215 -405
View File
@@ -5,15 +5,72 @@ if (NOT CMAKE_BUILD_TYPE)
"Build type options: Debug Release RelWithDebInfo MinSizeRel" FORCE) "Build type options: Debug Release RelWithDebInfo MinSizeRel" FORCE)
endif () endif ()
include(cmake/DetectVersion.cmake) # obtain revision info from git
detect_version() find_package(Git)
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") if (GIT_FOUND)
project(dusklight LANGUAGES C CXX VERSION ${DUSK_VERSION_STRING}) # make sure version information gets re-run when the current Git HEAD changes
if (APPLE) execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD
enable_language(OBJC OBJCXX) OUTPUT_VARIABLE dusk_git_head_filename
OUTPUT_STRIP_TRAILING_WHITESPACE)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dusk_git_head_filename}")
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --symbolic-full-name HEAD
OUTPUT_VARIABLE dusk_git_head_symbolic
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${GIT_EXECUTABLE} rev-parse --git-path ${dusk_git_head_symbolic}
OUTPUT_VARIABLE dusk_git_head_symbolic_filename
OUTPUT_STRIP_TRAILING_WHITESPACE)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dusk_git_head_symbolic_filename}")
# defines DUSK_WC_REVISION
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
OUTPUT_VARIABLE DUSK_WC_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE)
# defines DUSK_WC_DESCRIBE
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --tags --long --dirty --match "v*"
OUTPUT_VARIABLE DUSK_WC_DESCRIBE
OUTPUT_STRIP_TRAILING_WHITESPACE)
# remove the git hash, then collapse a clean "-0" suffix only
string(REGEX REPLACE "-[^-]+(-dirty|)$" "\\1" DUSK_WC_DESCRIBE "${DUSK_WC_DESCRIBE}")
string(REGEX REPLACE "-0$" "" DUSK_WC_DESCRIBE "${DUSK_WC_DESCRIBE}")
# defines DUSK_WC_BRANCH
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
OUTPUT_VARIABLE DUSK_WC_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE)
# defines DUSK_WC_DATE
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} log -1 --format=%ad
OUTPUT_VARIABLE DUSK_WC_DATE
OUTPUT_STRIP_TRAILING_WHITESPACE)
else ()
message(STATUS "Unable to find git, commit information will not be available")
endif ()
if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)(-([0-9]+).*)?$")
set(DUSK_SHORT_VERSION_STRING "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
if (CMAKE_MATCH_5)
set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.${CMAKE_MATCH_5}")
else ()
set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.0")
endif ()
else ()
set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION")
set(DUSK_VERSION_STRING "0.0.0.0")
set(DUSK_SHORT_VERSION_STRING "0.0.0")
endif ()
# Add version information to CI environment variables
if(DEFINED ENV{GITHUB_ENV})
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
endif()
message(STATUS "Dusk version set to ${DUSK_WC_DESCRIBE}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
project(dusk LANGUAGES C CXX VERSION ${DUSK_VERSION_STRING})
if (APPLE)
enable_language(OBJC)
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)
@@ -38,105 +95,37 @@ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "_cmake") set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "_cmake")
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
if (ENABLE_ASAN)
if (CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" AND
CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/fsanitize=address>)
add_link_options(/fsanitize=address /INCREMENTAL:NO)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "ProgramDatabase")
foreach (_lang C CXX)
foreach (_rtc_flag /RTC1 /RTCc /RTCs /RTCu)
string(REPLACE "${_rtc_flag}" "" CMAKE_${_lang}_FLAGS_DEBUG "${CMAKE_${_lang}_FLAGS_DEBUG}")
endforeach ()
endforeach ()
elseif (CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "GNU" AND
CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
add_compile_options(
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-fsanitize=address>
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-fno-omit-frame-pointer>
)
add_link_options(-fsanitize=address)
else ()
message(FATAL_ERROR "ENABLE_ASAN requires GNU-like or MSVC-like C/C++ compiler frontends")
endif ()
add_compile_definitions(NDEBUG_SANITIZER) # Avoids absl issue with SwissTable debug code
message(STATUS "dusklight: Enabled AddressSanitizer")
endif ()
if (CMAKE_SYSTEM_NAME STREQUAL Linux) if (CMAKE_SYSTEM_NAME STREQUAL Linux)
set(DAWN_USE_WAYLAND ON CACHE BOOL "Enable support for Wayland surface" FORCE) set(DAWN_USE_WAYLAND ON CACHE BOOL "Enable support for Wayland surface" FORCE)
endif () endif ()
set(AURORA_ENABLE_DVD ON CACHE BOOL "Enable DVD API support" FORCE) set(AURORA_ENABLE_DVD ON CACHE BOOL "Enable DVD API support" FORCE)
set(AURORA_ENABLE_CARD ON CACHE BOOL "Enable CARD API support" FORCE) set(AURORA_ENABLE_CARD ON CACHE BOOL "Enable CARD API support" FORCE)
set(AURORA_ENABLE_RMLUI ON CACHE BOOL "Enable RmlUi UI support" FORCE)
add_subdirectory(extern/aurora EXCLUDE_FROM_ALL) add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)
target_compile_definitions(aurora_mtx PRIVATE MTX_USE_PS=1)
add_subdirectory(libs/freeverb) add_subdirectory(libs/freeverb)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(DUSK_GFX_DEBUG_GROUPS_DEFAULT ON)
else ()
set(DUSK_GFX_DEBUG_GROUPS_DEFAULT OFF)
endif ()
option(DUSK_BUILD_WARNINGS "Enable compiler warnings (off by default)") 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)
if(ANDROID)
set(DUSK_MOVIE_SUPPORT OFF)
set(NOD_COMPRESS_BZIP2 OFF CACHE BOOL "" FORCE)
set(NOD_COMPRESS_LZMA OFF CACHE BOOL "" FORCE)
set(NOD_COMPRESS_ZLIB OFF CACHE BOOL "" FORCE)
set(NOD_COMPRESS_ZSTD OFF CACHE BOOL "" FORCE)
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)
option(DUSK_PACKAGE_INSTALL "Install Dusklight with a Linux-native file structure" OFF) set(DUSK_SENTRY_DSN "" CACHE STRING "Sentry DSN")
option(DUSK_GFX_DEBUG_GROUPS "Report debug groups to the native graphics API" ${DUSK_GFX_DEBUG_GROUPS_DEFAULT}) set(DUSK_SENTRY_ENVIRONMENT "development" CACHE STRING "Sentry environment")
option(DUSK_ENABLE_CODE_MODS "Enable code mods" OFF)
set(DUSK_HAS_FUNCHOOK OFF)
if (DUSK_ENABLE_CODE_MODS AND (NOT APPLE OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
set(DUSK_HAS_FUNCHOOK ON)
endif ()
set(DUSK_HAS_FUNCHOOK ${DUSK_HAS_FUNCHOOK} CACHE INTERNAL "Enable funchook" FORCE)
set(_target_architectures ${CMAKE_OSX_ARCHITECTURES})
if (NOT _target_architectures)
set(_target_architectures ${CMAKE_SYSTEM_PROCESSOR})
endif ()
list(LENGTH _target_architectures _target_arch_count)
set(DUSK_HAS_PREPATCH OFF)
if (DUSK_ENABLE_CODE_MODS AND APPLE AND _target_arch_count EQUAL 1)
list(GET _target_architectures 0 _target_arch)
if (_target_arch STREQUAL "arm64")
set(DUSK_HAS_PREPATCH ON)
endif ()
endif ()
set(DUSK_HAS_PREPATCH ${DUSK_HAS_PREPATCH} CACHE INTERNAL "Enable symgen prepatch support" FORCE)
if (DUSK_ENABLE_CODE_MODS AND CMAKE_SYSTEM_NAME MATCHES "^(iOS|tvOS)$")
list(LENGTH CMAKE_OSX_ARCHITECTURES _mobile_arch_count)
if (NOT _mobile_arch_count EQUAL 1 OR NOT CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
message(FATAL_ERROR
"iOS/tvOS code mods require a single arm64 architecture; got "
"CMAKE_OSX_ARCHITECTURES='${CMAKE_OSX_ARCHITECTURES}'")
endif ()
endif ()
# Edit & Continue
if (MSVC)
if ("${CMAKE_MSVC_DEBUG_INFORMATION_FORMAT}" STREQUAL "" AND CMAKE_BUILD_TYPE STREQUAL "Debug"
AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "EditAndContinue")
endif ()
if (CMAKE_MSVC_DEBUG_INFORMATION_FORMAT STREQUAL "EditAndContinue")
add_link_options("/INCREMENTAL")
endif ()
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)
@@ -146,7 +135,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
@@ -156,17 +144,12 @@ 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
CMAKE_MAKE_PROGRAM CMAKE_MAKE_PROGRAM
CMAKE_MSVC_RUNTIME_LIBRARY CMAKE_MSVC_RUNTIME_LIBRARY
CMAKE_MSVC_DEBUG_INFORMATION_FORMAT
CMAKE_OSX_ARCHITECTURES CMAKE_OSX_ARCHITECTURES
CMAKE_OSX_DEPLOYMENT_TARGET
CMAKE_OSX_SYSROOT
DEPLOYMENT_TARGET DEPLOYMENT_TARGET
ENABLE_ARC ENABLE_ARC
ENABLE_BITCODE ENABLE_BITCODE
@@ -197,18 +180,20 @@ if (CMAKE_SYSTEM_NAME STREQUAL Linux)
# -Wno-multichar: Multi-character constants ('ABCD') are implementation-defined but all compilers # -Wno-multichar: Multi-character constants ('ABCD') are implementation-defined but all compilers
# (CW, GCC, Clang, MSVC) encode them identically in big-endian order. # (CW, GCC, Clang, MSVC) encode them identically in big-endian order.
# For >4-char literals (which GCC/Clang truncate to int), use the MULTI_CHAR() macro. # For >4-char literals (which GCC/Clang truncate to int), use the MULTI_CHAR() macro.
# -Wwrite-strings: Game code relies on implicit const char* -> char* conversions
# -Wdeprecated-declarations: JSystem uses std::iterator, deprecated in C++17 # -Wdeprecated-declarations: JSystem uses std::iterator, deprecated in C++17
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar -Wno-write-strings")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-multichar -Wno-trigraphs -Wno-deprecated-declarations") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-multichar -Wno-write-strings -Wno-trigraphs -Wno-deprecated-declarations")
set(CMAKE_INSTALL_RPATH "$ORIGIN") set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_RPATH "$ORIGIN") set(CMAKE_BUILD_RPATH "$ORIGIN")
elseif (APPLE) elseif (APPLE)
add_compile_options(-Wno-declaration-after-statement -Wno-non-pod-varargs) add_compile_options(-Wno-declaration-after-statement -Wno-non-pod-varargs)
set(CMAKE_INSTALL_RPATH "@loader_path") set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_RPATH "@loader_path") set(CMAKE_BUILD_RPATH "$ORIGIN")
elseif (MSVC) elseif (MSVC)
add_compile_options( add_compile_options(
$<$<COMPILE_LANGUAGE:C,CXX>:/bigobj> $<$<COMPILE_LANGUAGE:C,CXX>:/bigobj>
$<$<COMPILE_LANGUAGE:C,CXX>:/Zc:strictStrings->
$<$<COMPILE_LANGUAGE:C,CXX>:/MP> $<$<COMPILE_LANGUAGE:C,CXX>:/MP>
$<$<COMPILE_LANGUAGE:C,CXX>:/FS> $<$<COMPILE_LANGUAGE:C,CXX>:/FS>
) )
@@ -225,65 +210,26 @@ elseif (MSVC)
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/utf-8>) add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/utf-8>)
endif () 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 FALSE 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
DOWNLOAD_EXTRACT_TIMESTAMP FALSE
)
message(STATUS "dusklight: Fetching miniz")
FetchContent_Declare(miniz
URL https://github.com/richgel999/miniz/releases/download/3.0.2/miniz-3.0.2.zip
DOWNLOAD_EXTRACT_TIMESTAMP TRUE DOWNLOAD_EXTRACT_TIMESTAMP TRUE
EXCLUDE_FROM_ALL
) )
FetchContent_MakeAvailable(cxxopts json)
set(_fetch_content_deps cxxopts json miniz)
if (DUSK_HAS_FUNCHOOK)
message(STATUS "dusklight: Fetching funchook")
# cmake/PatchFunchook.cmake patches funchook's cmake/capstone.cmake.in to inject a
# PATCH_COMMAND into capstone's inner ExternalProject. That PATCH_COMMAND runs
# cmake/PatchCapstone.cmake after capstone is cloned, which removes the
# cmake_policy(SET CMP0048 OLD) line that CMake >= 3.27 rejects.
# This is incredibly scuffed and we should probably think of a better way to do this
set(CAPSTONE_FIX_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/PatchCapstone.cmake")
FetchContent_Declare(funchook
GIT_REPOSITORY https://github.com/kubo/funchook.git
GIT_TAG v1.1.3
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
PATCH_COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=<SOURCE_DIR> -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/PatchFunchook.cmake
EXCLUDE_FROM_ALL
)
set(FUNCHOOK_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(FUNCHOOK_BUILD_SHARED OFF CACHE BOOL "" FORCE)
set(FUNCHOOK_INSTALL OFF CACHE BOOL "" FORCE)
if (APPLE AND CMAKE_OSX_ARCHITECTURES)
list(LENGTH CMAKE_OSX_ARCHITECTURES _osx_arch_count)
if (_osx_arch_count EQUAL 1)
list(GET CMAKE_OSX_ARCHITECTURES 0 _osx_arch)
if (_osx_arch MATCHES "^(arm64|aarch64|ARM64)$")
set(FUNCHOOK_CPU arm64 CACHE STRING "" FORCE)
elseif (_osx_arch MATCHES "^(x86_64|AMD64|amd64|i[3-6]86|x86)$")
set(FUNCHOOK_CPU x86 CACHE STRING "" FORCE)
endif ()
endif ()
endif ()
list(APPEND _fetch_content_deps funchook)
endif ()
FetchContent_MakeAvailable(${_fetch_content_deps})
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)
@@ -301,45 +247,59 @@ if (DUSK_ENABLE_SENTRY_NATIVE)
) )
if (NOT sentry_native_POPULATED) if (NOT sentry_native_POPULATED)
FetchContent_Populate(sentry_native) FetchContent_Populate(sentry_native)
set(_skip_install_rules ${CMAKE_SKIP_INSTALL_RULES}) set(_dusk_skip_install_rules ${CMAKE_SKIP_INSTALL_RULES})
set(CMAKE_SKIP_INSTALL_RULES ON) set(CMAKE_SKIP_INSTALL_RULES ON)
add_subdirectory(${sentry_native_SOURCE_DIR} ${sentry_native_BINARY_DIR} EXCLUDE_FROM_ALL) add_subdirectory(${sentry_native_SOURCE_DIR} ${sentry_native_BINARY_DIR} EXCLUDE_FROM_ALL)
set(CMAKE_SKIP_INSTALL_RULES ${_skip_install_rules}) set(CMAKE_SKIP_INSTALL_RULES ${_dusk_skip_install_rules})
endif () endif ()
endif () endif ()
# Use signed char on ARM to match the original game (and x86) if (CMAKE_SYSTEM_NAME STREQUAL Windows)
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _arch) set(PLATFORM_NAME win32)
if(_arch MATCHES "^(arm|aarch64)" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU") elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
add_compile_options(-fsigned-char) if (IOS)
endif() set(PLATFORM_NAME ios)
elseif (TVOS)
set(PLATFORM_NAME tvos)
else ()
set(PLATFORM_NAME macos)
endif ()
else ()
string(TOLOWER CMAKE_SYSTEM_NAME PLATFORM_NAME)
endif ()
configure_version_header() configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_BINARY_DIR}/version.h)
include(files.cmake) 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})
include(cmake/GameABIConfig.cmake) set(GAME_COMPILE_DEFS TARGET_PC WIDESCREEN_SUPPORT=1 AVOID_UB=1 VERSION=0)
set(GAME_INCLUDE_DIRS
include
src
assets/GZ2E01 # TODO: make this dynamic if needed?
libs/JSystem/include
libs
extern/aurora/include/dolphin
extern
${CMAKE_BINARY_DIR})
find_package(Threads REQUIRED)
set(GAME_COMPILE_DEFS DUSK_BUILDING_GAME=1)
set(GAME_LIBS aurora::core aurora::gx aurora::gd aurora::si aurora::vi aurora::pad aurora::mtx aurora::os aurora::dvd set(GAME_LIBS aurora::core aurora::gx aurora::gd aurora::si aurora::vi aurora::pad aurora::mtx aurora::os aurora::dvd
aurora::card freeverb cxxopts::cxxopts absl::flat_hash_map nlohmann_json::nlohmann_json TracyClient fmt::fmt aurora::card freeverb cxxopts::cxxopts absl::flat_hash_map nlohmann_json::nlohmann_json TracyClient fmt::fmt)
Threads::Threads zstd::libzstd dusklight_game_headers)
if (DUSK_HAS_FUNCHOOK) list(APPEND GAME_LIBS libzstd_static)
list(APPEND GAME_LIBS funchook-static)
endif ()
if (DUSK_ENABLE_SENTRY_NATIVE) if (DUSK_ENABLE_SENTRY_NATIVE)
list(APPEND GAME_LIBS sentry) list(APPEND GAME_LIBS sentry)
@@ -348,47 +308,8 @@ 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)
if (DUSK_ENABLE_UPDATE_CHECKER)
list(APPEND GAME_COMPILE_DEFS DUSK_ENABLE_UPDATE_CHECKER=1)
if (WIN32)
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/winhttp.cpp)
list(APPEND GAME_LIBS winhttp)
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_WINHTTP=1)
message(STATUS "dusklight: Enabled update checker (WinHTTP)")
elseif (ANDROID)
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/android.cpp)
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_ANDROID=1)
message(STATUS "dusklight: Enabled update checker (Android)")
elseif (APPLE)
find_library(FOUNDATION_FRAMEWORK Foundation REQUIRED)
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)
list(APPEND GAME_LIBS ${FOUNDATION_FRAMEWORK})
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_URLSESSION=1)
message(STATUS "dusklight: Enabled update checker (NSURLSession)")
elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
find_package(CURL QUIET OPTIONAL_COMPONENTS HTTPS SSL)
if (CURL_FOUND AND CURL_HTTPS_FOUND AND CURL_SSL_FOUND)
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/curl.cpp)
list(APPEND GAME_LIBS CURL::libcurl)
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_LIBCURL=1)
message(STATUS "dusklight: Enabled update checker (libcurl)")
else ()
message(STATUS "dusklight: Disabled update checker (libcurl + HTTPS/SSL not found)")
endif ()
else ()
message(STATUS "dusklight: Disabled update checker (unsupported platform)")
endif ()
endif ()
list(APPEND DUSK_FILES ${DUSK_HTTP_BACKEND_SOURCE})
if (DUSK_MOVIE_SUPPORT) if (DUSK_MOVIE_SUPPORT)
if (TARGET libjpeg-turbo::turbojpeg-static) if (TARGET libjpeg-turbo::turbojpeg-static)
list(APPEND GAME_LIBS libjpeg-turbo::turbojpeg-static) list(APPEND GAME_LIBS libjpeg-turbo::turbojpeg-static)
@@ -398,32 +319,60 @@ if (DUSK_MOVIE_SUPPORT)
list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1) list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1)
endif () endif ()
include(src/dusk/randomizer/randomizer.cmake) option(DUSK_ENABLE_DISCORD_RPC "Enable Discord Rich Presence support" ON)
if (DUSK_ENABLE_DISCORD_RPC AND NOT ANDROID AND NOT IOS AND NOT TVOS)
set(DUSK_ENABLE_DISCORD_DEFAULT ON) FetchContent_Populate(discord_rpc
if (DEFINED DUSK_ENABLE_DISCORD_RPC AND NOT DEFINED DUSK_ENABLE_DISCORD) URL https://github.com/discord/discord-rpc/archive/refs/tags/v3.4.0.tar.gz
set(DUSK_ENABLE_DISCORD_DEFAULT ${DUSK_ENABLE_DISCORD_RPC}) URL_HASH SHA256=e13427019027acd187352dacba6c65953af66fdf3c35fcf38fc40b454a9d7855
endif () DOWNLOAD_EXTRACT_TIMESTAMP TRUE
option(DUSK_ENABLE_DISCORD "Enable Discord Rich Presence support" ${DUSK_ENABLE_DISCORD_DEFAULT}) )
if (DUSK_ENABLE_DISCORD AND NOT ANDROID AND NOT IOS AND NOT TVOS) # RapidJSON is a git submodule absent from the discord-rpc tarball; fetch separately.
list(APPEND GAME_COMPILE_DEFS DUSK_DISCORD=1) FetchContent_Populate(rapidjson
URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz
URL_HASH SHA256=bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
if (NOT TARGET discord-rpc)
set(_drpc ${discord_rpc_SOURCE_DIR}/src)
set(_drpc_src
${_drpc}/discord_rpc.cpp
${_drpc}/rpc_connection.cpp
${_drpc}/serialization.cpp
)
if (WIN32)
list(APPEND _drpc_src ${_drpc}/connection_win.cpp ${_drpc}/discord_register_win.cpp)
elseif (APPLE)
list(APPEND _drpc_src ${_drpc}/connection_unix.cpp ${_drpc}/discord_register_osx.m)
else ()
list(APPEND _drpc_src ${_drpc}/connection_unix.cpp ${_drpc}/discord_register_linux.cpp)
endif ()
add_library(discord-rpc STATIC ${_drpc_src})
target_include_directories(discord-rpc PUBLIC
${discord_rpc_SOURCE_DIR}/include
${rapidjson_SOURCE_DIR}/include
)
if (UNIX)
target_link_libraries(discord-rpc PUBLIC pthread)
endif ()
endif ()
list(APPEND GAME_LIBS discord-rpc)
list(APPEND GAME_COMPILE_DEFS DUSK_DISCORD_RPC=1)
endif () endif ()
if (DUSK_ENABLE_CODE_MODS) # Edit & Continue
list(APPEND GAME_COMPILE_DEFS DUSK_CODE_MODS=1) if (MSVC)
endif () if ("${CMAKE_MSVC_DEBUG_INFORMATION_FORMAT}" STREQUAL "" AND CMAKE_BUILD_TYPE STREQUAL "Debug")
list(APPEND GAME_COMPILE_DEFS set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "EditAndContinue")
DUSK_HAS_FUNCHOOK=$<BOOL:${DUSK_HAS_FUNCHOOK}> endif ()
DUSK_HAS_PREPATCH=$<BOOL:${DUSK_HAS_PREPATCH}>) if (CMAKE_MSVC_DEBUG_INFORMATION_FORMAT STREQUAL "EditAndContinue")
add_link_options("/INCREMENTAL")
if (DUSK_PACKAGE_INSTALL) endif ()
include(GNUInstallDirs)
list(APPEND GAME_COMPILE_DEFS DUSK_ASSET_DIR="${CMAKE_INSTALL_FULL_DATADIR}/dusklight/")
endif () endif ()
if (DUSK_GFX_DEBUG_GROUPS) if(ANDROID)
list(APPEND GAME_COMPILE_DEFS DUSK_GFX_DEBUG_GROUPS=1) list(APPEND GAME_COMPILE_DEFS TARGET_ANDROID=1)
target_compile_definitions(aurora_gx PRIVATE AURORA_GFX_DEBUG_GROUPS)
endif () endif ()
# game_debug is for game code files that we know work when compiled with DEBUG=1 # game_debug is for game code files that we know work when compiled with DEBUG=1
@@ -440,7 +389,7 @@ set(GAME_DEBUG_FILES
set_source_files_properties( set_source_files_properties(
${GAME_DEBUG_FILES} ${GAME_DEBUG_FILES}
PROPERTIES PROPERTIES
COMPILE_DEFINITIONS "$<$<CONFIG:Debug>:DEBUG=1>" COMPILE_DEFINITIONS "$<$<CONFIG:Debug>:DEBUG=1>;$<$<CONFIG:Debug>:PARTIAL_DEBUG=1>"
) )
# game_base is for all other game code files # game_base is for all other game code files
@@ -454,11 +403,16 @@ set(GAME_BASE_FILES
set_source_files_properties( set_source_files_properties(
${GAME_BASE_FILES} ${GAME_BASE_FILES}
PROPERTIES PROPERTIES
COMPILE_DEFINITIONS "NDEBUG=1;NDEBUG_DEFINED=1;DEBUG_DEFINED=0" COMPILE_DEFINITIONS "NDEBUG=1;NDEBUG_DEFINED=1;DEBUG_DEFINED=0;$<$<CONFIG:Debug>:PARTIAL_DEBUG=1>"
) )
foreach(jsystem_lib IN LISTS JSYSTEM_LIBRARIES) foreach(jsystem_lib IN LISTS JSYSTEM_LIBRARIES)
target_compile_definitions(${jsystem_lib} PRIVATE ${GAME_COMPILE_DEFS} $<$<CONFIG:Debug>:DEBUG=1>) target_compile_definitions(${jsystem_lib} PRIVATE
${GAME_COMPILE_DEFS}
$<$<CONFIG:Debug>:DEBUG=1>
$<$<CONFIG:Debug>:PARTIAL_DEBUG=1>
)
target_include_directories(${jsystem_lib} PRIVATE ${GAME_INCLUDE_DIRS})
target_link_libraries(${jsystem_lib} PRIVATE ${GAME_LIBS}) target_link_libraries(${jsystem_lib} PRIVATE ${GAME_LIBS})
set_target_properties(${jsystem_lib} PROPERTIES FOLDER "JSystem") set_target_properties(${jsystem_lib} PROPERTIES FOLDER "JSystem")
endforeach() endforeach()
@@ -470,126 +424,33 @@ if (CMAKE_CXX_LINK_GROUP_USING_RESCAN_SUPPORTED OR CMAKE_LINK_GROUP_USING_RESCAN
set(JSYSTEM_LINK_LIBRARIES "$<LINK_GROUP:RESCAN,${JSYSTEM_LIBRARIES}>") set(JSYSTEM_LINK_LIBRARIES "$<LINK_GROUP:RESCAN,${JSYSTEM_LIBRARIES}>")
endif () endif ()
set(DUSK_FILES src/dusk/main.cpp ${GAME_BASE_FILES} ${GAME_DEBUG_FILES} ${miniz_SOURCE_DIR}/miniz.c) 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 ()
if (ENABLE_ASAN)
target_sources(dusklight PRIVATE src/dusk/asan_options.c)
endif ()
# Add embedded data to target
file(GLOB_RECURSE RANDOMIZER_DATA "src/dusk/randomizer/generator/data/*")
file(GLOB_RECURSE RANDOMIZER_ASSETS "src/dusk/randomizer/assets/*")
list(APPEND RANDOMIZER_DATA ${RANDOMIZER_ASSETS})
set(RANDO_ROOT_DATA_DIR ${CMAKE_CURRENT_SOURCE_DIR})
foreach (RANDOMIZER_FILE IN LISTS RANDOMIZER_DATA)
file(RELATIVE_PATH REL_PATH ${RANDO_ROOT_DATA_DIR} ${RANDOMIZER_FILE})
if(REL_PATH MATCHES "^src/dusk/randomizer/generator/data/tests")
message(STATUS "Skipping Embed: ${REL_PATH}")
continue()
endif ()
message(STATUS "Embedding File: ${REL_PATH}")
b_embed(dusklight ${REL_PATH})
endforeach ()
target_compile_definitions(dusklight PRIVATE ${GAME_COMPILE_DEFS})
target_include_directories(dusklight PRIVATE ${miniz_SOURCE_DIR})
target_link_libraries(dusklight PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
target_precompile_headers(dusklight PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/include/dusk_pch.hpp>")
if (DUSK_ENABLE_CODE_MODS)
include(cmake/SymbolManifest.cmake)
if (WIN32)
# Game ABI exports & import library for mod linking
include(cmake/WindowsExports.cmake)
setup_windows_exports(dusklight)
endif ()
# Post-link symbol manifest: hookable-surface name->address map keyed to the build.
setup_symbol_manifest(dusklight)
endif ()
# Hook reliability: guaranteed patchable entries on the game ABI surface, and no identical-code folding.
if (MSVC)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(DUSK_PATCHABLE_ENTRY_FLAG $<$<COMPILE_LANGUAGE:C,CXX>:/hotpatch>)
endif ()
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
target_link_options(dusklight PRIVATE /FUNCTIONPADMIN:16 /OPT:NOICF)
else ()
target_link_options(dusklight PRIVATE /FUNCTIONPADMIN /OPT:NOICF)
endif ()
elseif (CMAKE_CXX_COMPILER_ID MATCHES "^(AppleClang|Clang)$")
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" OR CMAKE_OSX_ARCHITECTURES MATCHES "arm64")
set(DUSK_PATCHABLE_ENTRY_FLAG $<$<COMPILE_LANGUAGE:C,CXX>:-fpatchable-function-entry=2,1>)
else ()
set(DUSK_PATCHABLE_ENTRY_FLAG $<$<COMPILE_LANGUAGE:C,CXX>:-fpatchable-function-entry=10,5>)
endif ()
endif ()
if (DEFINED DUSK_PATCHABLE_ENTRY_FLAG)
target_compile_options(dusklight PRIVATE ${DUSK_PATCHABLE_ENTRY_FLAG})
foreach(jsystem_lib IN LISTS JSYSTEM_LIBRARIES)
target_compile_options(${jsystem_lib} PRIVATE ${DUSK_PATCHABLE_ENTRY_FLAG})
endforeach()
foreach(_sdk_lib aurora_card aurora_core aurora_dvd aurora_gd aurora_gx aurora_mtx
aurora_os aurora_pad aurora_si aurora_vi)
if (TARGET ${_sdk_lib})
get_target_property(_sdk_lib_imported ${_sdk_lib} IMPORTED)
if (NOT _sdk_lib_imported)
target_compile_options(${_sdk_lib} PRIVATE ${DUSK_PATCHABLE_ENTRY_FLAG})
endif ()
endif ()
endforeach ()
endif ()
if (WIN32)
target_link_libraries(dusklight PRIVATE Psapi)
endif ()
if (APPLE)
include(cmake/AppleExports.cmake)
setup_apple_exports(dusklight)
elseif (ANDROID)
include(cmake/AndroidExports.cmake)
setup_android_exports(dusklight)
elseif (UNIX)
target_link_options(dusklight PRIVATE -rdynamic)
endif () endif ()
target_compile_definitions(dusk PRIVATE ${GAME_COMPILE_DEFS})
target_include_directories(dusk PRIVATE ${GAME_INCLUDE_DIRS})
target_link_libraries(dusk PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
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")
target_link_libraries(dusklight PRIVATE dl)
elseif (ANDROID)
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 ()
@@ -597,9 +458,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}
@@ -612,26 +473,17 @@ 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 ()
include(cmake/ModSDK.cmake)
if (DUSK_ENABLE_CODE_MODS AND CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
add_custom_target(dusklight_mods) # Aggregate target for all in-tree mods
add_subdirectory(mods/template_mod)
add_subdirectory(mods/ao_mod)
add_subdirectory(mods/shadow_mod)
endif ()
if (APPLE) if (APPLE)
if (IOS) if (IOS)
set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios) set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios)
@@ -639,16 +491,15 @@ if (APPLE)
set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/tvos) set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/tvos)
else () else ()
set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos) set(DUSK_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos)
set(DUSK_ENTITLEMENTS ${DUSK_RESOURCE_DIR}/Dusklight.entitlements)
endif () endif ()
set(DUSK_INFO_PLIST ${DUSK_RESOURCE_DIR}/Info.plist.in) set(DUSK_INFO_PLIST ${DUSK_RESOURCE_DIR}/Info.plist.in)
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)
@@ -659,61 +510,30 @@ if (APPLE)
get_filename_component(NEW_FILE_PATH ${NEW_FILE} DIRECTORY) get_filename_component(NEW_FILE_PATH ${NEW_FILE} DIRECTORY)
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(_apple_bundle_properties set_target_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"
) )
if (DUSK_ENTITLEMENTS)
list(APPEND _apple_bundle_properties
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${DUSK_ENTITLEMENTS})
endif ()
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
list(APPEND _apple_bundle_properties
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES")
endif ()
set_target_properties(dusklight PROPERTIES ${_apple_bundle_properties})
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
set(_sign_nested_commands)
if (TARGET crashpad_handler)
list(APPEND _sign_nested_commands
COMMAND /usr/bin/codesign --force --sign -
"$<TARGET_FILE_DIR:dusklight>/crashpad_handler")
endif ()
add_custom_command(TARGET dusklight POST_BUILD
${_sign_nested_commands}
COMMAND /usr/bin/codesign --force --sign - --entitlements
"${DUSK_ENTITLEMENTS}" "$<TARGET_BUNDLE_DIR:dusklight>"
COMMENT "Signing Dusklight.app with entitlements"
VERBATIM
)
endif ()
endif ()
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
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 () 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")
@@ -751,25 +571,17 @@ 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 ()
if (DUSK_PACKAGE_INSTALL) install(TARGETS ${BINARY_TARGETS} ${EXTRA_TARGETS} DESTINATION ${CMAKE_INSTALL_PREFIX})
install(TARGETS ${BINARY_TARGETS} ${EXTRA_TARGETS} DESTINATION ${CMAKE_INSTALL_BINDIR}) aurora_install_runtime_dlls(dusk ${CMAKE_INSTALL_PREFIX})
else()
install(TARGETS ${BINARY_TARGETS} ${EXTRA_TARGETS} DESTINATION ${CMAKE_INSTALL_PREFIX})
endif()
aurora_install_runtime_dlls(dusklight ${CMAKE_INSTALL_PREFIX})
if (NOT APPLE) if (NOT APPLE)
if (DUSK_PACKAGE_INSTALL) install(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ${CMAKE_INSTALL_PREFIX})
install(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/dusklight)
else()
install(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ${CMAKE_INSTALL_PREFIX})
endif()
endif () endif ()
if (CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo AND NOT DUSK_PACKAGE_INSTALL) if (CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
set(DEBUG_FILES_LIST "") set(DEBUG_FILES_LIST "")
foreach (target IN LISTS BINARY_TARGETS EXTRA_TARGETS) foreach (target IN LISTS BINARY_TARGETS EXTRA_TARGETS)
get_target_output_name(${target} output_name) get_target_output_name(${target} output_name)
@@ -818,5 +630,3 @@ foreach (target IN LISTS BINARY_TARGETS)
endif () endif ()
endforeach () endforeach ()
endforeach () endforeach ()
install_bundled_mods()
+51 -189
View File
@@ -19,7 +19,7 @@
"hidden": true, "hidden": true,
"cacheVariables": { "cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo", "CMAKE_BUILD_TYPE": "RelWithDebInfo",
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreadedDLL" "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded"
} }
}, },
{ {
@@ -33,21 +33,7 @@
"value": true "value": true
}, },
"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
}
}
},
{
"name": "asan",
"hidden": true,
"cacheVariables": {
"ENABLE_ASAN": {
"type": "BOOL",
"value": true
}
} }
}, },
{ {
@@ -56,15 +42,7 @@
"generator": "Ninja", "generator": "Ninja",
"binaryDir": "${sourceDir}/build/${presetName}", "binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": { "cacheVariables": {
"BUILD_SHARED_LIBS": { "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install"
"type": "BOOL",
"value": false
},
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
"DUSK_ENABLE_CODE_MODS": {
"type": "BOOL",
"value": true
}
}, },
"vendor": { "vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": { "microsoft.com/VisualStudioSettings/CMake/1.0": {
@@ -85,15 +63,6 @@
"linux-default" "linux-default"
] ]
}, },
{
"name": "linux-default-debug-asan",
"displayName": "Linux (default) Debug ASan",
"inherits": [
"debug",
"linux-default",
"asan"
]
},
{ {
"name": "linux-default-relwithdebinfo", "name": "linux-default-relwithdebinfo",
"displayName": "Linux (default) RelWithDebInfo", "displayName": "Linux (default) RelWithDebInfo",
@@ -121,15 +90,6 @@
"linux-clang" "linux-clang"
] ]
}, },
{
"name": "linux-clang-debug-asan",
"displayName": "Linux (Clang) Debug ASan",
"inherits": [
"debug",
"linux-clang",
"asan"
]
},
{ {
"name": "linux-clang-relwithdebinfo", "name": "linux-clang-relwithdebinfo",
"displayName": "Linux (Clang) RelWithDebInfo", "displayName": "Linux (Clang) RelWithDebInfo",
@@ -150,15 +110,7 @@
"cacheVariables": { "cacheVariables": {
"CMAKE_C_COMPILER": "cl", "CMAKE_C_COMPILER": "cl",
"CMAKE_CXX_COMPILER": "cl", "CMAKE_CXX_COMPILER": "cl",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install", "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install"
"DUSK_ENABLE_CODE_MODS": {
"type": "BOOL",
"value": true
},
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": {
"type": "BOOL",
"value": true
}
}, },
"vendor": { "vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": { "microsoft.com/VisualStudioSettings/CMake/1.0": {
@@ -176,15 +128,6 @@
"windows-msvc" "windows-msvc"
] ]
}, },
{
"name": "windows-msvc-debug-asan",
"displayName": "Windows (MSVC) Debug ASan",
"inherits": [
"debug",
"windows-msvc",
"asan"
]
},
{ {
"name": "windows-msvc-relwithdebinfo", "name": "windows-msvc-relwithdebinfo",
"displayName": "Windows (MSVC) RelWithDebInfo", "displayName": "Windows (MSVC) RelWithDebInfo",
@@ -196,13 +139,17 @@
{ {
"name": "windows-arm64-msvc", "name": "windows-arm64-msvc",
"displayName": "Windows ARM64 (MSVC)", "displayName": "Windows ARM64 (MSVC)",
"inherits": [ "generator": "Ninja",
"windows-msvc" "binaryDir": "${sourceDir}/build/${presetName}",
],
"architecture": { "architecture": {
"value": "arm64", "value": "arm64",
"strategy": "external" "strategy": "external"
}, },
"cacheVariables": {
"CMAKE_C_COMPILER": "cl",
"CMAKE_CXX_COMPILER": "cl",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install"
},
"vendor": { "vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": { "microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": [ "hostOS": [
@@ -250,15 +197,7 @@
"generator": "Ninja", "generator": "Ninja",
"binaryDir": "${sourceDir}/build/${presetName}", "binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": { "cacheVariables": {
"BUILD_SHARED_LIBS": { "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install"
"type": "BOOL",
"value": false
},
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
"DUSK_ENABLE_CODE_MODS": {
"type": "BOOL",
"value": true
}
}, },
"vendor": { "vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": { "microsoft.com/VisualStudioSettings/CMake/1.0": {
@@ -276,15 +215,6 @@
"macos-default" "macos-default"
] ]
}, },
{
"name": "macos-default-debug-asan",
"displayName": "macOS (default) Debug ASan",
"inherits": [
"debug",
"macos-default",
"asan"
]
},
{ {
"name": "macos-default-relwithdebinfo", "name": "macos-default-relwithdebinfo",
"displayName": "macOS (default) RelWithDebInfo", "displayName": "macOS (default) RelWithDebInfo",
@@ -314,24 +244,27 @@
"type": "BOOL", "type": "BOOL",
"value": false "value": false
}, },
"ENABLE_VISIBILITY": {
"type": "BOOL",
"value": true
},
"Rust_CARGO_TARGET": "aarch64-apple-ios", "Rust_CARGO_TARGET": "aarch64-apple-ios",
"BUILD_SHARED_LIBS": { "BUILD_SHARED_LIBS": {
"type": "BOOL", "type": "BOOL",
"value": false "value": false
}, },
"DUSK_ENABLE_CODE_MODS": { "CMAKE_DISABLE_FIND_PACKAGE_BZip2": {
"type": "BOOL", "type": "BOOL",
"value": true "value": true
}, },
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": { "CMAKE_DISABLE_FIND_PACKAGE_LibLZMA": {
"type": "BOOL", "type": "BOOL",
"value": true "value": true
}, },
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew" "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": {
@@ -358,29 +291,24 @@
"type": "BOOL", "type": "BOOL",
"value": false "value": false
}, },
"ENABLE_ARC": {
"type": "BOOL",
"value": false
},
"ENABLE_VISIBILITY": {
"type": "BOOL",
"value": true
},
"Rust_CARGO_TARGET": "aarch64-apple-tvos", "Rust_CARGO_TARGET": "aarch64-apple-tvos",
"Rust_TOOLCHAIN": "nightly", "Rust_TOOLCHAIN": "nightly",
"BUILD_SHARED_LIBS": { "BUILD_SHARED_LIBS": {
"type": "BOOL", "type": "BOOL",
"value": false "value": false
}, },
"DUSK_ENABLE_CODE_MODS": { "CMAKE_DISABLE_FIND_PACKAGE_BZip2": {
"type": "BOOL", "type": "BOOL",
"value": true "value": true
}, },
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": { "CMAKE_DISABLE_FIND_PACKAGE_LibLZMA": {
"type": "BOOL", "type": "BOOL",
"value": true "value": true
}, },
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew" "CMAKE_DISABLE_FIND_PACKAGE_zstd": {
"type": "BOOL",
"value": true
}
}, },
"vendor": { "vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": { "microsoft.com/VisualStudioSettings/CMake/1.0": {
@@ -401,23 +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
},
"DUSK_ENABLE_CODE_MODS": {
"type": "BOOL",
"value": true
},
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": {
"type": "BOOL",
"value": true
},
"CMAKE_DISABLE_FIND_PACKAGE_zstd": {
"type": "BOOL",
"value": true
}
} }
}, },
{ {
@@ -440,31 +352,6 @@
"ANDROID_ABI": "x86_64" "ANDROID_ABI": "x86_64"
} }
}, },
{
"name": "x-android-ci",
"hidden": true,
"inherits": [
"android-base",
"ci"
],
"cacheVariables": {
"DUSK_ENABLE_SENTRY_NATIVE": {
"type": "BOOL",
"value": false
}
}
},
{
"name": "x-android-ci-arm64",
"binaryDir": "${sourceDir}/build/android-arm64",
"inherits": [
"x-android-ci"
],
"cacheVariables": {
"ANDROID_ABI": "arm64-v8a",
"Rust_CARGO_TARGET": "aarch64-linux-android"
}
},
{ {
"name": "x-linux-ci", "name": "x-linux-ci",
"hidden": true, "hidden": true,
@@ -473,8 +360,7 @@
"ci" "ci"
], ],
"cacheVariables": { "cacheVariables": {
"AURORA_SDL3_PROVIDER": "vendor", "AURORA_SDL3_PROVIDER": "vendor"
"CMAKE_LINKER_TYPE": "MOLD"
} }
}, },
{ {
@@ -503,8 +389,12 @@
"type": "BOOL", "type": "BOOL",
"value": true "value": true
}, },
"CMAKE_OSX_DEPLOYMENT_TARGET": "12.0", "CMAKE_OSX_DEPLOYMENT_TARGET": "11.0",
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew" "CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew",
"DUSK_MOVIE_SUPPORT": {
"type": "BOOL",
"value": false
}
} }
}, },
{ {
@@ -533,7 +423,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
}
} }
}, },
{ {
@@ -543,7 +437,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
}
} }
}, },
{ {
@@ -581,10 +479,7 @@
"inherits": [ "inherits": [
"x-windows-ci", "x-windows-ci",
"windows-arm64-msvc" "windows-arm64-msvc"
], ]
"cacheVariables": {
"VCPKG_TARGET_TRIPLET": "arm64-windows"
}
} }
], ],
"buildPresets": [ "buildPresets": [
@@ -594,12 +489,6 @@
"description": "Linux (default) debug build", "description": "Linux (default) debug build",
"displayName": "Linux (default) Debug" "displayName": "Linux (default) Debug"
}, },
{
"name": "linux-default-debug-asan",
"configurePreset": "linux-default-debug-asan",
"description": "Linux (default) debug build with AddressSanitizer",
"displayName": "Linux (default) Debug ASan"
},
{ {
"name": "linux-default-relwithdebinfo", "name": "linux-default-relwithdebinfo",
"configurePreset": "linux-default-relwithdebinfo", "configurePreset": "linux-default-relwithdebinfo",
@@ -612,12 +501,6 @@
"description": "Linux (Clang) debug build", "description": "Linux (Clang) debug build",
"displayName": "Linux (Clang) Debug" "displayName": "Linux (Clang) Debug"
}, },
{
"name": "linux-clang-debug-asan",
"configurePreset": "linux-clang-debug-asan",
"description": "Linux (Clang) debug build with AddressSanitizer",
"displayName": "Linux (Clang) Debug ASan"
},
{ {
"name": "linux-clang-relwithdebinfo", "name": "linux-clang-relwithdebinfo",
"configurePreset": "linux-clang-relwithdebinfo", "configurePreset": "linux-clang-relwithdebinfo",
@@ -630,12 +513,6 @@
"description": "macOS debug build", "description": "macOS debug build",
"displayName": "macOS Debug" "displayName": "macOS Debug"
}, },
{
"name": "macos-default-debug-asan",
"configurePreset": "macos-default-debug-asan",
"description": "macOS debug build with AddressSanitizer",
"displayName": "macOS Debug ASan"
},
{ {
"name": "macos-default-relwithdebinfo", "name": "macos-default-relwithdebinfo",
"configurePreset": "macos-default-relwithdebinfo", "configurePreset": "macos-default-relwithdebinfo",
@@ -648,7 +525,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"
] ]
}, },
{ {
@@ -657,7 +534,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"
] ]
}, },
{ {
@@ -666,7 +543,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"
] ]
}, },
{ {
@@ -675,16 +552,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"
]
},
{
"name": "x-android-ci-arm64",
"configurePreset": "x-android-ci-arm64",
"description": "(Internal) Android CI arm64-v8a",
"displayName": "(Internal) Android CI arm64-v8a",
"targets": [
"dusklight"
] ]
}, },
{ {
@@ -693,12 +561,6 @@
"description": "Windows (MSVC) debug build", "description": "Windows (MSVC) debug build",
"displayName": "Windows (MSVC) Debug" "displayName": "Windows (MSVC) Debug"
}, },
{
"name": "windows-msvc-debug-asan",
"configurePreset": "windows-msvc-debug-asan",
"description": "Windows (MSVC) debug build with AddressSanitizer",
"displayName": "Windows (MSVC) Debug ASan"
},
{ {
"name": "windows-msvc-relwithdebinfo", "name": "windows-msvc-relwithdebinfo",
"configurePreset": "windows-msvc-relwithdebinfo", "configurePreset": "windows-msvc-relwithdebinfo",
+19 -38
View File
@@ -1,50 +1,31 @@
<div align="center"> ![DuskLogo](res/logo-mascot.webp)
<img src="res/logo.png" alt="Logo" width="640">
<p align="center"> - ### **[Official Website](https://twilitrealm.dev)**
<a href="https://twilitrealm.dev">Official Website</a> - ### **[Discord](https://discord.gg/QACynxeyna)**
<a href="https://discord.gg/6NpMhefCK9">Discord</a>
</p>
</div>
# Overview
Dusklight 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.
# Setup # Setup
**⚠️ Dusk does NOT provide any copyrighted assets. You must provide your own copy of the game.**
> [!IMPORTANT] ### 1. Verify your ROM dump
> Dusklight does *not* provide any copyrighted assets. You must provide your own copy of the original game. First make sure your dump of the game is clean and supported by Dusk. You can do this by checking the sha1 hash of your dump against this list of supported versions.
> [!IMPORTANT] | Version | sha1 hash |
> At a minimum, Dusklight requires a GPU with support for D3D12, Vulkan 1.1+, or Metal. For older devices, best-effort support is provided for D3D11 and OpenGL ES (Android), but will not achieve full accuracy or performance. Your experience with specific hardware, operating systems, and drivers may vary. |--------------| ---------------------------------------- |
| GameCube USA | 75edd3ddff41f125d1b4ce1a40378f1b565519e7 |
| GameCube PAL | 2601822a488eeb86fb89db16ca8f29c2c953e1ca |
### 1. Dump your game ### 2. Download [Dusk](https://github.com/TwilitRealm/dusk/releases)
You must dump your own copy of the game. Please see [this article](https://wiki.dolphin-emu.org/index.php?title=Ripping_Games) for instructions. After dumping, you can use a program like [Dolphin](https://dolphin-emu.org/) or [nodtool](https://github.com/encounter/nod/releases) to convert the `.iso` to `.rvz` to save space. ### 3. Setup the game
- Extract the zip folder
- Launch Dusk
- Select Options, then set the ISO Path to your supported game dump
- Press Start Game to play!
Currently, only the GameCube releases are supported. Support for other versions of the game is planned in the future. ![Dusk options](assets/dusk_options.png)
### 2. Install Dusklight
Visit the [official installation guide](https://twilitrealm.dev/install/) for full instructions.
# Building # Building
If you'd like to build Dusk from source, please read the [build instructions](docs/building.md).
If you'd like to build Dusklight 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).
# 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/dusk/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/dusklight/graphs/contributors).
<br/>
<div align="center">
<a href="https://github.com/encounter/aurora">
<img src="assets/aurora-powered.png" alt="Powered by Aurora" width="800">
</a>
</div>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

-66
View File
@@ -1,66 +0,0 @@
<svg width="600" height="600" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
<circle cx="150" cy="150" r="105" fill="none" stroke="white" stroke-width="4"/>
<circle cx="150" cy="150" r="95" fill="none" stroke="white" stroke-width="4"/>
<circle cx="150" cy="150" r="60" fill="none" stroke="white" stroke-width="4"/>
<circle cx="150" cy="150" r="75" fill="none" stroke="white" stroke-width="4"/>
<defs>
<line id="ray" x1="150" y1="55" x2="150" y2="45"/>
<clipPath id="zigzag-clip">
<circle cx="150" cy="150" r="75"/>
</clipPath>
</defs>
<g stroke="white" stroke-width="3">
<use href="#ray"/>
<use href="#ray" transform="rotate(18 150 150)"/>
<use href="#ray" transform="rotate(36 150 150)"/>
<use href="#ray" transform="rotate(54 150 150)"/>
<use href="#ray" transform="rotate(72 150 150)"/>
<use href="#ray" transform="rotate(90 150 150)"/>
<use href="#ray" transform="rotate(108 150 150)"/>
<use href="#ray" transform="rotate(126 150 150)"/>
<use href="#ray" transform="rotate(144 150 150)"/>
<use href="#ray" transform="rotate(162 150 150)"/>
<use href="#ray" transform="rotate(180 150 150)"/>
<use href="#ray" transform="rotate(198 150 150)"/>
<use href="#ray" transform="rotate(216 150 150)"/>
<use href="#ray" transform="rotate(234 150 150)"/>
<use href="#ray" transform="rotate(252 150 150)"/>
<use href="#ray" transform="rotate(270 150 150)"/>
<use href="#ray" transform="rotate(288 150 150)"/>
<use href="#ray" transform="rotate(306 150 150)"/>
<use href="#ray" transform="rotate(324 150 150)"/>
<use href="#ray" transform="rotate(342 150 150)"/>
</g>
<polygon fill="none" stroke="white" stroke-width="4" opacity="1" clip-path="url(#zigzag-clip)"
points="
126.82,78.67
150,90
173.18,78.67
185.27,101.46
210.68,105.92
207.06,131.46
225,150
207.06,168.54
210.68,194.08
185.27,198.54
173.18,221.33
150,210
126.82,221.33
114.73,198.54
89.32,194.08
92.94,168.54
75,150
92.94,131.46
89.32,105.92
114.73,101.46
"/>
<g fill="none" stroke="white" stroke-width="4">
<polygon points="150,105 130,140 170,140"/>
<polygon points="130,140 110,175 150,175"/>
<polygon points="170,140 150,175 190,175"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

+9 -18
View File
@@ -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
-63
View File
@@ -1,63 +0,0 @@
include_guard(GLOBAL)
get_filename_component(_dir "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
# Android mod linking: symgen scans and filters the game's exports, generating a version script used for the executable
# link step, and generates a shared object stub that mods can link against without having to build the whole game.
function(setup_android_exports target)
include("${_dir}/SymbolManifest.cmake")
ensure_symgen(TRUE)
add_dependencies(${target} symgen)
set(_rsp_lines "$<TARGET_OBJECTS:${target}>")
foreach (_lib IN LISTS JSYSTEM_LIBRARIES)
list(APPEND _rsp_lines "$<TARGET_FILE:${_lib}>")
endforeach ()
list(JOIN _rsp_lines "\n" _rsp_content)
set(_rsp "${CMAKE_BINARY_DIR}/dusklight_exports_input.rsp")
file(GENERATE OUTPUT "${_rsp}" CONTENT "${_rsp_content}")
set(_sdk_args)
foreach (_lib aurora_card aurora_core aurora_dvd aurora_gd aurora_gx aurora_mtx
aurora_os aurora_pad aurora_si aurora_vi)
if (TARGET ${_lib})
list(APPEND _sdk_args --sdk-lib "$<TARGET_FILE:${_lib}>")
endif ()
endforeach ()
if (TARGET dawn::webgpu_dawn)
get_target_property(_dawn_type dawn::webgpu_dawn TYPE)
if (_dawn_type STREQUAL "STATIC_LIBRARY")
list(APPEND _sdk_args --sdk-lib "$<TARGET_FILE:dawn::webgpu_dawn>")
endif ()
endif ()
set(_vscript "${CMAKE_BINARY_DIR}/dusklight_exports.ver")
add_custom_command(TARGET ${target} PRE_LINK
COMMAND "${SYMGEN_EXE}" exports
"@${_rsp}"
--out "${_vscript}"
--format version-script
--exclude cmake_pch
--exclude miniz
--exclude asan_options
--exclude src/dusk
# Resolved from the Java side; the SDL ones live in the statically-linked
# SDL archive, outside the provenance scan.
--extra-sym JNI_OnLoad
--extra-sym SDL_main
--extra-sym "Java_*"
${_sdk_args}
COMMENT "Generating dusklight exports"
VERBATIM)
target_link_options(${target} PRIVATE "-Wl,--version-script=${_vscript}")
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _arch)
set(_stub "${CMAKE_BINARY_DIR}/stub-android-${_arch}.so")
add_custom_command(TARGET ${target} POST_BUILD
COMMAND "${SYMGEN_EXE}" stub -f elf "$<TARGET_FILE:${target}>" -o "${_stub}"
--soname "$<TARGET_FILE_NAME:${target}>" --arch "${_arch}"
BYPRODUCTS "${_stub}"
COMMENT "Generating dusklight link stub"
VERBATIM)
install(FILES "${_stub}" DESTINATION sdk)
endfunction()
-90
View File
@@ -1,90 +0,0 @@
include_guard(GLOBAL)
get_filename_component(_dir "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
# Apple mod linking: symgen scans and filters the game's exports, generating an exports list used for the executable
# link step, and generates a MH_EXECUTE Mach-O stub that mods can link against without having to build the whole game.
function(setup_apple_exports target)
include("${_dir}/SymbolManifest.cmake")
ensure_symgen(TRUE)
set(_symgen "${SYMGEN_EXE}")
add_dependencies(${target} symgen)
set(_config_subdir "")
if (CMAKE_CONFIGURATION_TYPES)
set(_config_subdir "$<CONFIG>/")
endif ()
set(_rsp_lines "$<TARGET_OBJECTS:${target}>")
foreach (_lib IN LISTS JSYSTEM_LIBRARIES)
list(APPEND _rsp_lines "$<TARGET_FILE:${_lib}>")
endforeach ()
list(JOIN _rsp_lines "\n" _rsp_content)
set(_rsp "${CMAKE_BINARY_DIR}/${_config_subdir}dusklight_exports_input.rsp")
file(GENERATE OUTPUT "${_rsp}" CONTENT "${_rsp_content}")
set(_sdk_args)
foreach (_lib aurora_card aurora_core aurora_dvd aurora_gd aurora_gx aurora_mtx
aurora_os aurora_pad aurora_si aurora_vi)
if (TARGET ${_lib})
list(APPEND _sdk_args --sdk-lib "$<TARGET_FILE:${_lib}>")
endif ()
endforeach ()
# Dawn is linked statically on Apple; mods reach wgpu* through the executable.
if (TARGET dawn::webgpu_dawn)
get_target_property(_dawn_type dawn::webgpu_dawn TYPE)
if (_dawn_type STREQUAL "STATIC_LIBRARY")
list(APPEND _sdk_args --sdk-lib "$<TARGET_FILE:dawn::webgpu_dawn>")
endif ()
endif ()
set(_exp "${CMAKE_BINARY_DIR}/${_config_subdir}dusklight_exports.exp")
add_custom_command(TARGET ${target} PRE_LINK
COMMAND "${_symgen}" exports
"@${_rsp}"
--out "${_exp}"
--exclude cmake_pch
--exclude miniz
--exclude asan_options
--exclude src/dusk
${_sdk_args}
COMMENT "Generating dusklight exports"
VERBATIM)
target_link_options(${target} PRIVATE -Xlinker -exported_symbols_list -Xlinker "${_exp}")
# Generate the stub executable mods link against via -bundle_loader.
set(_stub_args)
if (IOS)
set(_stub_platform "ios")
list(APPEND _stub_args --platform ios)
elseif (TVOS)
set(_stub_platform "tvos")
list(APPEND _stub_args --platform tvos)
else ()
set(_stub_platform "macos")
endif ()
if (CMAKE_OSX_DEPLOYMENT_TARGET)
list(APPEND _stub_args --min-os "${CMAKE_OSX_DEPLOYMENT_TARGET}")
endif ()
if (CMAKE_OSX_ARCHITECTURES)
set(_archs "${CMAKE_OSX_ARCHITECTURES}")
else ()
set(_archs "${CMAKE_SYSTEM_PROCESSOR}")
endif ()
set(_arch_names "")
foreach (_arch IN LISTS _archs)
string(TOLOWER "${_arch}" _arch)
list(APPEND _stub_args --arch "${_arch}")
list(APPEND _arch_names "${_arch}")
endforeach ()
list(JOIN _arch_names "_" _arch_name)
set(_stub "${CMAKE_BINARY_DIR}/${_config_subdir}dusklight-stub")
add_custom_command(TARGET ${target} POST_BUILD
COMMAND "${_symgen}" stub -f macho "${_exp}" -o "${_stub}" ${_stub_args}
BYPRODUCTS "${_stub}"
COMMENT "Generating dusklight link stub"
VERBATIM)
install(FILES "${_stub}" DESTINATION sdk RENAME "stub-${_stub_platform}-${_arch_name}")
endfunction()
-10
View File
@@ -1,10 +0,0 @@
# Copies a mod asset directory for packaging, skipping dotfiles and dot-directories
# (.gitkeep, .DS_Store, ...). Usage: cmake -DSRC=<dir> -DDST=<dir> -P CopyModAssets.cmake
file(MAKE_DIRECTORY "${DST}")
file(GLOB_RECURSE _files RELATIVE "${SRC}" "${SRC}/*")
foreach (_file IN LISTS _files)
if (NOT _file MATCHES "(^|/)\\.")
get_filename_component(_dir "${_file}" DIRECTORY)
file(COPY "${SRC}/${_file}" DESTINATION "${DST}/${_dir}")
endif ()
endforeach ()
-121
View File
@@ -1,121 +0,0 @@
# Version detection shared by the main build and the mod SDK (sdk/CMakeLists.txt)
include_guard(GLOBAL)
get_filename_component(_DUSK_VERSION_ROOT "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)
set(DUSK_SENTRY_DSN "" CACHE STRING "Sentry DSN")
set(DUSK_SENTRY_ENVIRONMENT "development" CACHE STRING "Sentry environment")
set(DUSK_VERSION_OVERRIDE "" CACHE STRING "Override version string (skips git detection and format validation)")
macro(detect_version)
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)
# make sure version information gets re-run when the current Git HEAD changes
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD
OUTPUT_VARIABLE dusk_git_head_filename
OUTPUT_STRIP_TRAILING_WHITESPACE)
get_filename_component(dusk_git_head_filename "${dusk_git_head_filename}" ABSOLUTE BASE_DIR "${_DUSK_VERSION_ROOT}")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dusk_git_head_filename}")
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT} COMMAND ${GIT_EXECUTABLE} rev-parse --symbolic-full-name HEAD
OUTPUT_VARIABLE dusk_git_head_symbolic
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT}
COMMAND ${GIT_EXECUTABLE} rev-parse --git-path ${dusk_git_head_symbolic}
OUTPUT_VARIABLE dusk_git_head_symbolic_filename
OUTPUT_STRIP_TRAILING_WHITESPACE)
get_filename_component(dusk_git_head_symbolic_filename "${dusk_git_head_symbolic_filename}" ABSOLUTE BASE_DIR "${_DUSK_VERSION_ROOT}")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dusk_git_head_symbolic_filename}")
# defines DUSK_WC_REVISION
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
OUTPUT_VARIABLE DUSK_WC_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE)
# defines DUSK_WC_DESCRIBE
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT} COMMAND ${GIT_EXECUTABLE} describe --tags --long --dirty --match "v*"
OUTPUT_VARIABLE DUSK_WC_DESCRIBE
OUTPUT_STRIP_TRAILING_WHITESPACE)
# remove the git hash, then collapse a clean "-0" suffix only
string(REGEX REPLACE "-[^-]+(-dirty|)$" "\\1" DUSK_WC_DESCRIBE "${DUSK_WC_DESCRIBE}")
string(REGEX REPLACE "-0$" "" DUSK_WC_DESCRIBE "${DUSK_WC_DESCRIBE}")
# defines DUSK_WC_BRANCH
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
OUTPUT_VARIABLE DUSK_WC_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE)
# defines DUSK_WC_DATE
execute_process(WORKING_DIRECTORY ${_DUSK_VERSION_ROOT} COMMAND ${GIT_EXECUTABLE} log -1 --format=%ad
OUTPUT_VARIABLE DUSK_WC_DATE
OUTPUT_STRIP_TRAILING_WHITESPACE)
else ()
message(STATUS "Unable to find git, commit information will not be available")
endif ()
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(_ver_major ${CMAKE_MATCH_1})
set(_ver_minor ${CMAKE_MATCH_2})
set(_ver_patch ${CMAKE_MATCH_3})
set(DUSK_VERSION_TWEAK "0")
if (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+)(-dirty)?$")
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
elseif (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-[0-9A-Za-z.-]+-([0-9]+)(-dirty)?$")
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
endif ()
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 ()
set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION")
set(DUSK_VERSION_STRING "0.0.0.0")
set(DUSK_SHORT_VERSION_STRING "0.0.0")
set(DUSK_VERSION_CODE "1")
endif ()
endif ()
# Add version information to CI environment variables
if (DEFINED ENV{GITHUB_ENV})
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION_CODE=${DUSK_VERSION_CODE}\n")
endif ()
message(STATUS "Dusklight version set to ${DUSK_WC_DESCRIBE}")
endmacro()
# Sets PLATFORM_NAME and configures version.h into the caller's binary dir.
macro(configure_version_header)
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
set(PLATFORM_NAME win32)
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
if (IOS)
set(PLATFORM_NAME ios)
elseif (TVOS)
set(PLATFORM_NAME tvos)
else ()
set(PLATFORM_NAME macos)
endif ()
else ()
string(TOLOWER CMAKE_SYSTEM_NAME PLATFORM_NAME)
endif ()
configure_file(${_DUSK_VERSION_ROOT}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
endmacro()
-64
View File
@@ -1,64 +0,0 @@
# The game ABI surface shared by the main build and the mod SDK (sdk/CMakeLists.txt)
include_guard(GLOBAL)
get_filename_component(_game_root "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)
# PARTIAL_DEBUG makes debug and release share one struct/vtable ABI so a mod binary loads into either
set(_game_compile_defs TARGET_PC=1 WIDESCREEN_SUPPORT=1 AVOID_UB=1 VERSION=0 MTX_USE_PS=1 PARTIAL_DEBUG=1)
if (ANDROID)
list(APPEND _game_compile_defs TARGET_ANDROID=1)
endif ()
# Public game headers
set(_game_abi_include_dirs
${_game_root}/include
${_game_root}/assets/GZ2E01
${_game_root}/libs/JSystem/include
${_game_root}/extern/aurora/include/dolphin
${_game_root}/extern/aurora/include
${_game_root}/sdk/include
)
# Internal game headers
set(_game_include_dirs
${_game_abi_include_dirs}
${_game_root}/src
${_game_root}/extern
${CMAKE_CURRENT_BINARY_DIR}
)
# Mod API, including services
add_library(dusklight_mod_api INTERFACE)
target_include_directories(dusklight_mod_api INTERFACE ${_game_root}/sdk/include)
# Full internal headers used to build the game
add_library(dusklight_game_headers INTERFACE)
target_include_directories(dusklight_game_headers INTERFACE ${_game_include_dirs})
target_compile_definitions(dusklight_game_headers INTERFACE ${_game_compile_defs})
# Public game ABI for mods
add_library(dusklight_game_abi_headers INTERFACE)
target_include_directories(dusklight_game_abi_headers INTERFACE ${_game_abi_include_dirs})
target_compile_definitions(dusklight_game_abi_headers INTERFACE ${_game_compile_defs})
# Mod feature targets
add_library(dusklight_mod_feature_game INTERFACE)
target_link_libraries(dusklight_mod_feature_game INTERFACE
dusklight_mod_api
dusklight_game_abi_headers)
target_compile_definitions(dusklight_mod_feature_game INTERFACE DUSK_MOD_FEATURE_GAME=1)
# Game headers assume global.h comes first in the translation unit (it defines DUSK_GAME_DATA
# and friends); force-include it so mods don't depend on include order.
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
target_compile_options(dusklight_mod_feature_game INTERFACE
"$<$<COMPILE_LANGUAGE:CXX>:/FIglobal.h>")
else ()
target_compile_options(dusklight_mod_feature_game INTERFACE
"$<$<COMPILE_LANGUAGE:CXX>:SHELL:-include global.h>")
endif ()
target_sources(dusklight_mod_feature_game INTERFACE
${_game_root}/sdk/src/game_feature.cpp)
add_library(dusklight_mod_feature_webgpu INTERFACE)
target_link_libraries(dusklight_mod_feature_webgpu INTERFACE dusklight_mod_api)
target_compile_definitions(dusklight_mod_feature_webgpu INTERFACE DUSK_MOD_FEATURE_WEBGPU=1)
-492
View File
@@ -1,492 +0,0 @@
# add_mod(<target> [FEATURES <feature>...] SOURCES <file>... MOD_JSON <mod.json>
# [RUNTIME_LIBRARIES <file>...] [RES_DIR <res>] [OVERLAY_DIR <overlay>]
# [TEXTURES_DIR <textures>] [OUTPUT_DIR <dir>] [BUNDLE])
set(DUSK_MODS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/mods" CACHE PATH "Directory to write mod packages into")
set(DUSKLIGHT_SDK_STUB_URL "https://github.com/encounter/dusklight/releases/download/sdk"
CACHE STRING "Base URL for game link stubs downloaded by out-of-tree mod builds")
function(_mod_lib_info out_platform_var out_name_var)
set(_arch "${CMAKE_SYSTEM_PROCESSOR}")
if (APPLE AND CMAKE_OSX_ARCHITECTURES)
list(LENGTH CMAKE_OSX_ARCHITECTURES _count)
if (_count GREATER 1)
message(FATAL_ERROR "add_mod: universal binaries are not supported")
endif ()
set(_arch "${CMAKE_OSX_ARCHITECTURES}")
elseif (WIN32)
set(_arch_id "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}")
if (NOT _arch_id)
set(_arch_id "${CMAKE_C_COMPILER_ARCHITECTURE_ID}")
endif ()
if (_arch_id MATCHES "^ARM64(EC)?$")
set(_arch "arm64")
elseif (_arch_id STREQUAL "x64")
set(_arch "amd64")
elseif (_arch_id STREQUAL "X86")
set(_arch "x86")
endif ()
endif ()
string(TOLOWER "${CMAKE_SYSTEM_NAME}" _platform)
if (_platform STREQUAL "darwin")
set(_platform "macos")
endif ()
string(TOLOWER "${_arch}" _arch)
if (_arch MATCHES "^(i[3-6]86|x86)$")
set(_arch "x86")
endif ()
if (WIN32)
set(_ext ".dll")
else ()
set(_ext ".so")
endif ()
set(${out_platform_var} "${_platform}-${_arch}" PARENT_SCOPE)
set(${out_name_var} "mod${_ext}" PARENT_SCOPE)
endfunction()
# For out-of-tree builds without a game binary: download the version-independent link stub
# (generated by symgen) for the target platform.
function(_mod_download_link_stub out_var)
_mod_lib_info(_platform _lib_name)
if (WIN32)
set(_asset "${_platform}.lib")
elseif (ANDROID)
set(_asset "stub-${_platform}.so")
else ()
set(_asset "stub-${_platform}")
endif ()
set(_stub "${CMAKE_BINARY_DIR}/dusklight-sdk-stubs/${_asset}")
if (NOT EXISTS "${_stub}")
message(STATUS "Mod SDK: downloading link stub ${_asset}")
file(DOWNLOAD "${DUSKLIGHT_SDK_STUB_URL}/${_asset}" "${_stub}.tmp" STATUS _status)
list(GET _status 0 _code)
if (NOT _code EQUAL 0)
list(GET _status 1 _error)
file(REMOVE "${_stub}.tmp")
message(FATAL_ERROR
"Mod SDK: failed to download ${DUSKLIGHT_SDK_STUB_URL}/${_asset}: ${_error}\n"
"Set DUSK_GAME_EXE to a game binary or link stub to skip the download.")
endif ()
file(RENAME "${_stub}.tmp" "${_stub}")
endif ()
set(${out_var} "${_stub}" PARENT_SCOPE)
endfunction()
function(_mod_resolve_source_path out_var path)
if (IS_ABSOLUTE "${path}")
set(_path "${path}")
else ()
set(_path "${CMAKE_CURRENT_SOURCE_DIR}/${path}")
endif ()
set(${out_var} "${_path}" PARENT_SCOPE)
endfunction()
function(_mod_collect_assets out_var dir)
if (NOT IS_DIRECTORY "${dir}")
message(FATAL_ERROR "add_mod: asset directory does not exist: ${dir}")
endif ()
file(GLOB_RECURSE _files CONFIGURE_DEPENDS LIST_DIRECTORIES false "${dir}/*")
# Dotfiles (.gitkeep, .DS_Store, ...) are not packaged; see CopyModAssets.cmake.
set(_assets "")
foreach (_file IN LISTS _files)
file(RELATIVE_PATH _rel "${dir}" "${_file}")
if (NOT _rel MATCHES "(^|/)\\.")
list(APPEND _assets "${_file}")
endif ()
endforeach ()
set(${out_var} ${_assets} PARENT_SCOPE)
endfunction()
function(_mod_add_webgpu_headers target_name)
if (NOT TARGET dawn::dawncpp_headers AND NOT TARGET dawn::webgpu_dawn)
include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../extern/aurora/cmake/AuroraDependencyVersions.cmake")
set(AURORA_DAWN_PROVIDER "package" CACHE STRING "How to provide Dawn for the mod SDK")
include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../extern/aurora/cmake/AuroraDawnProvider.cmake")
endif ()
if (TARGET dawn::dawncpp_headers)
target_link_libraries(${target_name} PRIVATE dawn::dawncpp_headers)
elseif (TARGET dawn::webgpu_dawn)
target_link_libraries(${target_name} PRIVATE dawn::webgpu_dawn)
else ()
message(FATAL_ERROR "add_mod: FEATURES webgpu could not provide WebGPU headers")
endif ()
endfunction()
function(add_mod target_name)
cmake_parse_arguments(ARG "BUNDLE" "MOD_JSON;RES_DIR;OVERLAY_DIR;TEXTURES_DIR;OUTPUT_DIR"
"SOURCES;RUNTIME_LIBRARIES;FEATURES" ${ARGN})
if (ARG_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "add_mod: unknown arguments: ${ARG_UNPARSED_ARGUMENTS}")
endif ()
if (NOT ARG_MOD_JSON)
message(FATAL_ERROR "add_mod: MOD_JSON is required")
endif ()
_mod_resolve_source_path(_mod_json "${ARG_MOD_JSON}")
if (NOT EXISTS "${_mod_json}")
message(FATAL_ERROR "add_mod: MOD_JSON does not exist: ${_mod_json}")
endif ()
set(_supported_features game webgpu)
set(_features "")
foreach (_feature IN LISTS ARG_FEATURES)
list(FIND _supported_features "${_feature}" _feature_index)
if (_feature_index EQUAL -1)
list(JOIN _supported_features ", " _supported_features_text)
message(FATAL_ERROR
"add_mod: unknown feature '${_feature}' (supported: ${_supported_features_text})")
endif ()
list(FIND _features "${_feature}" _duplicate_index)
if (NOT _duplicate_index EQUAL -1)
message(FATAL_ERROR "add_mod: duplicate feature '${_feature}'")
endif ()
list(APPEND _features "${_feature}")
endforeach ()
if (_features AND NOT ARG_SOURCES)
message(FATAL_ERROR "add_mod: FEATURES requires SOURCES")
endif ()
set(_has_lib FALSE)
set(_needs_host_link FALSE)
set(_lib_platform "")
set(_lib_name "")
if (ARG_SOURCES)
set(_has_lib TRUE)
add_library(${target_name} MODULE ${ARG_SOURCES})
_mod_lib_info(_lib_platform _lib_name)
set_target_properties(${target_name} PROPERTIES
PREFIX ""
C_VISIBILITY_PRESET hidden
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
WINDOWS_EXPORT_ALL_SYMBOLS OFF)
target_compile_features(${target_name} PRIVATE cxx_std_20)
target_link_libraries(${target_name} PRIVATE dusklight_mod_api)
foreach (_feature IN LISTS _features)
target_link_libraries(${target_name} PRIVATE dusklight_mod_feature_${_feature})
if (_feature STREQUAL "webgpu")
_mod_add_webgpu_headers(${target_name})
endif ()
if (_feature STREQUAL "game" OR _feature STREQUAL "webgpu")
set(_needs_host_link TRUE)
endif ()
endforeach ()
if (NOT TARGET dusklight)
# Apply global compile options for out-of-tree mod builds
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
target_compile_options(${target_name} PRIVATE
-Wno-multichar -Wno-trigraphs -Wno-deprecated-declarations)
elseif (APPLE)
target_compile_options(${target_name} PRIVATE
-Wno-declaration-after-statement -Wno-non-pod-varargs)
elseif (MSVC)
target_compile_options(${target_name} PRIVATE
"$<$<COMPILE_LANGUAGE:C,CXX>:/bigobj>"
"$<$<COMPILE_LANGUAGE:C,CXX>:/utf-8>")
endif ()
# Use signed char on ARM to match the original game (and x86)
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _mod_arch)
if (_mod_arch MATCHES "^(arm|aarch64)" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
target_compile_options(${target_name} PRIVATE -fsigned-char)
endif ()
endif ()
if (APPLE)
if (_needs_host_link)
if (TARGET dusklight)
set(_game_exe "$<TARGET_FILE:dusklight>")
add_dependencies(${target_name} dusklight)
elseif (DUSK_GAME_EXE)
_mod_resolve_source_path(_game_exe "${DUSK_GAME_EXE}")
else ()
_mod_download_link_stub(_game_exe)
endif ()
target_link_options(${target_name} PRIVATE
-Xlinker -bundle_loader -Xlinker "${_game_exe}")
set_property(TARGET ${target_name} APPEND PROPERTY LINK_DEPENDS "${_game_exe}")
endif ()
set_target_properties(${target_name} PROPERTIES
BUILD_RPATH "@loader_path"
INSTALL_RPATH "@loader_path")
elseif (ANDROID)
if (_needs_host_link)
if (TARGET dusklight)
target_link_libraries(${target_name} PRIVATE dusklight)
else ()
if (DUSK_GAME_EXE)
_mod_resolve_source_path(_game_lib "${DUSK_GAME_EXE}")
else ()
_mod_download_link_stub(_game_lib)
endif ()
target_link_libraries(${target_name} PRIVATE "${_game_lib}")
endif ()
endif ()
set_target_properties(${target_name} PROPERTIES
BUILD_RPATH "$ORIGIN"
INSTALL_RPATH "$ORIGIN")
elseif (UNIX)
if (_needs_host_link)
target_link_options(${target_name} PRIVATE -Wl,--allow-shlib-undefined)
endif ()
set_target_properties(${target_name} PROPERTIES
BUILD_RPATH "$ORIGIN"
INSTALL_RPATH "$ORIGIN")
elseif (WIN32)
# Mods link against the game's import library (sdk/windows-<arch>.lib, generated by
# setup_windows_exports); cl and clang-cl both consume it in MSVC mode. Function
# calls resolve through import thunks; game data is reachable only through
# __declspec(dllimport), i.e. DUSK_GAME_DATA-annotated declarations.
if (_needs_host_link)
if (TARGET dusklight)
if (NOT DUSK_GAME_IMPLIB)
message(FATAL_ERROR
"add_mod: DUSK_GAME_IMPLIB is not set (see setup_windows_exports)")
endif ()
set(_game_lib "${DUSK_GAME_IMPLIB}")
elseif (DUSK_GAME_EXE)
_mod_resolve_source_path(_game_lib "${DUSK_GAME_EXE}")
if (NOT _game_lib MATCHES "\\.lib$")
message(FATAL_ERROR
"add_mod: DUSK_GAME_EXE must be an import library on Windows "
"(sdk/windows-<arch>.lib)")
endif ()
else ()
_mod_download_link_stub(_game_lib)
endif ()
target_link_libraries(${target_name} PRIVATE "${_game_lib}")
endif ()
set_target_properties(${target_name} PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
target_compile_definitions(${target_name} PRIVATE _ITERATOR_DEBUG_LEVEL=0)
endif ()
endif ()
if (ARG_RUNTIME_LIBRARIES AND NOT _has_lib)
message(FATAL_ERROR "add_mod: RUNTIME_LIBRARIES requires SOURCES")
endif ()
set(_output_dir "${DUSK_MODS_OUTPUT_DIR}")
if (ARG_OUTPUT_DIR)
set(_output_dir "${ARG_OUTPUT_DIR}")
endif ()
set(_stage "${CMAKE_CURRENT_BINARY_DIR}/${target_name}_stage")
set(_out "${_output_dir}/${target_name}.dusk")
set(_zip_args mod.json)
set(_package_deps "${_mod_json}")
set(_package_inputs "${_mod_json}")
set(_extra_cmds "")
set(_lib_copy_cmd "")
set(_target_depend "")
if (_has_lib)
list(APPEND _zip_args lib)
set(_lib_copy_cmd
COMMAND ${CMAKE_COMMAND} -E make_directory "${_stage}/lib/${_lib_platform}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_FILE:${target_name}>" "${_stage}/lib/${_lib_platform}/${_lib_name}")
set(_target_depend ${target_name})
endif ()
string(TOLOWER "${_lib_name}" _lib_name_key)
set(_runtime_lib_name_keys "${_lib_name_key}")
foreach (_runtime_lib IN LISTS ARG_RUNTIME_LIBRARIES)
_mod_resolve_source_path(_runtime_lib_path "${_runtime_lib}")
if (NOT EXISTS "${_runtime_lib_path}" OR IS_DIRECTORY "${_runtime_lib_path}")
message(FATAL_ERROR "add_mod: runtime library does not exist or is not a file: ${_runtime_lib_path}")
endif ()
get_filename_component(_runtime_lib_name "${_runtime_lib_path}" NAME)
string(TOLOWER "${_runtime_lib_name}" _runtime_lib_name_key)
list(FIND _runtime_lib_name_keys "${_runtime_lib_name_key}" _runtime_lib_name_index)
if (NOT _runtime_lib_name_index EQUAL -1)
message(FATAL_ERROR "add_mod: duplicate runtime library filename: ${_runtime_lib_name}")
endif ()
list(APPEND _runtime_lib_name_keys "${_runtime_lib_name_key}")
list(APPEND _package_deps "${_runtime_lib_path}")
list(APPEND _package_inputs "${_runtime_lib_path}")
list(APPEND _lib_copy_cmd COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${_runtime_lib_path}" "${_stage}/lib/${_lib_platform}/${_runtime_lib_name}")
endforeach ()
if (ARG_RES_DIR)
_mod_resolve_source_path(_res_dir "${ARG_RES_DIR}")
_mod_collect_assets(_res_deps "${_res_dir}")
list(APPEND _package_deps ${_res_deps})
list(APPEND _package_inputs "${_res_dir}" ${_res_deps})
list(APPEND _zip_args res)
list(APPEND _extra_cmds COMMAND ${CMAKE_COMMAND} "-DSRC=${_res_dir}"
"-DDST=${_stage}/res" -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/CopyModAssets.cmake")
endif ()
if (ARG_OVERLAY_DIR)
_mod_resolve_source_path(_overlay_dir "${ARG_OVERLAY_DIR}")
_mod_collect_assets(_overlay_deps "${_overlay_dir}")
list(APPEND _package_deps ${_overlay_deps})
list(APPEND _package_inputs "${_overlay_dir}" ${_overlay_deps})
list(APPEND _zip_args overlay)
list(APPEND _extra_cmds COMMAND ${CMAKE_COMMAND} "-DSRC=${_overlay_dir}"
"-DDST=${_stage}/overlay" -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/CopyModAssets.cmake")
endif ()
if (ARG_TEXTURES_DIR)
_mod_resolve_source_path(_textures_dir "${ARG_TEXTURES_DIR}")
_mod_collect_assets(_textures_deps "${_textures_dir}")
list(APPEND _package_deps ${_textures_deps})
list(APPEND _package_inputs "${_textures_dir}" ${_textures_deps})
list(APPEND _zip_args textures)
list(APPEND _extra_cmds COMMAND ${CMAKE_COMMAND} "-DSRC=${_textures_dir}"
"-DDST=${_stage}/textures" -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/CopyModAssets.cmake")
endif ()
set(_bundle_cmds "")
if (ARG_BUNDLE AND TARGET dusklight)
file(READ "${_mod_json}" _mod_json_text)
string(JSON _mod_id GET "${_mod_json_text}" id)
set_property(GLOBAL APPEND PROPERTY DUSK_BUNDLED_MOD_TARGETS "${target_name}")
set_property(GLOBAL APPEND PROPERTY DUSK_BUNDLED_MOD_IDS "${_mod_id}")
set_property(GLOBAL APPEND PROPERTY DUSK_BUNDLED_MOD_STAGES "${_stage}")
set_property(GLOBAL APPEND PROPERTY DUSK_BUNDLED_MOD_PACKAGES "${_out}")
set_property(GLOBAL APPEND PROPERTY DUSK_BUNDLED_MOD_LIB_PLATFORMS "${_lib_platform}")
set_property(GLOBAL APPEND PROPERTY DUSK_BUNDLED_MOD_LIB_NAMES "${_lib_name}")
set(_bundle_cmds
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bundled_mods"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_out}" "${CMAKE_BINARY_DIR}/bundled_mods/${target_name}.dusk")
endif ()
set(_package_target "${target_name}_package")
set(_package_inputs_file "${CMAKE_CURRENT_BINARY_DIR}/${target_name}_package_inputs.txt")
list(SORT _package_inputs)
set(_package_inputs_text "")
foreach (_package_input IN LISTS _package_inputs)
string(APPEND _package_inputs_text "${_package_input}\n")
endforeach ()
file(GENERATE OUTPUT "${_package_inputs_file}" CONTENT "${_package_inputs_text}")
add_custom_command(OUTPUT "${_out}"
COMMAND ${CMAKE_COMMAND} -E rm -rf "${_stage}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${_stage}" "${_output_dir}"
${_lib_copy_cmd}
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_mod_json}" "${_stage}/mod.json"
${_extra_cmds}
COMMAND ${CMAKE_COMMAND} -E chdir "${_stage}" ${CMAKE_COMMAND} -E tar cvf "${_out}" --format=zip ${_zip_args}
${_bundle_cmds}
DEPENDS ${_target_depend} ${_package_deps} "${_package_inputs_file}"
COMMENT "Packaging ${target_name} -> ${_out}"
COMMAND_EXPAND_LISTS
VERBATIM
)
add_custom_target(${_package_target} ALL DEPENDS "${_out}")
if (TARGET dusklight_mods)
add_dependencies(dusklight_mods ${_package_target})
endif ()
endfunction()
# Install rules for BUNDLE mods.
# - Windows: the .dusk archives into <install>/mods (the loader extracts native libs to the
# user cache).
# - Linux: pre-extracted stage dirs into <install>/mods so native libs dlopen in place from
# read-only installs.
# - macOS: pre-extracted stage dirs into the installed app's Contents/Resources/mods, native
# libs ad-hoc signed in place, then the whole bundle re-signed.
# - iOS/tvOS: assets into <app>/mods/<id>, the mod library into Frameworks/<id>.so,
# and runtime libraries alongside it.
# - Android: nothing here; gradle packs ${CMAKE_BINARY_DIR}/bundled_mods into APK assets.
function(install_bundled_mods)
get_property(_targets GLOBAL PROPERTY DUSK_BUNDLED_MOD_TARGETS)
if (NOT _targets OR ANDROID)
return ()
endif ()
get_property(_ids GLOBAL PROPERTY DUSK_BUNDLED_MOD_IDS)
get_property(_stages GLOBAL PROPERTY DUSK_BUNDLED_MOD_STAGES)
get_property(_lib_platforms GLOBAL PROPERTY DUSK_BUNDLED_MOD_LIB_PLATFORMS)
get_property(_lib_names GLOBAL PROPERTY DUSK_BUNDLED_MOD_LIB_NAMES)
list(LENGTH _targets _count)
math(EXPR _last "${_count} - 1")
if (APPLE)
get_target_property(_app_name dusklight OUTPUT_NAME)
if (NOT _app_name)
set(_app_name dusklight)
endif ()
set(_bundle_dir "${CMAKE_INSTALL_PREFIX}/${_app_name}.app")
if (IOS OR TVOS)
foreach (_i RANGE ${_last})
list(GET _targets ${_i} _target)
list(GET _ids ${_i} _id)
list(GET _stages ${_i} _stage)
list(GET _lib_platforms ${_i} _lib_platform)
list(GET _lib_names ${_i} _lib_name)
install(DIRECTORY "${_stage}/" DESTINATION "${_bundle_dir}/mods/${_id}"
PATTERN "lib" EXCLUDE)
install(PROGRAMS "$<TARGET_FILE:${_target}>"
DESTINATION "${_bundle_dir}/Frameworks" RENAME "${_id}.so")
install(DIRECTORY "${_stage}/lib/${_lib_platform}/"
DESTINATION "${_bundle_dir}/Frameworks"
PATTERN "${_lib_name}" EXCLUDE)
endforeach ()
if (DUSK_HAS_PREPATCH)
set(_prepatch_executable "${_bundle_dir}/Dusklight")
set(_prepatch_mod_args "")
foreach (_id IN LISTS _ids)
string(APPEND _prepatch_mod_args
" \"${_bundle_dir}/Frameworks/${_id}.so\"")
endforeach ()
install(CODE "
execute_process(
COMMAND \"${SYMGEN_EXE}\" prepatch
--binary \"${_prepatch_executable}\"
--report \"${CMAKE_BINARY_DIR}/prepatch-report-$<CONFIG>.json\"
${_prepatch_mod_args}
COMMAND_ERROR_IS_FATAL ANY)")
endif ()
else ()
foreach (_i RANGE ${_last})
list(GET _ids ${_i} _id)
list(GET _stages ${_i} _stage)
list(GET _lib_platforms ${_i} _lib_platform)
list(GET _lib_names ${_i} _lib_name)
install(DIRECTORY "${_stage}/" DESTINATION "${_bundle_dir}/Contents/Resources/mods/${_id}")
install(CODE "
file(GLOB _mod_libs \"${_bundle_dir}/Contents/Resources/mods/${_id}/lib/${_lib_platform}/*\")
foreach (_mod_lib IN LISTS _mod_libs)
if (NOT IS_DIRECTORY \"\${_mod_lib}\")
execute_process(COMMAND /usr/bin/codesign --force --sign - \"\${_mod_lib}\" COMMAND_ERROR_IS_FATAL ANY)
endif ()
endforeach ()")
endforeach ()
if (DUSK_HAS_PREPATCH)
set(_prepatch_executable "${_bundle_dir}/Contents/MacOS/Dusklight")
set(_prepatch_mod_args "")
foreach (_i RANGE ${_last})
list(GET _ids ${_i} _id)
list(GET _lib_platforms ${_i} _lib_platform)
list(GET _lib_names ${_i} _lib_name)
string(APPEND _prepatch_mod_args
" \"${_bundle_dir}/Contents/Resources/mods/${_id}/lib/${_lib_platform}/${_lib_name}\"")
endforeach ()
install(CODE "
execute_process(
COMMAND \"${SYMGEN_EXE}\" prepatch
--binary \"${_prepatch_executable}\"
--report \"${CMAKE_BINARY_DIR}/prepatch-report-$<CONFIG>.json\"
${_prepatch_mod_args}
COMMAND_ERROR_IS_FATAL ANY)")
endif ()
if (TARGET crashpad_handler)
install(CODE "execute_process(COMMAND /usr/bin/codesign --force --sign - \"${_bundle_dir}/Contents/MacOS/$<TARGET_FILE_NAME:crashpad_handler>\" COMMAND_ERROR_IS_FATAL ANY)")
endif ()
install(CODE "execute_process(COMMAND /usr/bin/codesign --force --sign - --entitlements \"${DUSK_ENTITLEMENTS}\" \"${_bundle_dir}\" COMMAND_ERROR_IS_FATAL ANY)")
endif ()
return ()
endif ()
if (DUSK_PACKAGE_INSTALL)
set(_mods_dest "${CMAKE_INSTALL_DATAROOTDIR}/dusklight/mods")
else ()
set(_mods_dest "${CMAKE_INSTALL_PREFIX}/mods")
endif ()
if (WIN32)
foreach (_target IN LISTS _targets)
install(FILES "${CMAKE_BINARY_DIR}/bundled_mods/${_target}.dusk" DESTINATION "${_mods_dest}")
endforeach ()
else ()
foreach (_i RANGE ${_last})
list(GET _ids ${_i} _id)
list(GET _stages ${_i} _stage)
install(DIRECTORY "${_stage}/" DESTINATION "${_mods_dest}/${_id}")
endforeach ()
endif ()
endfunction()
-13
View File
@@ -1,13 +0,0 @@
# Patches capstone's CMakeLists.txt for compatibility with CMake >= 4.0:
# - Bumps cmake_minimum_required to 3.10 (CMake >= 4.0 dropped < 3.5 support; < 3.10 warns)
# - Removes cmake_policy(SET CMP0048 OLD) (rejected by CMake >= 3.27)
file(READ "${DIR}/CMakeLists.txt" _content)
string(REGEX REPLACE
"cmake_minimum_required[ \t]*\\([ \t]*VERSION[ \t]+[0-9]+\\.[0-9]+(\\.[0-9]+)?[ \t]*\\)"
"cmake_minimum_required(VERSION 3.10)"
_content "${_content}")
string(REGEX REPLACE
"cmake_policy[ \t]*\\([ \t]*SET[ \t]+CMP0048[ \t]+OLD[ \t]*\\)"
"# cmake_policy(SET CMP0048 OLD)"
_content "${_content}")
file(WRITE "${DIR}/CMakeLists.txt" "${_content}")
-60
View File
@@ -1,60 +0,0 @@
file(READ "${SOURCE_DIR}/cmake/capstone.cmake.in" _content)
# Insert PATCH_COMMAND before CONFIGURE_COMMAND in the ExternalProject_Add.
# Bracket args prevent cmake from substituting ${...} while writing this file.
string(REPLACE
" CONFIGURE_COMMAND \"\""
[=[ PATCH_COMMAND "${CMAKE_COMMAND}" -DDIR=${CMAKE_CURRENT_BINARY_DIR}/capstone-src -P "${CAPSTONE_FIX_SCRIPT}"
CONFIGURE_COMMAND ""]=]
_content "${_content}")
file(WRITE "${SOURCE_DIR}/cmake/capstone.cmake.in" "${_content}")
file(READ "${SOURCE_DIR}/src/funchook_unix.c" _unix_content)
# macOS rejects the POSIX mprotect RWX/RW transition for executable image pages on arm64.
# Use Mach VM_PROT_COPY for the short patch window, then restore RX permissions.
if (NOT _unix_content MATCHES "VM_PROT_READ \\| VM_PROT_WRITE \\| VM_PROT_COPY")
string(REPLACE
[=[ rv = mprotect(mstate->addr, mstate->size, prot);]=]
[=[#ifdef __APPLE__
kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)mstate->addr,
(vm_size_t)mstate->size, FALSE,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY);
if (kr == KERN_SUCCESS) {
funchook_log(funchook, " unprotect memory %p (size=%"PRIuPTR", prot=read,write,copy) <- %p (size=%"PRIuPTR")\n",
mstate->addr, mstate->size, start, len);
return 0;
}
funchook_set_error_message(funchook, "Failed to unprotect memory %p (size=%"PRIuPTR", prot=read,write,copy) <- %p (size=%"PRIuPTR", error=%s)",
mstate->addr, mstate->size, start, len,
mach_error_string(kr));
return FUNCHOOK_ERROR_MEMORY_FUNCTION;
#endif
rv = mprotect(mstate->addr, mstate->size, prot);]=]
_unix_content "${_unix_content}")
string(REPLACE
[=[ char errbuf[128];
int rv = mprotect(mstate->addr, mstate->size, PROT_READ | PROT_EXEC);]=]
[=[ char errbuf[128];
#ifdef __APPLE__
kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)mstate->addr,
(vm_size_t)mstate->size, FALSE,
VM_PROT_READ | VM_PROT_EXECUTE);
if (kr == KERN_SUCCESS) {
funchook_log(funchook, " protect memory %p (size=%"PRIuPTR", prot=read,exec)\n",
mstate->addr, mstate->size);
return 0;
}
funchook_set_error_message(funchook, "Failed to protect memory %p (size=%"PRIuPTR", prot=read,exec, error=%s)",
mstate->addr, mstate->size,
mach_error_string(kr));
return FUNCHOOK_ERROR_MEMORY_FUNCTION;
#endif
int rv = mprotect(mstate->addr, mstate->size, PROT_READ | PROT_EXEC);]=]
_unix_content "${_unix_content}")
endif ()
file(WRITE "${SOURCE_DIR}/src/funchook_unix.c" "${_unix_content}")
-132
View File
@@ -1,132 +0,0 @@
include_guard(GLOBAL)
get_filename_component(_SYMBOL_MANIFEST_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
set(_SYMGEN_VERSION "1.3.1")
set(_SYMGEN_RELEASE_BASE_URL "https://github.com/encounter/symgen/releases/download/v${_SYMGEN_VERSION}")
set(SYMGEN_PATH "" CACHE FILEPATH "Path to a symgen executable; empty downloads the pinned release")
mark_as_advanced(SYMGEN_PATH)
function(symgen_host_asset out_name)
string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" _host_processor)
set(_asset "")
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
if (_host_processor MATCHES "^(arm64|aarch64)$")
set(_asset "symgen-macos-arm64")
elseif (_host_processor MATCHES "^(x86_64|amd64)$")
set(_asset "symgen-macos-x86_64")
endif ()
elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
if (_host_processor MATCHES "^(aarch64|arm64)$")
set(_asset "symgen-linux-aarch64")
elseif (_host_processor MATCHES "^(x86_64|amd64)$")
set(_asset "symgen-linux-x86_64")
elseif (_host_processor MATCHES "^(i[3-6]86|x86)$")
set(_asset "symgen-linux-i686")
endif ()
elseif (CMAKE_HOST_WIN32)
if (_host_processor MATCHES "^(arm64|aarch64)$")
set(_asset "symgen-windows-arm64.exe")
elseif (_host_processor MATCHES "^(x86_64|amd64)$")
set(_asset "symgen-windows-x86_64.exe")
elseif (_host_processor MATCHES "^(i[3-6]86|x86)$")
set(_asset "symgen-windows-x86.exe")
endif ()
endif ()
set(${out_name} "${_asset}" PARENT_SCOPE)
endfunction()
function(ensure_symgen required)
if (TARGET symgen)
return()
endif ()
if (SYMGEN_PATH)
get_filename_component(_symgen "${SYMGEN_PATH}" ABSOLUTE)
if (NOT EXISTS "${_symgen}")
if (required)
message(FATAL_ERROR "symgen: SYMGEN_PATH does not exist: ${_symgen}")
endif ()
message(STATUS "symgen: SYMGEN_PATH does not exist, symbol manifest generation "
"skipped (by-name hook resolution will be unavailable)")
return()
endif ()
else ()
symgen_host_asset(_asset)
if (_asset STREQUAL "")
if (required)
message(FATAL_ERROR "symgen: no prebuilt binary for host "
"${CMAKE_HOST_SYSTEM_NAME}/${CMAKE_HOST_SYSTEM_PROCESSOR} "
"(configure with -DDUSK_ENABLE_CODE_MODS=OFF)")
endif ()
message(STATUS "symgen: no prebuilt binary for host "
"${CMAKE_HOST_SYSTEM_NAME}/${CMAKE_HOST_SYSTEM_PROCESSOR}; "
"symbol manifest generation skipped (by-name hook resolution will be unavailable)")
return()
endif ()
set(_symgen_dir "${CMAKE_BINARY_DIR}/_deps/symgen")
set(_symgen "${_symgen_dir}/${_asset}")
set(_url "${_SYMGEN_RELEASE_BASE_URL}/${_asset}")
message(STATUS "dusklight: Fetching symgen ${_SYMGEN_VERSION} (${_asset})")
file(MAKE_DIRECTORY "${_symgen_dir}")
file(DOWNLOAD "${_url}" "${_symgen}"
TLS_VERIFY ON
STATUS _download_status
SHOW_PROGRESS)
list(GET _download_status 0 _download_code)
if (NOT _download_code EQUAL 0)
list(GET _download_status 1 _download_message)
file(REMOVE "${_symgen}")
if (required)
message(FATAL_ERROR "symgen: failed to download ${_url}: ${_download_message}")
endif ()
message(STATUS "symgen: failed to download ${_url}: ${_download_message}; "
"symbol manifest generation skipped (by-name hook resolution will be unavailable)")
return()
endif ()
if (NOT CMAKE_HOST_WIN32)
file(CHMOD "${_symgen}" PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
endif ()
endif ()
add_custom_target(symgen DEPENDS "${_symgen}")
set(SYMGEN_EXE "${_symgen}" CACHE INTERNAL "symgen executable" FORCE)
endfunction()
function(setup_symbol_manifest target)
ensure_symgen(TRUE)
if (NOT TARGET symgen)
return()
endif ()
add_dependencies(${target} symgen)
if (WIN32)
set(_input --pdb "$<TARGET_PDB_FILE:${target}>")
else ()
set(_input --binary "$<TARGET_FILE:${target}>")
endif ()
if (APPLE)
# Room for the symbol manifest and several prepatch arenas.
target_link_options(${target} PRIVATE "LINKER:-headerpad,0x1000")
# ld64 may update an existing output, which breaks our symdb insertion. Remove it first.
add_custom_command(TARGET ${target} PRE_LINK
COMMAND "${CMAKE_COMMAND}" -E rm -f "$<TARGET_FILE:${target}>"
VERBATIM)
endif ()
# The manifest is embedded into the image as a new section, located at runtime through
# the descriptor manifest.cpp reserves. On Apple platforms this command must stay
# attached before the ad-hoc codesign POST_BUILD command: the patch removes any existing
# signature.
add_custom_command(TARGET ${target} POST_BUILD
COMMAND "${SYMGEN_EXE}" manifest ${_input} --embed "$<TARGET_FILE:${target}>"
COMMENT "Embedding symbol manifest"
VERBATIM)
endfunction()
-93
View File
@@ -1,93 +0,0 @@
include_guard(GLOBAL)
get_filename_component(_DUSK_WINDOWS_EXPORTS_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
# Windows mod linking: generate the curated export surface for the game executable and the
# import library mods link against. symgen scans the built objects, filters by source, and
# writes a .def used by the main link and import library generation.
function(setup_windows_exports target)
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _implib_arch)
if (_implib_arch STREQUAL "arm64")
set(_dlltool_machine "arm64")
set(_lib_machine "arm64")
elseif (_implib_arch MATCHES "^(amd64|x86_64)$")
set(_dlltool_machine "i386:x86-64")
set(_lib_machine "x64")
else ()
message(FATAL_ERROR
"dusklight: no Windows mod linking support for ${CMAKE_SYSTEM_PROCESSOR}")
endif ()
include("${_DUSK_WINDOWS_EXPORTS_CMAKE_DIR}/SymbolManifest.cmake")
ensure_symgen(TRUE)
set(_symgen "${SYMGEN_EXE}")
add_dependencies(${target} symgen)
set(_config_subdir "")
if (CMAKE_CONFIGURATION_TYPES)
set(_config_subdir "$<CONFIG>/")
endif ()
set(_rsp_lines "$<TARGET_OBJECTS:${target}>")
foreach (_lib IN LISTS JSYSTEM_LIBRARIES)
list(APPEND _rsp_lines "$<TARGET_FILE:${_lib}>")
endforeach ()
list(JOIN _rsp_lines "\n" _rsp_content)
set(_rsp "${CMAKE_BINARY_DIR}/${_config_subdir}dusklight_exports_input.rsp")
file(GENERATE OUTPUT "${_rsp}" CONTENT "${_rsp_content}")
set(_sdk_args)
foreach (_lib aurora_card aurora_core aurora_dvd aurora_gd aurora_gx aurora_mtx
aurora_os aurora_pad aurora_si aurora_vi)
if (TARGET ${_lib})
list(APPEND _sdk_args --sdk-lib "$<TARGET_FILE:${_lib}>")
endif ()
endforeach ()
set(_forward_args)
if (TARGET dawn::webgpu_dawn)
get_target_property(_dawn_type dawn::webgpu_dawn TYPE)
if (_dawn_type STREQUAL "SHARED_LIBRARY")
list(APPEND _forward_args
--forward-dll "$<TARGET_FILE:dawn::webgpu_dawn>"
--forward-sym-prefix wgpu)
endif ()
endif ()
# Generate curated exports list from the main binary
set(_def "${CMAKE_BINARY_DIR}/${_config_subdir}dusklight_exports.def")
add_custom_command(TARGET ${target} PRE_LINK
COMMAND "${_symgen}" def
"@${_rsp}"
--out "${_def}"
--exclude cmake_pch
--exclude miniz
--exclude asan_options
--exclude src/dusk
--max-exports 58000
${_sdk_args}
${_forward_args}
COMMENT "Generating dusklight exports"
VERBATIM)
target_link_options(${target} PRIVATE "/DEF:${_def}")
# Generate import library for mods to link against.
set(_implib "${CMAKE_BINARY_DIR}/${_config_subdir}dusklight_imports.lib")
get_filename_component(_compiler_dir "${CMAKE_CXX_COMPILER}" DIRECTORY)
find_program(DUSK_LLVM_DLLTOOL llvm-dlltool HINTS "${_compiler_dir}")
if (DUSK_LLVM_DLLTOOL)
set(_implib_cmd "${DUSK_LLVM_DLLTOOL}" -d "${_def}" -D dusklight.exe
-m "${_dlltool_machine}" -l "${_implib}")
else ()
set(_implib_cmd "${CMAKE_AR}" /nologo "/def:${_def}" "/machine:${_lib_machine}"
/name:dusklight.exe "/out:${_implib}")
endif ()
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${_implib_cmd}
BYPRODUCTS "${_implib}"
COMMENT "Generating dusklight import library"
VERBATIM)
set(DUSK_GAME_IMPLIB "${_implib}" CACHE INTERNAL "Import library for Windows mod linking")
install(FILES "${_implib}" DESTINATION sdk RENAME "windows-${_implib_arch}.lib")
endfunction()
-9
View File
@@ -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 ()
+52 -186
View File
@@ -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,9 +64,7 @@ cmake --build --preset macos-default-relwithdebinfo
``` ```
Alternate presets available: Alternate presets available:
- `macos-default-debug`: Clang, Debug
* `macos-default-debug`: Clang, Debug
* `macos-default-debug-asan`: Clang, Debug, AddressSanitizer
**ninja (Linux)** **ninja (Linux)**
@@ -190,12 +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-default-debug-asan`: GCC, Debug, AddressSanitizer - `linux-clang-debug`: Clang, Debug
* `linux-clang-relwithdebinfo`: Clang, RelWithDebInfo
* `linux-clang-debug`: Clang, Debug
* `linux-clang-debug-asan`: Clang, Debug, AddressSanitizer
**ninja (Windows)** **ninja (Windows)**
@@ -205,28 +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-msvc-debug-asan`: MSVC, Debug, AddressSanitizer Pass the disc image as a positional argument. Supported formats: ISO (GCM), RVZ, WIA, WBFS, CISO, GCZ
* `windows-clang-relwithdebinfo`: Clang-cl, RelWithDebInfo
* `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.
-13
View File
@@ -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.
-48
View File
@@ -1,48 +0,0 @@
# Installing Dusklight on iOS via iloader
## Prerequisites
- A Windows, Linux, or macOS device
- iOS device connected to computer 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))
- Legally acquired game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL)
## 1. Install iloader
- 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.
- Windows WILL require iTunes to be installed
- Linux WILL require usbmuxd to be installed, this is installed by default in most distros though
## 2. Enable Developer Mode (iOS 16+)
- On your iPhone, go to **Settings > Privacy & Security > Developer Mode**
- Toggle it on, put in your device passcode, and restart when prompted
## 3. Install Dusklight 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)
* You may be prompted to put in a code from your iOS device if you have 2FA enabled, do so
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
* You will need to hit `Refresh` after plugging it in at this stage so that it can be detected, it does not automatically refresh
3. Leave settings unchanged (the Anisette server should stay Sidestore (.io))
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
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:
- **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
- **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
You may now use Dusklight on iOS and iPadOS!
-778
View File
@@ -1,778 +0,0 @@
# Dusklight Mod API
Mods are `.dusk` bundles: zip archives that can contain code (in the form of native libraries), resources, DVD overlay
files, and texture replacements. Mods may be enabled, disabled and reloaded at runtime.
When code mods are loaded, they get dynamically linked by the operating system to the running game process. The mod
exports lifecycle functions that Dusklight calls into (`mod_initialize`, `mod_update`, `mod_shutdown`), and the mod
communicates with the host via **services**: plain C APIs, individually versioned. Dusklight exports several built-in
services, and mods may export services of their own, permitting framework mods and cross-mod integration.
Beyond services, mods have full access to the original game's code: include game headers, call directly into any public
function, read and write data fields, and hook the vast majority of game functions.
## Table of Contents
1. [Getting Started](#getting-started)
2. [mod.json](#modjson)
3. [Anatomy of a Code Mod](#anatomy-of-a-code-mod)
4. [Services](#services)
5. [Built-in Services](#built-in-services)
6. [Hooking Game Functions](#hooking-game-functions)
7. [Asset Overlays](#asset-overlays)
8. [Runtime Lifecycle](#runtime-lifecycle)
9. [Error Handling](#error-handling)
10. [Advanced](#advanced)
---
## Getting Started
Fork the [mod template](https://github.com/TwilitRealm/mod-template), a self-contained CMake project that uses the
Dusklight mod SDK.
```
my_mod/
├── CMakeLists.txt
├── mod.json
├── src/mod.cpp
├── res/ (optional bundled resources)
├── overlay/ (optional game file overrides)
└── textures/ (optional texture replacements)
```
**CMakeLists.txt:**
```cmake
cmake_minimum_required(VERSION 3.26)
project(my_mod CXX)
if (NOT DUSKLIGHT_VERSION)
set(DUSKLIGHT_VERSION "76b56cd8b81809fce0a5c2a44e2f6d437591132f")
endif ()
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/FetchDusklight.cmake")
add_subdirectory("${DUSKLIGHT_DIR}/sdk" dusklight-sdk EXCLUDE_FROM_ALL)
add_mod(my_mod
FEATURES game # remove for service/asset-only mods; add webgpu for GfxService
SOURCES src/mod.cpp
MOD_JSON mod.json
RES_DIR res # mod resources, including icon.png and banner.png
OVERLAY_DIR overlay # game file overlays; remove if unused
TEXTURES_DIR textures # texture replacements; remove if unused
)
```
Available features:
- `game`: Allows calling into and hooking game code. Mods that **only** use services may omit it, providing a wider
range of compatibility with Dusklight versions and a slightly faster build process.
- `webgpu`: Allows importing the WebGPU API (`webgpu/webgpu.h`). Must be enabled when using
[GfxService](#gfxservice-modssvcgfxh).
Building produces `my_mod.dusk` in `build/mods/`. Copy the `.dusk` into the user mods folder:
- Windows: `%APPDATA%\TwilitRealm\Dusklight\mods`
- Linux: `~/.local/share/TwilitRealm/Dusklight/mods`
- macOS: `~/Library/Application Support/TwilitRealm/Dusklight/mods`
Passing `--mods <dir>` on the command line replaces the user directory with one of your choosing.
---
## mod.json
```json
{
"id": "com.example.my_mod",
"name": "My Mod",
"version": "1.0.0",
"author": "Your Name",
"description": "A short description shown in the mod manager.",
"icon": "res/my_icon.png",
"banner": "res/my_banner.png"
}
```
`id` is required: a unique, stable identifier (reverse-DNS style; periods, underscores, and alphanumerics). Everything
else is optional but recommended.
`icon` and `banner` are bundle-relative paths to PNG images for the in-game mod manager: the square icon (e.g.
512x512), the banner (~3.5:1). If omitted, `res/icon.png` and `res/banner.png` are used automatically when present.
---
## Anatomy of a Code Mod
```cpp
#include "mods/service.hpp"
#include "mods/svc/log.h"
DEFINE_MOD(); // once, in exactly one translation unit
IMPORT_SERVICE(LogService, svc_log); // resolved by the loader before mod_initialize
extern "C" {
MOD_EXPORT ModResult mod_initialize(ModError* error) {
svc_log->info(mod_ctx, "hello from my_mod");
return MOD_OK;
}
MOD_EXPORT ModResult mod_update(ModError* error) { // called every frame
return MOD_OK;
}
MOD_EXPORT ModResult mod_shutdown(ModError* error) {
return MOD_OK;
}
}
```
All three lifecycle exports are required. `mod_ctx` is your mod's identity token, set by the loader before
`mod_initialize` runs. Pass it as the first argument to every service call.
---
## Services
A service is a struct of C function pointers with a version header. You declare what you use at file scope, and the
loader resolves it before your mod initializes:
```cpp
IMPORT_SERVICE(LogService, svc_log); // required, latest minor version
IMPORT_SERVICE_VERSION(LogService, svc_log, 0); // required, minimum minor version 0 (for backwards compatibility)
IMPORT_OPTIONAL_SERVICE(SomeService, svc_maybe); // may be null
```
Each service is individually versioned, and there may be multiple major versions of a service provided at once,
allowing backwards compatibility with older mods while still changing services fundamentally if necessary. A **major**
bump is a breaking change, treated as a different service entirely. For **additive** changes, a service appends new
functions to the end of the struct without breaking existing callers and simply bumps the minor version.
`IMPORT_SERVICE` and `IMPORT_OPTIONAL_SERVICE` require the latest minor version compiled against, making every field in
the service safe to call. A mod can use `IMPORT_SERVICE_VERSION` (or its optional counterpart) with an older minor
version to remain compatible with older Dusklight versions, then use `SERVICE_HAS` to check at runtime for fields added
after that explicitly requested version.
The contract (see `sdk/include/mods/api.h` for the full version):
- **A required import is guaranteed valid.** If the service is missing or too old, the mod fails to load with a clear
error. No need to null check at call sites.
- **Anything at or below the minor version you imported can be called unconditionally.** The default macros import
the service type's current minor version; the versioned macros explicitly override that minimum.
- Optional imports may be null; check once in `mod_initialize`.
- Fields newer than your imported minor version must be gated behind `SERVICE_HAS(service, ServiceType, field)` plus a
null check.
---
## Built-in Services
### LogService (`mods/svc/log.h`)
```cpp
IMPORT_SERVICE(LogService, svc_log);
svc_log->info(mod_ctx, "spawned the thing");
svc_log->warn(mod_ctx, "that looks wrong");
svc_log->error(mod_ctx, "very bad");
svc_log->write(mod_ctx, LOG_LEVEL_DEBUG, "verbose details");
```
Messages appear in the console prefixed with your mod ID. Messages are plain UTF-8 strings and are copied before the
call returns; use `snprintf` or `fmt::format` for formatting.
### ResourceService (`mods/svc/resource.h`)
Loads files from the `res/` tree of your `.dusk` archive. Paths are relative to `res/` (pass `"config.txt"`, not
`"res/config.txt"`); absolute paths and `..` are rejected.
```cpp
IMPORT_SERVICE(ResourceService, svc_resource);
ResourceBuffer buf = RESOURCE_BUFFER_INIT;
if (svc_resource->load(mod_ctx, "config.txt", &buf) == MOD_OK) {
// buf.data / buf.size
svc_resource->free(mod_ctx, &buf);
}
```
Missing files return `MOD_UNAVAILABLE`. Always `free` what you `load`. Note that the bundle is read-only; for writable
storage, use the directory from `svc_host->mod_dir(mod_ctx)`.
### HostService (`mods/svc/host.h`)
Mod metadata and runtime interaction with the loader:
```cpp
IMPORT_SERVICE(HostService, svc_host);
const char* id = svc_host->mod_id(mod_ctx);
const char* dir = svc_host->mod_dir(mod_ctx); // writable per-mod directory
svc_host->fail(mod_ctx, MOD_ERROR, "something unrecoverable happened"); // disables the mod
```
`get_service`/`publish_service` provide dynamic service lookup; see [Exporting Services](#exporting-services).
**Lifecycle watches.** If your mod provides a service that hands out per-caller state (registrations, callbacks,
handles), watch other mods' lifecycle and drop what you hold for a mod when it detaches.
```cpp
IMPORT_SERVICE(HostService, svc_host);
void on_mod_lifecycle(ModContext* ctx, ModContext* subject, const char* subject_id,
ModLifecycleEvent event, void* user_data) {
if (event == MOD_LIFECYCLE_DETACHED) {
drop_state_for(subject); // same ModContext* the subject passed into your service
}
}
uint64_t watch = 0;
svc_host->watch_mod_lifecycle(mod_ctx, on_mod_lifecycle, nullptr, &watch);
```
`MOD_LIFECYCLE_DETACHED` fires on the game thread at a lifecycle safe point, after the subject's `mod_shutdown` ran and
every service dropped its state. For your own mod's teardown, use `mod_shutdown` instead.
### HookService (`mods/svc/hook.h`)
Installs hooks on game functions and resolves symbols by name. You'll rarely call it directly; use the typed helpers in
`mods/hook.hpp` described in [Hooking Game Functions](#hooking-game-functions).
### OverlayService (`mods/svc/overlay.h`)
Registers DVD file overlays at runtime: the dynamic counterpart to the static `overlay/` directory (see
[Asset Overlays](#asset-overlays)). Overlay a disc path with a file from your bundle, or with a caller-owned buffer
(copied on registration):
```cpp
IMPORT_SERVICE(OverlayService, svc_overlay);
OverlayHandle handle = 0;
svc_overlay->add_file(mod_ctx, "/res/Msgus.arc", "res/replacement.arc", &handle);
svc_overlay->add_buffer(mod_ctx, "/generated.txt", data, size, nullptr);
svc_overlay->remove(mod_ctx, handle);
```
`disc_path` must be absolute (leading `/`) and is matched against the disc case-insensitively. Paths that don't exist
on the disc are added as new files. Changes are applied at the next frame boundary, and data the game already read
stays in memory until the file is re-read: sometimes a scene reload, and in the worst case, a full restart.
See [Asset Overlays](#asset-overlays) for priority and conflict handling.
### TextureService (`mods/svc/texture.h`)
Registers texture replacements at runtime: the dynamic counterpart to the static `textures/` directory (see
[Asset Overlays](#asset-overlays)). Two forms: raw texel data with an explicit key, or an encoded `.dds`/`.png` from
your bundle whose filename encodes the key:
```cpp
IMPORT_SERVICE(TextureService, svc_texture);
// Encoded file; filename follows the replacement naming convention.
TextureReplacementHandle handle = 0;
svc_texture->register_file(mod_ctx, "res/tex1_32x32_$_6.png", &handle);
// Raw data: match by texel-data pointer or by content hash (TEXTURE_KEY_SOURCE).
TextureKey key = TEXTURE_KEY_INIT;
key.kind = TEXTURE_KEY_POINTER;
key.pointer = someTexObj.data;
TextureData data = TEXTURE_DATA_INIT;
data.data = pixels; data.size = pixelsSize;
data.width = 32; data.height = 32; data.gx_format = GX_TF_RGBA8_PC;
svc_texture->register_data(mod_ctx, &key, &data, nullptr);
svc_texture->unregister(mod_ctx, handle);
```
Filenames use the same Dolphin-style convention as the user's `texture_replacements` directory:
`tex1_{w}x{h}_{texhash}[_{tluthash}]_{fmt}.dds|.png`, where hashes may be `$` (wildcard). `_mipN` sidecar files next to
a registered file are picked up automatically. Files are decoded lazily on first use by the renderer; raw data is copied
at registration. Registrations follow your mod's lifecycle.
See [Asset Overlays](#asset-overlays) for priority and conflict handling.
### ConfigService (`mods/svc/config.h`)
Persistent, mod-scoped configuration variables. Each var is stored in the user's `config.json` under
`mod.<escaped mod id>.<name>` (escaping: `.``_`, `_``__`, so `com.example.my_mod` becomes `com_example_my__mod`),
next to the host's own settings:
```cpp
IMPORT_SERVICE(ConfigService, svc_config);
ConfigVarDesc desc = CONFIG_VAR_DESC_INIT;
desc.name = "speedMultiplier"; // 1-64 chars from [A-Za-z0-9_-]; "enabled" is reserved
desc.type = CONFIG_VAR_FLOAT;
desc.default_float = 1.0;
ConfigVarHandle var = 0;
svc_config->register_var(mod_ctx, &desc, &var);
double speed = 1.0;
svc_config->get_float(mod_ctx, var, &speed);
svc_config->set_float(mod_ctx, var, 2.0);
// Optional: get notified when the value changes.
void on_speed_changed(ModContext* ctx, ConfigVarHandle var, const ConfigVarValue* value,
const ConfigVarValue* previous, void* user_data) {
/* value->float_value is the new value, previous->float_value the old one */
}
svc_config->subscribe(mod_ctx, var, on_speed_changed, nullptr, nullptr);
```
Types: `CONFIG_VAR_BOOL` (`bool`), `CONFIG_VAR_INT` (`int64_t`), `CONFIG_VAR_FLOAT` (`double`), `CONFIG_VAR_STRING`
(UTF-8; `get_string` copies into a caller buffer, pass a `NULL` buffer with size 0 to query the length). Accessors are
typed and must match the registration.
Change callbacks fire on the game thread whenever the value changes at runtime (your own `set_*` calls included).
Writes that store the same value are silent. Values applied from `config.json` or `--cvar` at registration do
**not** fire callbacks; read the value after `register_var` for the starting state.
### UiService (`mods/svc/ui.h`)
Integrate seamlessly with Dusklight's UI system: add controls and buttons to your mod's detail pane in the Mods window,
create custom windows and modal dialogs, apply custom RCSS stylesheets (anywhere!), and add menu bar tabs.
**Mod panel:** Registers or replaces the panel rendered in your mod's detail pane; `build` runs every time the detail
content is rebuilt, and `update` runs every frame while that mod is selected. While your mod is selected, the detail
pane carries your mod's id as a `mod-id` attribute (like custom window roots), so scoped RCSS can target it (e.g.
`[mod-id="com.example.mod"]`).
```cpp
IMPORT_SERVICE(UiService, svc_ui);
UiElementHandle statusText = 0;
ModResult build(ModContext*, UiElementHandle panel, void*, ModError*) {
svc_ui->pane_add_section(mod_ctx, panel, "Status");
svc_ui->pane_add_text(mod_ctx, panel, "starting...", &statusText);
svc_ui->pane_add_progress(mod_ctx, panel, 0.5f, nullptr);
return MOD_OK;
}
ModResult update(ModContext*, void*, ModError*) {
svc_ui->elem_set_text(mod_ctx, statusText, "running");
return MOD_OK;
}
UiModsPanelDesc panel = UI_MODS_PANEL_DESC_INIT;
panel.build = build;
panel.update = update;
svc_ui->register_mods_panel(mod_ctx, &panel);
```
Element setters must match the element kind: `elem_set_text`/`elem_set_rml` on text rows, and `elem_set_progress` on
progress bars. `elem_set_class` sets or clears an RCSS class on any element handle, for styling via scoped or
per-window RCSS. A non-`MOD_OK` result from `build`/`update` fails your mod, as do exceptions thrown from any UI
callback.
**Controls:** `pane_add_control` adds an input row described by a `UiControlDesc`: `UI_CONTROL_BUTTON`,
`UI_CONTROL_TOGGLE`, `UI_CONTROL_NUMBER`, `UI_CONTROL_STRING`, or `UI_CONTROL_SELECT`. Values bind with callbacks or
directly to a config var.
```cpp
UiControlDesc control = UI_CONTROL_DESC_INIT;
control.kind = UI_CONTROL_TOGGLE;
control.label = "Enable rainbows";
control.help_rml = "Shown in the help pane while focused.";
control.binding = UI_BINDING_CONFIG_VAR;
control.config_var = myBoolVar; // from svc_config->register_var
svc_ui->pane_add_control(mod_ctx, leftPane, &control, nullptr);
```
`UI_BINDING_CONFIG_VAR` wires persistence, change notifications, and the modified indicator automatically. The var
type must match the control: `TOGGLE` = bool, `NUMBER` and `SELECT` = int, `STRING` = string. Float vars are not
bindable; use callbacks and convert. `help_rml` and `SELECT` option lists render in a help pane, so `SELECT` controls
are only available inside window tabs.
**Windows:** `window_push` pushes a tabbed two-pane window onto the document stack and shows it. Each tab's `build`
receives the window handle plus fresh left and right pane handles on every activation. The optional per-tab `update`
runs each frame while that tab is active. `on_closed` fires when the window is destroyed. `desc.rcss` optionally styles
that window's document only; custom windows carry the owning mod's id as a `mod-id` attribute on the window root, so
scoped RCSS can target your specific mod's windows (e.g. `window[mod-id="com.example.mod"]`).
```cpp
UiTabDesc tabs[1] = {UI_TAB_DESC_INIT};
tabs[0].title = "Options";
tabs[0].build = build_options_tab;
UiWindowDesc desc = UI_WINDOW_DESC_INIT;
desc.tabs = tabs;
desc.tab_count = 1;
desc.on_closed = options_window_closed;
UiWindowHandle window = 0;
svc_ui->window_push(mod_ctx, &desc, &window);
```
**Dialogs:** `dialog_push` shows a modal dialog. `variant` picks the style, `icon` optionally overrides the variant's
default icon, and actions become buttons. After an action's `on_pressed` returns, the dialog closes unless the action
sets `keep_open`. A `keep_open` action can close it later (or immediately) with `dialog_close`. Cancel fires
`on_dismiss` if present and always closes. `dialog_set_body`, `dialog_set_icon`, and `dialog_add_action` mutate a live
dialog.
**Menu bar tabs:** `register_menu_tab` adds a tab to the in-game menu bar. `on_selected` fires when the user activates
the tab: typically you'd push a window from it. The tab is removed by `unregister_menu_tab`, or automatically when the
mod is disabled.
**Custom styles:** `register_styles(scope, rcss, &handle)` applies an RCSS stylesheet to every document of a scope:
existing documents restyle immediately, and future ones pick it up when created. `register_styles_file(scope, path,
&handle)` reads the sheet from your bundle's `res/` directory. Scopes are `UI_SCOPE_PRELAUNCH`, `UI_SCOPE_WINDOW`,
`UI_SCOPE_MENU_BAR`, `UI_SCOPE_OVERLAY`, `UI_SCOPE_TOUCH_CONTROLS`, and `UI_SCOPE_GRAPHICS_TUNER`. Sheets apply after
host styles and may override them. Scope selectors tightly (use `[mod-id="..."]`!), especially for `UI_SCOPE_WINDOW`,
unless changing host UI is intentional.
### GfxService (`mods/svc/gfx.h`)
**Requires `add_mod(... FEATURES webgpu)`**
Direct WebGPU access at various stages of the rendering pipeline. Mods use the `wgpu*` C API (via `webgpu/webgpu.h`) for
custom draws and compute dispatches. Mods must manage their own WebGPU state, including pipelines and bind groups.
```cpp
IMPORT_SERVICE(GfxService, svc_gfx);
GfxDeviceInfo info = GFX_DEVICE_INFO_INIT;
svc_gfx->get_device_info(mod_ctx, &info);
```
`register_stage_hook` runs a game-thread callback during frame recording. The public stages are:
- `GFX_STAGE_SCENE_BEGIN`: world camera window after camera/projection/light setup
- `GFX_STAGE_SCENE_AFTER_TERRAIN`: after terrain/shadow lists, before object and translucent lists
- `GFX_STAGE_SCENE_AFTER_OPAQUE`: after sky/terrain/object opaque lists, before translucent lists
- `GFX_STAGE_FRAME_BEFORE_HUD`: 3D scene and wipe are complete, before 2D/HUD lists
- `GFX_STAGE_FRAME_AFTER_HUD`: full game scene, including HUD
Inside a stage callback, record work with `push_draw`, stream per-frame data with `push_verts`, `push_indices`,
`push_uniform`, or `push_storage`, snapshot the current frame with `resolve_pass`, and use `create_pass`/`resolve_pass`
for temporary offscreen passes. Draw callbacks run later on the render worker thread with the live
`WGPURenderPassEncoder`; they may use only their `GfxDrawContext` handles and raw `wgpu*` calls. Compute callbacks
registered with `register_compute_type` follow the same worker-thread rule and run on the frame command encoder.
All WGPU handles from the service are borrowed. Resolved target views are valid for the current frame only. GPU objects
created by a mod are owned by that mod and should be released in `mod_shutdown`.
### CameraService (`mods/svc/camera.h`)
Converts a game view provided by a render callback into WebGPU-convention camera data. Matrix fields are column-major
`float[16]` values using the matrix * column-vector convention (transpose of the game's row-major `Mtx`/`Mtx44` layout),
ready to copy into WGSL `mat4x4f` uniforms.
```cpp
IMPORT_SERVICE(CameraService, svc_camera);
CameraInfo camera = CAMERA_INFO_INIT;
if (svc_camera->get_camera(mod_ctx, game_view, &camera) == MOD_OK) {
// camera.view_from_world, camera.proj_from_view, camera.eye, ...
}
```
`get_camera` returns `MOD_UNAVAILABLE` while the view is not a valid perspective camera, such as before the
first in-game frame. Projection matrices match the renderer's WebGPU clip convention and renderer depth convention
(reversed-Z by default).
---
## Hooking Game Functions
**Requires `add_mod(... FEATURES game)`**
Mods may hook the vast majority of game functions, including file-local static, private and virtual functions.
`mods/hook.hpp` provides typed helpers over the hook service:
```cpp
#include "mods/hook.hpp"
#include "mods/svc/hook.h"
IMPORT_SERVICE(HookService, svc_hook);
DEFINE_HOOK(&daAlink_c::posMove, LinkPosMove);
DEFINE_HOOK(&daAlink_c::execute, LinkExecute);
```
Every hook target must be **declared** at namespace scope with `DEFINE_HOOK` (a target you can name in C++) or
`DEFINE_HOOK_SYMBOL` (a symbol name).
### Pre-hooks
Run before the original. Return `HOOK_SKIP_ORIGINAL` to cancel it (post-hooks still run).
```cpp
HookAction on_pos_move_pre(ModContext*, void* args, void* retval, void* userdata) {
daAlink_c* link = mods::arg<daAlink_c*>(args, 0); // arg 0 is `this`
if (link->shape_angle.y > 10000) {
return HOOK_SKIP_ORIGINAL;
}
return HOOK_CONTINUE;
}
mods::hook_add_pre<LinkPosMove>(svc_hook, on_pos_move_pre);
```
### Post-hooks
Run after the original (or after a replace-hook, or after a cancelled original). `retval` points to the return value,
if any.
```cpp
void on_pos_move_post(ModContext*, void* args, void* retval, void* userdata) { ... }
mods::hook_add_post<LinkPosMove>(svc_hook, on_pos_move_post);
```
### Replace-hooks
Substitute the original entirely. Call through to it via the declaration's `g_orig` if needed:
```cpp
void on_execute_replace(ModContext*, void* args, void* retval, void*) {
int result = LinkExecute::g_orig(mods::arg<daAlink_c*>(args, 0));
if (retval != nullptr) {
*static_cast<int*>(retval) = result;
}
}
mods::hook_replace<LinkExecute>(svc_hook, on_execute_replace);
```
By default a second replace-hook on the same function is a conflict; `HookOptions` (`replace_policy`, `priority`,
`userdata`) controls this and callback ordering. Multiple mods can attach pre/post hooks to the same function
independently.
### Hooking by name
Functions you can't name in C++ (file-local statics, private class members, anything not in a header) can be hooked by
symbol name instead. You must supply the signature along with the name.
```cpp
DEFINE_HOOK_SYMBOL("daAlink_hookshotAtHitCallBack",
void(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*), HookshotHit);
mods::hook_add_pre<HookshotHit>(svc_hook, on_hookshot_hit_pre);
...
HookshotHit::g_orig(link, atObjInf, target, tgObjInf); // call through to the original
```
Class member functions must include `Class*` as the first argument.
Two spellings work on every platform:
- **Display names** (`daAlink_c::posMove`, `fapGm_Before`): the qualified name with no parameter list. They carry no
signature, so overload sets (and file-local statics sharing a name) return `MOD_CONFLICT`.
- **Decorated names** (`_ZN9daAlink_c7posMoveEv` / `?posMove@daAlink_c@@...`): the platform's mangled spelling in
dlsym convention (no Mach-O leading underscore). The escape hatch for overloads.
Installing fails with `MOD_UNAVAILABLE` when it didn't resolve (missing, ambiguous, or no symbol manifest). Unlike
`DEFINE_HOOK`, the signature is **not** compiler-checked: a mismatched signature will corrupt the
call.
### Reading and writing arguments
`args` is an array of pointers to the arguments. For member functions, index 0 is `this`; parameters follow in
declaration order.
```cpp
T value = mods::arg<T>(args, n); // copy
T& ref = mods::arg_ref<T>(args, n); // read/write reference
```
```cpp
DEFINE_HOOK(fopAcM_createItem, CreateItem);
// fpc_ProcID fopAcM_createItem(..., int itemNo, ...): turn heart drops into green rupees
HookAction on_create_item_pre(ModContext*, void* args, void*, void*) {
int& itemNo = mods::arg_ref<int>(args, 1);
if (itemNo == dItemNo_HEART_e) {
itemNo = dItemNo_GREEN_RUPEE_e;
}
return HOOK_CONTINUE;
}
mods::hook_add_pre<CreateItem>(svc_hook, on_create_item_pre);
```
For reference parameters (e.g. `const cXyz& pos`), `arg_ref<cXyz>` yields a direct reference.
---
## Asset Overlays
Files placed under `overlay/` in the `.dusk` archive override game files at the corresponding path, equivalent to
replacing files in the .iso. This requires no code: an archive with just `mod.json` and `overlay/` is a complete mod.
Files placed under `textures/` register as texture replacements, and act just like the user's general
`texture_replacements/` directory: Dolphin-style naming, matched by texture hash
(`tex1_{w}x{h}_{texhash}[_{tluthash}]_{fmt}.dds|.png`, `$` as a hash wildcard). Subdirectories are scanned recursively;
only the filename needs to match.
Both mechanisms are tied to the mod's lifecycle: disabling the mod removes its overrides (files revert to the disc
contents on their next open; added files stop existing), and reloading serves the new bundle's content. However, game
data the engine already read stays as-is until it is loaded again, which may require a scene change or, in the worst
case, a full restart. Texture replacements usually take effect immediately.
If multiple sources replace the same file or texture, the last one wins: runtime registrations override static
`textures/` or `overlay/` files, and later-loaded mods override earlier ones. Cross-mod conflicts log warnings.
**All** mod-provided texture replacements override the user's `texture_replacements/`.
To configure overlays and texture replacements at runtime instead, see [OverlayService](#overlayservice-modssvcoverlayh)
and [TextureService](#textureservice-modssvctextureh).
---
## Runtime Lifecycle
Mods can be disabled, re-enabled, and reloaded at runtime without restarting the game (the enabled state persists as the
`mod.<escaped id>.enabled` config var). Write your mod assuming this happens:
- **Disable** calls `mod_shutdown`, removes your hooks, services, overlays, and texture replacements (both static and
runtime-registered), and unloads your library.
- **Enable** and **Reload** load a *fresh copy* of your library, imports are re-resolved, and `mod_initialize` runs
again. You never see a second `mod_initialize` on the same image, so just make `mod_shutdown` release anything the
loader doesn't manage for you (threads, files, game-side state you mutated).
- **Reload** additionally re-reads the `.dusk` from disk, picking up a rebuilt library and changed assets. This is the
fast iteration loop during development: rebuild, click Reload.
**Dependents restart too.** Disabling or reloading a mod that exports services shuts down the mods importing them
first (in reverse dependency order) and brings them back afterward. A mod whose *required* provider is disabled stays
suspended and resumes automatically when the provider returns. Mods with an *optional* import of a disabled provider
restart with that import null.
**One caution for hooks:** lifecycle changes are applied between frames, which is safe for hooks on functions
that return every frame (effectively everything you'd normally hook). Avoid hooking a function that stays on
the stack for the whole session (e.g. the outermost main loop); a mod that does cannot be safely unloaded.
---
## Error Handling
Service calls report failure through `ModResult` return values (`MOD_OK`, `MOD_UNAVAILABLE`,
`MOD_INVALID_ARGUMENT`, ...). Lifecycle exports additionally receive a `ModError*`: fill it (e.g. with
`mods::set_error(error, code, "message")`) and return the code, and the loader disables the mod and shows the
message to the user.
```cpp
MOD_EXPORT ModResult mod_initialize(ModError* error) {
if (!load_my_data()) {
return mods::set_error(error, MOD_ERROR, "failed to load data");
}
return MOD_OK;
}
```
Throwing exceptions out of lifecycle functions also disables the mod (they are caught by the loader), but prefer
explicit results.
---
## Advanced
### Exporting Services
Mods may export services of their own, permitting framework mods and cross-mod integration. Define the interface in a
header both mods share:
```cpp
// my_mod_api.h
#include "mods/api.h"
#define MY_MOD_SERVICE_ID "com.example.my_mod.api"
#define MY_MOD_SERVICE_MAJOR 1u
#define MY_MOD_SERVICE_MINOR 0u
typedef struct MyModService {
ServiceHeader header;
ModResult (*do_thing)(ModContext* ctx, int value);
} MyModService;
#ifdef __cplusplus
#include "mods/service.hpp"
template <>
struct mods::ServiceTraits<MyModService> {
static constexpr const char* id = MY_MOD_SERVICE_ID;
static constexpr uint16_t major_version = MY_MOD_SERVICE_MAJOR;
static constexpr uint16_t minor_version = MY_MOD_SERVICE_MINOR;
};
#endif
```
**Provider:**
```cpp
ModResult do_thing(ModContext* ctx, int value) { ... }
constexpr MyModService g_service{
.header = SERVICE_HEADER(MyModService, MY_MOD_SERVICE_MAJOR, MY_MOD_SERVICE_MINOR),
.do_thing = do_thing,
};
EXPORT_SERVICE(g_service);
```
**Consumer:**
```cpp
IMPORT_SERVICE(MyModService, svc_my_mod);
// or IMPORT_OPTIONAL_SERVICE if the dependency is optional
svc_my_mod->do_thing(mod_ctx, 42);
```
The loader registers all exports before resolving any imports, so declaration order between mods doesn't matter. Note
that the `ctx` a provider receives identifies the *calling* mod.
#### Dependencies between mods
Service imports are also dependency declarations: the loader initializes mods in dependency order, so by the time your
`mod_initialize` runs, every mod you import services from (required *or* optional) has already finished its own
`mod_initialize`. This includes deferred services: a service the provider publishes during its initialization resolves
into your import slot just like a static export.
Consequences of that contract:
- If a provider fails to load, every mod that *requires* one of its services is disabled too, with an error naming the
provider. Optional imports of a failed provider simply resolve to `NULL`.
- Mods whose **required** imports form a cycle all fail to load. If the cycle runs through an **optional** import, the
loader breaks it there: the optional import still resolves, but its provider may not be initialized yet when you run.
- `svc_host->get_service(...)` is outside this system. It sees whatever is published at call time and gives no
initialization-order guarantee, which also makes it the escape hatch for intentionally cyclic designs.
Mods shut down in reverse initialization order, so services you import remain safe to call from `mod_shutdown`.
Rules for providers:
- Service IDs are global and use reverse-DNS names (e.g. `com.mydomain.mod.service`)
- Every function pointer covered by your declared minor version must be populated.
- Within a major version, only append fields; never reorder, remove, or repurpose them. Breaking changes require a major
bump (which is, in effect, a new service).
- Only one provider per `(id, major)` pair may be registered; duplicates are load errors.
For services whose construction can't happen at static-init time, declare the export with `EXPORT_DEFERRED_SERVICE(...)`
and publish the pointer later via `svc_host->publish_service(...)`. Consumers can fetch services dynamically with
`svc_host->get_service(...)`; prefer manifest imports whenever possible, since they give the loader dependency
information and fail fast with good errors.
### Native Runtime Libraries
`RUNTIME_LIBRARIES` passed to `add_mod` are packaged beside the mod's native module in `lib/<platform>/`. Dusklight
extracts the whole directory before loading the mod, so libraries linked by the mod resolve normally. The SDK links the
mod itself with `$ORIGIN` on Linux and `@loader_path` on Apple platforms; runtime libraries with their own non-system
dependencies must also be built with origin-relative lookup paths. On Windows, Dusklight uses an isolated DLL search
rooted at this directory.
```cmake
add_mod(my_mod
SOURCES src/mod.cpp
MOD_JSON mod.json
RUNTIME_LIBRARIES "${VENDOR_RUNTIME_LIBRARY}")
```
SDKs that load plugins by directory can pass them the absolute runtime path from the current HostService:
```cpp
IMPORT_SERVICE(HostService, svc_host);
const char* nativeDir = svc_host->native_dir(mod_ctx); // read-only
```
Libraries loaded explicitly by the mod remain its responsibility: stop their threads and unload them during
`mod_shutdown`. Do not write into `native_dir`; use `mod_dir` for writable state. Native library namespaces are
process-wide on some platforms, so two mods cannot safely assume that incompatible libraries with the same filename
will remain isolated.
+1 -1
+39 -299
View File
@@ -1,7 +1,7 @@
set(DOLZEL_FILES set(DOLZEL_FILES
src/m_Do/m_Do_main.cpp src/m_Do/m_Do_main.cpp
#src/m_Do/m_Do_printf.cpp src/m_Do/m_Do_printf.cpp
src/m_Do/m_Do_audio.cpp src/m_Do/m_Do_audio.cpp
src/m_Do/m_Do_controller_pad.cpp src/m_Do/m_Do_controller_pad.cpp
#src/m_Do/m_Re_controller_pad.cpp #src/m_Do/m_Re_controller_pad.cpp
@@ -1411,326 +1411,66 @@ set(DOLPHIN_FILES
) )
set(DUSK_FILES set(DUSK_FILES
include/helpers/batch.hpp include/dusk/endian_gx.hpp
include/helpers/endian_gx.hpp include/dusk/config.hpp
src/d/actor/d_a_alink_dusk.cpp include/dusk/dvd_asset.hpp
src/dusk/OSContext.cpp include/dusk/scope_guard.hpp
src/dusk/OSMutex.cpp
src/dusk/OSReport.cpp
src/dusk/OSThread.cpp
src/dusk/achievements.cpp
src/dusk/action_bindings.cpp
src/dusk/action_bindings.h
src/dusk/android_frame_rate.cpp
src/dusk/android_frame_rate.hpp
src/dusk/asserts.cpp
src/dusk/autosave.cpp
src/dusk/config.cpp
src/dusk/config.hpp
src/dusk/crash_handler.cpp
src/dusk/crash_reporting.cpp
src/dusk/data.cpp
src/dusk/data.hpp
src/dusk/discord.cpp
src/dusk/discord.hpp
src/dusk/discord_presence.cpp
src/dusk/dvd_asset.cpp src/dusk/dvd_asset.cpp
src/dusk/dvd_asset.hpp src/d/actor/d_a_alink_dusk.cpp
src/dusk/asserts.cpp
src/dusk/config.cpp
src/dusk/crash_reporting.cpp
src/dusk/endian.cpp
src/dusk/extras.c src/dusk/extras.c
src/dusk/file_select.cpp src/dusk/file_select.cpp
src/dusk/file_select.hpp src/dusk/file_select.hpp
src/dusk/frame_interpolation.cpp src/dusk/frame_interpolation.cpp
src/dusk/game_clock.cpp src/dusk/game_clock.cpp
src/dusk/gamepad_color.cpp
src/dusk/globals.cpp src/dusk/globals.cpp
src/dusk/gyro.cpp src/dusk/gyro.cpp
src/dusk/http/http.hpp src/dusk/gamepad_color.cpp
src/dusk/imgui/ImGuiActorSpawner.cpp src/dusk/io.cpp
src/dusk/imgui/ImGuiBloomWindow.cpp src/dusk/layout.cpp
src/dusk/imgui/ImGuiBloomWindow.hpp src/dusk/logging.cpp
src/dusk/imgui/ImGuiCameraOverlay.cpp src/dusk/settings.cpp
src/dusk/stubs.cpp
#src/dusk/m_Do_ext_dusk.cpp
src/dusk/imgui/ImGuiConfig.hpp src/dusk/imgui/ImGuiConfig.hpp
src/dusk/imgui/ImGuiConsole.cpp
src/dusk/imgui/ImGuiConsole.hpp src/dusk/imgui/ImGuiConsole.hpp
src/dusk/imgui/ImGuiControllerOverlay.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/ImGuiHeapOverlay.cpp src/dusk/imgui/ImGuiMenuGame.cpp
src/dusk/imgui/ImGuiMenuGame.hpp
src/dusk/imgui/ImGuiBloomWindow.cpp
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/ImGuiMenuRandomizer.cpp src/dusk/imgui/ImGuiPreLaunchWindow.cpp
src/dusk/imgui/ImGuiMenuRandomizer.hpp src/dusk/imgui/ImGuiPreLaunchWindow.hpp
src/dusk/imgui/ImGuiFirstRunPreset.hpp
src/dusk/imgui/ImGuiFirstRunPreset.cpp
src/dusk/imgui/ImGuiProcessOverlay.cpp src/dusk/imgui/ImGuiProcessOverlay.cpp
src/dusk/imgui/ImGuiSaveEditor.cpp src/dusk/imgui/ImGuiCameraOverlay.cpp
src/dusk/imgui/ImGuiStateShare.cpp src/dusk/imgui/ImGuiHeapOverlay.cpp
src/dusk/imgui/ImGuiStateShare.hpp src/dusk/imgui/ImGuiActorSpawner.cpp
src/dusk/imgui/ImGuiDebugPad.cpp
src/dusk/imgui/ImGuiControllerOverlay.cpp
src/dusk/imgui/ImGuiStubLog.cpp src/dusk/imgui/ImGuiStubLog.cpp
src/dusk/io.cpp src/dusk/imgui/ImGuiMapLoader.cpp
src/dusk/iso_validate.cpp src/dusk/imgui/ImGuiSaveEditor.cpp
src/dusk/layout.cpp src/dusk/imgui/ImGuiStateShare.hpp
src/dusk/livesplit.cpp src/dusk/imgui/ImGuiStateShare.cpp
src/dusk/logging.cpp src/dusk/imgui/ImGuiAchievements.hpp
src/dusk/menu_pointer.cpp src/dusk/imgui/ImGuiAchievements.cpp
src/dusk/menu_pointer.h
src/dusk/mods/loader/bundle_disk.cpp
src/dusk/mods/loader/bundle_zip.cpp
src/dusk/mods/loader/context.cpp
src/dusk/mods/loader/depgraph.cpp
src/dusk/mods/loader/depgraph.hpp
src/dusk/mods/loader/loader.cpp
src/dusk/mods/loader/loader.hpp
src/dusk/mods/loader/native_module.cpp
src/dusk/mods/loader/native_module.hpp
src/dusk/mods/loader/prepatch.cpp
src/dusk/mods/loader/prepatch.hpp
src/dusk/mods/log_buffer.cpp
src/dusk/mods/log_buffer.hpp
src/dusk/mods/manifest.cpp
src/dusk/mods/manifest.hpp
src/dusk/mods/svc/camera.cpp
src/dusk/mods/svc/config.cpp
src/dusk/mods/svc/config.hpp
src/dusk/mods/svc/game.cpp
src/dusk/mods/svc/gfx.cpp
src/dusk/mods/svc/hook.cpp
src/dusk/mods/svc/host.cpp
src/dusk/mods/svc/log.cpp
src/dusk/mods/svc/overlay.cpp
src/dusk/mods/svc/registry.cpp
src/dusk/mods/svc/registry.hpp
src/dusk/mods/svc/resource.cpp
src/dusk/mods/svc/texture.cpp
src/dusk/mods/svc/ui.cpp
src/dusk/mods/svc/ui.hpp
src/dusk/mouse.cpp
src/dusk/scope_guard.hpp
src/dusk/settings.cpp
src/dusk/speedrun.cpp
src/dusk/stubs.cpp
src/dusk/texture_replacements.cpp
src/dusk/texture_replacements.hpp
src/dusk/touch_camera.cpp
src/dusk/ui/achievements.cpp
src/dusk/ui/achievements.hpp
src/dusk/ui/bool_button.cpp
src/dusk/ui/bool_button.hpp
src/dusk/ui/button.cpp
src/dusk/ui/button.hpp
src/dusk/ui/component.cpp
src/dusk/ui/component.hpp
src/dusk/ui/controller_config.cpp
src/dusk/ui/controller_config.hpp
src/dusk/ui/cosmetics.hpp
src/dusk/ui/cosmetics.cpp
src/dusk/ui/controls.hpp
src/dusk/ui/document.cpp
src/dusk/ui/document.hpp
src/dusk/ui/editor.cpp
src/dusk/ui/editor.hpp
src/dusk/ui/event.cpp
src/dusk/ui/event.hpp
src/dusk/ui/graphics_tuner.cpp
src/dusk/ui/graphics_tuner.hpp
src/dusk/ui/icon_provider.cpp
src/dusk/ui/icon_provider.hpp
src/dusk/ui/input.cpp
src/dusk/ui/input.hpp
src/dusk/ui/logs_window.cpp
src/dusk/ui/logs_window.hpp
src/dusk/ui/menu_bar.cpp
src/dusk/ui/menu_bar.hpp
src/dusk/ui/mod_texture_provider.cpp
src/dusk/ui/mod_texture_provider.hpp
src/dusk/ui/mod_window.cpp
src/dusk/ui/mod_window.hpp
src/dusk/ui/modal.cpp
src/dusk/ui/modal.hpp
src/dusk/ui/mods_window.cpp
src/dusk/ui/mods_window.hpp
src/dusk/ui/nav_types.hpp
src/dusk/ui/number_button.cpp
src/dusk/ui/number_button.hpp
src/dusk/ui/overlay.cpp
src/dusk/ui/overlay.hpp
src/dusk/ui/pane.cpp
src/dusk/ui/pane.hpp
src/dusk/ui/prelaunch.cpp
src/dusk/ui/prelaunch.hpp
src/dusk/ui/preset.cpp
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.hpp
src/dusk/ui/settings.cpp
src/dusk/ui/settings.hpp
src/dusk/ui/string_button.cpp
src/dusk/ui/string_button.hpp
src/dusk/ui/tab_bar.cpp
src/dusk/ui/tab_bar.hpp
src/dusk/ui/touch_controls.cpp
src/dusk/ui/touch_controls.hpp
src/dusk/ui/touch_controls_common.cpp
src/dusk/ui/touch_controls_common.hpp
src/dusk/ui/touch_controls_editor.cpp
src/dusk/ui/touch_controls_editor.hpp
src/dusk/ui/ui.cpp
src/dusk/ui/ui.hpp
src/dusk/ui/warp.cpp
src/dusk/ui/warp.hpp
src/dusk/ui/window.cpp
src/dusk/ui/window.hpp
src/dusk/ui/rando_config.cpp
src/dusk/ui/rando_config.hpp
src/dusk/ui/rando_seed_generation.cpp
src/dusk/ui/rando_seed_generation.hpp
src/dusk/achievements.cpp src/dusk/achievements.cpp
src/dusk/iso_validate.cpp src/dusk/iso_validate.cpp
src/dusk/livesplit.cpp src/dusk/livesplit.cpp
src/dusk/offset_ptr.cpp
src/dusk/vmem.cpp
src/dusk/OSContext.cpp src/dusk/OSContext.cpp
src/dusk/OSReport.cpp
src/dusk/OSThread.cpp src/dusk/OSThread.cpp
src/dusk/OSMutex.cpp src/dusk/OSMutex.cpp
src/dusk/mods/log_buffer.cpp
src/dusk/mods/log_buffer.hpp
src/dusk/mods/manifest.cpp
src/dusk/mods/manifest.hpp
src/dusk/mods/loader/bundle_disk.cpp
src/dusk/mods/loader/bundle_zip.cpp
src/dusk/mods/loader/context.cpp
src/dusk/mods/loader/depgraph.cpp
src/dusk/mods/loader/depgraph.hpp
src/dusk/mods/loader/loader.cpp
src/dusk/mods/loader/loader.hpp
src/dusk/mods/loader/native_module.cpp
src/dusk/mods/loader/native_module.hpp
src/dusk/mods/svc/camera.cpp
src/dusk/mods/svc/config.cpp
src/dusk/mods/svc/config.hpp
src/dusk/mods/svc/game.cpp
src/dusk/mods/svc/gfx.cpp
src/dusk/mods/svc/hook.cpp
src/dusk/mods/svc/host.cpp
src/dusk/mods/svc/log.cpp
src/dusk/mods/svc/overlay.cpp
src/dusk/mods/svc/resource.cpp
src/dusk/mods/svc/texture.cpp
src/dusk/mods/svc/ui.cpp
src/dusk/mods/svc/ui.hpp
src/dusk/mods/svc/registry.cpp
src/dusk/mods/svc/registry.hpp
src/dusk/discord.cpp
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
src/dusk/update_check.cpp
src/dusk/update_check.hpp
src/dusk/version.cpp
src/dusk/cosmetics/color_utils.hpp
src/dusk/cosmetics/color_utils.cpp
src/dusk/cosmetics/midna_hair_color.hpp
src/dusk/cosmetics/midna_hair_color.cpp
src/dusk/cosmetics/texture_utils.hpp
src/dusk/cosmetics/texture_utils.cpp
# Randomizer files
src/dusk/randomizer/game/custom_flow_ids.hpp
src/dusk/randomizer/game/flags.cpp
src/dusk/randomizer/game/flags.h
src/dusk/randomizer/game/messages.cpp
src/dusk/randomizer/game/messages.hpp
src/dusk/randomizer/game/stages.cpp
src/dusk/randomizer/game/stages.h
src/dusk/randomizer/game/tools.cpp
src/dusk/randomizer/game/tools.h
src/dusk/randomizer/game/verify_item_functions.cpp
src/dusk/randomizer/game/verify_item_functions.h
src/dusk/randomizer/game/randomizer_context.cpp
src/dusk/randomizer/game/randomizer_context.hpp
src/dusk/randomizer/generator/logic/area.cpp
src/dusk/randomizer/generator/logic/area.hpp
src/dusk/randomizer/generator/logic/dungeon.cpp
src/dusk/randomizer/generator/logic/dungeon.hpp
src/dusk/randomizer/generator/logic/entrance.cpp
src/dusk/randomizer/generator/logic/entrance.hpp
src/dusk/randomizer/generator/logic/entrance_shuffle.cpp
src/dusk/randomizer/generator/logic/entrance_shuffle.hpp
src/dusk/randomizer/generator/logic/fill.cpp
src/dusk/randomizer/generator/logic/fill.hpp
src/dusk/randomizer/generator/logic/flatten/bits.cpp
src/dusk/randomizer/generator/logic/flatten/bits.hpp
src/dusk/randomizer/generator/logic/flatten/flatten.cpp
src/dusk/randomizer/generator/logic/flatten/flatten.hpp
src/dusk/randomizer/generator/logic/flatten/simplify_algebraic.cpp
src/dusk/randomizer/generator/logic/flatten/simplify_algebraic.hpp
src/dusk/randomizer/generator/logic/hints.cpp
src/dusk/randomizer/generator/logic/hints.hpp
src/dusk/randomizer/generator/logic/item.cpp
src/dusk/randomizer/generator/logic/item.hpp
src/dusk/randomizer/generator/logic/item_pool.cpp
src/dusk/randomizer/generator/logic/item_pool.hpp
src/dusk/randomizer/generator/logic/location.cpp
src/dusk/randomizer/generator/logic/location.hpp
src/dusk/randomizer/generator/logic/plandomizer.cpp
src/dusk/randomizer/generator/logic/plandomizer.hpp
src/dusk/randomizer/generator/logic/requirement.cpp
src/dusk/randomizer/generator/logic/requirement.hpp
src/dusk/randomizer/generator/logic/search.cpp
src/dusk/randomizer/generator/logic/search.hpp
src/dusk/randomizer/generator/logic/spoiler_log.cpp
src/dusk/randomizer/generator/logic/spoiler_log.hpp
src/dusk/randomizer/generator/logic/world.cpp
src/dusk/randomizer/generator/logic/world.hpp
src/dusk/randomizer/generator/randomizer.cpp
src/dusk/randomizer/generator/randomizer.hpp
src/dusk/randomizer/generator/seedgen/config.cpp
src/dusk/randomizer/generator/seedgen/config.hpp
src/dusk/randomizer/generator/seedgen/packed_bits.hpp
src/dusk/randomizer/generator/seedgen/seed.cpp
src/dusk/randomizer/generator/seedgen/seed.hpp
src/dusk/randomizer/generator/seedgen/settings.cpp
src/dusk/randomizer/generator/seedgen/settings.hpp
src/dusk/randomizer/generator/test/test.cpp
src/dusk/randomizer/generator/test/test.hpp
src/dusk/randomizer/generator/utility/base64pp.hpp
src/dusk/randomizer/generator/utility/color.cpp
src/dusk/randomizer/generator/utility/color.hpp
src/dusk/randomizer/generator/utility/crc32.hpp
src/dusk/randomizer/generator/utility/common.cpp
src/dusk/randomizer/generator/utility/common.hpp
src/dusk/randomizer/generator/utility/container.hpp
src/dusk/randomizer/generator/utility/endian.cpp
src/dusk/randomizer/generator/utility/endian.hpp
src/dusk/randomizer/generator/utility/exception.hpp
src/dusk/randomizer/generator/utility/file.cpp
src/dusk/randomizer/generator/utility/file.hpp
src/dusk/randomizer/generator/utility/general.hpp
src/dusk/randomizer/generator/utility/log.cpp
src/dusk/randomizer/generator/utility/log.hpp
src/dusk/randomizer/generator/utility/math.hpp
src/dusk/randomizer/generator/utility/path.cpp
src/dusk/randomizer/generator/utility/path.hpp
src/dusk/randomizer/generator/utility/platform.cpp
src/dusk/randomizer/generator/utility/platform.hpp
src/dusk/randomizer/generator/utility/random.cpp
src/dusk/randomizer/generator/utility/random.hpp
src/dusk/randomizer/generator/utility/string.cpp
src/dusk/randomizer/generator/utility/string.hpp
src/dusk/randomizer/generator/utility/text.cpp
src/dusk/randomizer/generator/utility/text.hpp
src/dusk/randomizer/generator/utility/thread_local.hpp
src/dusk/randomizer/generator/utility/time.cpp
src/dusk/randomizer/generator/utility/time.hpp
src/dusk/randomizer/generator/utility/yaml.hpp
src/helpers/batch.cpp
src/helpers/endian.cpp
src/helpers/offset_ptr.cpp
src/helpers/string.cpp
)
set(DUSK_HTTP_BACKEND_FILES
src/dusk/http/no_backend.cpp
src/dusk/http/curl.cpp
src/dusk/http/winhttp.cpp
src/dusk/http/url_session.mm
) )
-32
View File
@@ -1,32 +0,0 @@
From f69d29614644f9963f5cb3f828b58575d60a1c5a Mon Sep 17 00:00:00 2001
From: Joshua Trees <gh@jtrees.io>
Date: Thu, 4 Jun 2026 01:04:04 +0100
Subject: [PATCH] fix cmake paths
---
cmake/nodConfig.cmake.in | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/cmake/nodConfig.cmake.in b/cmake/nodConfig.cmake.in
index 0969382..2a24a88 100644
--- a/cmake/nodConfig.cmake.in
+++ b/cmake/nodConfig.cmake.in
@@ -1,12 +1,12 @@
@PACKAGE_INIT@
-set(_nod_libdir "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_LIBDIR@")
-set(_nod_incdir "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_INCLUDEDIR@")
+set(_nod_libdir "@CMAKE_INSTALL_FULL_LIBDIR@")
+set(_nod_incdir "@CMAKE_INSTALL_FULL_INCLUDEDIR@")
if (NOT TARGET nod::nod_shared AND NOT TARGET nod::nod_static)
# Shared library
if (WIN32)
- set(_nod_dll "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_BINDIR@/${CMAKE_SHARED_LIBRARY_PREFIX}nod${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set(_nod_dll "@CMAKE_INSTALL_FULL_BINDIR@/${CMAKE_SHARED_LIBRARY_PREFIX}nod${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(_nod_implib "${_nod_libdir}/${CMAKE_IMPORT_LIBRARY_PREFIX}nod${CMAKE_IMPORT_LIBRARY_SUFFIX}")
if (EXISTS "${_nod_dll}")
add_library(nod::nod_shared SHARED IMPORTED)
--
2.53.0
Generated
+3 -3
View File
@@ -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": {
+28 -387
View File
@@ -1,392 +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 = "v20260618.032059"; pkgs.libGL
nodVersion = "v2.0.0-alpha.10"; 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-GFSd573b+VQx/VmFdNQgWDd0V9ayQlcw0Zuopke12ak="; pkgs.libxtst
}; pkgs.libjpeg8
"aarch64-linux" = { pkgs.libxkbcommon
triple = "linux-aarch64"; pkgs.libglvnd
hash = "sha256-ZaoP7BAjBMnfAv2/AMRi3FNH2ZtyqASCSFyU/oB2Mzg="; ];
};
"aarch64-darwin" = {
triple = "darwin-arm64";
hash = "sha256-HT+qtlLaSHyoXPrUcXgcTGa877X5YfzbxRD4bJb7i1Y=";
};
"x86_64-darwin" = {
triple = "darwin-x86_64";
hash = "sha256-cUNaCbA7rlKSukDVKGaVEVw0Zt1+mSbaHbmUCMvMVWc=";
};
}; };
in {
nodPrebuiltInfo = { packages.x86_64-linux.default = dusk;
"x86_64-linux" = {
triple = "linux-x86_64";
hash = "sha256-FVQWECVA2gWdc+n5OQ/Tvwn8z0qdgjSd1WlFt5HKOec=";
};
"aarch64-darwin" = {
triple = "macos-arm64";
hash = "sha256-8ZEejxksVgShNKUVRCBYaLOp9x/qOC9pAeVrElQUGUk=";
};
};
perSystem =
system:
let
pkgs = import nixpkgs { inherit system; };
inherit (pkgs.stdenv.hostPlatform) isDarwin;
hasNodPrebuilt = nodPrebuiltInfo ? ${system};
aurora = builtins.pathExists "${self}/extern/aurora/CMakeLists.txt";
needSubmodules = ''
dusklight: The aurora submodule is not vendored. Add submodules=1 to build.
As a flake input:
dusklight.url = "git+https://github.com/TwilitRealm/dusklight?ref=main&submodules=1";
nix command:
nix run 'git+https://github.com/TwilitRealm/dusklight?submodules=1'
Local checkout:
nix run '.?submodules=1#dusklight'
'';
dawn = pkgs.fetchzip {
url = "https://github.com/encounter/dawn/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-r8qDlOVxv5iKiFjJQrcBuL9HVoOM3yEjRVnQIMqaICs=";
};
patches = [ ./fix-cmake-paths.patch ];
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/12.1.0.tar.gz";
hash = "sha256-ZmI1Dv0ZabPlxa02OpERI47jp7zFfjpeWCy1WyuPYZ0=";
};
TRACY = pkgs.fetchzip {
url = "https://github.com/wolfpld/tracy/archive/6789e7d6f9a65ec98926b602097a33a9676d2606.tar.gz";
hash = "sha256-Xxyd7G/mnXEPpN+ehmwl0AkAhS3CwObpJNDgcqbdUJg=";
};
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 =
if !aurora then
throw needSubmodules
else
pkgs.stdenv.mkDerivation {
pname = "dusklight";
version = versionSuffix;
src = ./.;
postUnpack = ''
chmod -R u+w "$sourceRoot"
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
nod
];
cmakeBuildType = "RelWithDebInfo";
ninjaFlags = [ "dusklight" ];
cmakeFlags = [
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
"-DAURORA_DAWN_PROVIDER=package"
"-DAURORA_DAWN_LINKAGE=static"
"-DAURORA_NOD_PROVIDER=system"
"-DAURORA_SDL3_PROVIDER=system"
"-DBUILD_SHARED_LIBS=OFF"
]
++ 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
'';
postFixup = lib.optionalString (!isDarwin) ''
patchelf \
--add-needed "${pkgs.vulkan-loader}/lib/libvulkan.so" \
$out/bin/dusklight
'';
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;
}; };
} }
+3 -3
View File
@@ -88,9 +88,9 @@ struct DynamicModuleControl : DynamicModuleControlBase {
/* 0x24 */ s32 mSize; /* 0x24 */ s32 mSize;
/* 0x28 */ mDoDvdThd_callback_c* mAsyncLoadCallback; /* 0x28 */ mDoDvdThd_callback_c* mAsyncLoadCallback;
static DUSK_GAME_DATA u32 sAllocBytes; static u32 sAllocBytes;
static DUSK_GAME_DATA JKRArchive* sArchive; static JKRArchive* sArchive;
static DUSK_GAME_DATA JKRFileCache* sFileCache; static JKRFileCache* sFileCache;
}; };
#endif /* DYNAMICLINK_H */ #endif /* DYNAMICLINK_H */
+1 -1
View File
@@ -12,6 +12,6 @@ struct cAPI_Interface {
/* 0x14 */ cAPIGph_Mthd blankingOffMtd; /* 0x14 */ cAPIGph_Mthd blankingOffMtd;
}; };
DUSK_GAME_EXTERN cAPI_Interface g_cAPI_Interface; extern cAPI_Interface g_cAPI_Interface;
#endif /* C_API_H */ #endif /* C_API_H */
+5 -5
View File
@@ -24,11 +24,11 @@ private:
s16 mAngle; s16 mAngle;
public: public:
const static DUSK_GAME_DATA cSAngle _0; const static cSAngle _0;
const static DUSK_GAME_DATA cSAngle _1; const static cSAngle _1;
const static DUSK_GAME_DATA cSAngle _90; const static cSAngle _90;
const static DUSK_GAME_DATA cSAngle _180; const static cSAngle _180;
const static DUSK_GAME_DATA cSAngle _270; const static cSAngle _270;
#ifdef __MWERKS__ #ifdef __MWERKS__
cSAngle() {} cSAngle() {}
~cSAngle() {} ~cSAngle() {}
+1 -1
View File
@@ -5,7 +5,7 @@
#include "f_pc/f_pc_base.h" #include "f_pc/f_pc_base.h"
#include "SSystem/SComponent/c_bg_s_grp_pass_chk.h" #include "SSystem/SComponent/c_bg_s_grp_pass_chk.h"
#include "SSystem/SComponent/c_bg_s_poly_pass_chk.h" #include "SSystem/SComponent/c_bg_s_poly_pass_chk.h"
#include "helpers/endian.h" #include "dusk/endian.h"
struct cBgD_Vtx_t : public Vec {}; struct cBgD_Vtx_t : public Vec {};
@@ -20,7 +20,7 @@ public:
/* 0x14 */ cM3dGAab mM3dGAab; /* 0x14 */ cM3dGAab mM3dGAab;
/* 0x30 */ cBgS_ShdwDraw_Callback mCallbackFun; /* 0x30 */ cBgS_ShdwDraw_Callback mCallbackFun;
#if PARTIAL_DEBUG || DEBUG #if DEBUG
/* 0x34 */ int field_0x34; /* 0x34 */ int field_0x34;
#endif #endif
}; };
+1 -1
View File
@@ -435,7 +435,7 @@ public:
cM3dGAab& GetWorkAab() { return mAab; } cM3dGAab& GetWorkAab() { return mAab; }
static DUSK_GAME_DATA cXyz m_virtual_center; static cXyz m_virtual_center;
}; };
STATIC_ASSERT(0x20 == sizeof(cCcD_ShapeAttr)); STATIC_ASSERT(0x20 == sizeof(cCcD_ShapeAttr));
+1 -1
View File
@@ -9,7 +9,7 @@ struct counter_class {
u32 mTimer; u32 mTimer;
}; };
DUSK_GAME_EXTERN counter_class g_Counter; extern counter_class g_Counter;
void cCt_Counter(int resetCounter1); void cCt_Counter(int resetCounter1);
+2 -2
View File
@@ -98,10 +98,10 @@ T cLib_calcTimer(T* value) {
void MtxInit(void); void MtxInit(void);
void MtxTrans(f32, f32, f32, u8); void MtxTrans(f32, f32, f32, u8);
void MtxScale(f32, f32, f32, u8); void MtxScale(f32, f32, f32, u8);
void MtxPosition(cXyz DUSK_CONST*, cXyz*); void MtxPosition(cXyz*, cXyz*);
void MtxPush(void); void MtxPush(void);
void MtxPull(void); void MtxPull(void);
DUSK_GAME_EXTERN Mtx* calc_mtx; extern Mtx* calc_mtx;
#endif #endif
+1 -1
View File
@@ -20,7 +20,7 @@ struct cM3d_Range {
}; };
#define G_CM3D_F_INF (1000000000.0f) #define G_CM3D_F_INF (1000000000.0f)
DUSK_GAME_EXTERN const f32 G_CM3D_F_ABS_MIN; extern const f32 G_CM3D_F_ABS_MIN;
static void cM3d_InDivPos1(const Vec*, const Vec*, f32, Vec*); static void cM3d_InDivPos1(const Vec*, const Vec*, f32, Vec*);
void cM3d_InDivPos2(const Vec*, const Vec*, f32, Vec*); void cM3d_InDivPos2(const Vec*, const Vec*, f32, Vec*);
+1 -1
View File
@@ -2,7 +2,7 @@
#define C_M3D_G_TRI_H_ #define C_M3D_G_TRI_H_
#include "SSystem/SComponent/c_m3d_g_pla.h" #include "SSystem/SComponent/c_m3d_g_pla.h"
#include "helpers/endian.h" #include "dusk/endian.h"
class cM3dGCyl; class cM3dGCyl;
+1 -1
View File
@@ -6,7 +6,7 @@
class JKRHeap; class JKRHeap;
struct cMl { struct cMl {
static DUSK_GAME_DATA JKRHeap* Heap; static JKRHeap* Heap;
static void init(JKRHeap*); static void init(JKRHeap*);
static void* memalignB(int, u32); static void* memalignB(int, u32);
static void free(void*); static void free(void*);
+1 -1
View File
@@ -9,7 +9,7 @@ struct SVec {
class csXyz : public SVec { class csXyz : public SVec {
public: public:
static DUSK_GAME_DATA const csXyz Zero; static const csXyz Zero;
~csXyz() {} ~csXyz() {}
csXyz() {} csXyz() {}
csXyz(s16, s16, s16); csXyz(s16, s16, s16);
+11 -11
View File
@@ -14,14 +14,14 @@ struct cXy {
}; };
struct cXyz : Vec { struct cXyz : Vec {
static DUSK_GAME_DATA const cXyz Zero; static const cXyz Zero;
static DUSK_GAME_DATA const cXyz BaseX; static const cXyz BaseX;
static DUSK_GAME_DATA const cXyz BaseY; static const cXyz BaseY;
static DUSK_GAME_DATA const cXyz BaseZ; static const cXyz BaseZ;
static DUSK_GAME_DATA const cXyz BaseXY; static const cXyz BaseXY;
static DUSK_GAME_DATA const cXyz BaseXZ; static const cXyz BaseXZ;
static DUSK_GAME_DATA const cXyz BaseYZ; static const cXyz BaseYZ;
static DUSK_GAME_DATA const cXyz BaseXYZ; static const cXyz BaseXYZ;
#ifdef __MWERKS__ #ifdef __MWERKS__
cXyz() {} cXyz() {}
~cXyz() {} ~cXyz() {}
@@ -45,17 +45,17 @@ struct cXyz : Vec {
~cXyz() = default; ~cXyz() = default;
cXyz(const cXyz& vec) = default; cXyz(const cXyz& vec) = default;
#endif #endif
DUSK_CONSTEXPR cXyz(f32 x, f32 y, f32 z) { cXyz(f32 x, f32 y, f32 z) {
this->x = x; this->x = x;
this->y = y; this->y = y;
this->z = z; this->z = z;
} }
DUSK_CONSTEXPR cXyz(const Vec& vec) { cXyz(const Vec& vec) {
this->x = vec.x; this->x = vec.x;
this->y = vec.y; this->y = vec.y;
this->z = vec.z; this->z = vec.z;
} }
DUSK_CONSTEXPR cXyz& operator=(const Vec& vec) { cXyz& operator=(const Vec& vec) {
this->x = vec.x; this->x = vec.x;
this->y = vec.y; this->y = vec.y;
this->z = vec.z; this->z = vec.z;
+2 -2
View File
@@ -256,7 +256,7 @@ inline Z2Audience* Z2GetAudience() {
return JASGlobalInstance<Z2Audience>::getInstance(); return JASGlobalInstance<Z2Audience>::getInstance();
} }
DUSK_GAME_EXTERN s8 data_80451358; extern s8 data_80451358;
DUSK_GAME_EXTERN s8 data_80451359; extern s8 data_80451359;
#endif /* Z2AUDIENCE_H */ #endif /* Z2AUDIENCE_H */
+1 -3
View File
@@ -34,7 +34,7 @@ public:
bool isResetting() { return mResettingFlag; } bool isResetting() { return mResettingFlag; }
static Z2AudioMgr* getInterface() { return mAudioMgrPtr; } static Z2AudioMgr* getInterface() { return mAudioMgrPtr; }
static DUSK_GAME_DATA Z2AudioMgr* mAudioMgrPtr; static Z2AudioMgr* mAudioMgrPtr;
/* 0x0514 */ virtual bool startSound(JAISoundID soundID, JAISoundHandle* handle, const JGeometry::TVec3<f32>* posPtr); /* 0x0514 */ virtual bool startSound(JAISoundID soundID, JAISoundHandle* handle, const JGeometry::TVec3<f32>* posPtr);
/* 0x0518 */ bool mResettingFlag; /* 0x0518 */ bool mResettingFlag;
@@ -48,8 +48,6 @@ public:
/* 0x1370 */ Z2FxLineMgr mFxLineMgr; /* 0x1370 */ Z2FxLineMgr mFxLineMgr;
#if DEBUG #if DEBUG
/* 0x13BC */ Z2DebugSys mDebugSys; /* 0x13BC */ Z2DebugSys mDebugSys;
#elif PARTIAL_DEBUG
alignas(Z2DebugSys) u8 mDebugSys[sizeof(Z2DebugSys)];
#endif #endif
}; // Size: 0x138C }; // Size: 0x138C
+2 -2
View File
@@ -42,8 +42,8 @@ f32 getParamByExp(f32 value, f32 inMin, f32 inMax, f32 exponent, f32 outMin, f32
f32 getRandom(f32 magnitude, f32 exponent, f32 bias); f32 getRandom(f32 magnitude, f32 exponent, f32 bias);
f32 getRandom_0_1(); f32 getRandom_0_1();
DUSK_GAME_EXTERN const f32 cEqualCSlope; extern const f32 cEqualCSlope;
DUSK_GAME_EXTERN const f32 cEqualPSlope; extern const f32 cEqualPSlope;
} // namespace Z2Calc } // namespace Z2Calc
#endif /* Z2CALC_H */ #endif /* Z2CALC_H */
+1 -1
View File
@@ -175,7 +175,7 @@ struct Z2EnvSeMgr : public JASGlobalInstance<Z2EnvSeMgr> {
STATIC_ASSERT(sizeof(Z2EnvSeMgr) == 0x30C); STATIC_ASSERT(sizeof(Z2EnvSeMgr) == 0x30C);
DUSK_GAME_EXTERN Z2EnvSeMgr g_mEnvSeMgr; extern Z2EnvSeMgr g_mEnvSeMgr;
inline Z2EnvSeMgr* Z2GetEnvSeMgr() { inline Z2EnvSeMgr* Z2GetEnvSeMgr() {
return JASGlobalInstance<Z2EnvSeMgr>::getInstance(); return JASGlobalInstance<Z2EnvSeMgr>::getInstance();
+1 -1
View File
@@ -57,7 +57,7 @@ public:
void setUsingIronBall(bool isUsingIronBall) { mUsingIronBall = isUsingIronBall; } void setUsingIronBall(bool isUsingIronBall) { mUsingIronBall = isUsingIronBall; }
void setMarkState(u8 state) { mMarkState = state; } void setMarkState(u8 state) { mMarkState = state; }
static DUSK_GAME_DATA Z2CreatureLink* mLinkPtr; static Z2CreatureLink* mLinkPtr;
static Z2CreatureLink* getLink() { return mLinkPtr; } static Z2CreatureLink* getLink() { return mLinkPtr; }
friend class Z2LinkSoundStarter; friend class Z2LinkSoundStarter;
+52 -52
View File
@@ -4,72 +4,72 @@
#include <types.h> #include <types.h>
struct Z2Param { struct Z2Param {
static DUSK_GAME_DATA f32 DISTANCE_MAX; static f32 DISTANCE_MAX;
static DUSK_GAME_DATA f32 MAX_VOLUME_DISTANCE; static f32 MAX_VOLUME_DISTANCE;
static DUSK_GAME_DATA f32 DOLBY_CENTER_VALUE; static f32 DOLBY_CENTER_VALUE;
static DUSK_GAME_DATA f32 DOLBY_FLONT_DISTANCE_MAX; static f32 DOLBY_FLONT_DISTANCE_MAX;
static DUSK_GAME_DATA f32 DOLBY_BEHIND_DISTANCE_MAX; static f32 DOLBY_BEHIND_DISTANCE_MAX;
static DUSK_GAME_DATA f32 DISTANCE_FX_PARAM; static f32 DISTANCE_FX_PARAM;
static DUSK_GAME_DATA f32 SONIC_SPEED; static f32 SONIC_SPEED;
static DUSK_GAME_DATA f32 VOL_BGM_DEFAULT; static f32 VOL_BGM_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_SYSTEM_DEFAULT; static f32 VOL_SE_SYSTEM_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_LINK_VOICE_DEFAULT; static f32 VOL_SE_LINK_VOICE_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_LINK_MOTION_DEFAULT; static f32 VOL_SE_LINK_MOTION_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_LINK_FOOTNOTE_DEFAULT; static f32 VOL_SE_LINK_FOOTNOTE_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_CHAR_VOICE_DEFAULT; static f32 VOL_SE_CHAR_VOICE_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_CHAR_MOVE_DEFAULT; static f32 VOL_SE_CHAR_MOVE_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_OBJECT_DEFAULT; static f32 VOL_SE_OBJECT_DEFAULT;
static DUSK_GAME_DATA f32 VOL_SE_ATMOSPHERE_DEFAULT; static f32 VOL_SE_ATMOSPHERE_DEFAULT;
static DUSK_GAME_DATA f32 VOL_BGM_TALKING; static f32 VOL_BGM_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_SYSTEM_TALKING; static f32 VOL_SE_SYSTEM_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_LINK_VOICE_TALKING; static f32 VOL_SE_LINK_VOICE_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_LINK_MOTION_TALKING; static f32 VOL_SE_LINK_MOTION_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_LINK_FOOTNOTE_TALKING; static f32 VOL_SE_LINK_FOOTNOTE_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_CHAR_VOICE_TALKING; static f32 VOL_SE_CHAR_VOICE_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_CHAR_MOVE_TALKING; static f32 VOL_SE_CHAR_MOVE_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_OBJECT_TALKING; static f32 VOL_SE_OBJECT_TALKING;
static DUSK_GAME_DATA f32 VOL_SE_ATMOSPHERE_TALKING; static f32 VOL_SE_ATMOSPHERE_TALKING;
static DUSK_GAME_DATA f32 VOL_BGM_PAUSING; static f32 VOL_BGM_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_SYSTEM_PAUSING; static f32 VOL_SE_SYSTEM_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_LINK_VOICE_PAUSING; static f32 VOL_SE_LINK_VOICE_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_LINK_MOTION_PAUSING; static f32 VOL_SE_LINK_MOTION_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_LINK_FOOTNOTE_PAUSING; static f32 VOL_SE_LINK_FOOTNOTE_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_CHAR_VOICE_PAUSING; static f32 VOL_SE_CHAR_VOICE_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_CHAR_MOVE_PAUSING; static f32 VOL_SE_CHAR_MOVE_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_OBJECT_PAUSING; static f32 VOL_SE_OBJECT_PAUSING;
static DUSK_GAME_DATA f32 VOL_SE_ATMOSPHERE_PAUSING; static f32 VOL_SE_ATMOSPHERE_PAUSING;
static DUSK_GAME_DATA f32 MIN_DISTANCE_VOLUME; static f32 MIN_DISTANCE_VOLUME;
static DUSK_GAME_DATA f32 ENEMY_LASTHIT_MUTE_VOLUME; static f32 ENEMY_LASTHIT_MUTE_VOLUME;
// made up names based on HIO labels // made up names based on HIO labels
static DUSK_GAME_DATA u8 SCENE_CHANGE_BGM_FADEOUT_TIME; static u8 SCENE_CHANGE_BGM_FADEOUT_TIME;
static DUSK_GAME_DATA u8 BGM_CROSS_FADEIN_TIME; static u8 BGM_CROSS_FADEIN_TIME;
static DUSK_GAME_DATA u8 BGM_CROSS_FADEOUT_TIME; static u8 BGM_CROSS_FADEOUT_TIME;
static DUSK_GAME_DATA u8 BATTLE_BGM_WAIT_TIME; static u8 BATTLE_BGM_WAIT_TIME;
static f32 ENEMY_NEARBY_DIST; static f32 ENEMY_NEARBY_DIST;
static f32 BATTLE_FADEIN_DIST; static f32 BATTLE_FADEIN_DIST;
static f32 BATTLE_FADEOUT_DIST; static f32 BATTLE_FADEOUT_DIST;
static DUSK_GAME_DATA u8 FOUND_TRACK_FI_TIME; static u8 FOUND_TRACK_FI_TIME;
static DUSK_GAME_DATA u8 FOUND_TRACK_FO_TIME; static u8 FOUND_TRACK_FO_TIME;
static DUSK_GAME_DATA u8 CLOSE_BATTLE_TRACK_FI_TIME; static u8 CLOSE_BATTLE_TRACK_FI_TIME;
static DUSK_GAME_DATA u8 CLOSE_BATTLE_TRACK_FO_TIME; static u8 CLOSE_BATTLE_TRACK_FO_TIME;
static DUSK_GAME_DATA u8 ENDING_BLOW_VOL_DOWN_TIME; static u8 ENDING_BLOW_VOL_DOWN_TIME;
static DUSK_GAME_DATA u8 ENDING_BLOW_VOL_LOWER_TIME; static u8 ENDING_BLOW_VOL_LOWER_TIME;
static DUSK_GAME_DATA u8 ENDING_BLOW_VOL_LOWER_RECOVER_TIME; static u8 ENDING_BLOW_VOL_LOWER_RECOVER_TIME;
static DUSK_GAME_DATA u8 ENDING_BLOW_MIN_FINISH_TIME; static u8 ENDING_BLOW_MIN_FINISH_TIME;
static DUSK_GAME_DATA u8 DARK_SE_FILTER_ON; static u8 DARK_SE_FILTER_ON;
static DUSK_GAME_DATA u8 DARK_SE_LOW_PASS_FILTER_SETTING; static u8 DARK_SE_LOW_PASS_FILTER_SETTING;
static DUSK_GAME_DATA u8 SYSTEM_SE_USE_DARK_SE_SETTING; static u8 SYSTEM_SE_USE_DARK_SE_SETTING;
static f32 AUDIBLE_DELTA_RANGE_VOLUME; static f32 AUDIBLE_DELTA_RANGE_VOLUME;
static f32 AUDIBLE_DELTA_RANGE_PAN; static f32 AUDIBLE_DELTA_RANGE_PAN;
static f32 AUDIBLE_DELTA_RANGE_DOLBY; static f32 AUDIBLE_DELTA_RANGE_DOLBY;
}; };
DUSK_GAME_EXTERN u8 data_8045086C; extern u8 data_8045086C;
#endif /* Z2PARAM_H */ #endif /* Z2PARAM_H */
-5
View File
@@ -46,11 +46,6 @@ public:
s32 getSeLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 0); } s32 getSeLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 0); }
s32 getBgmLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 1); } s32 getBgmLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 1); }
u8 getDemoSeWaveNum() { return loadedDemoWave; } u8 getDemoSeWaveNum() { return loadedDemoWave; }
#if TARGET_PC
u8 getLoadedSeWave_1() { return loadedSeWave_1;}
u8 getLoadedSeWave_2() { return loadedSeWave_2;}
#endif
private: private:
/* 0x00 */ JAISoundID BGM_ID; /* 0x00 */ JAISoundID BGM_ID;
+1 -1
View File
@@ -194,7 +194,7 @@ public:
JAISoundHandle* getMainBgmHandle() { return &mMainBgmHandle; } JAISoundHandle* getMainBgmHandle() { return &mMainBgmHandle; }
JAISoundHandle* getSubBgmHandle() { return &mSubBgmHandle; } JAISoundHandle* getSubBgmHandle() { return &mSubBgmHandle; }
#if PARTIAL_DEBUG || DEBUG #if DEBUG
f32 field_0x00_debug; f32 field_0x00_debug;
u8 field_0x04_debug; u8 field_0x04_debug;
#endif #endif
+2 -2
View File
@@ -100,13 +100,13 @@ public:
bool isForceBattle() { return forceBattle_; } bool isForceBattle() { return forceBattle_; }
JSUList<Z2CreatureEnemy>* getEnemyList() { return &field_0x0; } JSUList<Z2CreatureEnemy>* getEnemyList() { return &field_0x0; }
#if PARTIAL_DEBUG || DEBUG #if DEBUG
JSUList<Z2SoundObjBase>* getAllList() { return &allList_; } JSUList<Z2SoundObjBase>* getAllList() { return &allList_; }
#endif #endif
private: private:
/* 0x00 */ JSUList<Z2CreatureEnemy> field_0x0; /* 0x00 */ JSUList<Z2CreatureEnemy> field_0x0;
#if PARTIAL_DEBUG || DEBUG #if DEBUG
/* 0x0C */ JSUList<Z2SoundObjBase> allList_; /* 0x0C */ JSUList<Z2SoundObjBase> allList_;
#endif #endif
/* 0x0C */ Z2EnemyArea enemyArea_; /* 0x0C */ Z2EnemyArea enemyArea_;
+1 -1
View File
@@ -7,7 +7,7 @@
struct Z2SoundStarter; struct Z2SoundStarter;
class Z2SoundObjBase : public Z2SoundHandles class Z2SoundObjBase : public Z2SoundHandles
#if PARTIAL_DEBUG || DEBUG #if DEBUG
, public JSULink<Z2SoundObjBase> , public JSULink<Z2SoundObjBase>
#endif #endif
{ {
+1 -1
View File
@@ -14,7 +14,7 @@ struct Z2StatusMgr : public JASGlobalInstance<Z2StatusMgr> {
void menuIn(); void menuIn();
void menuOut(); void menuOut();
bool isMovieDemo(); bool isMovieDemo();
void setDemoName(DUSK_CONST char* demoName); void setDemoName(char* demoName);
void processTime(); void processTime();
bool checkDayTime(); bool checkDayTime();
void setEventBit(void* eventBit); void setEventBit(void* eventBit);
+10 -10
View File
@@ -12,18 +12,18 @@ public:
BOOL cDmrNowMidnaTalk(); BOOL cDmrNowMidnaTalk();
DUSK_GAME_EXTERN u8 cDmr_SkipInfo; extern u8 cDmr_SkipInfo;
DUSK_GAME_EXTERN u8 data_80450C99; extern u8 data_80450C99;
DUSK_GAME_EXTERN u8 data_80450C9A; extern u8 data_80450C9A;
DUSK_GAME_EXTERN u8 data_80450C9B; extern u8 data_80450C9B;
DUSK_GAME_EXTERN u8 data_80450C9C; extern u8 data_80450C9C;
DUSK_GAME_EXTERN u8 data_80450C9D; extern u8 data_80450C9D;
DUSK_GAME_EXTERN u8 data_80450C9E; extern u8 data_80450C9E;
DUSK_GAME_EXTERN u8 cDmr_FishingWether; extern u8 cDmr_FishingWether;
DUSK_GAME_EXTERN u8 data_80450CA0; extern u8 data_80450CA0;
extern "C" { extern "C" {
DUSK_GAME_EXTERN JPTraceParticleCallBack4 JPTracePCB4; extern JPTraceParticleCallBack4 JPTracePCB4;
} }
void debug_actor_create(); void debug_actor_create();
+129 -171
View File
@@ -57,8 +57,8 @@ public:
void setNowOffsetX(f32 i_offset) { mNowOffsetX = i_offset; } void setNowOffsetX(f32 i_offset) { mNowOffsetX = i_offset; }
void setNowOffsetY(f32 i_offset) { mNowOffsetY = i_offset; } void setNowOffsetY(f32 i_offset) { mNowOffsetY = i_offset; }
static DUSK_GAME_DATA bool m_eye_move_flg; static bool m_eye_move_flg;
static DUSK_GAME_DATA u8 m_morf_frame; static u8 m_morf_frame;
/* 0x0F4 */ mutable f32 field_0xf4; /* 0x0F4 */ mutable f32 field_0xf4;
/* 0x0F8 */ mutable f32 field_0xf8; /* 0x0F8 */ mutable f32 field_0xf8;
@@ -88,10 +88,6 @@ public:
/* 0x02C */ cXyz field_0x2c; /* 0x02C */ cXyz field_0x2c;
/* 0x038 */ cXyz field_0x38[60]; /* 0x038 */ cXyz field_0x38[60];
/* 0x308 */ cXyz field_0x308[60]; /* 0x308 */ cXyz field_0x308[60];
#if TARGET_PC
TGXTexObj mBlurTexObj;
ResTIMG* mpCachedBlurTex = nullptr;
#endif
}; // Size = 0x5D8 }; // Size = 0x5D8
class dAlink_bottleWaterPcallBack_c : public JPAParticleCallBack { class dAlink_bottleWaterPcallBack_c : public JPAParticleCallBack {
@@ -3913,30 +3909,20 @@ public:
static u32 getOtherHeapSize() { return 0xF0A60; } static u32 getOtherHeapSize() { return 0xF0A60; }
#if TARGET_PC static daAlink_BckData const m_mainBckShield[20];
u16 getEventId() { return mMsgFlow.getEventId(); } static daAlink_BckData const m_mainBckSword[5];
static daAlink_BckData const m_mainBckFishing[28];
static daAlink_AnmData const m_anmDataTable[ANM_MAX];
static daAlink_WlAnmData const m_wlAnmDataTable[WANM_MAX];
static daAlink_FaceTexData const m_faceTexDataTable[];
static Vec const m_handLeftOutSidePos;
static Vec const m_handRightOutSidePos;
static Vec const m_handLeftInSidePos;
static Vec const m_handRightInSidePos;
bool checkSwimming() {return checkModeFlg(MODE_SWIMMING);} static const daAlink_procInitTable m_procInitTable[];
static daAlink_procFunc m_demoInitTable[];
BE<short>** getDomeLockChromaTable() { static const EffParamProc m_fEffParamProc[];
return &field_0x0724->mAnmCRegDataR;
}
#endif
static DUSK_GAME_DATA daAlink_BckData const m_mainBckShield[20];
static DUSK_GAME_DATA daAlink_BckData const m_mainBckSword[5];
static DUSK_GAME_DATA daAlink_BckData const m_mainBckFishing[28];
static DUSK_GAME_DATA daAlink_AnmData const m_anmDataTable[ANM_MAX];
static DUSK_GAME_DATA daAlink_WlAnmData const m_wlAnmDataTable[WANM_MAX];
static DUSK_GAME_DATA daAlink_FaceTexData const m_faceTexDataTable[];
static DUSK_GAME_DATA Vec const m_handLeftOutSidePos;
static DUSK_GAME_DATA Vec const m_handRightOutSidePos;
static DUSK_GAME_DATA Vec const m_handLeftInSidePos;
static DUSK_GAME_DATA Vec const m_handRightInSidePos;
static DUSK_GAME_DATA const daAlink_procInitTable m_procInitTable[];
static DUSK_GAME_DATA daAlink_procFunc m_demoInitTable[];
static DUSK_GAME_DATA const EffParamProc m_fEffParamProc[];
/* 0x0062C */ request_of_phase_process_class mPhaseReq; /* 0x0062C */ request_of_phase_process_class mPhaseReq;
/* 0x00634 */ const char* mArcName; /* 0x00634 */ const char* mArcName;
@@ -4559,39 +4545,13 @@ public:
/* 0x03840 */ cXyz* mIronBallChainPos; /* 0x03840 */ cXyz* mIronBallChainPos;
/* 0x03844 */ csXyz* mIronBallChainAngle; /* 0x03844 */ csXyz* mIronBallChainAngle;
/* 0x03848 */ cXyz* field_0x3848; /* 0x03848 */ cXyz* field_0x3848;
/* 0x0384C */ cXyz DUSK_CONST* field_0x384c; /* 0x0384C */ cXyz* field_0x384c;
/* 0x03850 */ daAlink_procFunc mpProcFunc; /* 0x03850 */ daAlink_procFunc mpProcFunc;
#if TARGET_PC #if TARGET_PC
void handleWolfHowl(); void handleWolfHowl();
void handleQuickTransform(); void handleQuickTransform();
bool checkAimContext(); bool checkGyroAimContext();
bool checkAimInputContext();
void onIronBallChainInterpCallback();
static const int IRON_BALL_CHAIN_COUNT = 102;
cXyz mIBChainInterpPrevPos[IRON_BALL_CHAIN_COUNT];
cXyz mIBChainInterpCurrPos[IRON_BALL_CHAIN_COUNT];
csXyz mIBChainInterpPrevAngle[IRON_BALL_CHAIN_COUNT];
csXyz mIBChainInterpCurrAngle[IRON_BALL_CHAIN_COUNT];
cXyz mIBChainInterpPrevHandRoot;
cXyz mIBChainInterpCurrHandRoot;
bool mIBChainInterpPrevValid;
bool mIBChainInterpCurrValid;
cXyz mHsChainInterpPrevTop;
cXyz mHsChainInterpCurrTop;
cXyz mHsChainInterpPrevRoot;
cXyz mHsChainInterpCurrRoot;
cXyz mHsChainInterpPrevSubRoot;
cXyz mHsChainInterpCurrSubRoot;
cXyz mHsChainInterpPrevSubTop;
cXyz mHsChainInterpCurrSubTop;
bool mHsChainInterpPrevValid;
bool mHsChainInterpCurrValid;
bool mIsRollstab = false;
#endif #endif
}; // Size: 0x385C }; // Size: 0x385C
@@ -4659,7 +4619,7 @@ struct daAlinkHIO_basic_c1 {
class daAlinkHIO_basic_c0 { class daAlinkHIO_basic_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_basic_c1 const m; static daAlinkHIO_basic_c1 const m;
}; };
class daAlinkHIO_basic_c : public daAlinkHIO_data_c { class daAlinkHIO_basic_c : public daAlinkHIO_data_c {
@@ -4710,7 +4670,7 @@ public:
class daAlinkHIO_move_c0 { class daAlinkHIO_move_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_move_c1 const m; static daAlinkHIO_move_c1 const m;
}; };
class daAlinkHIO_move_c : public daAlinkHIO_data_c { class daAlinkHIO_move_c : public daAlinkHIO_data_c {
@@ -4756,7 +4716,7 @@ public:
class daAlinkHIO_atnMove_c0 { class daAlinkHIO_atnMove_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_atnMove_c1 const m; static daAlinkHIO_atnMove_c1 const m;
}; };
class daAlinkHIO_atnMove_c : public daAlinkHIO_data_c { class daAlinkHIO_atnMove_c : public daAlinkHIO_data_c {
@@ -4802,7 +4762,7 @@ public:
class daAlinkHIO_noActAtnMove_c0 { class daAlinkHIO_noActAtnMove_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_noActAtnMove_c1 const m; static daAlinkHIO_noActAtnMove_c1 const m;
}; };
class daAlinkHIO_noActAtnMove_c : public daAlinkHIO_data_c { class daAlinkHIO_noActAtnMove_c : public daAlinkHIO_data_c {
@@ -4844,7 +4804,7 @@ public:
class daAlinkHIO_frontRoll_c0 { class daAlinkHIO_frontRoll_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_frontRoll_c1 const m; static daAlinkHIO_frontRoll_c1 const m;
}; };
class daAlinkHIO_frontRoll_c : public daAlinkHIO_data_c { class daAlinkHIO_frontRoll_c : public daAlinkHIO_data_c {
@@ -4874,7 +4834,7 @@ public:
class daAlinkHIO_backJump_c0 { class daAlinkHIO_backJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_backJump_c1 const m; static daAlinkHIO_backJump_c1 const m;
}; };
class daAlinkHIO_backJump_c : public daAlinkHIO_data_c { class daAlinkHIO_backJump_c : public daAlinkHIO_data_c {
@@ -4908,7 +4868,7 @@ public:
class daAlinkHIO_sideStep_c0 { class daAlinkHIO_sideStep_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_sideStep_c1 const m; static daAlinkHIO_sideStep_c1 const m;
}; };
class daAlinkHIO_sideStep_c : public daAlinkHIO_data_c { class daAlinkHIO_sideStep_c : public daAlinkHIO_data_c {
@@ -4946,7 +4906,7 @@ public:
class daAlinkHIO_slide_c0 { class daAlinkHIO_slide_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_slide_c1 const m; static daAlinkHIO_slide_c1 const m;
}; };
class daAlinkHIO_slide_c : public daAlinkHIO_data_c { class daAlinkHIO_slide_c : public daAlinkHIO_data_c {
@@ -4974,27 +4934,27 @@ public:
class daAlinkHIO_cutNmV_c0 { class daAlinkHIO_cutNmV_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutNormal_c1 const m; static daAlinkHIO_cutNormal_c1 const m;
}; };
class daAlinkHIO_cutNmL_c0 { class daAlinkHIO_cutNmL_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutNormal_c1 const m; static daAlinkHIO_cutNormal_c1 const m;
}; };
class daAlinkHIO_cutNmR_c0 { class daAlinkHIO_cutNmR_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutNormal_c1 const m; static daAlinkHIO_cutNormal_c1 const m;
}; };
class daAlinkHIO_cutNmSL_c0 { class daAlinkHIO_cutNmSL_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutNormal_c1 const m; static daAlinkHIO_cutNormal_c1 const m;
}; };
class daAlinkHIO_cutNmSR_c0 { class daAlinkHIO_cutNmSR_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutNormal_c1 const m; static daAlinkHIO_cutNormal_c1 const m;
}; };
class daAlinkHIO_cutNormal_c : public daAlinkHIO_data_c { class daAlinkHIO_cutNormal_c : public daAlinkHIO_data_c {
@@ -5025,32 +4985,32 @@ public:
class daAlinkHIO_cutFnL_c0 { class daAlinkHIO_cutFnL_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFinish_c1 const m; static daAlinkHIO_cutFinish_c1 const m;
}; };
class daAlinkHIO_cutFnV_c0 { class daAlinkHIO_cutFnV_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFinish_c1 const m; static daAlinkHIO_cutFinish_c1 const m;
}; };
class daAlinkHIO_cutFnS_c0 { class daAlinkHIO_cutFnS_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFinish_c1 const m; static daAlinkHIO_cutFinish_c1 const m;
}; };
class daAlinkHIO_cutFnSl_c0 { class daAlinkHIO_cutFnSl_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFinish_c1 const m; static daAlinkHIO_cutFinish_c1 const m;
}; };
class daAlinkHIO_cutFnSm_c0 { class daAlinkHIO_cutFnSm_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFinish_c1 const m; static daAlinkHIO_cutFinish_c1 const m;
}; };
class daAlinkHIO_cutFnR_c0 { class daAlinkHIO_cutFnR_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFinish_c1 const m; static daAlinkHIO_cutFinish_c1 const m;
}; };
class daAlinkHIO_cutFinish_c : public daAlinkHIO_data_c { class daAlinkHIO_cutFinish_c : public daAlinkHIO_data_c {
@@ -5087,7 +5047,7 @@ public:
class daAlinkHIO_cutFnJU_c0 { class daAlinkHIO_cutFnJU_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutFnJU_c1 const m; static daAlinkHIO_cutFnJU_c1 const m;
}; };
class daAlinkHIO_cutFnJU_c : public daAlinkHIO_data_c { class daAlinkHIO_cutFnJU_c : public daAlinkHIO_data_c {
@@ -5114,17 +5074,17 @@ public:
class daAlinkHIO_cutDaL_c0 { class daAlinkHIO_cutDaL_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutDash_c1 const m; static daAlinkHIO_cutDash_c1 const m;
}; };
class daAlinkHIO_cutDaR_c0 { class daAlinkHIO_cutDaR_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutDash_c1 const m; static daAlinkHIO_cutDash_c1 const m;
}; };
class daAlinkHIO_cutDaCharge_c0 { class daAlinkHIO_cutDaCharge_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutDash_c1 const m; static daAlinkHIO_cutDash_c1 const m;
}; };
class daAlinkHIO_cutDash_c : public daAlinkHIO_data_c { class daAlinkHIO_cutDash_c : public daAlinkHIO_data_c {
@@ -5156,7 +5116,7 @@ public:
class daAlinkHIO_cutJump_c0 { class daAlinkHIO_cutJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutJump_c1 const m; static daAlinkHIO_cutJump_c1 const m;
}; };
class daAlinkHIO_cutJump_c : public daAlinkHIO_data_c { class daAlinkHIO_cutJump_c : public daAlinkHIO_data_c {
@@ -5207,7 +5167,7 @@ public:
class daAlinkHIO_cutTurn_c0 { class daAlinkHIO_cutTurn_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutTurn_c1 const m; static daAlinkHIO_cutTurn_c1 const m;
}; };
class daAlinkHIO_cutTurn_c : public daAlinkHIO_data_c { class daAlinkHIO_cutTurn_c : public daAlinkHIO_data_c {
@@ -5235,22 +5195,22 @@ public:
class daAlinkHIO_hoCutLA_c0 { class daAlinkHIO_hoCutLA_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_hoCut_c1 const m; static daAlinkHIO_hoCut_c1 const m;
}; };
class daAlinkHIO_hoCutLB_c0 { class daAlinkHIO_hoCutLB_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_hoCut_c1 const m; static daAlinkHIO_hoCut_c1 const m;
}; };
class daAlinkHIO_hoCutRA_c0 { class daAlinkHIO_hoCutRA_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_hoCut_c1 const m; static daAlinkHIO_hoCut_c1 const m;
}; };
class daAlinkHIO_hoCutRB_c0 { class daAlinkHIO_hoCutRB_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_hoCut_c1 const m; static daAlinkHIO_hoCut_c1 const m;
}; };
class daAlinkHIO_hoCut_c : public daAlinkHIO_data_c { class daAlinkHIO_hoCut_c : public daAlinkHIO_data_c {
@@ -5283,7 +5243,7 @@ public:
class daAlinkHIO_hoCutCharge_c0 { class daAlinkHIO_hoCutCharge_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_hoCutCharge_c1 const m; static daAlinkHIO_hoCutCharge_c1 const m;
}; };
class daAlinkHIO_hoCutCharge_c : public daAlinkHIO_data_c { class daAlinkHIO_hoCutCharge_c : public daAlinkHIO_data_c {
@@ -5317,7 +5277,7 @@ public:
class daAlinkHIO_cutDown_c0 { class daAlinkHIO_cutDown_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutDown_c1 const m; static daAlinkHIO_cutDown_c1 const m;
}; };
class daAlinkHIO_cutDown_c : public daAlinkHIO_data_c { class daAlinkHIO_cutDown_c : public daAlinkHIO_data_c {
@@ -5353,7 +5313,7 @@ public:
class daAlinkHIO_cutHead_c0 { class daAlinkHIO_cutHead_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutHead_c1 const m; static daAlinkHIO_cutHead_c1 const m;
}; };
class daAlinkHIO_cutHead_c : public daAlinkHIO_data_c { class daAlinkHIO_cutHead_c : public daAlinkHIO_data_c {
@@ -5390,7 +5350,7 @@ public:
class daAlinkHIO_cutLargeJump_c0 { class daAlinkHIO_cutLargeJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_cutLargeJump_c1 const m; static daAlinkHIO_cutLargeJump_c1 const m;
}; };
class daAlinkHIO_cutLargeJump_c : public daAlinkHIO_data_c { class daAlinkHIO_cutLargeJump_c : public daAlinkHIO_data_c {
@@ -5467,7 +5427,7 @@ public:
static daAlinkHIO_cutDown_c0 const mCutDown; static daAlinkHIO_cutDown_c0 const mCutDown;
static daAlinkHIO_cutHead_c0 const mCutHead; static daAlinkHIO_cutHead_c0 const mCutHead;
static daAlinkHIO_cutLargeJump_c0 const mCutLargeJump; static daAlinkHIO_cutLargeJump_c0 const mCutLargeJump;
static DUSK_GAME_DATA daAlinkHIO_cut_c1 const m; static daAlinkHIO_cut_c1 const m;
}; };
class daAlinkHIO_cut_c : public daAlinkHIO_data_c { class daAlinkHIO_cut_c : public daAlinkHIO_data_c {
@@ -5523,12 +5483,12 @@ public:
class daAlinkHIO_gAtPush_c0 { class daAlinkHIO_gAtPush_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_guardAttack_c1 const m; static daAlinkHIO_guardAttack_c1 const m;
}; };
class daAlinkHIO_gAtKick_c0 { class daAlinkHIO_gAtKick_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_guardAttack_c1 const m; static daAlinkHIO_guardAttack_c1 const m;
}; };
class daAlinkHIO_guardAttack_c : public daAlinkHIO_data_c { class daAlinkHIO_guardAttack_c : public daAlinkHIO_data_c {
@@ -5560,7 +5520,7 @@ public:
class daAlinkHIO_turnMove_c0 { class daAlinkHIO_turnMove_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_turnMove_c1 const m; static daAlinkHIO_turnMove_c1 const m;
}; };
class daAlinkHIO_turnMove_c : public daAlinkHIO_data_c { class daAlinkHIO_turnMove_c : public daAlinkHIO_data_c {
@@ -5605,7 +5565,7 @@ public:
static daAlinkHIO_gAtPush_c0 const mAtPush; static daAlinkHIO_gAtPush_c0 const mAtPush;
static daAlinkHIO_gAtKick_c0 const mAtKick; static daAlinkHIO_gAtKick_c0 const mAtKick;
static daAlinkHIO_turnMove_c0 const mTurnMove; static daAlinkHIO_turnMove_c0 const mTurnMove;
static DUSK_GAME_DATA daAlinkHIO_guard_c1 const m; static daAlinkHIO_guard_c1 const m;
}; };
class daAlinkHIO_guard_c : public daAlinkHIO_data_c { class daAlinkHIO_guard_c : public daAlinkHIO_data_c {
@@ -5644,7 +5604,7 @@ public:
class daAlinkHIO_crouch_c0 { class daAlinkHIO_crouch_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_crouch_c1 const m; static daAlinkHIO_crouch_c1 const m;
}; };
class daAlinkHIO_crouch_c : public daAlinkHIO_data_c { class daAlinkHIO_crouch_c : public daAlinkHIO_data_c {
@@ -5699,7 +5659,7 @@ public:
class daAlinkHIO_autoJump_c0 { class daAlinkHIO_autoJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_autoJump_c1 const m; static daAlinkHIO_autoJump_c1 const m;
}; };
class daAlinkHIO_autoJump_c : public daAlinkHIO_data_c { class daAlinkHIO_autoJump_c : public daAlinkHIO_data_c {
@@ -5729,7 +5689,7 @@ public:
class daAlinkHIO_smallJump_c0 { class daAlinkHIO_smallJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_smallJump_c1 const m; static daAlinkHIO_smallJump_c1 const m;
}; };
class daAlinkHIO_smallJump_c : public daAlinkHIO_data_c { class daAlinkHIO_smallJump_c : public daAlinkHIO_data_c {
@@ -5758,7 +5718,7 @@ public:
class daAlinkHIO_wallCatch_c0 { class daAlinkHIO_wallCatch_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wallCatch_c1 const m; static daAlinkHIO_wallCatch_c1 const m;
}; };
class daAlinkHIO_wallCatch_c : public daAlinkHIO_data_c { class daAlinkHIO_wallCatch_c : public daAlinkHIO_data_c {
@@ -5784,7 +5744,7 @@ public:
class daAlinkHIO_wallFall_c0 { class daAlinkHIO_wallFall_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wallFall_c1 const m; static daAlinkHIO_wallFall_c1 const m;
}; };
class daAlinkHIO_wallFall_c : public daAlinkHIO_data_c { class daAlinkHIO_wallFall_c : public daAlinkHIO_data_c {
@@ -5813,7 +5773,7 @@ public:
class daAlinkHIO_wallMove_c0 { class daAlinkHIO_wallMove_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wallMove_c1 const m; static daAlinkHIO_wallMove_c1 const m;
}; };
class daAlinkHIO_wallMove_c : public daAlinkHIO_data_c { class daAlinkHIO_wallMove_c : public daAlinkHIO_data_c {
@@ -5849,7 +5809,7 @@ public:
static daAlinkHIO_wallCatch_c0 const mWallCatch; static daAlinkHIO_wallCatch_c0 const mWallCatch;
static daAlinkHIO_wallFall_c0 const mWallFall; static daAlinkHIO_wallFall_c0 const mWallFall;
static daAlinkHIO_wallMove_c0 const mWallMove; static daAlinkHIO_wallMove_c0 const mWallMove;
static DUSK_GAME_DATA daAlinkHIO_wallHang_c1 const m; static daAlinkHIO_wallHang_c1 const m;
}; };
class daAlinkHIO_wallHang_c : public daAlinkHIO_data_c { class daAlinkHIO_wallHang_c : public daAlinkHIO_data_c {
@@ -5896,7 +5856,7 @@ public:
class daAlinkHIO_pushpull_c0 { class daAlinkHIO_pushpull_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_pushpull_c1 const m; static daAlinkHIO_pushpull_c1 const m;
}; };
class daAlinkHIO_pushpull_c : public daAlinkHIO_data_c { class daAlinkHIO_pushpull_c : public daAlinkHIO_data_c {
@@ -5930,7 +5890,7 @@ public:
class daAlinkHIO_damNormal_c0 { class daAlinkHIO_damNormal_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damNormal_c1 const m; static daAlinkHIO_damNormal_c1 const m;
}; };
class daAlinkHIO_damNormal_c : public daAlinkHIO_data_c { class daAlinkHIO_damNormal_c : public daAlinkHIO_data_c {
@@ -5969,12 +5929,12 @@ public:
class daAlinkHIO_damLarge_c0 { class daAlinkHIO_damLarge_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damLaHu_c1 const m; static daAlinkHIO_damLaHu_c1 const m;
}; };
class daAlinkHIO_damHuge_c0 { class daAlinkHIO_damHuge_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damLaHu_c1 const m; static daAlinkHIO_damLaHu_c1 const m;
}; };
class daAlinkHIO_damLaHu_c : public daAlinkHIO_data_c { class daAlinkHIO_damLaHu_c : public daAlinkHIO_data_c {
@@ -6002,7 +5962,7 @@ public:
class daAlinkHIO_damHorse_c0 { class daAlinkHIO_damHorse_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damHorse_c1 const m; static daAlinkHIO_damHorse_c1 const m;
}; };
class daAlinkHIO_damHorse_c : public daAlinkHIO_data_c { class daAlinkHIO_damHorse_c : public daAlinkHIO_data_c {
@@ -6037,7 +5997,7 @@ public:
class daAlinkHIO_damFall_c0 { class daAlinkHIO_damFall_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damFall_c1 const m; static daAlinkHIO_damFall_c1 const m;
}; };
class daAlinkHIO_damFall_c : public daAlinkHIO_data_c { class daAlinkHIO_damFall_c : public daAlinkHIO_data_c {
@@ -6067,7 +6027,7 @@ public:
class daAlinkHIO_damCaught_c0 { class daAlinkHIO_damCaught_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damCaught_c1 const m; static daAlinkHIO_damCaught_c1 const m;
}; };
class daAlinkHIO_damCaught_c : public daAlinkHIO_data_c { class daAlinkHIO_damCaught_c : public daAlinkHIO_data_c {
@@ -6103,7 +6063,7 @@ public:
class daAlinkHIO_damSwim_c0 { class daAlinkHIO_damSwim_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damSwim_c1 const m; static daAlinkHIO_damSwim_c1 const m;
}; };
class daAlinkHIO_damSwim_c : public daAlinkHIO_data_c { class daAlinkHIO_damSwim_c : public daAlinkHIO_data_c {
@@ -6150,7 +6110,7 @@ public:
class daAlinkHIO_damage_c0 { class daAlinkHIO_damage_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_damage_c1 const m; static daAlinkHIO_damage_c1 const m;
static daAlinkHIO_damNormal_c0 const mDamNormal; static daAlinkHIO_damNormal_c0 const mDamNormal;
static daAlinkHIO_damLarge_c0 const mDamLarge; static daAlinkHIO_damLarge_c0 const mDamLarge;
static daAlinkHIO_damHuge_c0 const mDamHuge; static daAlinkHIO_damHuge_c0 const mDamHuge;
@@ -6202,7 +6162,7 @@ public:
class daAlinkHIO_horse_c0 { class daAlinkHIO_horse_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_horse_c1 const m; static daAlinkHIO_horse_c1 const m;
}; };
class daAlinkHIO_horse_c : public daAlinkHIO_data_c { class daAlinkHIO_horse_c : public daAlinkHIO_data_c {
@@ -6241,7 +6201,7 @@ public:
class daAlinkHIO_canoe_c0 { class daAlinkHIO_canoe_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_canoe_c1 const m; static daAlinkHIO_canoe_c1 const m;
}; };
class daAlinkHIO_canoe_c : public daAlinkHIO_data_c { class daAlinkHIO_canoe_c : public daAlinkHIO_data_c {
@@ -6286,7 +6246,7 @@ public:
class daAlinkHIO_bow_c0 { class daAlinkHIO_bow_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_bow_c1 const m; static daAlinkHIO_bow_c1 const m;
}; };
class daAlinkHIO_bow_c : public daAlinkHIO_data_c { class daAlinkHIO_bow_c : public daAlinkHIO_data_c {
@@ -6322,7 +6282,7 @@ public:
class daAlinkHIO_boom_c0 { class daAlinkHIO_boom_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_boom_c1 const m; static daAlinkHIO_boom_c1 const m;
}; };
class daAlinkHIO_boom_c : public daAlinkHIO_data_c { class daAlinkHIO_boom_c : public daAlinkHIO_data_c {
@@ -6366,7 +6326,7 @@ public:
class daAlinkHIO_bomb_c0 { class daAlinkHIO_bomb_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_bomb_c1 const m; static daAlinkHIO_bomb_c1 const m;
}; };
class daAlinkHIO_bomb_c : public daAlinkHIO_data_c { class daAlinkHIO_bomb_c : public daAlinkHIO_data_c {
@@ -6401,8 +6361,7 @@ public:
class daAlinkHIO_huLight_c0 { class daAlinkHIO_huLight_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_huLight_c1 IF_NOT_DUSK(const) m; static daAlinkHIO_huLight_c1 const m;
IF_DUSK(static DUSK_GAME_DATA daAlinkHIO_huLight_c1 const original;)
}; };
class daAlinkHIO_wlLight_c1 { class daAlinkHIO_wlLight_c1 {
@@ -6421,7 +6380,7 @@ public:
class daAlinkHIO_wlLight_c0 { class daAlinkHIO_wlLight_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlLight_c1 const m; static daAlinkHIO_wlLight_c1 const m;
}; };
class daAlinkHIO_zwLight_c1 { // may be wrong class daAlinkHIO_zwLight_c1 { // may be wrong
@@ -6440,7 +6399,7 @@ public:
class daAlinkHIO_zwLight_c0 { class daAlinkHIO_zwLight_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_zwLight_c1 const m; static daAlinkHIO_zwLight_c1 const m;
}; };
class daAlinkHIO_light_c : public daAlinkHIO_data_c { class daAlinkHIO_light_c : public daAlinkHIO_data_c {
@@ -6476,8 +6435,7 @@ public:
class daAlinkHIO_kandelaar_c0 { class daAlinkHIO_kandelaar_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_kandelaar_c1 IF_NOT_DUSK(const) m; static daAlinkHIO_kandelaar_c1 const m;
IF_DUSK(static DUSK_GAME_DATA daAlinkHIO_kandelaar_c1 const original;)
}; };
class daAlinkHIO_kandelaar_c : public daAlinkHIO_data_c { class daAlinkHIO_kandelaar_c : public daAlinkHIO_data_c {
@@ -6516,7 +6474,7 @@ public:
class daAlinkHIO_magneBoots_c0 { class daAlinkHIO_magneBoots_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_magneBoots_c1 const m; static daAlinkHIO_magneBoots_c1 const m;
}; };
class daAlinkHIO_magneBoots_c : public daAlinkHIO_data_c { class daAlinkHIO_magneBoots_c : public daAlinkHIO_data_c {
@@ -6542,7 +6500,7 @@ public:
class daAlinkHIO_fmChain_c0 { class daAlinkHIO_fmChain_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_fmChain_c1 const m; static daAlinkHIO_fmChain_c1 const m;
}; };
class daAlinkHIO_fmChain_c : public daAlinkHIO_data_c { class daAlinkHIO_fmChain_c : public daAlinkHIO_data_c {
@@ -6582,7 +6540,7 @@ public:
class daAlinkHIO_hookshot_c0 { class daAlinkHIO_hookshot_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_hookshot_c1 const m; static daAlinkHIO_hookshot_c1 const m;
}; };
class daAlinkHIO_hookshot_c : public daAlinkHIO_data_c { class daAlinkHIO_hookshot_c : public daAlinkHIO_data_c {
@@ -6620,7 +6578,7 @@ public:
class daAlinkHIO_spinner_c0 { class daAlinkHIO_spinner_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_spinner_c1 const m; static daAlinkHIO_spinner_c1 const m;
}; };
class daAlinkHIO_spinner_c : public daAlinkHIO_data_c { class daAlinkHIO_spinner_c : public daAlinkHIO_data_c {
@@ -6676,7 +6634,7 @@ public:
class daAlinkHIO_ironBall_c0 { class daAlinkHIO_ironBall_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_ironBall_c1 const m; static daAlinkHIO_ironBall_c1 const m;
}; };
class daAlinkHIO_ironBall_c : public daAlinkHIO_data_c { class daAlinkHIO_ironBall_c : public daAlinkHIO_data_c {
@@ -6706,7 +6664,7 @@ public:
class daAlinkHIO_copyRod_c0 { class daAlinkHIO_copyRod_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_copyRod_c1 const m; static daAlinkHIO_copyRod_c1 const m;
}; };
class daAlinkHIO_copyRod_c : public daAlinkHIO_data_c { class daAlinkHIO_copyRod_c : public daAlinkHIO_data_c {
@@ -6734,7 +6692,7 @@ public:
class daAlinkHIO_pickUp_c0 { class daAlinkHIO_pickUp_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_pickUp_c1 const m; static daAlinkHIO_pickUp_c1 const m;
}; };
class daAlinkHIO_pickUp_c : public daAlinkHIO_data_c { class daAlinkHIO_pickUp_c : public daAlinkHIO_data_c {
@@ -6781,7 +6739,7 @@ public:
class daAlinkHIO_board_c0 { class daAlinkHIO_board_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_board_c1 const m; static daAlinkHIO_board_c1 const m;
}; };
class daAlinkHIO_board_c : public daAlinkHIO_data_c { class daAlinkHIO_board_c : public daAlinkHIO_data_c {
@@ -6814,7 +6772,7 @@ public:
class daAlinkHIO_bottle_c0 { class daAlinkHIO_bottle_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_bottle_c1 const m; static daAlinkHIO_bottle_c1 const m;
}; };
class daAlinkHIO_bottle_c : public daAlinkHIO_data_c { class daAlinkHIO_bottle_c : public daAlinkHIO_data_c {
@@ -6862,7 +6820,7 @@ public:
static daAlinkHIO_ironBall_c0 const mIronBall; static daAlinkHIO_ironBall_c0 const mIronBall;
static daAlinkHIO_copyRod_c0 const mCopyRod; static daAlinkHIO_copyRod_c0 const mCopyRod;
static daAlinkHIO_zwLight_c0 const mZoraArmorPL; static daAlinkHIO_zwLight_c0 const mZoraArmorPL;
static DUSK_GAME_DATA daAlinkHIO_item_c1 const m; static daAlinkHIO_item_c1 const m;
}; };
class daAlinkHIO_item_c : public daAlinkHIO_data_c { class daAlinkHIO_item_c : public daAlinkHIO_data_c {
@@ -6921,7 +6879,7 @@ public:
class daAlinkHIO_ladder_c0 { class daAlinkHIO_ladder_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_ladder_c1 const m; static daAlinkHIO_ladder_c1 const m;
}; };
class daAlinkHIO_ladder_c : public daAlinkHIO_data_c { class daAlinkHIO_ladder_c : public daAlinkHIO_data_c {
@@ -6961,7 +6919,7 @@ public:
class daAlinkHIO_roofHang_c0 { class daAlinkHIO_roofHang_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_roofHang_c1 const m; static daAlinkHIO_roofHang_c1 const m;
}; };
class daAlinkHIO_roofHang_c : public daAlinkHIO_data_c { class daAlinkHIO_roofHang_c : public daAlinkHIO_data_c {
@@ -6999,7 +6957,7 @@ public:
class daAlinkHIO_grab_c0 { class daAlinkHIO_grab_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_grab_c1 const m; static daAlinkHIO_grab_c1 const m;
}; };
class daAlinkHIO_grab_c : public daAlinkHIO_data_c { class daAlinkHIO_grab_c : public daAlinkHIO_data_c {
@@ -7074,7 +7032,7 @@ public:
class daAlinkHIO_swim_c0 { class daAlinkHIO_swim_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_swim_c1 const m; static daAlinkHIO_swim_c1 const m;
}; };
class daAlinkHIO_swim_c : public daAlinkHIO_data_c { class daAlinkHIO_swim_c : public daAlinkHIO_data_c {
@@ -7150,7 +7108,7 @@ public:
class daAlinkHIO_wlMove_c0 { class daAlinkHIO_wlMove_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlMove_c1 const m; static daAlinkHIO_wlMove_c1 const m;
}; };
class daAlinkHIO_wlMove_c : public daAlinkHIO_data_c { class daAlinkHIO_wlMove_c : public daAlinkHIO_data_c {
@@ -7193,7 +7151,7 @@ public:
class daAlinkHIO_wlMoveNoP_c0 { class daAlinkHIO_wlMoveNoP_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlMoveNoP_c1 const m; static daAlinkHIO_wlMoveNoP_c1 const m;
}; };
class daAlinkHIO_wlMoveNoP_c : public daAlinkHIO_data_c { class daAlinkHIO_wlMoveNoP_c : public daAlinkHIO_data_c {
@@ -7232,7 +7190,7 @@ public:
class daAlinkHIO_wlAtnMove_c0 { class daAlinkHIO_wlAtnMove_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtnMove_c1 const m; static daAlinkHIO_wlAtnMove_c1 const m;
}; };
class daAlinkHIO_wlAtnMove_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtnMove_c : public daAlinkHIO_data_c {
@@ -7264,7 +7222,7 @@ public:
class daAlinkHIO_wlHowl_c0 { class daAlinkHIO_wlHowl_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlHowl_c1 const m; static daAlinkHIO_wlHowl_c1 const m;
}; };
class daAlinkHIO_wlHowl_c : public daAlinkHIO_data_c { class daAlinkHIO_wlHowl_c : public daAlinkHIO_data_c {
@@ -7298,7 +7256,7 @@ public:
class daAlinkHIO_wlSideStep_c0 { class daAlinkHIO_wlSideStep_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlSideStep_c1 const m; static daAlinkHIO_wlSideStep_c1 const m;
}; };
class daAlinkHIO_wlSideStep_c : public daAlinkHIO_data_c { class daAlinkHIO_wlSideStep_c : public daAlinkHIO_data_c {
@@ -7328,7 +7286,7 @@ public:
class daAlinkHIO_wlBackJump_c0 { class daAlinkHIO_wlBackJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlBackJump_c1 const m; static daAlinkHIO_wlBackJump_c1 const m;
}; };
class daAlinkHIO_wlBackJump_c : public daAlinkHIO_data_c { class daAlinkHIO_wlBackJump_c : public daAlinkHIO_data_c {
@@ -7373,7 +7331,7 @@ public:
class daAlinkHIO_wlAutoJump_c0 { class daAlinkHIO_wlAutoJump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAutoJump_c1 const m; static daAlinkHIO_wlAutoJump_c1 const m;
}; };
class daAlinkHIO_wlAutoJump_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAutoJump_c : public daAlinkHIO_data_c {
@@ -7402,7 +7360,7 @@ public:
class daAlinkHIO_wlPush_c0 { class daAlinkHIO_wlPush_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlPush_c1 const m; static daAlinkHIO_wlPush_c1 const m;
}; };
class daAlinkHIO_wlPush_c : public daAlinkHIO_data_c { class daAlinkHIO_wlPush_c : public daAlinkHIO_data_c {
@@ -7438,7 +7396,7 @@ public:
class daAlinkHIO_wlLie_c0 { class daAlinkHIO_wlLie_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlLie_c1 const m; static daAlinkHIO_wlLie_c1 const m;
}; };
class daAlinkHIO_wlLie_c : public daAlinkHIO_data_c { class daAlinkHIO_wlLie_c : public daAlinkHIO_data_c {
@@ -7477,7 +7435,7 @@ public:
class daAlinkHIO_wlWallHang_c0 { class daAlinkHIO_wlWallHang_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlWallHang_c1 const m; static daAlinkHIO_wlWallHang_c1 const m;
}; };
class daAlinkHIO_wlWallHang_c : public daAlinkHIO_data_c { class daAlinkHIO_wlWallHang_c : public daAlinkHIO_data_c {
@@ -7509,7 +7467,7 @@ public:
class daAlinkHIO_wlDamNormal_c0 { class daAlinkHIO_wlDamNormal_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlDamNormal_c1 const m; static daAlinkHIO_wlDamNormal_c1 const m;
}; };
class daAlinkHIO_wlDamNormal_c : public daAlinkHIO_data_c { class daAlinkHIO_wlDamNormal_c : public daAlinkHIO_data_c {
@@ -7544,12 +7502,12 @@ public:
class daAlinkHIO_wlDamLarge_c0 { class daAlinkHIO_wlDamLarge_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlDamLaHu_c1 const m; static daAlinkHIO_wlDamLaHu_c1 const m;
}; };
class daAlinkHIO_wlDamHuge_c0 { class daAlinkHIO_wlDamHuge_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlDamLaHu_c1 const m; static daAlinkHIO_wlDamLaHu_c1 const m;
}; };
class daAlinkHIO_wlDamLaHu_c : public daAlinkHIO_data_c { class daAlinkHIO_wlDamLaHu_c : public daAlinkHIO_data_c {
@@ -7578,7 +7536,7 @@ public:
class daAlinkHIO_wlDamCaught_c0 { class daAlinkHIO_wlDamCaught_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlDamCaught_c1 const m; static daAlinkHIO_wlDamCaught_c1 const m;
}; };
class daAlinkHIO_wlDamCaught_c : public daAlinkHIO_data_c { class daAlinkHIO_wlDamCaught_c : public daAlinkHIO_data_c {
@@ -7611,7 +7569,7 @@ public:
class daAlinkHIO_wlDamFall_c0 { class daAlinkHIO_wlDamFall_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlDamFall_c1 const m; static daAlinkHIO_wlDamFall_c1 const m;
}; };
class daAlinkHIO_wlDamFall_c : public daAlinkHIO_data_c { class daAlinkHIO_wlDamFall_c : public daAlinkHIO_data_c {
@@ -7638,7 +7596,7 @@ public:
class daAlinkHIO_wlDamage_c0 { class daAlinkHIO_wlDamage_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlDamage_c1 const m; static daAlinkHIO_wlDamage_c1 const m;
static daAlinkHIO_wlDamNormal_c0 const mNormal; static daAlinkHIO_wlDamNormal_c0 const mNormal;
static daAlinkHIO_wlDamLarge_c0 const mLarge; static daAlinkHIO_wlDamLarge_c0 const mLarge;
static daAlinkHIO_wlDamHuge_c0 const mHuge; static daAlinkHIO_wlDamHuge_c0 const mHuge;
@@ -7688,7 +7646,7 @@ public:
class daAlinkHIO_wlSlide_c0 { class daAlinkHIO_wlSlide_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlSlide_c1 const m; static daAlinkHIO_wlSlide_c1 const m;
}; };
class daAlinkHIO_wlSlide_c : public daAlinkHIO_data_c { class daAlinkHIO_wlSlide_c : public daAlinkHIO_data_c {
@@ -7723,7 +7681,7 @@ public:
class daAlinkHIO_wlRope_c0 { class daAlinkHIO_wlRope_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlRope_c1 const m; static daAlinkHIO_wlRope_c1 const m;
}; };
class daAlinkHIO_wlRope_c : public daAlinkHIO_data_c { class daAlinkHIO_wlRope_c : public daAlinkHIO_data_c {
@@ -7759,17 +7717,17 @@ public:
class daAlinkHIO_wlAtWaTl_c0 { class daAlinkHIO_wlAtWaTl_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtWait_c1 const m; static daAlinkHIO_wlAtWait_c1 const m;
}; };
class daAlinkHIO_wlAtWaSc_c0 { class daAlinkHIO_wlAtWaSc_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtWait_c1 const m; static daAlinkHIO_wlAtWait_c1 const m;
}; };
class daAlinkHIO_wlAtWaLr_c0 { class daAlinkHIO_wlAtWaLr_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtWait_c1 const m; static daAlinkHIO_wlAtWait_c1 const m;
}; };
class daAlinkHIO_wlAtWait_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtWait_c : public daAlinkHIO_data_c {
@@ -7796,7 +7754,7 @@ public:
class daAlinkHIO_wlAtRoll_c0 { class daAlinkHIO_wlAtRoll_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtRoll_c1 const m; static daAlinkHIO_wlAtRoll_c1 const m;
}; };
class daAlinkHIO_wlAtRoll_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtRoll_c : public daAlinkHIO_data_c {
@@ -7831,7 +7789,7 @@ public:
class daAlinkHIO_wlAtNjump_c0 { class daAlinkHIO_wlAtNjump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtNjump_c1 const m; static daAlinkHIO_wlAtNjump_c1 const m;
}; };
class daAlinkHIO_wlAtNjump_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtNjump_c : public daAlinkHIO_data_c {
@@ -7872,7 +7830,7 @@ public:
class daAlinkHIO_wlAtCjump_c0 { class daAlinkHIO_wlAtCjump_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtCjump_c1 const m; static daAlinkHIO_wlAtCjump_c1 const m;
}; };
class daAlinkHIO_wlAtCjump_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtCjump_c : public daAlinkHIO_data_c {
@@ -7900,7 +7858,7 @@ public:
class daAlinkHIO_wlAtLand_c0 { class daAlinkHIO_wlAtLand_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtLand_c1 const m; static daAlinkHIO_wlAtLand_c1 const m;
}; };
class daAlinkHIO_wlAtLand_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtLand_c : public daAlinkHIO_data_c {
@@ -7936,7 +7894,7 @@ public:
class daAlinkHIO_wlAtDown_c0 { class daAlinkHIO_wlAtDown_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtDown_c1 const m; static daAlinkHIO_wlAtDown_c1 const m;
}; };
class daAlinkHIO_wlAtDown_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtDown_c : public daAlinkHIO_data_c {
@@ -7973,7 +7931,7 @@ public:
class daAlinkHIO_wlAtLock_c0 { class daAlinkHIO_wlAtLock_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtLock_c1 const m; static daAlinkHIO_wlAtLock_c1 const m;
}; };
class daAlinkHIO_wlAtLock_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtLock_c : public daAlinkHIO_data_c {
@@ -8013,7 +7971,7 @@ public:
class daAlinkHIO_wlAtBite_c0 { class daAlinkHIO_wlAtBite_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlAtBite_c1 const m; static daAlinkHIO_wlAtBite_c1 const m;
}; };
class daAlinkHIO_wlAtBite_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAtBite_c : public daAlinkHIO_data_c {
@@ -8058,7 +8016,7 @@ public:
static daAlinkHIO_wlAtDown_c0 const mWlAtDown; static daAlinkHIO_wlAtDown_c0 const mWlAtDown;
static daAlinkHIO_wlAtLock_c0 const mWlAtLock; static daAlinkHIO_wlAtLock_c0 const mWlAtLock;
static daAlinkHIO_wlAtBite_c0 const mWlAtBite; static daAlinkHIO_wlAtBite_c0 const mWlAtBite;
static DUSK_GAME_DATA daAlinkHIO_wlAttack_c1 const m; static daAlinkHIO_wlAttack_c1 const m;
}; };
class daAlinkHIO_wlAttack_c : public daAlinkHIO_data_c { class daAlinkHIO_wlAttack_c : public daAlinkHIO_data_c {
@@ -8105,7 +8063,7 @@ public:
class daAlinkHIO_wlPoint_c0 { class daAlinkHIO_wlPoint_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlPoint_c1 const m; static daAlinkHIO_wlPoint_c1 const m;
}; };
class daAlinkHIO_wlPoint_c : public daAlinkHIO_data_c { class daAlinkHIO_wlPoint_c : public daAlinkHIO_data_c {
@@ -8141,7 +8099,7 @@ public:
class daAlinkHIO_wlChain_c0 { class daAlinkHIO_wlChain_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlChain_c1 const m; static daAlinkHIO_wlChain_c1 const m;
}; };
class daAlinkHIO_wlChain_c : public daAlinkHIO_data_c { class daAlinkHIO_wlChain_c : public daAlinkHIO_data_c {
@@ -8198,7 +8156,7 @@ public:
class daAlinkHIO_wlSwim_c0 { class daAlinkHIO_wlSwim_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlSwim_c1 const m; static daAlinkHIO_wlSwim_c1 const m;
}; };
class daAlinkHIO_wlSwim_c : public daAlinkHIO_data_c { class daAlinkHIO_wlSwim_c : public daAlinkHIO_data_c {
@@ -8227,7 +8185,7 @@ public:
class daAlinkHIO_wlGrab_c0 { class daAlinkHIO_wlGrab_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlGrab_c1 const m; static daAlinkHIO_wlGrab_c1 const m;
}; };
class daAlinkHIO_wlGrab_c : public daAlinkHIO_data_c { class daAlinkHIO_wlGrab_c : public daAlinkHIO_data_c {
@@ -8257,7 +8215,7 @@ public:
class daAlinkHIO_wlBall_c0 { class daAlinkHIO_wlBall_c0 {
public: public:
static DUSK_GAME_DATA daAlinkHIO_wlBall_c1 const m; static daAlinkHIO_wlBall_c1 const m;
}; };
class daAlinkHIO_wlBall_c : public daAlinkHIO_data_c { class daAlinkHIO_wlBall_c : public daAlinkHIO_data_c {
@@ -8312,7 +8270,7 @@ public:
static daAlinkHIO_wlSwim_c0 const mWlSwim; static daAlinkHIO_wlSwim_c0 const mWlSwim;
static daAlinkHIO_wlGrab_c0 const mWlGrab; static daAlinkHIO_wlGrab_c0 const mWlGrab;
static daAlinkHIO_wlBall_c0 const mWlBall; static daAlinkHIO_wlBall_c0 const mWlBall;
static DUSK_GAME_DATA daAlinkHIO_wolf_c1 const m; static daAlinkHIO_wolf_c1 const m;
}; };
class daAlinkHIO_wolf_c : public daAlinkHIO_data_c { class daAlinkHIO_wolf_c : public daAlinkHIO_data_c {
+1 -1
View File
@@ -161,7 +161,7 @@ private:
/* 0xA10 */ dPa_hermiteEcallBack_c field_0xa10; /* 0xA10 */ dPa_hermiteEcallBack_c field_0xa10;
/* 0xA28 */ int (daArrow_c::*mProcFunc)(); /* 0xA28 */ int (daArrow_c::*mProcFunc)();
static DUSK_GAME_DATA s16 m_count; static s16 m_count;
}; };
STATIC_ASSERT(sizeof(daArrow_c) == 0xA34); STATIC_ASSERT(sizeof(daArrow_c) == 0xA34);
+1 -1
View File
@@ -203,7 +203,7 @@ private:
/* 0x0AAD */ bool mStayNo2Flag; /* 0x0AAD */ bool mStayNo2Flag;
/* 0x0AAE */ u8 mBlendStatus; /* 0x0AAE */ u8 mBlendStatus;
/* 0x0AB0 */ f32 mBlend; /* 0x0AB0 */ f32 mBlend;
/* 0x0AB4 */ char DUSK_CONST* mArcName; /* 0x0AB4 */ char* mArcName;
/* 0x0AB8 */ dBgS_AcchCir mAcchCir; /* 0x0AB8 */ dBgS_AcchCir mAcchCir;
/* 0x0AF8 */ dBgS_ObjAcch mAcch; /* 0x0AF8 */ dBgS_ObjAcch mAcch;
/* 0x0CD0 */ dBgS_AcchCir mAcchCirArr[16]; /* 0x0CD0 */ dBgS_AcchCir mAcchCirArr[16];
+1 -1
View File
@@ -67,7 +67,7 @@ public:
void hide() { mIsVisible = 0; } void hide() { mIsVisible = 0; }
u8 isVisible() { return mIsVisible; } u8 isVisible() { return mIsVisible; }
static DUSK_GAME_DATA daBalloon2D_c* myclass; static daBalloon2D_c* myclass;
struct ScoreCount { struct ScoreCount {
cXyz field_0x0; cXyz field_0x0;
+4 -4
View File
@@ -89,10 +89,10 @@ public:
void setAction(u8 i_action) { mAction = i_action; } void setAction(u8 i_action) { mAction = i_action; }
static DUSK_GAME_DATA createHeapFunc mCreateHeapFunc[]; static createHeapFunc mCreateHeapFunc[];
static DUSK_GAME_DATA createInitFunc mCreateInitFunc[]; static createInitFunc mCreateInitFunc[];
static DUSK_GAME_DATA executeFunc mExecuteFunc[]; static executeFunc mExecuteFunc[];
static DUSK_GAME_DATA tgSetFunc mTgSetFunc[]; static tgSetFunc mTgSetFunc[];
/* 0x5A0 */ request_of_phase_process_class mPhase; /* 0x5A0 */ request_of_phase_process_class mPhase;
/* 0x5A8 */ J3DModel* field_0x5a8[2][2]; /* 0x5A8 */ J3DModel* field_0x5a8[2][2];
+6 -6
View File
@@ -190,12 +190,12 @@ STATIC_ASSERT(sizeof(daBoomerang_c) == 0xDE4);
class daBoomerang_HIO_c0 { class daBoomerang_HIO_c0 {
public: public:
static DUSK_GAME_DATA u16 const m_lockWaitTime; static u16 const m_lockWaitTime;
static DUSK_GAME_DATA f32 const m_minCircleR; static f32 const m_minCircleR;
static DUSK_GAME_DATA f32 const m_middleCircleR; static f32 const m_middleCircleR;
static DUSK_GAME_DATA f32 const m_maxCircleR; static f32 const m_maxCircleR;
static DUSK_GAME_DATA f32 const m_scale; static f32 const m_scale;
static DUSK_GAME_DATA f32 const m_lockWindScale; static f32 const m_lockWindScale;
}; };
#endif /* D_A_BOOMERANG_H */ #endif /* D_A_BOOMERANG_H */
+3 -3
View File
@@ -18,7 +18,7 @@ class daBullet_Param_c {
public: public:
virtual ~daBullet_Param_c() {} virtual ~daBullet_Param_c() {}
static DUSK_GAME_DATA daBullet_HIOParam const m; static daBullet_HIOParam const m;
}; };
#if DEBUG #if DEBUG
@@ -80,8 +80,8 @@ public:
int wait(void*); int wait(void*);
int move(void*); int move(void*);
static DUSK_GAME_DATA dCcD_SrcGObjInf const mCcDObjInfo; static dCcD_SrcGObjInf const mCcDObjInfo;
static DUSK_GAME_DATA dCcD_SrcSph mCcDSph; static dCcD_SrcSph mCcDSph;
}; };
STATIC_ASSERT(sizeof(daBullet_c) == 0x95c); STATIC_ASSERT(sizeof(daBullet_c) == 0x95c);
+1 -1
View File
@@ -33,7 +33,7 @@ public:
const CoachFireAttr& attr() { return M_attr; } const CoachFireAttr& attr() { return M_attr; }
static DUSK_GAME_DATA CoachFireAttr const M_attr; static CoachFireAttr const M_attr;
inline ~daCoachFire_c(); inline ~daCoachFire_c();
+1 -1
View File
@@ -38,7 +38,7 @@ public:
struct BckTbl { struct BckTbl {
u16 idx[4]; u16 idx[4];
}; };
static DUSK_GAME_DATA const BckTbl m_bckIdxTable[]; static const BckTbl m_bckIdxTable[];
private: private:
/* 0x5A0 */ const char* m_arcName; /* 0x5A0 */ const char* m_arcName;
+1 -1
View File
@@ -99,7 +99,7 @@ public:
mWarpMode = daCstatueWarpMode_Active; mWarpMode = daCstatueWarpMode_Active;
} }
static DUSK_GAME_DATA u16 const m_bckIdxTable[daCstatueType_N][7]; static u16 const m_bckIdxTable[daCstatueType_N][7];
private: private:
/* 0x568 */ const char* mResName; /* 0x568 */ const char* mResName;
+4 -4
View File
@@ -23,10 +23,10 @@ public:
/* 3 */ ACT_END, /* 3 */ ACT_END,
}; };
DUSK_CONST char* getArcName(); char* getArcName();
DUSK_CONST char* getBmd(); char* getBmd();
DUSK_CONST char* getDzb(); char* getDzb();
DUSK_CONST char* getBmd2(); char* getBmd2();
J3DModelData* getDoorModelData(); J3DModelData* getDoorModelData();
int CreateHeap(); int CreateHeap();
void calcMtx(); void calcMtx();
+2 -2
View File
@@ -33,8 +33,8 @@ public:
typedef int (daBdoorL1_c::*actionFunc)(); typedef int (daBdoorL1_c::*actionFunc)();
DUSK_CONST char* getDoorEventName(); char* getDoorEventName();
DUSK_CONST char* getDoorEventName2(); char* getDoorEventName2();
const char* getArcName(); const char* getArcName();
const char* getAnmArcName(); const char* getAnmArcName();
int getDoorType(); int getDoorType();
+5 -5
View File
@@ -14,11 +14,11 @@
*/ */
class daDbDoor00_c : public fopAc_ac_c { class daDbDoor00_c : public fopAc_ac_c {
public: public:
DUSK_CONST char* getAlwaysArcName(); char* getAlwaysArcName();
DUSK_CONST char* getDzb(); char* getDzb();
DUSK_CONST char* getDummyBmdName(); char* getDummyBmdName();
DUSK_CONST char* getBmdArcName(); char* getBmdArcName();
DUSK_CONST char* getBmdName(); char* getBmdName();
J3DModelData* getDoorModelData(); J3DModelData* getDoorModelData();
int CreateHeap(); int CreateHeap();
void calcMtx(); void calcMtx();
+5 -5
View File
@@ -29,11 +29,11 @@ public:
typedef int (daKnob20_c::*actionFunc)(); typedef int (daKnob20_c::*actionFunc)();
DUSK_CONST char* getAlwaysArcName(); char* getAlwaysArcName();
DUSK_CONST char* getEvArcName(); char* getEvArcName();
DUSK_CONST char* getDzb(); char* getDzb();
DUSK_CONST char* getDummyBmd(); char* getDummyBmd();
DUSK_CONST char* getBmd(); char* getBmd();
J3DModelData* getDoorModelData(); J3DModelData* getDoorModelData();
int CreateHeap(); int CreateHeap();
void calcMtx(); void calcMtx();
+8 -8
View File
@@ -54,15 +54,15 @@ public:
typedef int (daMBdoorL1_c::*actionFunc)(); typedef int (daMBdoorL1_c::*actionFunc)();
DUSK_CONST char* getAnmArcName(); char* getAnmArcName();
DUSK_CONST char* getArcName(); char* getArcName();
DUSK_CONST char* getAlwaysArcName(); char* getAlwaysArcName();
int getDoorType(); int getDoorType();
DUSK_CONST char* getOpenAnm(); char* getOpenAnm();
DUSK_CONST char* getCloseAnm(); char* getCloseAnm();
DUSK_CONST char* getBmd(); char* getBmd();
DUSK_CONST char* getBtk(); char* getBtk();
DUSK_CONST char* getDzb(); char* getDzb();
J3DModelData* getDoorModelData(); J3DModelData* getDoorModelData();
int CreateHeap(); int CreateHeap();
void calcMtx(); void calcMtx();
+6 -6
View File
@@ -45,12 +45,12 @@ public:
ACTION_DEMO, ACTION_DEMO,
}; };
char DUSK_CONST* getStopBmdName(); char* getStopBmdName();
J3DModelData* getStopModelData(); J3DModelData* getStopModelData();
char DUSK_CONST* getAlwaysArcName(); char* getAlwaysArcName();
char DUSK_CONST* getArcName(); char* getArcName();
char DUSK_CONST* getBmdName(); char* getBmdName();
char DUSK_CONST* getBtk(); char* getBtk();
J3DModelData* getModelData(); J3DModelData* getModelData();
f32 getSize2X(); f32 getSize2X();
int CreateHeap(); int CreateHeap();
@@ -115,7 +115,7 @@ public:
int chkStopOpen(); int chkStopOpen();
int chkMakeKey(); int chkMakeKey();
virtual char DUSK_CONST* getDzbName(); virtual char* getDzbName();
virtual int getDemoAction(); virtual int getDemoAction();
void onFlag(u16 flag) { field_0x68e |= flag; } void onFlag(u16 flag) { field_0x68e |= flag; }
+9 -9
View File
@@ -65,15 +65,15 @@ public:
f32 getCloseBoundSpeed() { return CLOSE_BOUND_SPEED; } f32 getCloseBoundSpeed() { return CLOSE_BOUND_SPEED; }
f32 getCloseBoundRatio() { return CLOSE_BOUND_RATIO; } f32 getCloseBoundRatio() { return CLOSE_BOUND_RATIO; }
static DUSK_GAME_DATA f32 const OPEN_SIZE; static f32 const OPEN_SIZE;
static DUSK_GAME_DATA f32 const OPEN_ACCEL; static f32 const OPEN_ACCEL;
static DUSK_GAME_DATA f32 const OPEN_SPEED; static f32 const OPEN_SPEED;
static DUSK_GAME_DATA f32 const OPEN_BOUND_SPEED; static f32 const OPEN_BOUND_SPEED;
static DUSK_GAME_DATA f32 const OPEN_BOUND_RATIO; static f32 const OPEN_BOUND_RATIO;
static DUSK_GAME_DATA f32 const CLOSE_ACCEL; static f32 const CLOSE_ACCEL;
static DUSK_GAME_DATA f32 const CLOSE_SPEED; static f32 const CLOSE_SPEED;
static DUSK_GAME_DATA f32 const CLOSE_BOUND_SPEED; static f32 const CLOSE_BOUND_SPEED;
static DUSK_GAME_DATA f32 const CLOSE_BOUND_RATIO; static f32 const CLOSE_BOUND_RATIO;
/* 0x5A0 */ dComIfG_resLoader_c mResLoader; /* 0x5A0 */ dComIfG_resLoader_c mResLoader;
/* 0x5B0 */ J3DModel* mpModel; /* 0x5B0 */ J3DModel* mpModel;
+1 -1
View File
@@ -32,7 +32,7 @@ public:
/* 0x5B4 */ J3DModel* mpModel; /* 0x5B4 */ J3DModel* mpModel;
/* 0x5B8 */ u8 mArrowType; /* 0x5B8 */ u8 mArrowType;
/* 0x5B9 */ u8 mFlags; /* 0x5B9 */ u8 mFlags;
/* 0x5BC */ char DUSK_CONST* mResName; /* 0x5BC */ char* mResName;
/* 0x5C0 */ s16 field_0x5c0; /* 0x5C0 */ s16 field_0x5c0;
/* 0x5C2 */ s16 mAction; /* 0x5C2 */ s16 mAction;
/* 0x5C4 */ s16 mMode; /* 0x5C4 */ s16 mMode;
+1 -1
View File
@@ -60,7 +60,7 @@ public:
/* 0x5B5 */ u8 mDistanceParam; /* 0x5B5 */ u8 mDistanceParam;
/* 0x5B6 */ u8 mType; /* 0x5B6 */ u8 mType;
/* 0x5B7 */ u8 mPathIndex; /* 0x5B7 */ u8 mPathIndex;
/* 0x5B8 */ DUSK_CONST char* mArcName; /* 0x5B8 */ char* mArcName;
/* 0x5BC */ u8 field_0x5bc; /* 0x5BC */ u8 field_0x5bc;
/* 0x5BD */ s8 mPathPoint; /* 0x5BD */ s8 mPathPoint;
/* 0x5BE */ s8 mPathStep; /* 0x5BE */ s8 mPathStep;
-6
View File
@@ -80,12 +80,6 @@ public:
/* 0x125C */ u32 field_0x125c; /* 0x125C */ u32 field_0x125c;
/* 0x1260 */ u8 field_0x1260[0x126C - 0x1260]; /* 0x1260 */ u8 field_0x1260[0x126C - 0x1260];
/* 0x126C */ u8 HIOInit; /* 0x126C */ u8 HIOInit;
#if TARGET_PC
cXyz mStalkLineInterpPrev[12];
cXyz mStalkLineInterpCurr[12];
bool mStalkLineInterpPrevValid;
bool mStalkLineInterpCurrValid;
#endif
}; };
STATIC_ASSERT(sizeof(e_db_class) == 0x1270); STATIC_ASSERT(sizeof(e_db_class) == 0x1270);
+8 -8
View File
@@ -175,14 +175,14 @@ private:
STATIC_ASSERT(sizeof(daE_DT_c) == 0x1174); STATIC_ASSERT(sizeof(daE_DT_c) == 0x1174);
struct E_DT_n { struct E_DT_n {
static DUSK_GAME_DATA f32 eDt_ShakeFrame[10]; static f32 eDt_ShakeFrame[10];
static DUSK_GAME_DATA f32 eDt_ShakeFrameDemo[10]; static f32 eDt_ShakeFrameDemo[10];
static DUSK_GAME_DATA dCcD_SrcSph cc_dt_body_src; static dCcD_SrcSph cc_dt_body_src;
static DUSK_GAME_DATA dCcD_SrcSph cc_dt_tongue_src; static dCcD_SrcSph cc_dt_tongue_src;
static DUSK_GAME_DATA int mDt_OtamaNum; static int mDt_OtamaNum;
static DUSK_GAME_DATA int mDt_OtamaNo[20]; static int mDt_OtamaNo[20];
static DUSK_GAME_DATA int m_fall_no; static int m_fall_no;
static DUSK_GAME_DATA cXyz m_tongue_pos; static cXyz m_tongue_pos;
}; };
+1 -1
View File
@@ -101,7 +101,7 @@ private:
/* 0xB9E */ u8 field_0xb9e; /* 0xB9E */ u8 field_0xb9e;
/* 0xB9F */ u8 mHIOInit; /* 0xB9F */ u8 mHIOInit;
static DUSK_GAME_DATA actionFunc l_actionmenu[9]; static actionFunc l_actionmenu[9];
}; };
STATIC_ASSERT(sizeof(daE_GE_c) == 0xBA0); STATIC_ASSERT(sizeof(daE_GE_c) == 0xBA0);
-6
View File
@@ -73,12 +73,6 @@ public:
/* 0x124C */ f32 field_0x124c; /* 0x124C */ f32 field_0x124c;
/* 0x1250 */ u8 field_0x1250[0x1264 - 0x1250]; /* 0x1250 */ u8 field_0x1250[0x1264 - 0x1250];
/* 0x1264 */ u8 HIOInit; /* 0x1264 */ u8 HIOInit;
#if TARGET_PC
cXyz mStalkLineInterpPrev[12];
cXyz mStalkLineInterpCurr[12];
bool mStalkLineInterpPrevValid;
bool mStalkLineInterpCurrValid;
#endif
}; };
STATIC_ASSERT(sizeof(e_hb_class) == 0x1268); STATIC_ASSERT(sizeof(e_hb_class) == 0x1268);
+8 -8
View File
@@ -159,14 +159,14 @@ private:
STATIC_ASSERT(sizeof(daE_OC_c) == 0xe88); STATIC_ASSERT(sizeof(daE_OC_c) == 0xe88);
struct E_OC_n { struct E_OC_n {
static DUSK_GAME_DATA f32 const oc_attackb_trans[10]; static f32 const oc_attackb_trans[10];
static DUSK_GAME_DATA f32 const oc_attackc_trans[10]; static f32 const oc_attackc_trans[10];
static DUSK_GAME_DATA dCcD_SrcSph cc_sph_src; static dCcD_SrcSph cc_sph_src;
static DUSK_GAME_DATA dCcD_SrcSph at_sph_src; static dCcD_SrcSph at_sph_src;
static DUSK_GAME_DATA daE_OC_c* m_battle_oc; static daE_OC_c* m_battle_oc;
static DUSK_GAME_DATA daE_OC_c* m_damage_oc; static daE_OC_c* m_damage_oc;
static DUSK_GAME_DATA daE_OC_c* m_death_oc; static daE_OC_c* m_death_oc;
static DUSK_GAME_DATA daE_OC_c* m_talk_oc; static daE_OC_c* m_talk_oc;
}; };
#endif /* D_A_E_OC_H */ #endif /* D_A_E_OC_H */
+1 -1
View File
@@ -38,7 +38,7 @@ public:
/* 0x05CC */ s16 target_ya; /* 0x05CC */ s16 target_ya;
/* 0x05D0 */ mDoExt_McaMorfSO* anm_p; /* 0x05D0 */ mDoExt_McaMorfSO* anm_p;
/* 0x05D4 */ Z2CreatureEnemy sound; /* 0x05D4 */ Z2CreatureEnemy sound;
/* 0x0678 */ DUSK_CONST char* resName; /* 0x0678 */ char* resName;
/* 0x067C */ int anm; /* 0x067C */ int anm;
/* 0x0680 */ int field_0x680; /* 0x0680 */ int field_0x680;
/* 0x0684 */ dJntCol_c mJntCol; /* 0x0684 */ dJntCol_c mJntCol;
+1 -1
View File
@@ -36,7 +36,7 @@ public:
/* 0x05C8 */ s16 mTargetAngleY; /* 0x05C8 */ s16 mTargetAngleY;
/* 0x05CC */ mDoExt_McaMorfSO* mpMorf; /* 0x05CC */ mDoExt_McaMorfSO* mpMorf;
/* 0x05D0 */ Z2CreatureEnemy mSound; /* 0x05D0 */ Z2CreatureEnemy mSound;
/* 0x0674 */ char DUSK_CONST* mpArcName; /* 0x0674 */ char* mpArcName;
/* 0x0678 */ int mAnm; /* 0x0678 */ int mAnm;
/* 0x067C */ u8 field_0x67c[0x680 - 0x67c]; /* 0x067C */ u8 field_0x67c[0x680 - 0x67c];
/* 0x0680 */ dJntCol_c mJntCol; /* 0x0680 */ dJntCol_c mJntCol;
-9
View File
@@ -81,15 +81,6 @@ public:
/* 0x306D */ u8 field_0x306D[0x307C - 0x306D]; /* 0x306D */ u8 field_0x306D[0x307C - 0x306D];
/* 0x307C */ u32 mBodyEffEmtrID; /* 0x307C */ u32 mBodyEffEmtrID;
/* 0x3080 */ u8 mInitHIO; /* 0x3080 */ u8 mInitHIO;
#if TARGET_PC
static const int HAIR_STRAND_COUNT = 22;
static const int HAIR_SEGMENT_COUNT = 16;
cXyz mHairInterpPrev[HAIR_STRAND_COUNT * HAIR_SEGMENT_COUNT];
cXyz mHairInterpCurr[HAIR_STRAND_COUNT * HAIR_SEGMENT_COUNT];
bool mHairInterpPrevValid;
bool mHairInterpCurrValid;
#endif
}; };
STATIC_ASSERT(sizeof(e_s1_class) == 0x3084); STATIC_ASSERT(sizeof(e_s1_class) == 0x3084);
+1 -1
View File
@@ -63,7 +63,7 @@ private:
/* 0x6D4 */ f32 field_0x6d4; /* 0x6D4 */ f32 field_0x6d4;
/* 0x6D8 */ s16 mFootJoints[4]; /* 0x6D8 */ s16 mFootJoints[4];
/* 0x6E0 */ s16 field_0x6e0; /* 0x6E0 */ s16 field_0x6e0;
/* 0x6E4 */ char DUSK_CONST* mpResName; /* 0x6E4 */ char* mpResName;
/* 0x6E8 */ u16 mDamageCooldownTimer; /* 0x6E8 */ u16 mDamageCooldownTimer;
/* 0x6EA */ u8 mGenericTimer; /* 0x6EA */ u8 mGenericTimer;
/* 0x6EC */ int mAttackTimer; /* 0x6EC */ int mAttackTimer;
+1 -1
View File
@@ -99,7 +99,7 @@ public:
/* 0x0000 */ fopEn_enemy_c enemy; ///< @brief Base enemy class instance. /* 0x0000 */ fopEn_enemy_c enemy; ///< @brief Base enemy class instance.
/* 0x05AC */ request_of_phase_process_class phase; ///< @brief Phase process request handler. /* 0x05AC */ request_of_phase_process_class phase; ///< @brief Phase process request handler.
/* 0x05B4 */ s16 ride_mode; ///< @brief Current sub-action mode within the run action. /* 0x05B4 */ s16 ride_mode; ///< @brief Current sub-action mode within the run action.
/* 0x05B8 */ char DUSK_CONST* resName; ///< @brief Resource name for loading models/animations. /* 0x05B8 */ char* resName; ///< @brief Resource name for loading models/animations.
/* 0x05BC */ u8 arg0; ///< @brief Creation parameter 1. /* 0x05BC */ u8 arg0; ///< @brief Creation parameter 1.
/* 0x05BD */ u8 arg1; ///< @brief Creation parameter 2. /* 0x05BD */ u8 arg1; ///< @brief Creation parameter 2.
/* 0x05BE */ u8 field_0x5be; /* 0x05BE */ u8 field_0x5be;
-6
View File
@@ -74,12 +74,6 @@ public:
/* 0x1250 */ f32 field_0x1250; /* 0x1250 */ f32 field_0x1250;
/* 0x1254 */ u8 field_0x1254[0x1268 - 0x1254]; /* 0x1254 */ u8 field_0x1254[0x1268 - 0x1254];
/* 0x1268 */ u8 field_0x1268; /* 0x1268 */ u8 field_0x1268;
#if TARGET_PC
cXyz mLineMatInterpPrev[12];
cXyz mLineMatInterpCurr[12];
bool mLineMatInterpPrevValid;
bool mLineMatInterpCurrValid;
#endif
}; };
STATIC_ASSERT(sizeof(e_yd_class) == 0x126c); STATIC_ASSERT(sizeof(e_yd_class) == 0x126c);
-9
View File
@@ -63,15 +63,6 @@ public:
/* 0x0BB4 */ yg_ke_s mYgKes[13]; /* 0x0BB4 */ yg_ke_s mYgKes[13];
/* 0x1880 */ mDoExt_3DlineMat0_c mLineMat; /* 0x1880 */ mDoExt_3DlineMat0_c mLineMat;
/* 0x189C */ u8 mIsFirstSpawn; /* 0x189C */ u8 mIsFirstSpawn;
#if TARGET_PC
static const int TENTACLE_STRAND_COUNT = 13;
static const int TENTACLE_SEGMENT_COUNT = 10;
cXyz mTentacleInterpPrev[TENTACLE_STRAND_COUNT * TENTACLE_SEGMENT_COUNT];
cXyz mTentacleInterpCurr[TENTACLE_STRAND_COUNT * TENTACLE_SEGMENT_COUNT];
bool mTentacleInterpPrevValid;
bool mTentacleInterpCurrValid;
#endif
}; };
STATIC_ASSERT(sizeof(e_yg_class) == 0x18a0); STATIC_ASSERT(sizeof(e_yg_class) == 0x18a0);
-6
View File
@@ -77,12 +77,6 @@ public:
/* 0x1260 */ u32 field_0x1260; /* 0x1260 */ u32 field_0x1260;
/* 0x1260 */ u8 field_0x1264[0x1270 - 0x1264]; /* 0x1260 */ u8 field_0x1264[0x1270 - 0x1264];
/* 0x1270 */ bool mIsHIOOwner; /* 0x1270 */ bool mIsHIOOwner;
#if TARGET_PC
cXyz mLineInterpPrev[12];
cXyz mLineInterpCurr[12];
bool mLineInterpPrevValid;
bool mLineInterpCurrValid;
#endif
}; };
STATIC_ASSERT(sizeof(e_yh_class) == 0x1274); STATIC_ASSERT(sizeof(e_yh_class) == 0x1274);
+1 -1
View File
@@ -215,7 +215,7 @@ private:
STATIC_ASSERT(sizeof(daE_YM_c) == 0xAF8); STATIC_ASSERT(sizeof(daE_YM_c) == 0xAF8);
struct E_YM_n { struct E_YM_n {
static DUSK_GAME_DATA dCcD_SrcSph cc_sph_src; static dCcD_SrcSph cc_sph_src;
}; };
+2 -2
View File
@@ -311,10 +311,10 @@ struct daFmtMng_c : public fopAc_ac_c {
} }
static FmtMngAttributes const& attr() { return M_attr; } static FmtMngAttributes const& attr() { return M_attr; }
static DUSK_GAME_DATA FmtMngAttributes const M_attr; static FmtMngAttributes const M_attr;
typedef void (daFmtMng_c::*ActionFunc)(); typedef void (daFmtMng_c::*ActionFunc)();
static DUSK_GAME_DATA daFmtMng_c::ActionFunc ActionTable[10]; static daFmtMng_c::ActionFunc ActionTable[10];
/* 0x568 */ FmtPos_c* mPos; /* 0x568 */ FmtPos_c* mPos;
/* 0x56C */ FmtMember_c* mMember; /* 0x56C */ FmtMember_c* mMember;
+3 -3
View File
@@ -41,9 +41,9 @@ public:
static void deleteRoomGrass(int); static void deleteRoomGrass(int);
static void deleteRoomFlower(int); static void deleteRoomFlower(int);
static DUSK_GAME_DATA daGrass_c* m_myObj; static daGrass_c* m_myObj;
static DUSK_GAME_DATA dGrass_packet_c* m_grass; static dGrass_packet_c* m_grass;
static DUSK_GAME_DATA dFlower_packet_c* m_flower; static dFlower_packet_c* m_flower;
/* 0x568 */ u8 unk_0x568[0x570 - 0x568]; /* 0x568 */ u8 unk_0x568[0x570 - 0x568];
}; };
+3 -3
View File
@@ -351,8 +351,8 @@ public:
m_modelData->getMaterialNodePointer(5)->getShape()->hide(); m_modelData->getMaterialNodePointer(5)->getShape()->hide();
} }
static DUSK_GAME_DATA u16 const m_footJointTable[]; static u16 const m_footJointTable[];
static DUSK_GAME_DATA f32 const m_callLimitDistance2; static f32 const m_callLimitDistance2;
/* 0x0568 */ request_of_phase_process_class m_phase; /* 0x0568 */ request_of_phase_process_class m_phase;
/* 0x0570 */ J3DModel* m_model; /* 0x0570 */ J3DModel* m_model;
@@ -567,7 +567,7 @@ public:
class daHorse_hio_c0 { class daHorse_hio_c0 {
public: public:
static DUSK_GAME_DATA const daHorse_hio_c1 m; static const daHorse_hio_c1 m;
}; };
class daHorse_hio_c : public JORReflexible { class daHorse_hio_c : public JORReflexible {
+3 -3
View File
@@ -29,8 +29,8 @@ public:
static void setMorfFrame(u8 i_frame) { mMorfFrame = i_frame; } static void setMorfFrame(u8 i_frame) { mMorfFrame = i_frame; }
static void decMorfFrame() { cLib_calcTimer<u8>(&mMorfFrame); } static void decMorfFrame() { cLib_calcTimer<u8>(&mMorfFrame); }
static DUSK_GAME_DATA u8 mEyeMoveFlg; static u8 mEyeMoveFlg;
static DUSK_GAME_DATA u8 mMorfFrame; static u8 mMorfFrame;
/* 0x0F4 */ f32 field_0xf4; /* 0x0F4 */ f32 field_0xf4;
/* 0x0F8 */ f32 field_0xf8; /* 0x0F8 */ f32 field_0xf8;
@@ -50,7 +50,7 @@ struct daHoZelda_hio_c1 {
struct daHoZelda_hio_c0 { struct daHoZelda_hio_c0 {
daHoZelda_hio_c0() {} daHoZelda_hio_c0() {}
static DUSK_GAME_DATA daHoZelda_hio_c1 const m; static daHoZelda_hio_c1 const m;
}; };
class daHoZelda_hio_c : public JORReflexible { class daHoZelda_hio_c : public JORReflexible {
+1 -1
View File
@@ -60,7 +60,7 @@ public:
virtual u8 getCollisionH(); virtual u8 getCollisionH();
virtual u8 getCollisionR(); virtual u8 getCollisionR();
static DUSK_GAME_DATA daItemBase_data const m_data; static daItemBase_data const m_data;
/* 0x56C */ request_of_phase_process_class mPhase; /* 0x56C */ request_of_phase_process_class mPhase;
/* 0x574 */ J3DModel* mpModel; /* 0x574 */ J3DModel* mpModel;
+2 -2
View File
@@ -213,8 +213,8 @@ private:
/* 0x750 */ int field_0x750; /* 0x750 */ int field_0x750;
/* 0x754 */ int field_0x754; /* 0x754 */ int field_0x754;
/* 0x758 */ int field_0x758; /* 0x758 */ int field_0x758;
/* 0x75C */ DUSK_CONST char* mArcName; /* 0x75C */ char* mArcName;
/* 0x760 */ DUSK_CONST char* mDemoName; /* 0x760 */ char* mDemoName;
/* 0x764 */ u32 mShadowId; /* 0x764 */ u32 mShadowId;
/* 0x768 */ dPath* mpPath1; /* 0x768 */ dPath* mpPath1;
/* 0x76C */ dPath* mpPath2; /* 0x76C */ dPath* mpPath2;
+2 -7
View File
@@ -88,14 +88,9 @@ public:
/* 0x396A */ u8 field_0x396A[0x399E - 0x396A]; /* 0x396A */ u8 field_0x396A[0x399E - 0x396A];
/* 0x399E */ s16 field_0x399e; /* 0x399E */ s16 field_0x399e;
/* 0x39A0 */ u8 field_0x39A0[0x39A4 - 0x39A0]; /* 0x39A0 */ u8 field_0x39A0[0x39A4 - 0x39A0];
#if TARGET_PC
/* 0x39A4 */ cM_rnd_c mMantRng;
#endif
}; };
#if TARGET_PC
STATIC_ASSERT(sizeof(mant_class) == 0x39ac);
#else
STATIC_ASSERT(sizeof(mant_class) == 0x39a4); STATIC_ASSERT(sizeof(mant_class) == 0x39a4);
#endif
#endif /* D_A_MANT_H */ #endif /* D_A_MANT_H */

Some files were not shown because too many files have changed in this diff Show More