Compare commits

..

5 Commits

Author SHA1 Message Date
TakaRikka 1a7c853d9b better disc info display 2026-05-16 21:06:55 -07:00
TakaRikka 9a3428983b build fix / verif 2026-05-16 19:37:46 -07:00
TakaRikka 15a846478b Merge branch 'main' of ssh://github.com/TwilitRealm/dusklight into jpn 2026-05-16 19:18:06 -07:00
TakaRikka 00704ad838 mDoExt font region handling 2026-04-28 03:43:52 -07:00
TakaRikka f52c715364 convert d_name literals to hex + enable version 2026-04-28 02:53:36 -07:00
207 changed files with 1445 additions and 4242 deletions
+12 -16
View File
@@ -7,10 +7,6 @@ on:
- '*LICENSE' - '*LICENSE'
pull_request: pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || format('run-{0}', github.run_id) }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
env: env:
SCCACHE_GHA_ENABLED: "true" SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache" RUSTC_WRAPPER: "sccache"
@@ -26,13 +22,13 @@ jobs:
matrix: matrix:
include: include:
- name: GCC x86_64 - name: GCC x86_64
runner: ubuntu-24.04 runner: ubuntu-latest
preset: gcc preset: gcc
artifact_arch: x86_64 artifact_arch: x86_64
- name: GCC aarch64 # - name: GCC aarch64
runner: ubuntu-24.04-arm # runner: ubuntu-24.04-arm
preset: gcc # preset: gcc
artifact_arch: aarch64 # artifact_arch: aarch64
# - name: Clang x86_64 # - name: Clang x86_64
# runner: ubuntu-latest # runner: ubuntu-latest
# preset: clang # preset: clang
@@ -225,12 +221,12 @@ jobs:
msvc_arch: amd64 msvc_arch: amd64
vcpkg_arch: x64 vcpkg_arch: x64
artifact_arch: x86_64 artifact_arch: x86_64
- name: MSVC arm64 # - name: MSVC arm64
runner: windows-latest # runner: windows-11-arm
preset: arm64-msvc # preset: arm64-msvc
msvc_arch: amd64_arm64 # msvc_arch: arm64
vcpkg_arch: arm64 # vcpkg_arch: arm64
artifact_arch: arm64 # artifact_arch: arm64
# - name: Clang x86_64 # - name: Clang x86_64
# runner: windows-latest # runner: windows-latest
# preset: clang # preset: clang
@@ -259,7 +255,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
choco install ninja choco install ninja
vcpkg install freetype:${{matrix.vcpkg_arch}}-windows zstd:${{matrix.vcpkg_arch}}-windows vcpkg install freetype:${{matrix.vcpkg_arch}}-windows-static zstd:${{matrix.vcpkg_arch}}-windows-static
- name: Configure CMake - name: Configure CMake
run: cmake --preset x-windows-ci-${{matrix.preset}} run: cmake --preset x-windows-ci-${{matrix.preset}}
-25
View File
@@ -11,7 +11,6 @@ if (DUSK_VERSION_OVERRIDE)
set(DUSK_WC_DESCRIBE "${DUSK_VERSION_OVERRIDE}") set(DUSK_WC_DESCRIBE "${DUSK_VERSION_OVERRIDE}")
set(DUSK_VERSION_STRING "0.0.0.0") set(DUSK_VERSION_STRING "0.0.0.0")
set(DUSK_SHORT_VERSION_STRING "0.0.0") set(DUSK_SHORT_VERSION_STRING "0.0.0")
set(DUSK_VERSION_CODE "1")
set(DUSK_WC_REVISION "") set(DUSK_WC_REVISION "")
set(DUSK_WC_BRANCH "") set(DUSK_WC_BRANCH "")
set(DUSK_WC_DATE "") set(DUSK_WC_DATE "")
@@ -62,9 +61,6 @@ endif ()
if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$") if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
set(DUSK_SHORT_VERSION_STRING "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") set(DUSK_SHORT_VERSION_STRING "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
set(_ver_major ${CMAKE_MATCH_1})
set(_ver_minor ${CMAKE_MATCH_2})
set(_ver_patch ${CMAKE_MATCH_3})
set(DUSK_VERSION_TWEAK "0") set(DUSK_VERSION_TWEAK "0")
if (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+)(-dirty)?$") if (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+)(-dirty)?$")
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}") set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
@@ -72,19 +68,10 @@ if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}") set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
endif () endif ()
set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.${DUSK_VERSION_TWEAK}") set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.${DUSK_VERSION_TWEAK}")
if(DUSK_VERSION_TWEAK GREATER 999)
set(_tweak 999)
else()
set(_tweak ${DUSK_VERSION_TWEAK})
endif()
# encoding: major*1e7 + minor*1e5 + patch*1e3 + tweak; collision-free for major<210, minor<100, patch<100, tweak<=999
math(EXPR DUSK_VERSION_CODE
"${_ver_major} * 10000000 + ${_ver_minor} * 100000 + ${_ver_patch} * 1000 + ${_tweak}")
else () else ()
set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION") set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION")
set(DUSK_VERSION_STRING "0.0.0.0") set(DUSK_VERSION_STRING "0.0.0.0")
set(DUSK_SHORT_VERSION_STRING "0.0.0") set(DUSK_SHORT_VERSION_STRING "0.0.0")
set(DUSK_VERSION_CODE "1")
endif () endif ()
endif () endif ()
@@ -92,7 +79,6 @@ endif ()
# Add version information to CI environment variables # Add version information to CI environment variables
if(DEFINED ENV{GITHUB_ENV}) if(DEFINED ENV{GITHUB_ENV})
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n") file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION_CODE=${DUSK_VERSION_CODE}\n")
endif() endif()
message(STATUS "Dusklight version set to ${DUSK_WC_DESCRIBE}") message(STATUS "Dusklight version set to ${DUSK_WC_DESCRIBE}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
@@ -100,8 +86,6 @@ project(dusklight LANGUAGES C CXX VERSION ${DUSK_VERSION_STRING})
if (APPLE) if (APPLE)
enable_language(OBJC OBJCXX) enable_language(OBJC OBJCXX)
endif () endif ()
# Adjust CMAKE_SYSTEM_PROCESSOR on Windows to match compiler target
include(cmake/WindowsTargetProcessor.cmake)
if (APPLE AND NOT TVOS AND CMAKE_SYSTEM_NAME STREQUAL tvOS) if (APPLE AND NOT TVOS AND CMAKE_SYSTEM_NAME STREQUAL tvOS)
# ios.toolchain.cmake hack for SDL # ios.toolchain.cmake hack for SDL
set(TVOS ON) set(TVOS ON)
@@ -170,7 +154,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
@@ -355,10 +338,6 @@ endif ()
if (WIN32) if (WIN32)
list(APPEND GAME_LIBS Ws2_32) list(APPEND GAME_LIBS Ws2_32)
if (CMAKE_BUILD_TYPE STREQUAL Debug)
list(APPEND GAME_LIBS dbghelp)
list(APPEND GAME_COMPILE_DEFS DUSK_CRASH_DBGHELP=1)
endif ()
endif () endif ()
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/no_backend.cpp) set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/no_backend.cpp)
@@ -495,10 +474,6 @@ if (ANDROID)
target_link_options(dusklight PRIVATE "-Wl,-u,SDL_main") target_link_options(dusklight PRIVATE "-Wl,-u,SDL_main")
endif () endif ()
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
target_link_options(dusklight PRIVATE "-Wl,--build-id=sha1")
endif ()
if (NOT APPLE) if (NOT APPLE)
add_custom_command(TARGET dusklight POST_BUILD add_custom_command(TARGET dusklight POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory COMMAND ${CMAKE_COMMAND} -E copy_directory
+4 -12
View File
@@ -33,11 +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
}
} }
}, },
{ {
@@ -326,9 +322,7 @@
"BUILD_SHARED_LIBS": { "BUILD_SHARED_LIBS": {
"type": "BOOL", "type": "BOOL",
"value": false "value": false
}, }
"AURORA_SDL3_VERSION": "3.4.8",
"AURORA_SDL3_REF": "refs/tags/release-3.4.8"
} }
}, },
{ {
@@ -436,6 +430,7 @@
"x-macos-ci" "x-macos-ci"
], ],
"cacheVariables": { "cacheVariables": {
"AURORA_DAWN_PROVIDER": "vendor",
"CMAKE_OSX_ARCHITECTURES": "x86_64", "CMAKE_OSX_ARCHITECTURES": "x86_64",
"Rust_CARGO_TARGET": "x86_64-apple-darwin" "Rust_CARGO_TARGET": "x86_64-apple-darwin"
} }
@@ -495,10 +490,7 @@
"inherits": [ "inherits": [
"x-windows-ci", "x-windows-ci",
"windows-arm64-msvc" "windows-arm64-msvc"
], ]
"cacheVariables": {
"VCPKG_TARGET_TRIPLET": "arm64-windows"
}
} }
], ],
"buildPresets": [ "buildPresets": [
+2 -3
View File
@@ -6,7 +6,6 @@ fi
build_dir="$PWD/build" build_dir="$PWD/build"
linuxdeploy="$build_dir/linuxdeploy-$(uname -m).AppImage" linuxdeploy="$build_dir/linuxdeploy-$(uname -m).AppImage"
lib_dir="/usr/lib/$(uname -m)-linux-gnu"
# Get linuxdeploy # Get linuxdeploy
mkdir -p "$build_dir" mkdir -p "$build_dir"
@@ -20,8 +19,8 @@ for install_path in build/install/*; do
cp -r "$install_path" build/appdir/usr/bin cp -r "$install_path" build/appdir/usr/bin
done 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/dusklight.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 "$linuxdeploy" \
-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 "$build_dir/appdir" --output appimage
-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 ()
+51 -181
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
```sh ```
brew install cmake base-devel cmake ninja llvm vulkan-headers python python-markupsafe clang lld alsa-lib libpulse libxrandr freetype2
``` ```
* Fedora packages
* Install Python 3 ```
cmake vulkan-headers ninja-build clang-devel llvm-devel libpng-devel
```sh ```
brew install python@3 * It's also important that you install the developer tools and libraries
``` ```
sudo dnf groupinstall "Development Tools" "Development Libraries"
Recommended IDEs: ```
#### Setup
* [Xcode 16.4 or later](https://developer.apple.com/xcode/) Clone and initialize the Dusklight repository
* [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 ```sh
git clone --recursive https://github.com/TwilitRealm/dusklight.git git clone --recursive https://github.com/TwilitRealm/dusklight.git
git pull
cd dusklight cd dusklight
git pull
git submodule update --init --recursive git submodule update --init --recursive
``` ```
#### Building
**CLion (Windows / macOS / Linux)** **CLion (Windows / macOS / Linux)**
Open the project directory in CLion. Enable the appropriate presets for your platform: Open the project directory in CLion. Enable the appropriate presets for your platform:
@@ -178,8 +64,7 @@ cmake --build --preset macos-default-relwithdebinfo
``` ```
Alternate presets available: Alternate presets available:
- `macos-default-debug`: Clang, Debug
* `macos-default-debug`: Clang, Debug
**ninja (Linux)** **ninja (Linux)**
@@ -189,10 +74,9 @@ cmake --build --preset linux-default-relwithdebinfo
``` ```
Alternate presets available: Alternate presets available:
- `linux-default-debug`: GCC, Debug
* `linux-default-debug`: GCC, Debug - `linux-clang-relwithdebinfo`: Clang, RelWithDebInfo
* `linux-clang-relwithdebinfo`: Clang, RelWithDebInfo - `linux-clang-debug`: Clang, Debug
* `linux-clang-debug`: Clang, Debug
**ninja (Windows)** **ninja (Windows)**
@@ -202,27 +86,13 @@ cmake --build --preset windows-msvc-relwithdebinfo
``` ```
Alternate presets available: Alternate presets available:
- `windows-msvc-debug`: MSVC, Debug
- `windows-clang-relwithdebinfo`: Clang-cl, RelWithDebInfo
- `windows-clang-debug`: Clang-cl, Debug
* `windows-msvc-debug`: MSVC, Debug #### Running
* `windows-clang-relwithdebinfo`: Clang-cl, RelWithDebInfo Pass the disc image as a positional argument. Supported formats: ISO (GCM), RVZ, WIA, WBFS, CISO, GCZ
* `windows-clang-debug`: Clang-cl, Debug
## Running
**Windows / Linux**
* Pass the disc image as a positional argument using the `--dvd` flag. Supported formats are: ISO (GCM), RVZ, WIA, WBFS, CISO, GCZ
```sh ```sh
build/{preset}/dusklight --dvd /path/to/game.iso build/{preset}/dusklight/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, Dusklight defaults to `game.iso` in the current working directory.
+10 -10
View File
@@ -4,10 +4,10 @@
- A Windows, Linux, or macOS device - A Windows, Linux, or macOS device
- iOS device connected to computer via USB - 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)) - Dusklight IPA file (download the latest `Dusklight-vX.X.X-ios-arm64.ipa` from the [releases page](https://github.com/TwilitRealm/dusk/releases))
- Legally acquired game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL) - Game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL)
## 1. Install iloader ## 1. Install AltServer
- Executable bundles can be installed from [iloader's main page](https://iloader.app/) or [their GitHub](https://github.com/nab138/iloader) for Windows, Linux, and macOS. - 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 - Windows WILL require iTunes to be installed
@@ -16,21 +16,21 @@
## 2. Enable Developer Mode (iOS 16+) ## 2. Enable Developer Mode (iOS 16+)
- On your iPhone, go to **Settings > Privacy & Security > Developer Mode** - On your iPhone, go to **Settings > Privacy & Security > Developer Mode**
- Toggle it on, put in your device passcode, and restart when prompted - Toggle it on and restart when prompted
## 3. Install Dusklight on Your iPhone ## 3. Install 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) 1. Sign into your Apple ID (this is required for registering app IDs, it is sent securely 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 * You may be prompted to put in a code from your iOS device, 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 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 * 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. 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 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 4. Press `Import IPA` and choose your downloaded `Dusk-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* **NOTE:** *At various stages, you may be prompted to trust your device, do so*
## 3. Getting Dusklight trusted ## 3. Getting Dusk trusted
When installing sideloaded iOS applications, at first you will need to manually trust the app due to Apple's security policies 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** * Go to **Settings > General > VPN & Device Management**
* Tap the Apple ID you signed into iloader with under "Developer App" and tap **Trust** * Tap the Apple ID you signed into iloader with under "Developer App" and tap **Trust**
@@ -38,11 +38,11 @@ When installing sideloaded iOS applications, at first you will need to manually
## 4. Copy Files to Your iPhone ## 4. Copy Files to Your iPhone
Transfer the game disc (and optionally, the Dusklight IPA) to your iPhone so they are accessible in the Files app. A few ways to do this: Transfer the IPA and game disc to your iPhone so they're accessible in the Files app. A few ways to do this:
- **AirDrop** - Right-click the files on your Mac and choose Share > AirDrop - **AirDrop** - Right-click the files on your Mac and choose Share > AirDrop
- **iCloud Drive** - Place files in iCloud Drive on your Mac and they'll sync to Files on your iPhone - **iCloud Drive** - Place files in iCloud Drive on your Mac and they'll sync to Files on your iPhone
- **USB transfer** - Connect your iPhone and drag files via Finder's sidebar - **USB transfer** - Connect your iPhone and drag files via Finder's sidebar
- **Cloud storage** - Upload to Google Drive, Dropbox, etc. and download on your iPhone - **Cloud storage** - Upload to Google Drive, Dropbox, etc. and download on your iPhone
You may now use Dusklight on iOS and iPadOS! You may now use Dusklight on iOS, iPadOS!
+1 -1
-2
View File
@@ -1420,7 +1420,6 @@ set(DUSK_FILES
src/d/actor/d_a_alink_dusk.cpp src/d/actor/d_a_alink_dusk.cpp
src/dusk/asserts.cpp src/dusk/asserts.cpp
src/dusk/config.cpp src/dusk/config.cpp
src/dusk/crash_handler.cpp
src/dusk/crash_reporting.cpp src/dusk/crash_reporting.cpp
src/dusk/data.cpp src/dusk/data.cpp
src/dusk/data.hpp src/dusk/data.hpp
@@ -1440,7 +1439,6 @@ set(DUSK_FILES
src/dusk/logging.cpp src/dusk/logging.cpp
src/dusk/settings.cpp src/dusk/settings.cpp
src/dusk/speedrun.cpp src/dusk/speedrun.cpp
src/dusk/string.cpp
src/dusk/stubs.cpp src/dusk/stubs.cpp
src/dusk/update_check.cpp src/dusk/update_check.cpp
src/dusk/update_check.hpp src/dusk/update_check.hpp
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": {
+197 -343
View File
@@ -1,374 +1,228 @@
{ {
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;
supportedSystems = [ supportedSystems = [
"x86_64-linux" "x86_64-linux"
"aarch64-linux" "aarch64-linux"
"x86_64-darwin" "x86_64-darwin"
"aarch64-darwin" "aarch64-darwin"
]; ];
forAllSystems = lib.genAttrs supportedSystems; forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
pkgsFor = system: import nixpkgs { inherit system; };
dawnVersion = "v20260423.175430"; # Dependencies that are not packaged in nixpkgs (used by the Linux package build):
nodVersion = "v2.0.0-alpha.8"; buildSources = pkgs: {
versionSuffix = "nix-" + (self.shortRev or self.dirtyShortRev or "dirty"); aurora-src = pkgs.fetchFromGitHub {
owner = "encounter";
dawnInfo = { repo = "aurora";
"x86_64-linux" = { rev = "63606a43265a3bc18dafd500ab4d7a2108f109e6";
triple = "linux-x86_64"; hash = "sha256-xBvnAwGwNzav67Ac6oUz7RqDUwqgL2bsME3OOMn8Tqw=";
};
dawn-src = pkgs.fetchzip {
url = "https://github.com/encounter/dawn-build/releases/download/v20260423.175430/dawn-linux-x86_64.tar.gz";
hash = "sha256-HXfKTLHtMPwupnFnaflCARtXVPuS/0PoCePXidjE5xs="; hash = "sha256-HXfKTLHtMPwupnFnaflCARtXVPuS/0PoCePXidjE5xs=";
stripRoot = false;
}; };
"aarch64-linux" = { nod-src = pkgs.fetchzip {
triple = "linux-aarch64"; url = "https://github.com/encounter/nod/releases/download/v2.0.0-alpha.8/libnod-linux-x86_64.tar.gz";
hash = "sha256-34yyFpfqBZUwoFXQ41F0AwAU78FaNihOSY0oriwn6B0=";
};
"aarch64-darwin" = {
triple = "darwin-arm64";
hash = "sha256-eQnzrBp6gjiBek1VYQ9A5W13ClYWrDDKjIqv/7eNTR4=";
};
"x86_64-darwin" = {
triple = "darwin-x86_64";
hash = "sha256-QGWiGdxiI9kci3NPXH6QFFirxn16851zB/w3jqhIBJ4=";
};
};
nodPrebuiltInfo = {
"x86_64-linux" = {
triple = "linux-x86_64";
hash = "sha256-mUqvLsbsqaZ+HAjMmHYPYO+MgtanGRTw7Gzn5uXR5rE="; hash = "sha256-mUqvLsbsqaZ+HAjMmHYPYO+MgtanGRTw7Gzn5uXR5rE=";
stripRoot = false;
}; };
"aarch64-darwin" = { # The version of imgui on nixpkgs does not map cleanly.
triple = "macos-arm64"; imgui-src = pkgs.fetchFromGitHub {
hash = "sha256-UPy1ywCcv0K6VJOU3uUelJuUdBh3UNaPRlyP5LOBeDw="; owner = "ocornut";
repo = "imgui";
rev = "v1.91.9b-docking";
hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ=";
};
sqlite-src = pkgs.fetchzip {
url = "https://sqlite.org/2026/sqlite-amalgamation-3510300.zip";
hash = "sha256-pNMR8zxaaqfAzQ0AQBOXMct4usdjey1Q0Gnitg06UhM=";
};
rmlui-src = pkgs.fetchzip {
url = "https://github.com/mikke89/RmlUi/archive/f9b8c9e2935d5df2c7dff2c190d3968e99b0c3dc.tar.gz";
hash = "sha256-g4O/JZUrrcseOz8o2QJRt+2CeuiLnVeuDJc906xvuIg=";
}; };
}; };
perSystem = # Dusklight Actual (Linux x86_64 only — relies on prebuilt dawn/nod binaries)
system: mkDusklight = pkgs:
let let srcs = buildSources pkgs;
pkgs = import nixpkgs { inherit system; }; versionSuffix = if self ? shortRev && self.shortRev != null
inherit (pkgs.stdenv.hostPlatform) isDarwin; then "nix-${self.shortRev}"
hasNodPrebuilt = nodPrebuiltInfo ? ${system}; else "nix-dirty";
in
aurora = pkgs.fetchFromGitHub { pkgs.stdenv.mkDerivation {
owner = "encounter"; name = "dusklight";
repo = "aurora"; src = ./.;
rev = "10006618ee493f248b8597e4dfa1d2871d76a1d9"; postUnpack = ''
hash = "sha256-lY2xuVyB7aPJ9+2wwLRB3F5U/BuPSxdSpegdG+qNd9o="; mkdir -p $sourceRoot/extern/aurora
}; cp -r ${srcs.aurora-src}/. $sourceRoot/extern/aurora/
chmod -R u+w $sourceRoot/extern/aurora
dawn = pkgs.fetchzip { sed -i '/add_subdirectory(tests)/d' $sourceRoot/extern/aurora/CMakeLists.txt
url = "https://github.com/encounter/dawn-build/releases/download/${dawnVersion}/dawn-${dawnInfo.${system}.triple}.tar.gz"; '';
hash = dawnInfo.${system}.hash; # Remove last line to re-enable tests
stripRoot = false; cmakeFlags = [
}; "-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
corrosion = pkgs.fetchFromGitHub { "-DFETCHCONTENT_SOURCE_DIR_CXXOPTS=${pkgs.cxxopts.src}"
owner = "corrosion-rs"; "-DFETCHCONTENT_SOURCE_DIR_JSON=${pkgs.nlohmann_json.src}"
repo = "corrosion"; "-DFETCHCONTENT_SOURCE_DIR_DAWN_PREBUILT=${srcs.dawn-src}"
rev = "v0.6.1"; "-DFETCHCONTENT_SOURCE_DIR_XXHASH=${pkgs.xxHash.src}"
hash = "sha256-ppuDNObfKhneD9AlnPAvyCRHKW3BidXKglD1j/LE9CM="; "-DFETCHCONTENT_SOURCE_DIR_FMT=${pkgs.fmt.src}"
}; "-DFETCHCONTENT_SOURCE_DIR_TRACY=${pkgs.tracy.src}"
"-DAURORA_SDL3_PROVIDER=system"
nodFromSource = pkgs.stdenv.mkDerivation (finalAttrs: { "-DFETCHCONTENT_SOURCE_DIR_NOD_PREBUILT=${srcs.nod-src}"
pname = "nod"; "-DAURORA_NOD_PROVIDER=package"
version = nodVersion; "-DFETCHCONTENT_SOURCE_DIR_FREETYPE=${pkgs.freetype.src}"
src = pkgs.fetchFromGitHub { "-DFETCHCONTENT_SOURCE_DIR_ZSTD=${pkgs.zstd.src}"
owner = "encounter"; "-DFETCHCONTENT_SOURCE_DIR_SQLITE3=${srcs.sqlite-src}"
repo = "nod"; "-DFETCHCONTENT_SOURCE_DIR_IMGUI=${srcs.imgui-src}"
rev = nodVersion; "-DFETCHCONTENT_SOURCE_DIR_RMLUI=${srcs.rmlui-src}"
hash = "sha256-+zrtVzjo0+X/6uMcNUn1+FaSR+jOhrcQSDNBFjw0NDs="; "-DCMAKE_CROSSCOMPILING=ON" # Tests are not working as I didn't want to work through getting google's test suite working as well. This is the only guard I could find to disable it.
};
cargoDeps = pkgs.rustPlatform.importCargoLock {
lockFile = "${finalAttrs.src}/Cargo.lock";
};
postPatch = ''
substituteInPlace CMakeLists.txt \
--replace-warn "add_subdirectory(nod-ffi/examples)" ""
'';
nativeBuildInputs = [
pkgs.cmake
pkgs.ninja
pkgs.rustPlatform.cargoSetupHook
pkgs.cargo
pkgs.rustc
];
CARGO_NET_OFFLINE = "true";
cmakeFlags = [
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
"-DFETCHCONTENT_SOURCE_DIR_CORROSION=${corrosion}"
"-DNOD_ENABLE_INSTALL=ON"
"-DBUILD_SHARED_LIBS=OFF"
];
doCheck = false;
});
nod =
if hasNodPrebuilt then
pkgs.fetchzip {
url = "https://github.com/encounter/nod/releases/download/${nodVersion}/libnod-${
nodPrebuiltInfo.${system}.triple
}.tar.gz";
hash = nodPrebuiltInfo.${system}.hash;
stripRoot = false;
}
else
nodFromSource;
fetchContentDirs = {
DAWN_PREBUILT = dawn;
NOD_PREBUILT = nod;
CXXOPTS = pkgs.cxxopts.src;
JSON = pkgs.nlohmann_json.src;
XXHASH = pkgs.xxHash.src;
ZSTD = pkgs.zstd.src;
FMT = pkgs.fetchzip {
url = "https://github.com/fmtlib/fmt/archive/refs/tags/11.1.4.tar.gz";
hash = "sha256-sUbxlYi/Aupaox3JjWFqXIjcaQa0LFjclQAOleT+FRA=";
};
TRACY = pkgs.fetchzip {
url = "https://github.com/wolfpld/tracy/archive/a64b9a20294d59421a2f57aeca3c6383d8c48169.tar.gz";
hash = "sha256-hbNGOsGeyGSvCJ2No8RkwOib1lX2on3vNZSzyVkZdXw=";
};
IMGUI = pkgs.fetchFromGitHub {
owner = "ocornut";
repo = "imgui";
rev = "v1.91.9b-docking";
hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ=";
};
SQLITE3 = pkgs.fetchzip {
url = "https://sqlite.org/2026/sqlite-amalgamation-3510300.zip";
hash = "sha256-pNMR8zxaaqfAzQ0AQBOXMct4usdjey1Q0Gnitg06UhM=";
};
RMLUI = pkgs.fetchzip {
url = "https://github.com/mikke89/RmlUi/archive/f9b8c9e2935d5df2c7dff2c190d3968e99b0c3dc.tar.gz";
hash = "sha256-g4O/JZUrrcseOz8o2QJRt+2CeuiLnVeuDJc906xvuIg=";
};
};
dusklight = pkgs.stdenv.mkDerivation {
pname = "dusklight";
version = versionSuffix;
src = ./.;
postUnpack = ''
chmod -R u+w "$sourceRoot"
rm -rf "$sourceRoot/extern/aurora"
mkdir -p "$sourceRoot/extern"
cp -r ${aurora} "$sourceRoot/extern/aurora"
chmod -R u+w "$sourceRoot/extern/aurora"
substituteInPlace "$sourceRoot/extern/aurora/CMakeLists.txt" \
--replace-warn "add_subdirectory(tests)" ""
'';
nativeBuildInputs = [
pkgs.cmake
pkgs.ninja
pkgs.pkg-config
pkgs.python3
pkgs.python3Packages.markupsafe
]
++ lib.optionals (!isDarwin) [ pkgs.autoPatchelfHook ];
buildInputs = [
pkgs.sdl3
pkgs.freetype
pkgs.zstd
pkgs.cxxopts
pkgs.nlohmann_json
pkgs.xxHash
pkgs.abseil-cpp
pkgs.zlib
pkgs.libpng
pkgs.libjpeg_turbo
pkgs.curl
pkgs.openssl
]
++ lib.optionals isDarwin [
pkgs.apple-sdk_15
pkgs.libiconv
]
++ lib.optionals (!isDarwin) [
pkgs.libGL
pkgs.libGLU
pkgs.libglvnd
pkgs.vulkan-loader
pkgs.libX11
pkgs.libxcb
pkgs.libXcursor
pkgs.libxi
pkgs.libxrandr
pkgs.libxscrnsaver
pkgs.libxtst
pkgs.libxinerama
pkgs.libxkbcommon
pkgs.wayland
pkgs.libdecor
pkgs.alsa-lib
pkgs.libpulseaudio
pkgs.pipewire
pkgs.dbus
pkgs.udev
pkgs.libusb1
pkgs.libunwind
pkgs.gtk3
];
cmakeBuildType = "RelWithDebInfo";
ninjaFlags = [ "dusklight" ];
cmakeFlags = [
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
"-DAURORA_DAWN_PROVIDER=package"
"-DAURORA_DAWN_LINKAGE=static"
"-DAURORA_NOD_PROVIDER=package"
"-DAURORA_NOD_LINKAGE=static"
"-DAURORA_SDL3_PROVIDER=system"
]
++ lib.mapAttrsToList (key: src: "-DFETCHCONTENT_SOURCE_DIR_${key}=${src}") fetchContentDirs;
installPhase =
if isDarwin then
''
runHook preInstall
mkdir -p "$out/Applications"
cp -r Dusklight.app "$out/Applications/Dusklight.app"
runHook postInstall
''
else
''
runHook preInstall
install -Dm755 dusklight "$out/bin/dusklight"
cp -r "$src/res" "$out/bin/res"
install -Dm644 "$src/platforms/freedesktop/dev.twilitrealm.dusk.desktop" \
"$out/share/applications/dev.twilitrealm.dusk.desktop"
for size in 16 32 48 64 128 256 512 1024; do
install -Dm644 "$src/platforms/freedesktop/''${size}x''${size}/apps/dev.twilitrealm.dusk.png" \
"$out/share/icons/hicolor/''${size}x''${size}/apps/dev.twilitrealm.dusk.png"
done
runHook postInstall
'';
dontStrip = true;
meta = {
description = "Dusklight native PC port of the Twilight Princess decompilation";
homepage = "https://github.com/zeldaret/tp";
platforms = supportedSystems;
mainProgram = "dusklight";
};
};
# Tooling common to every supported host (Linux and macOS).
commonDevTools = [
pkgs.cmake
pkgs.ninja
pkgs.pkg-config
pkgs.git
pkgs.python3
pkgs.python3Packages.markupsafe
pkgs.rustc
pkgs.cargo
pkgs.sccache
]; ];
installPhase = ''
mkdir -p $out/bin
cp dusklight $out/bin/dusklight
cp -r ./res $out/bin/res
# Linux-only system libraries — mirrors the apt deps from .github/workflows/build.yml mkdir -p $out/share/applications
# so the cmake presets resolve the same set of headers as CI. cp $src/platforms/freedesktop/dusklight.desktop $out/share/applications/dusklight.desktop
linuxDevDeps = [
# Compilers / linkers for size in 16 32 48 64 128 256 512 1024; do
pkgs.clang install -Dm644 $src/platforms/freedesktop/''${size}x''${size}/apps/dusklight.png \
pkgs.lld $out/share/icons/hicolor/''${size}x''${size}/apps/dusklight.png
# C/C++ utilities done
pkgs.curl '';
pkgs.openssl nativeBuildInputs = [
pkgs.zlib pkgs.cmake
pkgs.libpng pkgs.pkg-config
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
pkgs.wayland-protocols ];
pkgs.libxkbcommon buildInputs = [
pkgs.libdecor
# OpenGL / Vulkan
pkgs.libGL pkgs.libGL
pkgs.libGLU
pkgs.libglvnd
pkgs.vulkan-headers
pkgs.vulkan-loader
# X11
pkgs.libX11 pkgs.libX11
pkgs.libxcb
pkgs.libXcursor pkgs.libXcursor
pkgs.libxi pkgs.libxi
pkgs.libxcb
pkgs.libxrandr pkgs.libxrandr
pkgs.libxscrnsaver pkgs.libxscrnsaver
pkgs.libxtst pkgs.libxtst
pkgs.libxinerama pkgs.libjpeg8
# Audio pkgs.libxkbcommon
pkgs.alsa-lib pkgs.libglvnd
pkgs.libpulseaudio pkgs.cxxopts
pkgs.pipewire pkgs.abseil-cpp
# System integration pkgs.sdl3
pkgs.dbus pkgs.fmt
pkgs.udev pkgs.tracy
pkgs.gtk3 pkgs.freetype
pkgs.zstd
]; ];
# 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; # Tooling common to every supported host (Linux and macOS).
in commonDevTools = pkgs: [
{ pkgs.cmake
packages = lib.mapAttrs (_: s: s.packages) systems; pkgs.ninja
devShells = lib.mapAttrs (_: s: s.devShells) systems; 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 = pkgs: [
# 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.
mkDarwinShell = pkgs:
pkgs.mkShellNoCC {
packages = commonDevTools pkgs;
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"
'';
};
mkLinuxShell = pkgs:
pkgs.mkShell {
packages = (commonDevTools pkgs) ++ (linuxDevDeps pkgs);
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>"
'';
};
mkDevShell = pkgs:
if pkgs.stdenv.isDarwin
then mkDarwinShell pkgs
else mkLinuxShell pkgs;
in {
packages.x86_64-linux.default = mkDusklight (pkgsFor "x86_64-linux");
devShells = forAllSystems (system: {
default = mkDevShell (pkgsFor system);
});
}; };
} }
-1
View File
@@ -4564,7 +4564,6 @@ public:
cXyz mIBChainInterpCurrHandRoot; cXyz mIBChainInterpCurrHandRoot;
bool mIBChainInterpPrevValid; bool mIBChainInterpPrevValid;
bool mIBChainInterpCurrValid; bool mIBChainInterpCurrValid;
bool mIsRollstab = false;
#endif #endif
}; // Size: 0x385C }; // Size: 0x385C
-2
View File
@@ -5,7 +5,6 @@
#include <thp.h> #include <thp.h>
#else #else
#include <atomic> #include <atomic>
#include <chrono>
#endif #endif
#include "f_op/f_op_actor.h" #include "f_op/f_op_actor.h"
#include "d/d_drawlist.h" #include "d/d_drawlist.h"
@@ -126,7 +125,6 @@ struct daMP_THPPlayer {
/* 0x0D4 */ s32 curCount; /* 0x0D4 */ s32 curCount;
#if TARGET_PC #if TARGET_PC
/* 0x0D8 */ std::atomic<s32> videoDecodeCount; /* 0x0D8 */ std::atomic<s32> videoDecodeCount;
std::chrono::steady_clock::time_point thpPlaybackClock;
#else #else
/* 0x0D8 */ s32 videoDecodeCount; /* 0x0D8 */ s32 videoDecodeCount;
#endif #endif
+1 -1
View File
@@ -77,7 +77,7 @@ private:
#define PLAYER_CREATE_ANM_HEAP_F(heap, type, fmt, ...) \ #define PLAYER_CREATE_ANM_HEAP_F(heap, type, fmt, ...) \
{ \ { \
char pcah_name_buf[32]; \ char pcah_name_buf[32]; \
snprintf(pcah_name_buf, sizeof(pcah_name_buf), fmt, ##__VA_ARGS__); \ sprintf(pcah_name_buf, fmt, ##__VA_ARGS__); \
(heap).createHeap(type, pcah_name_buf); \ (heap).createHeap(type, pcah_name_buf); \
\ \
} }
+12 -10
View File
@@ -444,7 +444,8 @@ public:
/* 0x1C */ f32 mFovy; /* 0x1C */ f32 mFovy;
/* 0x20 */ f32 mBank; /* 0x20 */ f32 mBank;
/* 0x24 */ fopAc_ac_c* mRelActor; /* 0x24 */ fopAc_ac_c* mRelActor;
/* 0x28 */ char mRelUseMask[4]; /* 0x28 */ char mRelUseMask;
/* 0x29 */ char field_0x29;
/* 0x2C */ int mTimer; /* 0x2C */ int mTimer;
/* 0x30 */ bool field_0x30; /* 0x30 */ bool field_0x30;
/* 0x34 */ cXyz mBasePos; /* 0x34 */ cXyz mBasePos;
@@ -525,7 +526,7 @@ public:
/* 0x3C */ fopAc_ac_c* field_0x3c; /* 0x3C */ fopAc_ac_c* field_0x3c;
/* 0x40 */ fopAc_ac_c* field_0x40; /* 0x40 */ fopAc_ac_c* field_0x40;
/* 0x44 */ fpc_ProcID field_0x44; /* 0x44 */ fpc_ProcID field_0x44;
/* 0x48 */ char field_0x48[4]; /* 0x48 */ char field_0x48;
/* 0x4C */ int field_0x4c; /* 0x4C */ int field_0x4c;
}; };
@@ -540,7 +541,11 @@ public:
/* 0x3C */ f32 field_0x3c; /* 0x3C */ f32 field_0x3c;
/* 0x40 */ fopAc_ac_c* mRelActor; /* 0x40 */ fopAc_ac_c* mRelActor;
/* 0x44 */ fpc_ProcID mRelActorID; /* 0x44 */ fpc_ProcID mRelActorID;
/* 0x48 */ char mRelUseMask[8]; /* 0x48 */ char mRelUseMask;
/* 0x49 */ char field_0x49;
/* 0x4A */ char field_0x4a;
/* 0x4B */ char field_0x4b;
/* 0x4C */ u8 field_0x4c[4];
/* 0x50 */ int mTimer; /* 0x50 */ int mTimer;
/* 0x54 */ int mTransType; /* 0x54 */ int mTransType;
/* 0x58 */ f32 mCushion; /* 0x58 */ f32 mCushion;
@@ -691,7 +696,8 @@ public:
/* 0x24 */ f32* field_0x24; /* 0x24 */ f32* field_0x24;
/* 0x28 */ f32 field_0x28; /* 0x28 */ f32 field_0x28;
/* 0x2C */ fopAc_ac_c* mRelActor; /* 0x2C */ fopAc_ac_c* mRelActor;
/* 0x30 */ char mRelUseMask[4]; /* 0x30 */ char mRelUseMask;
/* 0x31 */ char field_0x31;
/* 0x34 */ int mTimer; /* 0x34 */ int mTimer;
/* 0x38 */ int field_0x38; /* 0x38 */ int field_0x38;
/* 0x3C */ int mChoice; /* 0x3C */ int mChoice;
@@ -774,7 +780,8 @@ public:
/* 0xAC */ f32 field_0xac; /* 0xAC */ f32 field_0xac;
/* 0xB0 */ fopAc_ac_c* mRelActor; /* 0xB0 */ fopAc_ac_c* mRelActor;
/* 0xB4 */ fpc_ProcID mRelActorID; /* 0xB4 */ fpc_ProcID mRelActorID;
/* 0xB8 */ char mRelUseMask[4]; /* 0xB8 */ char mRelUseMask;
/* 0xB9 */ char field_0xb9;
/* 0xBC */ f32 mCushion; /* 0xBC */ f32 mCushion;
/* 0xC0 */ u32 field_0xc0[6]; /* 0xC0 */ u32 field_0xc0[6];
}; };
@@ -910,12 +917,7 @@ public:
char* getEvStringPntData(char*, char*); char* getEvStringPntData(char*, char*);
char* getEvStringPntData(char*); char* getEvStringPntData(char*);
bool getEvXyzData(cXyz*, char*, cXyz); bool getEvXyzData(cXyz*, char*, cXyz);
#if TARGET_PC
template<size_t N>
bool getEvStringData(char (&)[N], char*, char*);
#else
bool getEvStringData(char*, char*, char*); bool getEvStringData(char*, char*, char*);
#endif
fopAc_ac_c* getEvActor(char*); fopAc_ac_c* getEvActor(char*);
fopAc_ac_c* getEvActor(char*, char*); fopAc_ac_c* getEvActor(char*, char*);
bool pauseEvCamera(); bool pauseEvCamera();
+2 -2
View File
@@ -1851,7 +1851,7 @@ inline u16 dComIfGs_getDeathCount() {
} }
#endif #endif
inline TEXT_SPAN dComIfGs_getPlayerName() { inline char* dComIfGs_getPlayerName() {
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getPlayerName(); return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getPlayerName();
} }
@@ -1859,7 +1859,7 @@ inline void dComIfGs_setPlayerName(const char* i_name) {
g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().setPlayerName(i_name); g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().setPlayerName(i_name);
} }
inline TEXT_SPAN dComIfGs_getHorseName() { inline char* dComIfGs_getHorseName() {
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getHorseName(); return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getHorseName();
} }
+4 -4
View File
@@ -46,10 +46,10 @@ private:
/* 0x22 */ u8 field_0x22; /* 0x22 */ u8 field_0x22;
/* 0x24 */ CPaneMgrAlpha* mDatBase; /* 0x24 */ CPaneMgrAlpha* mDatBase;
/* 0x28 */ CPaneMgrAlpha* mNoDatBase; /* 0x28 */ CPaneMgrAlpha* mNoDatBase;
/* 0x2C */ TEXT_SPAN mPlayerName; /* 0x2C */ char* mPlayerName;
/* 0x30 */ TEXT_SPAN mSaveDate; /* 0x30 */ char* mSaveDate;
/* 0x34 */ TEXT_SPAN mPlayTime; /* 0x34 */ char* mPlayTime;
/* 0x38 */ TEXT_SPAN mSaveStatus; /* 0x38 */ char* mSaveStatus;
}; };
typedef void (dFile_info_c::*warningFunc)(void); typedef void (dFile_info_c::*warningFunc)(void);
+3 -38
View File
@@ -11,42 +11,7 @@
class dFile_info_c; class dFile_info_c;
class J2DPicture; class J2DPicture;
#if TARGET_PC
static bool cachedPanes = false;
struct PaneCache {
u64 tag;
f32 origTransX;
f32 origTransY;
bool cached;
};
static PaneCache mSelDtPanes[] = {
{MULTI_CHAR('tate_n0'), 0.0f, false},
{MULTI_CHAR('tate_n1'), 0.0f, false},
{MULTI_CHAR('ken_n0'), 0.0f, false},
{MULTI_CHAR('ken_n1'), 0.0f, false},
{MULTI_CHAR('fuku_n0'), 0.0f, false},
{MULTI_CHAR('fuku_n1'), 0.0f, false},
{MULTI_CHAR('fuku_n2'), 0.0f, false},
{MULTI_CHAR('gray_n'), 0.0f, false},
{MULTI_CHAR('b_base'), 0.0f, false},
{MULTI_CHAR('b_base1'), 0.0f, false},
};
static PaneCache fileSelPanes[] = {
{MULTI_CHAR('w_uzu00'), 0.0f, false},
{MULTI_CHAR('w_uzu01'), 0.0f, false},
{MULTI_CHAR('w_uzu02'), 0.0f, false},
{MULTI_CHAR('w_uzu03'), 0.0f, false},
{MULTI_CHAR('w_uzu04'), 0.0f, false},
{MULTI_CHAR('w_uzu05'), 0.0f, false},
{MULTI_CHAR('w_uzu06'), 0.0f, false},
{MULTI_CHAR('w_uzu07'), 0.0f, false},
{MULTI_CHAR('w_uzu08'), 0.0f, false},
{MULTI_CHAR('w_uzu09'), 0.0f, false},
};
#endif
class dDlst_FileSel_c : public dDlst_base_c { class dDlst_FileSel_c : public dDlst_base_c {
public: public:
void draw(); void draw();
@@ -565,7 +530,7 @@ public:
/* 0x0130 */ int field_0x0130; /* 0x0130 */ int field_0x0130;
/* 0x0134 */ int field_0x0134; /* 0x0134 */ int field_0x0134;
/* 0x0138 */ CPaneMgrAlpha* mErrorMsgTxtPane[2]; /* 0x0138 */ CPaneMgrAlpha* mErrorMsgTxtPane[2];
/* 0x0140 */ TEXT_SPAN mErrorMsgStringPtr[2]; /* 0x0140 */ char* mErrorMsgStringPtr[2];
/* 0x0148 */ u8 mErrorTxtDispIdx; /* 0x0148 */ u8 mErrorTxtDispIdx;
/* 0x0149 */ u8 field_0x0149; /* 0x0149 */ u8 field_0x0149;
/* 0x014A */ bool field_0x014a; /* 0x014A */ bool field_0x014a;
@@ -609,7 +574,7 @@ public:
/* 0x020A */ u8 mFadeTimer; /* 0x020A */ u8 mFadeTimer;
/* 0x020B */ u8 field_0x020b; /* 0x020B */ u8 field_0x020b;
/* 0x020C */ CPaneMgrAlpha* mHeaderTxtPane[2]; /* 0x020C */ CPaneMgrAlpha* mHeaderTxtPane[2];
/* 0x0214 */ TEXT_SPAN mHeaderStringPtr[2]; /* 0x0214 */ char* mHeaderStringPtr[2];
/* 0x021C */ u8 mHeaderTxtDispIdx; /* 0x021C */ u8 mHeaderTxtDispIdx;
/* 0x021D */ u8 field_0x021d; /* 0x021D */ u8 field_0x021d;
/* 0x021E */ u8 field_0x021e; /* 0x021E */ u8 field_0x021e;
@@ -626,7 +591,7 @@ public:
/* 0x024B */ u8 field_0x024b; /* 0x024B */ u8 field_0x024b;
/* 0x024C */ u8 field_0x024c; /* 0x024C */ u8 field_0x024c;
/* 0x024B */ u8 field_0x024d[3]; /* 0x024B */ u8 field_0x024d[3];
/* 0x0250 */ TEXT_SPAN mModoruStringPtr; /* 0x0250 */ char* mModoruStringPtr;
/* 0x0254 */ STControl* stick; /* 0x0254 */ STControl* stick;
/* 0x0258 */ u8 mIsDataNew[3]; /* 0x0258 */ u8 mIsDataNew[3];
/* 0x025B */ u8 mIsNoData[3]; /* 0x025B */ u8 mIsNoData[3];
-43
View File
@@ -15,49 +15,6 @@ class dMenu_Fishing_c;
class dMenu_Skill_c; class dMenu_Skill_c;
class dMenu_Insect_c; class dMenu_Insect_c;
class dSelect_cursor_c; class dSelect_cursor_c;
#if TARGET_PC
static bool cachedPanes = false;
struct PaneCache {
u64 tag;
f32 origTransX;
f32 origTransY;
bool cached;
};
static PaneCache mpScreenPanes[] = {
{MULTI_CHAR('sa_tex_n'), 0.0f, false},
{MULTI_CHAR('op_tex_n'), 0.0f, false},
{MULTI_CHAR('heart_n'), 0.0f, false},
{MULTI_CHAR('wolf_n'), 0.0f, false},
{MULTI_CHAR('item_0_n'), 0.0f, false},
{MULTI_CHAR('item_1_n'), 0.0f, false},
{MULTI_CHAR('item_2_n'), 0.0f, false},
{MULTI_CHAR('fish_3_n'), 0.0f, false},
{MULTI_CHAR('lett_4_n'), 0.0f, false},
{MULTI_CHAR('maki_5_n'), 0.0f, false},
{MULTI_CHAR('fuku_n0'), 0.0f, false},
{MULTI_CHAR('fuku_n1'), 0.0f, false},
{MULTI_CHAR('fuku_n2'), 0.0f, false},
{MULTI_CHAR('tate_n0'), 0.0f, false},
{MULTI_CHAR('tate_n1'), 0.0f, false},
{MULTI_CHAR('ken_n0'), 0.0f, false},
{MULTI_CHAR('ken_n1'), 0.0f, false},
{MULTI_CHAR('kabu_6n'), 0.0f, false},
{MULTI_CHAR('t_t00'), 0.0f, false},
{MULTI_CHAR('f_t00'), 0.0f, false},
{MULTI_CHAR('itemn_n'), 0.0f, false},
{MULTI_CHAR('infotxtn'), 0.0f, false},
{MULTI_CHAR('sa_op_n'), 0.0f, false},
{MULTI_CHAR('title_n'), 0.0f, false},
{MULTI_CHAR('menu_n'), 0.0f, false},
{MULTI_CHAR('w_er_n'), 0.0f, false},
{MULTI_CHAR('center_n'), 0.0f, false},
{MULTI_CHAR('info_n'), 0.0f, false},
{MULTI_CHAR('lavel_n'), 0.0f, false},
{MULTI_CHAR('modelbgn'), 0.0f, false},
};
#endif
class dMenu_Collect2D_c; class dMenu_Collect2D_c;
class dMenu_Collect2DTop_c : public dDlst_base_c { class dMenu_Collect2DTop_c : public dDlst_base_c {
-5
View File
@@ -183,11 +183,6 @@ public:
/* 0xDD8 */ u8 field_0xdd8; /* 0xDD8 */ u8 field_0xdd8;
/* 0xDD9 */ u8 field_0xdd9; /* 0xDD9 */ u8 field_0xdd9;
/* 0xDDA */ u8 field_0xdda; /* 0xDDA */ u8 field_0xdda;
#if TARGET_PC
J2DTextBox* mpPoeCountPane;
J2DPicture* mpPoeCountIcon;
#endif
}; };
class dMenu_Dmap_c { class dMenu_Dmap_c {
-6
View File
@@ -421,12 +421,6 @@ public:
/* 0xC2 */ u8 mAlphaButtonZ; /* 0xC2 */ u8 mAlphaButtonZ;
/* 0xC3 */ u8 mAlphaAnalogStick; /* 0xC3 */ u8 mAlphaAnalogStick;
/* 0xC4 */ u8 mAlphaDpad; /* 0xC4 */ u8 mAlphaDpad;
#if TARGET_PC
J2DTextBox* mpPoeCountPane;
J2DPicture* mpPoeCountIcon;
u8 mSelectRegionNo;
#endif
}; };
#endif /* D_MENU_D_MENU_FMAP2D_H */ #endif /* D_MENU_D_MENU_FMAP2D_H */
-5
View File
@@ -76,11 +76,6 @@ public:
} }
#endif #endif
#if TARGET_PC
static void getDmapPoeCount(const std::string& stageName, int& nowCount, int& totalCount);
static void getFmapPoeCount(const int regionNo, int& nowCount, int& totalCount);
#endif
struct Stage_c { struct Stage_c {
// Incomplete class // Incomplete class
+2 -2
View File
@@ -313,7 +313,7 @@ private:
/* 0x00B8 */ int field_0xb8; /* 0x00B8 */ int field_0xb8;
/* 0x00BC */ int field_0xbc; /* 0x00BC */ int field_0xbc;
/* 0x00C0 */ CPaneMgrAlpha* mpErrTxtPane[2]; /* 0x00C0 */ CPaneMgrAlpha* mpErrTxtPane[2];
/* 0x00C8 */ TEXT_SPAN mpErrTxt[2]; /* 0x00C8 */ char* mpErrTxt[2];
/* 0x00D0 */ u8 mErrTxtType; /* 0x00D0 */ u8 mErrTxtType;
/* 0x00D1 */ u8 mErrTxtAnmComplete; /* 0x00D1 */ u8 mErrTxtAnmComplete;
/* 0x00D2 */ u8 field_0xd2; /* 0x00D2 */ u8 field_0xd2;
@@ -344,7 +344,7 @@ private:
/* 0x0160 */ J2DAnmTevRegKey* field_0x160; /* 0x0160 */ J2DAnmTevRegKey* field_0x160;
/* 0x0164 */ int field_0x164; /* 0x0164 */ int field_0x164;
/* 0x0168 */ CPaneMgrAlpha* mpHeaderTxtPane[2]; /* 0x0168 */ CPaneMgrAlpha* mpHeaderTxtPane[2];
/* 0x0170 */ TEXT_SPAN mpHeaderTxt[2]; /* 0x0170 */ char* mpHeaderTxt[2];
/* 0x0178 */ u8 mHeaderTxtType; // 0: Select Menu 1: YesNo Menu /* 0x0178 */ u8 mHeaderTxtType; // 0: Select Menu 1: YesNo Menu
/* 0x0179 */ u8 mHeaderAnmComplete; /* 0x0179 */ u8 mHeaderAnmComplete;
/* 0x017A */ u8 field_0x17a; /* 0x017A */ u8 field_0x17a;
+6 -6
View File
@@ -67,9 +67,9 @@ public:
s16 decFloatingMessageTimer(); s16 decFloatingMessageTimer();
void resetFloatingMessage(); void resetFloatingMessage();
void decMsgKeyWaitTimer(); void decMsgKeyWaitTimer();
void getString(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry); void getString(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
void getStringKana(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry); void getStringKana(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
void getStringKanji(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry); void getStringKanji(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
f32 getStringLength(J2DTextBox* i_textbox, char* i_string); f32 getStringLength(J2DTextBox* i_textbox, char* i_string);
f32 getStringLength(JUTFont* i_font, f32 param_2, f32 param_3, char* i_string); f32 getStringLength(JUTFont* i_font, f32 param_2, f32 param_3, char* i_string);
void onDirectUseItem(int); void onDirectUseItem(int);
@@ -348,15 +348,15 @@ inline CPaneMgr* dMeter2Info_getMeterItemPanePtr(s32 i_idx) {
return g_meter2_info.getMeterItemPanePtr(i_idx); return g_meter2_info.getMeterItemPanePtr(i_idx);
} }
inline void dMeter2Info_getString(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) { inline void dMeter2Info_getString(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
g_meter2_info.getString(i_stringID, o_string, i_msgEntry); g_meter2_info.getString(i_stringID, o_string, i_msgEntry);
} }
inline void dMeter2Info_getStringKanji(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) { inline void dMeter2Info_getStringKanji(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
g_meter2_info.getStringKanji(i_stringID, o_string, i_msgEntry); g_meter2_info.getStringKanji(i_stringID, o_string, i_msgEntry);
} }
inline void dMeter2Info_getStringKana(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) { inline void dMeter2Info_getStringKana(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
g_meter2_info.getStringKana(i_stringID, o_string, i_msgEntry); g_meter2_info.getStringKana(i_stringID, o_string, i_msgEntry);
} }
+1 -2
View File
@@ -1,7 +1,6 @@
#ifndef D_METER_D_METER_BUTTON_H #ifndef D_METER_D_METER_BUTTON_H
#define D_METER_D_METER_BUTTON_H #define D_METER_D_METER_BUTTON_H
#include "global.h"
#include "JSystem/J2DGraph/J2DScreen.h" #include "JSystem/J2DGraph/J2DScreen.h"
#include "JSystem/J2DGraph/J2DTextBox.h" #include "JSystem/J2DGraph/J2DTextBox.h"
#include "d/d_drawlist.h" #include "d/d_drawlist.h"
@@ -195,7 +194,7 @@ public:
/* 0x0FC */ CPaneMgr* field_0x0fc[4]; /* 0x0FC */ CPaneMgr* field_0x0fc[4];
/* 0x10C */ JKRHeap* mpHeap; /* 0x10C */ JKRHeap* mpHeap;
/* 0x110 */ void* mpFishingTex; /* 0x110 */ void* mpFishingTex;
/* 0x114 */ char mButtonText[2][DUSK_IF_ELSE(32, 15)]; /* 0x114 */ char mButtonText[2][15];
/* 0x132 */ u8 field_0x132[0x134 - 0x132]; /* 0x132 */ u8 field_0x132[0x134 - 0x132];
/* 0x134 */ f32 field_0x134; /* 0x134 */ f32 field_0x134;
/* 0x138 */ f32 field_0x138; /* 0x138 */ f32 field_0x138;
+7 -8
View File
@@ -5,7 +5,6 @@
#include "JSystem/JMessage/JMessage.h" #include "JSystem/JMessage/JMessage.h"
#include "SSystem/SComponent/c_xyz.h" #include "SSystem/SComponent/c_xyz.h"
#include "dusk/endian.h" #include "dusk/endian.h"
#include "dusk/string.hpp"
#if REGION_JPN #if REGION_JPN
#define D_MSG_CLASS_PAGE_CNT_MAX 30 #define D_MSG_CLASS_PAGE_CNT_MAX 30
@@ -68,7 +67,7 @@ struct jmessage_tReference : public JMessage::TReference {
void pageSend(); void pageSend();
void selectMessage(); void selectMessage();
void inputNumber(); void inputNumber();
TEXT_SPAN getWord(int); char* getWord(int);
void resetWord(); void resetWord();
void setCharactor(u16); void setCharactor(u16);
void addCharactor(u16); void addCharactor(u16);
@@ -229,11 +228,11 @@ struct jmessage_tReference : public JMessage::TReference {
f32 getSelRubyCharSpace() { return mSelRubyCharSpace; } f32 getSelRubyCharSpace() { return mSelRubyCharSpace; }
f32 getRubySize() { return mRubySize; } f32 getRubySize() { return mRubySize; }
f32 getRubyCharSpace() { return mRubyCharSpace; } f32 getRubyCharSpace() { return mRubyCharSpace; }
TEXT_SPAN getSelTextPtr(int idx) { return mSelText[idx]; } char* getSelTextPtr(int idx) { return mSelText[idx]; }
TEXT_SPAN getSelRubyPtr(int idx) { return mSelRuby[idx]; } char* getSelRubyPtr(int idx) { return mSelRuby[idx]; }
TEXT_SPAN getTextPtr() { return mText; } char* getTextPtr() { return mText; }
TEXT_SPAN getTextSPtr() { return mTextS; } char* getTextSPtr() { return mTextS; }
TEXT_SPAN getRubyPtr() { return mRuby; } char* getRubyPtr() { return mRuby; }
u8 getSelectRubyFlag() { return mSelectRubyFlag; } u8 getSelectRubyFlag() { return mSelectRubyFlag; }
f32 getSelTBoxWidth() { return mSelTBoxWidth; } f32 getSelTBoxWidth() { return mSelTBoxWidth; }
u8 getSelectPos() { return mSelectPos; } u8 getSelectPos() { return mSelectPos; }
@@ -464,7 +463,7 @@ struct jmessage_tRenderingProcessor : public JMessage::TRenderingProcessor {
f32 getLineLength(int); f32 getLineLength(int);
void do_strcat(char*, bool, bool, bool); void do_strcat(char*, bool, bool, bool);
void do_rubyset(void const*, u32); void do_rubyset(void const*, u32);
void do_rubystrcat(char*, TEXT_SPAN, f32, f32); void do_rubystrcat(char*, char*, f32, f32);
void do_name1(); void do_name1();
void do_numset(s16); void do_numset(s16);
void push_word(); void push_word();
+7 -7
View File
@@ -53,8 +53,8 @@ public:
void demoMessageGroupLocal(); void demoMessageGroupLocal();
void endFlowGroupLocal(); void endFlowGroupLocal();
void changeGroupLocal(s16); void changeGroupLocal(s16);
bool getStringLocal(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, TEXT_SPAN, bool getStringLocal(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, char*,
TEXT_SPAN, TEXT_SPAN, s16*); char*, char*, s16*);
bool isGetItemMessage(); bool isGetItemMessage();
bool isKanbanMessage(); bool isKanbanMessage();
bool isHowlMessage(); bool isHowlMessage();
@@ -121,7 +121,7 @@ public:
static void endFlowGroup(); static void endFlowGroup();
static void changeGroup(s16); static void changeGroup(s16);
static bool getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, static bool getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
TEXT_SPAN, TEXT_SPAN, TEXT_SPAN, s16*); char*, char*, char*, s16*);
static void* getMsgDtPtr(); static void* getMsgDtPtr();
static void setProcessID(fpc_ProcID); static void setProcessID(fpc_ProcID);
static msg_class* getActor(); static msg_class* getActor();
@@ -246,12 +246,12 @@ public:
static void setWord(const char* i_word); static void setWord(const char* i_word);
void setWordLocal(const char* i_word) { void setWordLocal(const char* i_word) {
SAFE_STRCPY(mWord, i_word); strcpy(mWord, i_word);
} }
static void setSelectWord(int i_no, const char* i_word); static void setSelectWord(int i_no, const char* i_word);
void setSelectWordLocal(int i_no, const char* i_word) { void setSelectWordLocal(int i_no, const char* i_word) {
SAFE_STRCPY(mSelectWord[i_no], i_word); strcpy(mSelectWord[i_no], i_word);
} }
jmessage_tSequenceProcessor* getSequenceProcessor() { return mpSeqProc; } jmessage_tSequenceProcessor* getSequenceProcessor() { return mpSeqProc; }
@@ -426,8 +426,8 @@ inline void dMsgObject_setTalkActor(fopAc_ac_c* actor) {
} }
inline bool dMsgObject_getString(u32 i_msgId, J2DTextBox* i_tbox, J2DTextBox* i_rubyTbox, inline bool dMsgObject_getString(u32 i_msgId, J2DTextBox* i_tbox, J2DTextBox* i_rubyTbox,
JUTFont* i_font, COutFont_c* i_outFont, TEXT_SPAN o_text, JUTFont* i_font, COutFont_c* i_outFont, char* o_text,
TEXT_SPAN o_ruby, TEXT_SPAN o_textS, s16* param_8) { char* o_ruby, char* o_textS, s16* param_8) {
return dMsgObject_getMsgObjectClass()->getString(i_msgId, i_tbox, i_rubyTbox, i_font, i_outFont, o_text, o_ruby, return dMsgObject_getMsgObjectClass()->getString(i_msgId, i_tbox, i_rubyTbox, i_font, i_outFont, o_text, o_ruby,
o_textS, param_8); o_textS, param_8);
} }
+2 -2
View File
@@ -20,12 +20,12 @@ public:
f32 getStringPageLocal(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*, f32 getStringPageLocal(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*,
COutFont_c*, u8); COutFont_c*, u8);
u8 getPageMax(int); u8 getPageMax(int);
f32 getMessageLocal(u32, TEXT_SPAN); f32 getMessageLocal(u32, char*);
virtual f32 getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, u8); virtual f32 getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, u8);
virtual f32 getStringPage(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, virtual f32 getStringPage(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
u8); u8);
virtual f32 getMessage(u32, TEXT_SPAN); virtual f32 getMessage(u32, char*);
virtual void resetStringLocal(J2DTextBox*); virtual void resetStringLocal(J2DTextBox*);
virtual void drawOutFontLocal(J2DTextBox*, f32); virtual void drawOutFontLocal(J2DTextBox*, f32);
virtual void drawFontLocal(J2DTextBox*, u8, f32, f32, f32, f32, u32, u8); virtual void drawFontLocal(J2DTextBox*, u8, f32, f32, f32, f32, u32, u8);
+2 -2
View File
@@ -6,14 +6,14 @@
class dMsgUnit_c { class dMsgUnit_c {
public: public:
dMsgUnit_c(); dMsgUnit_c();
void setTag(int, int, TEXT_SPAN, bool); void setTag(int, int, char*, bool);
virtual ~dMsgUnit_c(); virtual ~dMsgUnit_c();
}; };
extern dMsgUnit_c g_msg_unit; extern dMsgUnit_c g_msg_unit;
inline void dMsgUnit_setTag(int param_0, int param_1, TEXT_SPAN param_2) { inline void dMsgUnit_setTag(int param_0, int param_1, char* param_2) {
g_msg_unit.setTag(param_0, param_1, param_2, true); g_msg_unit.setTag(param_0, param_1, param_2, true);
} }
+3 -3
View File
@@ -127,7 +127,7 @@ public:
u8 isInputEnd() { return mIsInputEnd; } u8 isInputEnd() { return mIsInputEnd; }
char* getInputStrPtr() { return mInputStr; } char* getInputStrPtr() { return mInputStr; }
void hideIcon() { mSelIcon->setAlphaRate(0.0f); } void hideIcon() { mSelIcon->setAlphaRate(0.0f); }
void setNextNameStr(char* i_name) { SAFE_STRCPY(mNextNameStr,i_name); } void setNextNameStr(char* i_name) { strcpy(mNextNameStr,i_name); }
void draw() { _draw(); } void draw() { _draw(); }
private: private:
@@ -140,9 +140,9 @@ private:
/* 0x02C */ J2DAnmTextureSRTKey* mCursorTexKey; /* 0x02C */ J2DAnmTextureSRTKey* mCursorTexKey;
/* 0x030 */ int mCurTexAnmF; /* 0x030 */ int mCurTexAnmF;
/* 0x034 */ CPaneMgrAlpha* mNameCursor[8]; /* 0x034 */ CPaneMgrAlpha* mNameCursor[8];
/* 0x054 */ TEXT_SPAN mNameText[8]; /* 0x054 */ char* mNameText[8];
/* 0x074 */ CPaneMgr* mMojiIcon[65]; /* 0x074 */ CPaneMgr* mMojiIcon[65];
/* 0x178 */ TEXT_SPAN mMojiText[65]; /* 0x178 */ char* mMojiText[65];
/* 0x27C */ J2DPane* mMojiPane; /* 0x27C */ J2DPane* mMojiPane;
/* 0x280 */ J2DPane* mMenuPane; /* 0x280 */ J2DPane* mMenuPane;
/* 0x284 */ CPaneMgr* mMenuIcon[4]; /* 0x284 */ CPaneMgr* mMenuIcon[4];
+5 -9
View File
@@ -488,25 +488,21 @@ public:
} }
#if TARGET_PC #if TARGET_PC
u16 getDeathCount() const { return mDeathCount; } u16 getDeathCount() const { return mDeathCount; }
TEXT_SPAN getPlayerName() const { return const_cast<char(&)[17]>(mPlayerName); }
#else
char* getPlayerName() const { return const_cast<char*>(mPlayerName); }
#endif #endif
char* getPlayerName() const { return const_cast<char*>(mPlayerName); }
void setPlayerName(const char* i_name) { void setPlayerName(const char* i_name) {
#if AVOID_UB #if AVOID_UB
dusk::SafeStringCopyTruncate(mPlayerName, i_name); strncpy(mPlayerName, i_name, sizeof(mPlayerName) - 1);
mPlayerName[sizeof(mPlayerName) - 1] = '\0';
#else #else
strcpy(mPlayerName, i_name); strcpy(mPlayerName, i_name);
#endif #endif
} }
#if TARGET_PC
TEXT_SPAN getHorseName() const { return const_cast<char(&)[17]>(mHorseName); }
#else
char* getHorseName() const { return const_cast<char*>(mHorseName); } char* getHorseName() const { return const_cast<char*>(mHorseName); }
#endif
void setHorseName(const char* i_name) { void setHorseName(const char* i_name) {
#if AVOID_UB #if AVOID_UB
dusk::SafeStringCopyTruncate(mHorseName, i_name); strncpy(mHorseName, i_name, sizeof(mHorseName) - 1);
mHorseName[sizeof(mHorseName) - 1] = '\0';
#else #else
strcpy(mHorseName, i_name); strcpy(mHorseName, i_name);
#endif #endif
+1 -1
View File
@@ -51,7 +51,7 @@ public:
f32 getPositionX() const { return mPositionX; } f32 getPositionX() const { return mPositionX; }
f32 getPositionY() const { return mPositionY; } f32 getPositionY() const { return mPositionY; }
void refreshAspectScale(f32 param_0); void refreshAspectScale();
#endif #endif
void onUpdateFlag() { mUpdateFlag = true; } void onUpdateFlag() { mUpdateFlag = true; }
+1 -1
View File
@@ -1225,7 +1225,7 @@ public:
#endif #endif
} }
static JKRExpHeap* getMemoryBlockHeap(int i_no) { return mMemoryBlock[i_no]; } static JKRExpHeap* getMemoryBlockHeap(int i_no) { return mMemoryBlock[i_no]; }
static TEXT_SPAN getDemoArcName() { return mDemoArcName; } static char* getDemoArcName() { return mDemoArcName; }
static void offNoChangeRoom() { mNoChangeRoom = false; } static void offNoChangeRoom() { mNoChangeRoom = false; }
static void onNoChangeRoom() { mNoChangeRoom = true; } static void onNoChangeRoom() { mNoChangeRoom = true; }
+2 -3
View File
@@ -5,7 +5,7 @@
#include <queue> #include <queue>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <unordered_map> #include <unordered_set>
#include <vector> #include <vector>
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
@@ -47,7 +47,6 @@ public:
// Signals are visible to all achievement checks within the same tick, then cleared. // Signals are visible to all achievement checks within the same tick, then cleared.
void signal(const char* key); void signal(const char* key);
bool hasSignal(const char* key) const; bool hasSignal(const char* key) const;
int signalCount(const char* key) const;
std::vector<Achievement> getAchievements() const; std::vector<Achievement> getAchievements() const;
@@ -63,7 +62,7 @@ private:
void processEntry(Entry& e); void processEntry(Entry& e);
std::vector<Entry> m_entries; std::vector<Entry> m_entries;
std::unordered_map<std::string_view, int> m_signals; std::unordered_set<std::string_view> m_signals;
bool m_loaded = false; bool m_loaded = false;
bool m_dirty = false; bool m_dirty = false;
}; };
-7
View File
@@ -1,7 +0,0 @@
#pragma once
namespace dusk::crash_handler {
void install();
} // namespace dusk::crash_handler
-22
View File
@@ -227,28 +227,6 @@ struct BE<Mtx> {
} }
}; };
typedef f32 Mtx23[2][3];
template <>
struct BE<Mtx23> {
BE<f32> contents[2][3];
auto& operator[](int x) {
return contents[x];
}
auto& operator[](int x) const {
return contents[x];
}
void to_host(Mtx23& mtx) const {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
mtx[i][j] = contents[i][j];
}
}
}
};
template<typename T> template<typename T>
void be_swap(T& val) { void be_swap(T& val) {
val = BE<T>::swap(val); val = BE<T>::swap(val);
+1 -2
View File
@@ -4,7 +4,6 @@
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include "settings.h"
class camera_process_class; class camera_process_class;
class view_class; class view_class;
@@ -19,7 +18,7 @@ void begin_record();
void end_record(); void end_record();
void begin_sim_tick(); void begin_sim_tick();
uint64_t sim_tick_seq(); uint64_t sim_tick_seq();
void begin_frame(FrameInterpMode mode, bool is_sim_frame, float step); void begin_frame(bool enabled, bool is_sim_frame, float step);
void interpolate(); void interpolate();
float get_interpolation_step(); float get_interpolation_step();
-5
View File
@@ -12,7 +12,6 @@ namespace dusk {
void InitializeFileLogging(const std::filesystem::path& configDir, AuroraLogLevel logLevel); void InitializeFileLogging(const std::filesystem::path& configDir, AuroraLogLevel logLevel);
void ShutdownFileLogging(); void ShutdownFileLogging();
const char* GetLogFilePath(); const char* GetLogFilePath();
int GetLogFileDescriptor();
void SendToStubLog(AuroraLogLevel level, const char* module, const char* message); void SendToStubLog(AuroraLogLevel level, const char* module, const char* message);
} }
@@ -20,11 +19,7 @@ extern bool StubLogEnabled;
extern aurora::Module DuskLog; extern aurora::Module DuskLog;
#ifndef NDEBUG
#define STUB_LOG() DuskLog.debug("{} is a stub", __FUNCTION__) #define STUB_LOG() DuskLog.debug("{} is a stub", __FUNCTION__)
#else
#define STUB_LOG()
#endif
#if TARGET_PC #if TARGET_PC
#define STUB_RET(...) \ #define STUB_RET(...) \
+3 -58
View File
@@ -15,17 +15,6 @@ enum class BloomMode : int {
Dusk = 2, Dusk = 2,
}; };
enum class DepthOfFieldMode : int {
Off = 0,
Classic = 1,
Dusk = 2,
};
enum class Resampler : int {
Bilinear = 0,
Area = 1,
};
enum class GameLanguage : u8 { enum class GameLanguage : u8 {
English = OS_LANGUAGE_ENGLISH, English = OS_LANGUAGE_ENGLISH,
German = OS_LANGUAGE_GERMAN, German = OS_LANGUAGE_GERMAN,
@@ -45,18 +34,6 @@ enum class GyroMode : u8 {
Mouse = 1, Mouse = 1,
}; };
enum class FrameInterpMode : u8 {
Off = 0,
Capped = 1,
Unlimited = 2,
};
enum class MenuScaling : u8 {
GameCube = 0,
Wii = 1,
Dusklight = 2,
};
namespace config { namespace config {
template <> template <>
struct ConfigEnumRange<BloomMode> { struct ConfigEnumRange<BloomMode> {
@@ -64,18 +41,6 @@ struct ConfigEnumRange<BloomMode> {
static constexpr auto max = BloomMode::Dusk; static constexpr auto max = BloomMode::Dusk;
}; };
template <>
struct ConfigEnumRange<DepthOfFieldMode> {
static constexpr auto min = DepthOfFieldMode::Off;
static constexpr auto max = DepthOfFieldMode::Dusk;
};
template <>
struct ConfigEnumRange<Resampler> {
static constexpr auto min = Resampler::Bilinear;
static constexpr auto max = Resampler::Area;
};
template <> template <>
struct ConfigEnumRange<GameLanguage> { struct ConfigEnumRange<GameLanguage> {
static constexpr auto min = GameLanguage::English; static constexpr auto min = GameLanguage::English;
@@ -93,19 +58,7 @@ struct ConfigEnumRange<GyroMode> {
static constexpr auto min = GyroMode::Sensor; static constexpr auto min = GyroMode::Sensor;
static constexpr auto max = GyroMode::Mouse; static constexpr auto max = GyroMode::Mouse;
}; };
}
template <>
struct ConfigEnumRange<FrameInterpMode> {
static constexpr auto min = FrameInterpMode::Off;
static constexpr auto max = FrameInterpMode::Unlimited;
};
template <>
struct ConfigEnumRange<MenuScaling> {
static constexpr auto min = MenuScaling::GameCube;
static constexpr auto max = MenuScaling::Dusklight;
};
} // namespace config
// Persistent user settings // Persistent user settings
@@ -119,7 +72,6 @@ struct UserSettings {
ConfigVar<bool> lockAspectRatio; ConfigVar<bool> lockAspectRatio;
ConfigVar<bool> enableFpsOverlay; ConfigVar<bool> enableFpsOverlay;
ConfigVar<int> fpsOverlayCorner; ConfigVar<int> fpsOverlayCorner;
ConfigVar<int> maxFrameRate;
} video; } video;
struct { struct {
@@ -157,7 +109,6 @@ struct UserSettings {
ConfigVar<bool> instantText; ConfigVar<bool> instantText;
ConfigVar<bool> sunsSong; ConfigVar<bool> sunsSong;
ConfigVar<bool> autoSave; ConfigVar<bool> autoSave;
ConfigVar<bool> enhancedMapMenus;
// Preferences // Preferences
ConfigVar<bool> enableMirrorMode; ConfigVar<bool> enableMirrorMode;
@@ -167,18 +118,15 @@ struct UserSettings {
ConfigVar<bool> enableAchievementToasts; ConfigVar<bool> enableAchievementToasts;
ConfigVar<bool> enableControllerToasts; ConfigVar<bool> enableControllerToasts;
ConfigVar<bool> enableDiscordPresence; ConfigVar<bool> enableDiscordPresence;
ConfigVar<MenuScaling> menuScalingMode;
// Graphics // Graphics
ConfigVar<BloomMode> bloomMode; ConfigVar<BloomMode> bloomMode;
ConfigVar<float> bloomMultiplier; ConfigVar<float> bloomMultiplier;
ConfigVar<DepthOfFieldMode> depthOfFieldMode;
ConfigVar<bool> disableWaterRefraction; ConfigVar<bool> disableWaterRefraction;
ConfigVar<bool> enableTextureReplacements; ConfigVar<bool> enableFrameInterpolation;
ConfigVar<FrameInterpMode> enableFrameInterpolation;
ConfigVar<int> internalResolutionScale; ConfigVar<int> internalResolutionScale;
ConfigVar<int> shadowResolutionMultiplier; ConfigVar<int> shadowResolutionMultiplier;
ConfigVar<Resampler> resampler; ConfigVar<bool> enableDepthOfField;
ConfigVar<bool> enableMapBackground; ConfigVar<bool> enableMapBackground;
ConfigVar<bool> disableCutscenePillarboxing; ConfigVar<bool> disableCutscenePillarboxing;
@@ -202,8 +150,6 @@ struct UserSettings {
ConfigVar<bool> invertCameraYAxis; ConfigVar<bool> invertCameraYAxis;
ConfigVar<bool> invertFirstPersonXAxis; ConfigVar<bool> invertFirstPersonXAxis;
ConfigVar<bool> invertFirstPersonYAxis; ConfigVar<bool> invertFirstPersonYAxis;
ConfigVar<bool> invertAirSwimX;
ConfigVar<bool> invertAirSwimY;
ConfigVar<float> freeCameraSensitivity; ConfigVar<float> freeCameraSensitivity;
ConfigVar<bool> debugFlyCam; ConfigVar<bool> debugFlyCam;
ConfigVar<bool> debugFlyCamLockEvents; ConfigVar<bool> debugFlyCamLockEvents;
@@ -240,7 +186,6 @@ struct UserSettings {
ConfigVar<bool> liveSplitEnabled; ConfigVar<bool> liveSplitEnabled;
ConfigVar<bool> showSpeedrunRTATimer; ConfigVar<bool> showSpeedrunRTATimer;
ConfigVar<bool> recordingMode; ConfigVar<bool> recordingMode;
ConfigVar<bool> removeQuestMapMarkers;
ConfigVar<bool> showInputViewer; ConfigVar<bool> showInputViewer;
ConfigVar<bool> showInputViewerGyro; ConfigVar<bool> showInputViewerGyro;
} game; } game;
+28 -98
View File
@@ -1,55 +1,22 @@
#ifndef DUSK_STRING_HPP #ifndef DUSK_STRING_HPP
#define DUSK_STRING_HPP #define DUSK_STRING_HPP
#include <cstdarg>
#include "global.h"
#include <cstring>
#include <dolphin/os.h>
namespace dusk { namespace dusk {
struct TextSpan { inline void strncpyProxy(char* dst, const char* src, size_t count) {
char* buffer; #if _MSC_VER
size_t size; #pragma warning(push)
#pragma warning(disable : 4996)
constexpr operator char*() const {
return buffer;
}
constexpr TextSpan(char* buffer, size_t size) : buffer(buffer), size(size) { }
template<size_t BufSize>
constexpr TextSpan(char (&buffer)[BufSize]) : buffer(buffer), size(BufSize) {
}
constexpr TextSpan() : buffer(nullptr), size(0) { }
constexpr TextSpan operator++(int) {
const auto prev = *this;
if (size > 0) [[likely]] {
size--;
}
buffer++;
return prev;
}
constexpr char& operator*() const {
if (size == 0) [[unlikely]] {
CrashSpawnEmpty();
}
return *buffer;
}
private:
static void CrashSpawnEmpty();
};
#if TARGET_PC
#define TEXT_SPAN dusk::TextSpan
#else
#define TEXT_SPAN char*
#endif #endif
strncpy(dst, src, count);
void SafeStringCopyTruncate(char* buffer, size_t bufSize, const char* src); #if _MSC_VER
#pragma warning(pop)
#endif
}
/** /**
* Copy a string to a fixed-size array. * Copy a string to a fixed-size array.
@@ -58,28 +25,13 @@ void SafeStringCopyTruncate(char* buffer, size_t bufSize, const char* src);
template <size_t BufSize> template <size_t BufSize>
void SafeStringCopyTruncate(char (&buffer)[BufSize], const char* src) { void SafeStringCopyTruncate(char (&buffer)[BufSize], const char* src) {
static_assert(BufSize > 0, "Target buffer cannot be size zero"); static_assert(BufSize > 0, "Target buffer cannot be size zero");
SafeStringCopyTruncate(buffer, BufSize, src);
}
void SafeStringCopy(char* buffer, size_t bufSize, const char* src); if (buffer == src) {
void SafeStringCat(char* buffer, size_t bufSize, const char* src); CRASH("Cannot copy string to same buffer");
int SafeStringVPrintf(char* buffer, size_t bufSize, const char* src, std::va_list args); }
inline void SafeStringCopy(TextSpan dst, const char* src) { strncpyProxy(buffer, src, BufSize);
SafeStringCopy(dst.buffer, dst.size, src); buffer[BufSize - 1] = 0;
}
inline void SafeStringCat(TextSpan dst, const char* src) {
SafeStringCat(dst.buffer, dst.size, src);
}
inline int SafeStringPrintf(TextSpan dst, const char* format, ...) {
std::va_list args;
va_start(args, format);
const auto ret = SafeStringVPrintf(dst.buffer, dst.size, format, args);
va_end(args);
return ret;
} }
/** /**
@@ -89,40 +41,18 @@ inline int SafeStringPrintf(TextSpan dst, const char* format, ...) {
template <size_t BufSize> template <size_t BufSize>
void SafeStringCopy(char (&buffer)[BufSize], const char* src) { void SafeStringCopy(char (&buffer)[BufSize], const char* src) {
static_assert(BufSize > 0, "Target buffer cannot be size zero"); static_assert(BufSize > 0, "Target buffer cannot be size zero");
SafeStringCopy(buffer, BufSize, src); if (buffer == src) {
CRASH("Cannot copy string to same buffer");
}
if (strlen(src) > BufSize - 1) {
CRASH("Destination buffer too small!");
}
strncpyProxy(buffer, src, BufSize);
buffer[BufSize - 1] = 0;
} }
template <size_t BufSize>
void SafeStringCat(char (&buffer)[BufSize], const char* src) {
static_assert(BufSize > 0, "Target buffer cannot be size zero");
SafeStringCat(buffer, BufSize, src);
}
template <size_t BufSize>
int SafeStringPrintf(char (&buffer)[BufSize], const char* format, ...) {
static_assert(BufSize > 0, "Target buffer cannot be size zero");
std::va_list args;
va_start(args, format);
const auto ret = SafeStringVPrintf(buffer, BufSize, format, args);
va_end(args);
return ret;
}
#if TARGET_PC
#define SAFE_STRCPY dusk::SafeStringCopy
#define SAFE_STRCAT dusk::SafeStringCat
#define SAFE_SPRINTF dusk::SafeStringPrintf
#define SAFE_STRCPY_BOUNDED dusk::SafeStringCopy
#define SAFE_STRCAT_BOUNDED dusk::SafeStringCat
#else
#define SAFE_STRCPY strcpy
#define SAFE_STRCAT strcat
#define SAFE_SPRINTF sprintf
#define SAFE_STRCPY_BOUNDED strcpy
#define SAFE_STRCPY_BOUNDED strcat
#endif
} }
#endif // DUSK_STRING_HPP #endif // DUSK_STRING_HPP
+4 -40
View File
@@ -17,24 +17,16 @@
#include <shellapi.h> #include <shellapi.h>
#include <intrin.h> #include <intrin.h>
#endif #endif
#ifdef __APPLE__
#include <mach/mach_time.h>
#if defined(__x86_64__) || defined(__i386__)
#include <immintrin.h>
#endif
#endif
class Limiter { class Limiter {
public: public:
using duration_t = Uint64; using duration_t = Uint64;
void Reset() { void Reset() { m_oldTime = SDL_GetTicksNS(); }
m_oldTime = SDL_GetTicksNS();
}
duration_t Sleep(duration_t targetFrameTime) { void Sleep(duration_t targetFrameTime) {
if (targetFrameTime == 0) { if (targetFrameTime == 0) {
return 0; return;
} }
const Uint64 start = SDL_GetTicksNS(); const Uint64 start = SDL_GetTicksNS();
@@ -49,8 +41,6 @@ public:
} }
} }
Reset(); Reset();
return adjustedSleepTime;
} }
duration_t SleepTime(duration_t targetFrameTime) { duration_t SleepTime(duration_t targetFrameTime) {
@@ -84,6 +74,7 @@ private:
if (!initialized || numSleeps++ % 1000 == 0) { if (!initialized || numSleeps++ % 1000 == 0) {
LARGE_INTEGER freq; LARGE_INTEGER freq;
if (QueryPerformanceFrequency(&freq) == 0) { if (QueryPerformanceFrequency(&freq) == 0) {
DuskLog.warn("QueryPerformanceFrequency failed: {}", GetLastError());
return; return;
} }
countPerNs = static_cast<double>(freq.QuadPart) / 1e9; countPerNs = static_cast<double>(freq.QuadPart) / 1e9;
@@ -107,33 +98,6 @@ private:
#endif #endif
} while (current.QuadPart - start.QuadPart < ticksToWait); } while (current.QuadPart - start.QuadPart < ticksToWait);
} }
#elif defined (__APPLE__)
void NanoSleep(const duration_t duration) {
// Hybrid approach using Apple Mach
uint64_t start_mach = mach_absolute_time();
mach_timebase_info_data_t timebase_info;
mach_timebase_info(&timebase_info);
uint64_t total_mach_ticks = (duration * timebase_info.denom) / timebase_info.numer;
uint64_t target_mach = start_mach + total_mach_ticks;
uint64_t buffer_ns = 2'000'000ULL;
uint64_t buffer_mach_ticks = (buffer_ns * timebase_info.denom) / timebase_info.numer;
if (total_mach_ticks > buffer_mach_ticks) {
uint64_t sleep_until_mach = target_mach - buffer_mach_ticks;
mach_wait_until(sleep_until_mach);
}
while (mach_absolute_time() < target_mach) {
#if defined(__aarch64__) || defined(__arm__)
asm volatile("yield" ::: "memory"); // Hardware hint, not a scheduler hint.
#else
_mm_pause();
#endif
}
}
#else #else
void NanoSleep(const duration_t duration) { SDL_DelayPrecise(duration); } void NanoSleep(const duration_t duration) { SDL_DelayPrecise(duration); }
#endif #endif
+1 -1
View File
@@ -50,7 +50,7 @@ fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, fopAc_ac_c* i_talkActor, u32 param_2
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1); fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1);
fpc_ProcID fopMsgM_messageSetDemo(u32 i_msgidx); fpc_ProcID fopMsgM_messageSetDemo(u32 i_msgidx);
msg_class* fopMsgM_SearchByID(fpc_ProcID i_id); msg_class* fopMsgM_SearchByID(fpc_ProcID i_id);
TEXT_SPAN fopMsgM_messageGet(TEXT_SPAN i_stringBuf, u32 i_msgId); char* fopMsgM_messageGet(char* i_stringBuf, u32 i_msgId);
fpc_ProcID fop_Timer_create(s16 i_procName, u8 i_mode, u32 i_limitMs, u8 i_type, u8 param_4, fpc_ProcID fop_Timer_create(s16 i_procName, u8 i_mode, u32 i_limitMs, u8 i_type, u8 param_4,
f32 param_5, f32 param_6, f32 param_7, f32 param_8, f32 param_5, f32 param_6, f32 param_7, f32 param_8,
fopMsgCreateFunc i_createFunc); fopMsgCreateFunc i_createFunc);
@@ -116,7 +116,7 @@ private:
* *
*/ */
struct J2DIndTexMtxInfo { struct J2DIndTexMtxInfo {
/* 0x00 */ BE(Mtx23) mMtx; /* 0x00 */ Mtx23 mMtx;
/* 0x18 */ s8 mScaleExp; /* 0x18 */ s8 mScaleExp;
J2DIndTexMtxInfo& operator=(const J2DIndTexMtxInfo& other) { J2DIndTexMtxInfo& operator=(const J2DIndTexMtxInfo& other) {
@@ -4,7 +4,6 @@
#include "JSystem/J2DGraph/J2DMaterial.h" #include "JSystem/J2DGraph/J2DMaterial.h"
#include "JSystem/J2DGraph/J2DPane.h" #include "JSystem/J2DGraph/J2DPane.h"
#include "dusk/endian.h" #include "dusk/endian.h"
#include "dusk/string.hpp"
class J2DMaterial; class J2DMaterial;
class JUTFont; class JUTFont;
@@ -99,8 +98,7 @@ public:
void initiate(ResFONT const*, char const*, s16, J2DTextBoxHBinding, void initiate(ResFONT const*, char const*, s16, J2DTextBoxHBinding,
J2DTextBoxVBinding); J2DTextBoxVBinding);
void private_readStream(J2DPane*, JSURandomInputStream*, JKRArchive*); void private_readStream(J2DPane*, JSURandomInputStream*, JKRArchive*);
TEXT_SPAN getStringPtr() const; char* getStringPtr() const;
dusk::TextSpan getSpan() const;
s32 setString(s16, char const*, ...); s32 setString(s16, char const*, ...);
s32 setString(char const*, ...); s32 setString(char const*, ...);
@@ -1575,12 +1575,6 @@ struct J3DAlphaComp {
u8 getRef1() const { return mRef1; } u8 getRef1() const { return mRef1; }
void load() const { void load() const {
#ifdef AVOID_UB
if (mID > 255) {
J3DGDSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
return;
}
#endif
J3DGDSetAlphaCompare((GXCompare)getComp0(), mRef0, (GXAlphaOp)getOp(), (GXCompare)getComp1(), mRef1); J3DGDSetAlphaCompare((GXCompare)getComp0(), mRef0, (GXAlphaOp)getOp(), (GXCompare)getComp1(), mRef1);
} }
@@ -287,28 +287,28 @@ template <typename T>
class JASPoolAllocObject { class JASPoolAllocObject {
public: public:
#if TARGET_PC #if TARGET_PC
static void* operator new(size_t n, JKRHeapToken) IF_DUSK(noexcept) { static void* operator new(size_t n, JKRHeapToken) {
return operator new(n); return operator new(n);
} }
#endif #endif
static void* operator new(size_t n) IF_DUSK(noexcept) { static void* operator new(size_t n) {
#if PLATFORM_GCN #if PLATFORM_GCN
JASMemPool<T>& memPool_ = getMemPool_(); JASMemPool<T>& memPool_ = getMemPool_();
#endif #endif
return memPool_.alloc(n); return memPool_.alloc(n);
} }
static void* operator new(size_t n, void* ptr) IF_DUSK(noexcept) { static void* operator new(size_t n, void* ptr) {
return ptr; return ptr;
} }
#if TARGET_PC #if TARGET_PC
static void operator delete(void* ptr, size_t n, JKRHeapToken) IF_DUSK(noexcept) { static void operator delete(void* ptr, size_t n, JKRHeapToken) {
operator delete(ptr, n); operator delete(ptr, n);
} }
#endif #endif
static void operator delete(void* ptr, size_t n) IF_DUSK(noexcept) { static void operator delete(void* ptr, size_t n) {
#if PLATFORM_GCN #if PLATFORM_GCN
JASMemPool<T>& memPool_ = getMemPool_(); JASMemPool<T>& memPool_ = getMemPool_();
#endif #endif
@@ -402,28 +402,28 @@ template <typename T>
class JASPoolAllocObject_MultiThreaded { class JASPoolAllocObject_MultiThreaded {
public: public:
#if TARGET_PC #if TARGET_PC
static void* operator new(size_t n, JKRHeapToken) IF_DUSK(noexcept) { static void* operator new(size_t n, JKRHeapToken) {
return operator new(n); return operator new(n);
} }
#endif #endif
static void* operator new(size_t n) IF_DUSK(noexcept) { static void* operator new(size_t n) {
#if PLATFORM_GCN #if PLATFORM_GCN
JASMemPool_MultiThreaded<T>& memPool_ = getMemPool(); JASMemPool_MultiThreaded<T>& memPool_ = getMemPool();
#endif #endif
return memPool_.alloc(n); return memPool_.alloc(n);
} }
static void* operator new(size_t n, void* ptr) IF_DUSK(noexcept) { static void* operator new(size_t n, void* ptr) {
return ptr; return ptr;
} }
#if TARGET_PC #if TARGET_PC
static void operator delete(void* ptr, size_t n, JKRHeapToken) IF_DUSK(noexcept) { static void operator delete(void* ptr, size_t n, JKRHeapToken) {
return operator delete(ptr, n); return operator delete(ptr, n);
} }
#endif #endif
static void operator delete(void* ptr, size_t n) IF_DUSK(noexcept) { static void operator delete(void* ptr, size_t n) {
#if PLATFORM_GCN #if PLATFORM_GCN
JASMemPool_MultiThreaded<T>& memPool_ = getMemPool(); JASMemPool_MultiThreaded<T>& memPool_ = getMemPool();
#endif #endif
+15 -19
View File
@@ -237,11 +237,11 @@ enum class JKRHeapToken {
Dummy Dummy
}; };
inline void* operator new(size_t, JKRHeapToken, void* where) noexcept { inline void* operator new(size_t, JKRHeapToken, void* where) {
return where; return where;
} }
inline void* operator new[](size_t, JKRHeapToken, void* where) noexcept { inline void* operator new[](size_t, JKRHeapToken, void* where) {
return where; return where;
} }
@@ -264,21 +264,21 @@ inline void* operator new[](size_t, JKRHeapToken, void* where) noexcept {
#define JKR_HEAP_TOKEN_PARAM #define JKR_HEAP_TOKEN_PARAM
#endif #endif
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept); void* operator new(size_t size JKR_HEAP_TOKEN_PARAM);
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) IF_DUSK(noexcept); void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment);
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) IF_DUSK(noexcept); void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment);
// On PC, these new[] overloads are only used to catch usages of JKR_NEW with []. // On PC, these new[] overloads are only used to catch usages of JKR_NEW with [].
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept); void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM);
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, int alignment) IF_DUSK(noexcept); void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, int alignment);
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) IF_DUSK(noexcept); void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment);
void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept); void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM);
void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept); void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM);
#if TARGET_PC #if TARGET_PC
template<typename T> template<typename T>
void jkrDelete(T* ptr) IF_DUSK(noexcept) { void jkrDelete(T* ptr) {
if (ptr == nullptr) { if (ptr == nullptr) {
return; return;
} }
@@ -298,7 +298,7 @@ void jkrDelete(T* ptr) IF_DUSK(noexcept) {
} }
template<> template<>
inline void jkrDelete(void* ptr) IF_DUSK(noexcept) { inline void jkrDelete(void* ptr) {
if (ptr == nullptr) { if (ptr == nullptr) {
return; return;
} }
@@ -322,7 +322,7 @@ constexpr bool newArgsHasCustomAlignment() {
} }
template<typename T, typename... Args> template<typename T, typename... Args>
T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) IF_DUSK(noexcept) { T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) {
size_t allocSize = count * sizeof(T); size_t allocSize = count * sizeof(T);
if constexpr (!std::is_trivially_destructible<T>()) { if constexpr (!std::is_trivially_destructible<T>()) {
static_assert( static_assert(
@@ -333,10 +333,6 @@ T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) IF_DUSK(no
} }
void* ptr = operator new(allocSize, JKRHeapToken::Dummy, args...); void* ptr = operator new(allocSize, JKRHeapToken::Dummy, args...);
if (!ptr) {
return nullptr;
}
T* dataPtr; T* dataPtr;
if constexpr (!std::is_trivially_destructible<T>()) { if constexpr (!std::is_trivially_destructible<T>()) {
auto length = static_cast<size_t*>(ptr); auto length = static_cast<size_t*>(ptr);
@@ -356,7 +352,7 @@ T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) IF_DUSK(no
} }
template<typename T> template<typename T>
void jkrDeleteArray(T* pointer) IF_DUSK(noexcept) { void jkrDeleteArray(T* pointer) {
if (pointer == nullptr) { if (pointer == nullptr) {
return; return;
} }
@@ -376,7 +372,7 @@ void jkrDeleteArray(T* pointer) IF_DUSK(noexcept) {
} }
template<> template<>
inline void jkrDeleteArray(void* pointer) IF_DUSK(noexcept) { inline void jkrDeleteArray(void* pointer) {
if (pointer == nullptr) { if (pointer == nullptr) {
return; return;
} }
@@ -8,8 +8,6 @@
#include <cstring> #include <cstring>
#include <types.h> #include <types.h>
#include "dusk/string.hpp"
J2DMaterialFactory::J2DMaterialFactory(J2DMaterialBlock const& param_0) { J2DMaterialFactory::J2DMaterialFactory(J2DMaterialBlock const& param_0) {
mMaterialNum = param_0.field_0x8; mMaterialNum = param_0.field_0x8;
mpMaterialInitData = JSUConvertOffsetToPtr<J2DMaterialInitData>(&param_0, param_0.field_0xc); mpMaterialInitData = JSUConvertOffsetToPtr<J2DMaterialInitData>(&param_0, param_0.field_0xc);
@@ -94,7 +92,7 @@ J2DMaterial* J2DMaterialFactory::create(J2DMaterial* param_0, int index, u32 par
} }
if (local_380 == NULL && J2DScreen::getDataManage() != NULL) { if (local_380 == NULL && J2DScreen::getDataManage() != NULL) {
char acStack_230[257]; char acStack_230[257];
SAFE_STRCPY(acStack_230, param_3->getName(texNo)); strcpy(acStack_230, param_3->getName(texNo));
local_380 = J2DScreen::getDataManage()->get(acStack_230); local_380 = J2DScreen::getDataManage()->get(acStack_230);
} }
} }
@@ -113,7 +111,7 @@ J2DMaterial* J2DMaterialFactory::create(J2DMaterial* param_0, int index, u32 par
} }
if (local_388 == NULL && J2DScreen::getDataManage() != NULL) { if (local_388 == NULL && J2DScreen::getDataManage() != NULL) {
char acStack_334[257]; char acStack_334[257];
SAFE_STRCPY(acStack_334, param_4->getName(param_0->getTevBlock()->getFontNo())); strcpy(acStack_334, param_4->getName(param_0->getTevBlock()->getFontNo()));
local_388 = J2DScreen::getDataManage()->get(acStack_334); local_388 = J2DScreen::getDataManage()->get(acStack_334);
} }
} }
-6
View File
@@ -68,14 +68,8 @@ void J2DIndTevStage::load(u8 tevStage) {
} }
void J2DIndTexMtx::load(u8 indTexMtx) { void J2DIndTexMtx::load(u8 indTexMtx) {
#ifdef TARGET_PC
Mtx23 mtx;
mIndTexMtxInfo.mMtx.to_host(mtx);
GXSetIndTexMtx((GXIndTexMtxID)(GX_ITM_0 + indTexMtx), mtx, mIndTexMtxInfo.mScaleExp);
#else
GXSetIndTexMtx((GXIndTexMtxID)(GX_ITM_0 + indTexMtx), mIndTexMtxInfo.mMtx, GXSetIndTexMtx((GXIndTexMtxID)(GX_ITM_0 + indTexMtx), mIndTexMtxInfo.mMtx,
mIndTexMtxInfo.mScaleExp); mIndTexMtxInfo.mScaleExp);
#endif
} }
void J2DIndTexCoordScale::load(u8 indTexStage) { void J2DIndTexCoordScale::load(u8 indTexStage) {
+2 -6
View File
@@ -309,12 +309,8 @@ void J2DTextBox::draw(f32 posX, f32 posY, f32 param_2, J2DTextBoxHBinding hBind)
} }
} }
TEXT_SPAN J2DTextBox::getStringPtr() const { char* J2DTextBox::getStringPtr() const {
#if TARGET_PC
return { mStringPtr, mStringLength };
#else
return mStringPtr; return mStringPtr;
#endif
} }
s32 J2DTextBox::setString(char const* string, ...) { s32 J2DTextBox::setString(char const* string, ...) {
@@ -334,7 +330,7 @@ s32 J2DTextBox::setString(char const* string, ...) {
if (mStringPtr) { if (mStringPtr) {
mStringLength = len + 1; mStringLength = len + 1;
SAFE_STRCPY_BOUNDED(mStringPtr, mStringLength, string); strcpy(mStringPtr, string);
} }
va_end(args); va_end(args);
+1 -3
View File
@@ -2,8 +2,6 @@
#include <JSystem/JUtility/JUTAssert.h> #include <JSystem/JUtility/JUTAssert.h>
#include <cstring> #include <cstring>
#include "dusk/string.hpp"
u32 JAHVirtualNode::smVirNodeNum; u32 JAHVirtualNode::smVirNodeNum;
void JAHVirtualNode::virtualMessage(JAHControl& control) { void JAHVirtualNode::virtualMessage(JAHControl& control) {
@@ -79,7 +77,7 @@ void JAHVirtualNode::setVirNodeName(const char* name) {
// clang-format off // clang-format off
JUT_ASSERT(141, size<32); JUT_ASSERT(141, size<32);
// clang-format on // clang-format on
SAFE_STRCPY(mName, name); strcpy(mName, name);
} }
JAHVirtualNode::JAHVirtualNode(const char* name) : mTree(this) { JAHVirtualNode::JAHVirtualNode(const char* name) : mTree(this) {
+1 -3
View File
@@ -4,9 +4,7 @@
#include "JSystem/JAHostIO/JAHioMessage.h" #include "JSystem/JAHostIO/JAHioMessage.h"
#include "JSystem/JAHostIO/JAHioMgr.h" #include "JSystem/JAHostIO/JAHioMgr.h"
#include "JSystem/JAHostIO/JAHioNode.h" #include "JSystem/JAHostIO/JAHioNode.h"
#include "JSystem/JHostIO/JORServer.h" #include "JSystem/JHostIO/JORServer.h"
#include "dusk/string.hpp"
JAHioNode* JAHioNode::smCurrentNode; JAHioNode* JAHioNode::smCurrentNode;
@@ -34,7 +32,7 @@ void JAHioNode::updateNode() {
void JAHioNode::setNodeName(const char* name) { void JAHioNode::setNodeName(const char* name) {
int size = strlen(name) + 1; int size = strlen(name) + 1;
JUT_ASSERT(51, size < 32); JUT_ASSERT(51, size < 32);
SAFE_STRCPY(mName, name); strcpy(mName, name);
} }
void JAHioNode::genMessage(JORMContext* mctx) { void JAHioNode::genMessage(JORMContext* mctx) {
@@ -9,8 +9,6 @@
#include <os.h> #include <os.h>
#include <stdint.h> #include <stdint.h>
#include "dusk/string.hpp"
JASHeap* JASWaveArcLoader::sAramHeap; JASHeap* JASWaveArcLoader::sAramHeap;
JASHeap* JASWaveArcLoader::getRootHeap() { JASHeap* JASWaveArcLoader::getRootHeap() {
@@ -24,7 +22,7 @@ char JASWaveArcLoader::sCurrentDir[DIR_MAX] = "/AudioRes/Waves/";
void JASWaveArcLoader::setCurrentDir(char const* dir) { void JASWaveArcLoader::setCurrentDir(char const* dir) {
JUT_ASSERT(40, std::strlen(dir) < DIR_MAX - 1); JUT_ASSERT(40, std::strlen(dir) < DIR_MAX - 1);
SAFE_STRCPY(sCurrentDir, dir); strcpy(sCurrentDir, dir);
u32 len = strlen(sCurrentDir); u32 len = strlen(sCurrentDir);
if (sCurrentDir[len - 1] != '/') { if (sCurrentDir[len - 1] != '/') {
JUT_ASSERT(45, len + 1 < DIR_MAX); JUT_ASSERT(45, len + 1 < DIR_MAX);
@@ -172,8 +170,8 @@ void JASWaveArc::setFileName(char const* fileName) {
length = length + strlen(fileName); length = length + strlen(fileName);
char* path = JKR_NEW_ARRAY_ARGS(char, length + 1, JASKernel::getSystemHeap(), -4); char* path = JKR_NEW_ARRAY_ARGS(char, length + 1, JASKernel::getSystemHeap(), -4);
JUT_ASSERT(322, path); JUT_ASSERT(322, path);
SAFE_STRCPY_BOUNDED(path, length + 1, currentDir); strcpy(path, currentDir);
SAFE_STRCAT_BOUNDED(path, length + 1, fileName); strcat(path, fileName);
path[length] = '\0'; path[length] = '\0';
int entryNum = DVDConvertPathToEntrynum(path); int entryNum = DVDConvertPathToEntrynum(path);
JKR_DELETE_ARRAY(path); JKR_DELETE_ARRAY(path);
+5 -5
View File
@@ -370,28 +370,28 @@ constexpr auto FRAME_PERIOD = std::chrono::duration_cast<std::chrono::nanosecond
constexpr auto RETRACE_PERIOD = FRAME_PERIOD / 2; constexpr auto RETRACE_PERIOD = FRAME_PERIOD / 2;
static void waitPrecise(Limiter& limiter, Limiter::duration_t targetNs) { static void waitPrecise(Limiter& limiter, Limiter::duration_t targetNs) {
const auto sleepTime = limiter.Sleep(targetNs); const auto sleepTime = limiter.SleepTime(targetNs);
dusk::frameUsagePct = dusk::frameUsagePct =
100.0f * (1.0f - static_cast<float>(sleepTime) / static_cast<float>(targetNs)); 100.0f * (1.0f - static_cast<float>(sleepTime) / static_cast<float>(targetNs));
limiter.Sleep(targetNs);
} }
#endif #endif
static void waitForTick(u32 p1, u16 p2) { static void waitForTick(u32 p1, u16 p2) {
#if TARGET_PC #if TARGET_PC
static Limiter limiter; if (dusk::getSettings().game.enableFrameInterpolation && !dusk::getTransientSettings().skipFrameRateLimit) {
if (dusk::frame_interp::is_enabled() && !dusk::getTransientSettings().skipFrameRateLimit) {
dusk::frameUsagePct = 0.f; dusk::frameUsagePct = 0.f;
return; return;
} }
if (dusk::getTransientSettings().skipFrameRateLimit) { if (dusk::getTransientSettings().skipFrameRateLimit) {
p1 = OS_TIMER_CLOCK / 120; p1 = OS_TIMER_CLOCK / 120;
} }
#if TARGET_PC
if (fopOvlpM_IsPeek() && dusk::getTransientSettings().stateShareLoadActive) { if (fopOvlpM_IsPeek() && dusk::getTransientSettings().stateShareLoadActive) {
return; return;
} }
#endif
ZoneScopedC(tracy::Color::DimGray); ZoneScopedC(tracy::Color::DimGray);
#endif #endif
@@ -8,7 +8,6 @@
#include <cctype> #include <cctype>
#include <cstring> #include <cstring>
#include "dusk/string.hpp"
#include "global.h" #include "global.h"
JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) { JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) {
+2 -3
View File
@@ -4,11 +4,10 @@
#define MSL_USE_INLINES 1 // needed to inline tolower call. not inlined elsewhere in the repo #define MSL_USE_INLINES 1 // needed to inline tolower call. not inlined elsewhere in the repo
#include <cctype>
#include <cstring> #include <cstring>
#include <cctype>
#include <string> #include <string>
#include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JKernel/JKRHeap.h"
#include "dusk/string.hpp"
#include "global.h" #include "global.h"
JKRFileLoader* JKRFileLoader::sCurrentVolume; JKRFileLoader* JKRFileLoader::sCurrentVolume;
@@ -105,7 +104,7 @@ const char* JKRFileLoader::fetchVolumeName(char* buffer, s32 bufferSize, const c
static char rootPath[2] = "/"; static char rootPath[2] = "/";
if (strcmp(path, "/") == 0) { if (strcmp(path, "/") == 0) {
SAFE_STRCPY_BOUNDED(buffer, bufferSize, rootPath); strcpy(buffer, rootPath);
return rootPath; return rootPath;
} }
+8 -8
View File
@@ -559,7 +559,7 @@ void* operator new(size_t size) {
return JKRHeap::alloc(size, 4, NULL); return JKRHeap::alloc(size, 4, NULL);
} }
#else #else
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM) noexcept { void* operator new(size_t size JKR_HEAP_TOKEN_PARAM) {
if (sCurrentHeap == NULL) { if (sCurrentHeap == NULL) {
return fallback_alloc(size, 0, false); return fallback_alloc(size, 0, false);
} }
@@ -576,7 +576,7 @@ void* operator new(size_t size, int alignment) {
return JKRHeap::alloc(size, alignment, NULL); return JKRHeap::alloc(size, alignment, NULL);
} }
#else #else
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) noexcept { void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) {
void* mem = JKRHeap::alloc(size, alignment, nullptr); void* mem = JKRHeap::alloc(size, alignment, nullptr);
if (mem == nullptr) { if (mem == nullptr) {
return fallback_alloc(size, abs(alignment), true); return fallback_alloc(size, abs(alignment), true);
@@ -585,7 +585,7 @@ void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) noexcept {
} }
#endif #endif
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) IF_DUSK(noexcept) { void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) {
void* mem = JKRHeap::alloc(size, alignment, heap); void* mem = JKRHeap::alloc(size, alignment, heap);
#if TARGET_PC #if TARGET_PC
if (mem == nullptr) { if (mem == nullptr) {
@@ -600,7 +600,7 @@ void* operator new[](size_t size) {
return JKRHeap::alloc(size, 4, NULL); return JKRHeap::alloc(size, 4, NULL);
} }
#else #else
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept) { void* operator new[](size_t JKR_HEAP_TOKEN_PARAM) {
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead"); OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
} }
#endif #endif
@@ -610,12 +610,12 @@ void* operator new[](size_t size, int alignment) {
return JKRHeap::alloc(size, alignment, NULL); return JKRHeap::alloc(size, alignment, NULL);
} }
#else #else
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, int) IF_DUSK(noexcept) { void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, int) {
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead"); OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
} }
#endif #endif
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, JKRHeap*, int) IF_DUSK(noexcept) { void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, JKRHeap*, int) {
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead"); OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
} }
@@ -624,7 +624,7 @@ void operator delete(void* ptr) {
JKRHeap::free(ptr, NULL); JKRHeap::free(ptr, NULL);
} }
#else #else
void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept) { void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM) {
if (ptr == NULL) if (ptr == NULL)
return; return;
JKRHeap* heap = JKRHeap::findFromRoot(ptr); JKRHeap* heap = JKRHeap::findFromRoot(ptr);
@@ -645,7 +645,7 @@ void operator delete[](void* ptr) {
JKRHeap::free(ptr, NULL); JKRHeap::free(ptr, NULL);
} }
#else #else
void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept) { void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM) {
if (ptr == NULL) if (ptr == NULL)
return; return;
JKRHeap* heap = JKRHeap::findFromRoot(ptr); JKRHeap* heap = JKRHeap::findFromRoot(ptr);
+1 -3
View File
@@ -7,8 +7,6 @@
#include "global.h" #include "global.h"
#include <stdint.h> #include <stdint.h>
#include "dusk/string.hpp"
#if TARGET_PC #if TARGET_PC
#include "dusk/os.h" #include "dusk/os.h"
#endif #endif
@@ -276,7 +274,7 @@ void JKRThreadSwitch::draw(JKRThreadName_* thread_name_list, JUTConsole* console
if (!thread_print_name) { if (!thread_print_name) {
char buffer[16]; char buffer[16];
SAFE_SPRINTF(buffer, "%d", loadInfo->getId()); sprintf(buffer, "%d", loadInfo->getId());
thread_print_name = buffer; thread_print_name = buffer;
} }
@@ -76,7 +76,6 @@ void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
} }
void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
ZoneScoped;
JPABaseEmitter* emtr = work->mpEmtr; JPABaseEmitter* emtr = work->mpEmtr;
GXColor prm = ptcl->mPrmClr; GXColor prm = ptcl->mPrmClr;
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
@@ -88,7 +87,6 @@ void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
} }
void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
ZoneScoped;
JPABaseEmitter* emtr = work->mpEmtr; JPABaseEmitter* emtr = work->mpEmtr;
GXColor prm = ptcl->mPrmClr; GXColor prm = ptcl->mPrmClr;
GXColor env = ptcl->mEnvClr; GXColor env = ptcl->mEnvClr;
@@ -227,7 +225,6 @@ void JPAGenTexCrdMtxPrj(JPAEmitterWorkData* param_0) {
} }
void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) { void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
ZoneScoped;
JPABaseShape* shape = work->mpRes->getBsp(); JPABaseShape* shape = work->mpRes->getBsp();
f32 dVar16 = work->mpEmtr->mTick; f32 dVar16 = work->mpEmtr->mTick;
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS()); f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
@@ -259,7 +256,6 @@ void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
} }
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) { void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
ZoneScoped;
JPABaseShape* shape = work->mpRes->getBsp(); JPABaseShape* shape = work->mpRes->getBsp();
f32 dVar16 = param_1->mAge; f32 dVar16 = param_1->mAge;
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS()); f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
@@ -290,17 +286,14 @@ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1)
} }
void JPALoadTex(JPAEmitterWorkData* work) { void JPALoadTex(JPAEmitterWorkData* work) {
ZoneScoped;
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpRes->getBsp()->getTexIdx()), GX_TEXMAP0); work->mpResMgr->load(work->mpRes->getTexIdx(work->mpRes->getBsp()->getTexIdx()), GX_TEXMAP0);
} }
void JPALoadTexAnm(JPAEmitterWorkData* work) { void JPALoadTexAnm(JPAEmitterWorkData* work) {
ZoneScoped;
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0); work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0);
} }
void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
ZoneScoped;
work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0); work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0);
} }
@@ -453,7 +446,6 @@ void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
return; return;
} }
ZoneScoped;
JGeometry::TVec3<f32> pos; JGeometry::TVec3<f32> pos;
#if TARGET_PC #if TARGET_PC
Mtx ptclPosMtx; Mtx ptclPosMtx;
@@ -483,7 +475,6 @@ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
return; return;
} }
ZoneScoped;
if (work->mpRes->getUsrIdx() == 0x89d7) { if (work->mpRes->getUsrIdx() == 0x89d7) {
int a = 0; int a = 0;
} }
@@ -527,7 +518,6 @@ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
return; return;
} }
ZoneScoped;
JGeometry::TVec3<f32> local_48; JGeometry::TVec3<f32> local_48;
MTXMultVec(work->mPosCamMtx, &param_1->mPosition, &local_48); MTXMultVec(work->mPosCamMtx, &param_1->mPosition, &local_48);
Mtx local_38; Mtx local_38;
@@ -552,7 +542,6 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
return; return;
} }
ZoneScoped;
JGeometry::TVec3<f32> local_48; JGeometry::TVec3<f32> local_48;
MTXMultVec(work->mPosCamMtx, &param_1->mPosition, &local_48); MTXMultVec(work->mPosCamMtx, &param_1->mPosition, &local_48);
f32 sinRot = JMASSin(param_1->mRotateAngle); f32 sinRot = JMASSin(param_1->mRotateAngle);
@@ -1279,8 +1268,6 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
} }
void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) { void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) {
ZoneScoped;
JPABaseEmitter* emtr = work->mpEmtr; JPABaseEmitter* emtr = work->mpEmtr;
if (emtr->mpEmtrCallBack == NULL) { if (emtr->mpEmtrCallBack == NULL) {
return; return;
@@ -1295,7 +1282,6 @@ void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
return; return;
} }
ZoneScoped;
emtr->mpPtclCallBack->draw(emtr, ptcl); emtr->mpPtclCallBack->draw(emtr, ptcl);
} }
@@ -6,8 +6,6 @@
#include <gx.h> #include <gx.h>
void JPALoadExTex(JPAEmitterWorkData* work) { void JPALoadExTex(JPAEmitterWorkData* work) {
ZoneScoped;
JPAExTexShape* ets = work->mpRes->getEts(); JPAExTexShape* ets = work->mpRes->getEts();
GXTexCoordID secTexCoordID = GX_TEXCOORD1; GXTexCoordID secTexCoordID = GX_TEXCOORD1;
@@ -655,7 +655,7 @@ value_or_fun:
value: value:
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled() && u <= 5 && if (dusk::getSettings().game.enableFrameInterpolation && u <= 5 &&
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12)) (operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
{ {
dusk::frame_interp::request_presentation_sync(); dusk::frame_interp::request_presentation_sync();
@@ -666,7 +666,7 @@ value:
value_n: value_n:
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled() && if (dusk::getSettings().game.enableFrameInterpolation &&
(pN == TAdaptor_camera::sauVariableValue_3_POSITION_XYZ || pN == TAdaptor_camera::sauVariableValue_3_TARGET_POSITION_XYZ) && (pN == TAdaptor_camera::sauVariableValue_3_POSITION_XYZ || pN == TAdaptor_camera::sauVariableValue_3_TARGET_POSITION_XYZ) &&
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12)) (operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
{ {
+5 -6
View File
@@ -1,14 +1,13 @@
#include "JSystem/JSystem.h" // IWYU pragma: keep #include "JSystem/JSystem.h" // IWYU pragma: keep
#include <cstdio> #include "JSystem/JUtility/JUTConsole.h"
#include <vi.h>
#include "JSystem/J2DGraph/J2DOrthoGraph.h" #include "JSystem/J2DGraph/J2DOrthoGraph.h"
#include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTAssert.h" #include "JSystem/JUtility/JUTAssert.h"
#include "JSystem/JUtility/JUTConsole.h"
#include "JSystem/JUtility/JUTDirectPrint.h" #include "JSystem/JUtility/JUTDirectPrint.h"
#include "JSystem/JUtility/JUTVideo.h" #include "JSystem/JUtility/JUTVideo.h"
#include "dusk/string.hpp" #include <vi.h>
#include <cstdio>
#include "global.h" #include "global.h"
JUTConsoleManager* JUTConsoleManager::sManager; JUTConsoleManager* JUTConsoleManager::sManager;
@@ -205,10 +204,10 @@ void JUTConsole::doDraw(JUTConsole::EConsoleType consoleType) const {
mFont->drawString_scale((int)f31, sp94, mFontSizeX, mFontSizeY, spA8, TRUE); mFont->drawString_scale((int)f31, sp94, mFontSizeX, mFontSizeY, spA8, TRUE);
f31 += mFontSizeX * 13.0f; f31 += mFontSizeX * 13.0f;
if (sp88) { if (sp88) {
SAFE_SPRINTF(spB8, "ALL"); sprintf(spB8, "ALL");
} else { } else {
f32 f29 = sp8C / (f32)(sp90 - mHeight); f32 f29 = sp8C / (f32)(sp90 - mHeight);
SAFE_SPRINTF(spB8, "%3d%%(%dL)", (int)(100.0 * f29), sp90); sprintf(spB8, "%3d%%(%dL)", (int)(100.0 * f29), sp90);
} }
mFont->drawString_scale(f31, sp94, mFontSizeX, mFontSizeY, spB8, TRUE); mFont->drawString_scale(f31, sp94, mFontSizeX, mFontSizeY, spB8, TRUE);
} }
+2 -4
View File
@@ -9,8 +9,6 @@
#include <cmath> #include <cmath>
#include <cstdio> #include <cstdio>
#include <cstdlib> #include <cstdlib>
#include "dusk/string.hpp"
#ifdef __REVOLUTION_SDK__ #ifdef __REVOLUTION_SDK__
#include <revolution.h> #include <revolution.h>
#else #else
@@ -847,8 +845,8 @@ bool JUTException::queryMapAddress(char* mapPath, u32 address, s32 section_id, u
bool begin_with_newline) { bool begin_with_newline) {
if (mapPath) { if (mapPath) {
char buffer[80]; char buffer[80];
SAFE_STRCPY(buffer, mapPath); strcpy(buffer, mapPath);
SAFE_STRCAT(buffer, ".map"); strcat(buffer, ".map");
if (queryMapAddress_single(buffer, address, section_id, out_addr, out_size, out_line, if (queryMapAddress_single(buffer, address, section_id, out_addr, out_size, out_line,
line_length, print, begin_with_newline) == true) line_length, print, begin_with_newline) == true)
{ {
+1 -14
View File
@@ -13,33 +13,20 @@ inline denormal_state denormals_enable()
} }
inline void denormals_restore(denormal_state saved) { _mm_setcsr(saved); } inline void denormals_restore(denormal_state saved) { _mm_setcsr(saved); }
#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) #elif defined(__aarch64__) || defined(_M_ARM64)
#include <cstdint> #include <cstdint>
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
#include <intrin.h>
#endif
using denormal_state = uint64_t; using denormal_state = uint64_t;
inline denormal_state denormals_enable() inline denormal_state denormals_enable()
{ {
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
denormal_state saved = static_cast<denormal_state>(_ReadStatusReg(ARM64_FPCR));
_WriteStatusReg(ARM64_FPCR, static_cast<__int64>(saved | (1ULL << 24))); // FZ
return saved;
#else
denormal_state saved; denormal_state saved;
asm volatile("mrs %0, fpcr" : "=r"(saved)); asm volatile("mrs %0, fpcr" : "=r"(saved));
asm volatile("msr fpcr, %0" :: "r"(saved | (1ULL << 24))); // FZ asm volatile("msr fpcr, %0" :: "r"(saved | (1ULL << 24))); // FZ
return saved; return saved;
#endif
} }
inline void denormals_restore(denormal_state saved) inline void denormals_restore(denormal_state saved)
{ {
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
_WriteStatusReg(ARM64_FPCR, static_cast<__int64>(saved));
#else
asm volatile("msr fpcr, %0" :: "r"(saved)); asm volatile("msr fpcr, %0" :: "r"(saved));
#endif
} }
#elif defined(__arm__) || defined(_M_ARM) #elif defined(__arm__) || defined(_M_ARM)
+2 -5
View File
@@ -2,9 +2,6 @@ plugins {
id 'com.android.application' id 'com.android.application'
} }
def versionNameStr = (System.getenv("DUSK_VERSION") ?: "v0.1.0").replaceFirst("^v", "")
def versionCodeInt = (System.getenv("DUSK_VERSION_CODE") ?: "100000").toInteger()
def duskRepoDir = rootProject.projectDir.parentFile.parentFile def duskRepoDir = rootProject.projectDir.parentFile.parentFile
def duskGeneratedAssetsDir = layout.buildDirectory.dir('generated/assets/dusklight').get().asFile def duskGeneratedAssetsDir = layout.buildDirectory.dir('generated/assets/dusklight').get().asFile
def syncDuskAssets = tasks.register('syncDuskAssets', Sync) { def syncDuskAssets = tasks.register('syncDuskAssets', Sync) {
@@ -23,8 +20,8 @@ android {
applicationId 'dev.twilitrealm.dusk' applicationId 'dev.twilitrealm.dusk'
minSdk 26 minSdk 26
targetSdk 36 targetSdk 36
versionCode versionCodeInt versionCode 1
versionName versionNameStr versionName '0.1.0'
} }
buildTypes { buildTypes {
@@ -11,7 +11,6 @@
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application <application
android:allowBackup="true" android:allowBackup="true"
@@ -12,7 +12,6 @@ import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.provider.DocumentsContract; import android.provider.DocumentsContract;
import android.provider.OpenableColumns; import android.provider.OpenableColumns;
import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.Window; import android.view.Window;
@@ -28,12 +27,10 @@ import java.util.List;
public class DuskActivity extends SDLActivity { public class DuskActivity extends SDLActivity {
private static final String TAG = "DuskActivity"; private static final String TAG = "DuskActivity";
private static final int FOLDER_DIALOG_REQUEST_CODE = 0x4455; private static final int FOLDER_DIALOG_REQUEST_CODE = 0x4455;
private static final int MANAGE_STORAGE_REQUEST_CODE = 0x4456;
private static final String EXTERNAL_STORAGE_AUTHORITY = private static final String EXTERNAL_STORAGE_AUTHORITY =
"com.android.externalstorage.documents"; "com.android.externalstorage.documents";
private long folderDialogUserdata = 0; private long folderDialogUserdata = 0;
private boolean awaitingManageStoragePermission = false;
private static native void nativeFolderDialogResult(long userdata, String path, String error); private static native void nativeFolderDialogResult(long userdata, String path, String error);
@@ -92,9 +89,6 @@ public class DuskActivity extends SDLActivity {
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
hideSystemBars(); hideSystemBars();
if (awaitingManageStoragePermission) {
resumeFolderDialogAfterPermissionGrant();
}
} }
@Override @Override
@@ -177,19 +171,6 @@ public class DuskActivity extends SDLActivity {
} }
folderDialogUserdata = userdata; folderDialogUserdata = userdata;
if (requiresManageStoragePermission() && !hasManageStoragePermission()) {
if (!requestManageStoragePermission()) {
finishFolderDialogWithError("Unable to request Android file access permission");
return false;
}
return true;
}
openFolderDialog();
return true;
}
private void openFolderDialog() {
runOnUiThread(() -> { runOnUiThread(() -> {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
@@ -204,71 +185,9 @@ public class DuskActivity extends SDLActivity {
finishFolderDialog(Activity.RESULT_CANCELED, null); finishFolderDialog(Activity.RESULT_CANCELED, null);
} }
}); });
}
private boolean requiresManageStoragePermission() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
}
private boolean hasManageStoragePermission() {
return !requiresManageStoragePermission() || Environment.isExternalStorageManager();
}
private boolean requestManageStoragePermission() {
if (!requiresManageStoragePermission()) {
return true;
}
awaitingManageStoragePermission = true;
runOnUiThread(() -> {
if (tryStartManageStorageIntent(
new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
.setData(Uri.parse("package:" + getPackageName()))) ||
tryStartManageStorageIntent(
new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)))
{
return;
}
finishFolderDialogWithError("Unable to request Android file access permission");
});
return true; return true;
} }
private boolean tryStartManageStorageIntent(Intent intent) {
try {
startActivityForResult(intent, MANAGE_STORAGE_REQUEST_CODE);
return true;
} catch (ActivityNotFoundException e) {
Log.w(TAG, "Unable to open all-files access settings.", e);
return false;
}
}
private void resumeFolderDialogAfterPermissionGrant() {
awaitingManageStoragePermission = false;
if (folderDialogUserdata == 0) {
return;
}
if (hasManageStoragePermission()) {
openFolderDialog();
return;
}
finishFolderDialogWithError(
"Allow \"All files access\" for Dusklight before choosing a custom data folder");
}
private void finishFolderDialogWithError(String error) {
long userdata = folderDialogUserdata;
folderDialogUserdata = 0;
awaitingManageStoragePermission = false;
if (userdata != 0) {
nativeFolderDialogResult(userdata, null, error);
}
}
private void finishFolderDialog(int resultCode, Intent data) { private void finishFolderDialog(int resultCode, Intent data) {
long userdata = folderDialogUserdata; long userdata = folderDialogUserdata;
folderDialogUserdata = 0; folderDialogUserdata = 0;
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
private static final String TAG = "SDL"; private static final String TAG = "SDL";
private static final int SDL_MAJOR_VERSION = 3; private static final int SDL_MAJOR_VERSION = 3;
private static final int SDL_MINOR_VERSION = 4; private static final int SDL_MINOR_VERSION = 4;
private static final int SDL_MICRO_VERSION = 8; private static final int SDL_MICRO_VERSION = 4;
/* /*
// Display InputType.SOURCE/CLASS of events and devices // Display InputType.SOURCE/CLASS of events and devices
// //
@@ -570,7 +570,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static int getNaturalOrientation() { public static int getNaturalOrientation() {
int result = SDL_ORIENTATION_UNKNOWN; int result = SDL_ORIENTATION_UNKNOWN;
Activity activity = getContext(); Activity activity = (Activity)getContext();
if (activity != null) { if (activity != null) {
Configuration config = activity.getResources().getConfiguration(); Configuration config = activity.getResources().getConfiguration();
Display display = activity.getWindowManager().getDefaultDisplay(); Display display = activity.getWindowManager().getDefaultDisplay();
@@ -590,7 +590,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static int getCurrentRotation() { public static int getCurrentRotation() {
int result = 0; int result = 0;
Activity activity = getContext(); Activity activity = (Activity)getContext();
if (activity != null) { if (activity != null) {
Display display = activity.getWindowManager().getDefaultDisplay(); Display display = activity.getWindowManager().getDefaultDisplay();
switch (display.getRotation()) { switch (display.getRotation()) {
@@ -1292,7 +1292,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static double getDiagonal() public static double getDiagonal()
{ {
DisplayMetrics metrics = new DisplayMetrics(); DisplayMetrics metrics = new DisplayMetrics();
Activity activity = getContext(); Activity activity = (Activity)getContext();
if (activity == null) { if (activity == null) {
return 0.0; return 0.0;
} }
@@ -1940,7 +1940,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
return; return;
} }
Activity activity = getContext(); Activity activity = (Activity)getContext();
if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[]{permission}, requestCode); activity.requestPermissions(new String[]{permission}, requestCode);
} else { } else {

Before

Width:  |  Height:  |  Size: 928 KiB

After

Width:  |  Height:  |  Size: 928 KiB

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Before

Width:  |  Height:  |  Size: 1014 B

After

Width:  |  Height:  |  Size: 1014 B

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before

Width:  |  Height:  |  Size: 279 KiB

After

Width:  |  Height:  |  Size: 279 KiB

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

@@ -3,7 +3,7 @@ Name=Dusklight
GenericName=Dusklight GenericName=Dusklight
Comment=PC port of a classic adventure game Comment=PC port of a classic adventure game
Exec=dusklight Exec=dusklight
Icon=dev.twilitrealm.dusk Icon=dusklight
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Game; Categories=Game;
-2
View File
@@ -447,7 +447,6 @@ body.animate-in .intro-item {
top: auto; top: auto;
text-align: right; text-align: right;
font-size: 16dp; font-size: 16dp;
gap: 8dp;
} }
#disc-status { #disc-status {
@@ -469,7 +468,6 @@ body.animate-in .intro-item {
top: 32dp; top: 32dp;
text-align: right; text-align: right;
font-size: 16dp; font-size: 16dp;
gap: 8dp;
} }
.update { .update {
+1 -1
View File
@@ -183,7 +183,7 @@ bool Z2SoundMgr::startSound(JAISoundID soundID, JAISoundHandle* handle, const JG
return streamMgr_.startSound(soundID, handle, posPtr); return streamMgr_.startSound(soundID, handle, posPtr);
default: default:
char error[64]; char error[64];
SAFE_SPRINTF(error, "Unknown Sound-Type id :%08x\n", (u32)soundID); sprintf(error, "Unknown Sound-Type id :%08x\n", (u32)soundID);
JUT_WARN(277, "%s", error); JUT_WARN(277, "%s", error);
} }
+2 -3
View File
@@ -57,7 +57,6 @@
#include "dusk/settings.h" #include "dusk/settings.h"
#include "res/Object/Alink.h" #include "res/Object/Alink.h"
#include <cstring> #include <cstring>
#include <dusk/string.hpp>
#endif #endif
static int daAlink_Create(fopAc_ac_c* i_this); static int daAlink_Create(fopAc_ac_c* i_this);
@@ -5991,7 +5990,7 @@ void daAlink_c::setItemMatrix(int param_0) {
mDoMtx_stack_c::XrotS(-0x8000); mDoMtx_stack_c::XrotS(-0x8000);
#ifdef TARGET_PC #ifdef TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
Mtx boot_mtx; Mtx boot_mtx;
mDoMtx_concat(mpLinkModel->getAnmMtx(0x18), mDoMtx_stack_c::get(), boot_mtx); mDoMtx_concat(mpLinkModel->getAnmMtx(0x18), mDoMtx_stack_c::get(), boot_mtx);
mpLinkBootModels[1]->setAnmMtx(1, boot_mtx); mpLinkBootModels[1]->setAnmMtx(1, boot_mtx);
@@ -19768,7 +19767,7 @@ int daAlink_c::draw() {
dComIfGd_getOpaListDark()->entryImm(mpHookChain, 0); dComIfGd_getOpaListDark()->entryImm(mpHookChain, 0);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled() && if (dusk::getSettings().game.enableFrameInterpolation &&
mEquipItem == dItemNo_IRONBALL_e && mEquipItem == dItemNo_IRONBALL_e &&
mIronBallChainPos != NULL && mIronBallChainAngle != NULL) mIronBallChainPos != NULL && mIronBallChainAngle != NULL)
{ {
-4
View File
@@ -1165,10 +1165,6 @@ int daAlink_c::procCutFinishInit(int i_type) {
const daAlink_cutParamTbl* cutParams = &cutParamTable[i_type]; const daAlink_cutParamTbl* cutParams = &cutParamTable[i_type];
BOOL is_proc_frontRoll = mProcID == PROC_FRONT_ROLL; BOOL is_proc_frontRoll = mProcID == PROC_FRONT_ROLL;
#if TARGET_PC
mIsRollstab = (is_proc_frontRoll != FALSE) && (i_type == CUT_FINISH_PARAM_STAB);
#endif
commonProcInit(PROC_CUT_FINISH); commonProcInit(PROC_CUT_FINISH);
setCutType(cutParams->m_cutType); setCutType(cutParams->m_cutType);
field_0x3198 = cutParams->m_recoilAnmID; field_0x3198 = cutParams->m_recoilAnmID;
+2 -2
View File
@@ -4359,7 +4359,7 @@ void daAlink_c::dungeonReturnWarp() {
s16 angle = dComIfGs_getWarpPlayerAngleY(); s16 angle = dComIfGs_getWarpPlayerAngleY();
s8 room = dComIfGs_getWarpRoomNo(); s8 room = dComIfGs_getWarpRoomNo();
char name[8]; char name[8];
SAFE_STRCPY(name, dComIfGs_getWarpStageName()); strcpy(name, dComIfGs_getWarpStageName());
dComIfGs_setRestartRoom(pos, angle, room); dComIfGs_setRestartRoom(pos, angle, room);
dComIfGp_setNextStage(name, -1, dComIfGs_getRestartRoomNo(), -1, 0.0f, 12, 0, dComIfGp_setNextStage(name, -1, dComIfGs_getRestartRoomNo(), -1, 0.0f, 12, 0,
@@ -4535,7 +4535,7 @@ int daAlink_c::procCoWarpInit(int param_0, int param_1) {
if (checkBossRoom() && fopAcM_GetRoomNo(this) == 50) { if (checkBossRoom() && fopAcM_GetRoomNo(this) == 50) {
char stageName[32]; char stageName[32];
SAFE_STRCPY(stageName, dComIfGp_getStartStageName()); strcpy(stageName, dComIfGp_getStartStageName());
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
if ((s64)stageName[i] == 0) { if ((s64)stageName[i] == 0) {
+2 -2
View File
@@ -216,7 +216,7 @@ void daAlink_c::setSpeedAndAngleSwim() {
if (checkEventRun()) { if (checkEventRun()) {
var_r28 = mMoveAngle; var_r28 = mMoveAngle;
} else { } else {
var_r28 = shape_angle.y + (16384.0f * cM_ssin(mStickAngle) IF_DUSK(* (dusk::getSettings().game.invertAirSwimX ? -1.0f : 1.0f))); var_r28 = shape_angle.y + (16384.0f * cM_ssin(mStickAngle));
} }
cLib_addCalcAngleS(&shape_angle.y, var_r28, mpHIO->mSwim.m.mUnderwaterTurnRate, mpHIO->mSwim.m.mUnderwaterMaxTurn, mpHIO->mSwim.m.mUnderwaterMinTurn); cLib_addCalcAngleS(&shape_angle.y, var_r28, mpHIO->mSwim.m.mUnderwaterTurnRate, mpHIO->mSwim.m.mUnderwaterMaxTurn, mpHIO->mSwim.m.mUnderwaterMinTurn);
@@ -835,7 +835,7 @@ void daAlink_c::setSwimMoveAnime() {
} else { } else {
s16 var_r24; s16 var_r24;
if (checkInputOnR() && !checkEventRun()) { if (checkInputOnR() && !checkEventRun()) {
var_r24 = 13653.0f * cM_scos(mStickAngle) IF_DUSK(* (dusk::getSettings().game.invertAirSwimY ? -1.0f : 1.0f)); var_r24 = 13653.0f * cM_scos(mStickAngle);
} else { } else {
var_r24 = 0; var_r24 = 0;
} }
-6
View File
@@ -4005,13 +4005,7 @@ int daAlink_c::procWolfHowlDemoInit() {
} else if (name == fpcNm_Tag_WaraHowl_e) { } else if (name == fpcNm_Tag_WaraHowl_e) {
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daTagWrHowl_c*>(field_0x27f4)->getTuneId()); mZ2WolfHowlMgr.setCorrectCurve(static_cast<daTagWrHowl_c*>(field_0x27f4)->getTuneId());
} else { } else {
#if TARGET_PC
if (mZ2WolfHowlMgr.getCorrectCurveID() != 9) {
mZ2WolfHowlMgr.setCorrectCurve(-1);
}
#else
mZ2WolfHowlMgr.setCorrectCurve(-1); mZ2WolfHowlMgr.setCorrectCurve(-1);
#endif
} }
} else { } else {
#if TARGET_PC #if TARGET_PC
+1 -5
View File
@@ -397,7 +397,7 @@ static int daB_GND_Draw(b_gnd_class* i_this) {
i_this->field_0x21e8.update(2, l_color, &a_this->tevStr); i_this->field_0x21e8.update(2, l_color, &a_this->tevStr);
dComIfGd_set3DlineMat(&i_this->field_0x21e8); dComIfGd_set3DlineMat(&i_this->field_0x21e8);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mReinsInterpCurrValid) { if (i_this->mReinsInterpCurrValid) {
memcpy(i_this->mReinsInterpPrev, i_this->mReinsInterpCurr, sizeof(i_this->mReinsInterpCurr)); memcpy(i_this->mReinsInterpPrev, i_this->mReinsInterpCurr, sizeof(i_this->mReinsInterpCurr));
memcpy(i_this->mReinsTexInterpPrev, i_this->mReinsTexInterpCurr, sizeof(i_this->mReinsTexInterpCurr)); memcpy(i_this->mReinsTexInterpPrev, i_this->mReinsTexInterpCurr, sizeof(i_this->mReinsTexInterpCurr));
@@ -2192,9 +2192,6 @@ static void damage_check(b_gnd_class* i_this) {
i_this->mDamageInvulnerabilityTimer = 100; i_this->mDamageInvulnerabilityTimer = 100;
} }
} }
#if TARGET_PC
dusk::AchievementSystem::get().signal("ganondorf_hit");
#endif
} }
cXyz hitmark_size(1.0f, 1.0f, 1.0f); cXyz hitmark_size(1.0f, 1.0f, 1.0f);
@@ -2221,7 +2218,6 @@ static void damage_check(b_gnd_class* i_this) {
i_this->field_0xc7c = 0; i_this->field_0xc7c = 0;
dScnPly_c::setPauseTimer(7); dScnPly_c::setPauseTimer(7);
a_this->health = 100; a_this->health = 100;
dusk::AchievementSystem::get().signal("ganondorf_knocked_down");
} }
break; break;
} }
+16 -17
View File
@@ -5,25 +5,24 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/dolzel_rel.h" // IWYU pragma: keep
#include <cstdio>
#include <cstring>
#include <os.h>
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "SSystem/SComponent/c_math.h"
#include "d/actor/d_a_bg_obj.h" #include "d/actor/d_a_bg_obj.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include <cstdio>
#include <os.h>
#include <cstring>
#include "d/actor/d_a_set_bgobj.h" #include "d/actor/d_a_set_bgobj.h"
#include "d/d_s_play.h" #include "d/d_s_play.h"
#include "dusk/string.hpp" #include "SSystem/SComponent/c_math.h"
static const char* getBmdName(int param_0, int param_1) { static const char* getBmdName(int param_0, int param_1) {
static char l_bmdName[16]; static char l_bmdName[16];
switch (param_1) { switch (param_1) {
case 0: case 0:
SAFE_SPRINTF(l_bmdName, "model%d.bmd", param_0); sprintf(l_bmdName, "model%d.bmd", param_0);
break; break;
default: default:
SAFE_SPRINTF(l_bmdName, "model%d_%d.bmd", param_0, param_1); sprintf(l_bmdName, "model%d_%d.bmd", param_0, param_1);
break; break;
} }
@@ -35,10 +34,10 @@ static const char* getBtkName(int param_0, int param_1) {
switch (param_1) { switch (param_1) {
case 0: case 0:
SAFE_SPRINTF(l_btkName, "model%d.btk", param_0); sprintf(l_btkName, "model%d.btk", param_0);
break; break;
default: default:
SAFE_SPRINTF(l_btkName, "model%d_%d.btk", param_0, param_1); sprintf(l_btkName, "model%d_%d.btk", param_0, param_1);
break; break;
} }
@@ -50,10 +49,10 @@ static const char* getBrkName(int param_0, int param_1) {
switch (param_1) { switch (param_1) {
case 0: case 0:
SAFE_SPRINTF(l_brkName, "model%d.brk", param_0); sprintf(l_brkName, "model%d.brk", param_0);
break; break;
default: default:
SAFE_SPRINTF(l_brkName, "model%d_%d.brk", param_0, param_1); sprintf(l_brkName, "model%d_%d.brk", param_0, param_1);
break; break;
} }
@@ -63,7 +62,7 @@ static const char* getBrkName(int param_0, int param_1) {
static const char* getDzbName(int param_0) { static const char* getDzbName(int param_0) {
static char l_dzbName[16]; static char l_dzbName[16];
SAFE_SPRINTF(l_dzbName, "model%d.dzb", param_0); sprintf(l_dzbName, "model%d.dzb", param_0);
return l_dzbName; return l_dzbName;
} }
@@ -96,12 +95,12 @@ u8* daBgObj_c::spec_data_c::initTexShareBlock(u8* i_dataPtr) {
u8* dataPos = i_dataPtr + 8; u8* dataPos = i_dataPtr + 8;
for (; i < mTexShareNum; i++) { for (; i < mTexShareNum; i++) {
SAFE_STRCPY(sp48, (char*)dataPos); strcpy(sp48, (char*)dataPos);
int len = strlen((char*)dataPos); int len = strlen((char*)dataPos);
dataPos += len + 1; dataPos += len + 1;
if (*dataPos != 0) { if (*dataPos != 0) {
SAFE_STRCPY(sp8, (char*)dataPos); strcpy(sp8, (char*)dataPos);
dataPos += strlen((char*)dataPos) + 1; dataPos += strlen((char*)dataPos) + 1;
} else if (*dataPos == 0 && dataPos[1] == 1) { } else if (*dataPos == 0 && dataPos[1] == 1) {
dataPos += 2; dataPos += 2;
@@ -647,14 +646,14 @@ void daBgObj_c::doShareTexture() {
u8* spec_res_name = mSpecData.mpTexShareBlock + 8; u8* spec_res_name = mSpecData.mpTexShareBlock + 8;
for (int i = 0; i < mSpecData.mTexShareNum; i++) { for (int i = 0; i < mSpecData.mTexShareNum; i++) {
SAFE_STRCPY(res_name, (char*)spec_res_name); strcpy(res_name, (char*)spec_res_name);
spec_res_name += strlen((char*)spec_res_name) + 1; spec_res_name += strlen((char*)spec_res_name) + 1;
J3DModelData* modelData = J3DModelData* modelData =
(J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), res_name); (J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), res_name);
if (*spec_res_name != 0) { if (*spec_res_name != 0) {
SAFE_STRCPY(share_res_name, (char*)spec_res_name); strcpy(share_res_name, (char*)spec_res_name);
spec_res_name += strlen((char*)spec_res_name) + 1; spec_res_name += strlen((char*)spec_res_name) + 1;
J3DModelData* shareModelData = J3DModelData* shareModelData =
+1 -1
View File
@@ -51,7 +51,7 @@ static char* l_bmd_base_name = "door-pushDouble_";
char* daDbDoor00_c::getBmdName() { char* daDbDoor00_c::getBmdName() {
static char l_bmdName[32]; static char l_bmdName[32];
SAFE_SPRINTF(l_bmdName, "%s%02d.bmd", l_bmd_base_name, door_param2_c::getDoorModel(this)); sprintf(l_bmdName, "%s%02d.bmd", l_bmd_base_name, door_param2_c::getDoorModel(this));
return l_bmdName; return l_bmdName;
} }
+1 -1
View File
@@ -55,7 +55,7 @@ static char* l_bmd_base_name = "door-knob_";
char* daKnob20_c::getBmd() { char* daKnob20_c::getBmd() {
static char l_bmdName[32]; static char l_bmdName[32];
SAFE_SPRINTF(l_bmdName, "%s%02d.bmd", l_bmd_base_name, knob_param_c::getDoorModel(this)); sprintf(l_bmdName, "%s%02d.bmd", l_bmd_base_name, knob_param_c::getDoorModel(this));
return l_bmdName; return l_bmdName;
} }
+2 -2
View File
@@ -65,10 +65,10 @@ char* daDoor20_c::getBmdName() {
case 10: case 10:
case 12: case 12:
default: default:
SAFE_SPRINTF(bmdName, "door-shutter_%02d.bmd", door_param2_c::getDoorModel(this)); sprintf(bmdName, "door-shutter_%02d.bmd", door_param2_c::getDoorModel(this));
break; break;
case 9: case 9:
SAFE_SPRINTF(bmdName, "door-knob_%02d.bmd", door_param2_c::getDoorModel(this)); sprintf(bmdName, "door-knob_%02d.bmd", door_param2_c::getDoorModel(this));
break; break;
} }
return bmdName; return bmdName;
+2 -2
View File
@@ -94,9 +94,9 @@ const char* daSpiral_c::getBmd(int i_type) {
const char* daSpiral_c::getBmd2(int i_type) { const char* daSpiral_c::getBmd2(int i_type) {
static char bmdName[32]; static char bmdName[32];
if (i_type == daSpiral_TYPE_DOWN_e) { if (i_type == daSpiral_TYPE_DOWN_e) {
SAFE_SPRINTF(bmdName, "door-stairSpiralU.bmd"); sprintf(bmdName, "door-stairSpiralU.bmd");
} else { } else {
SAFE_SPRINTF(bmdName, "door-stairSpiralD.bmd"); sprintf(bmdName, "door-stairSpiralD.bmd");
} }
return bmdName; return bmdName;
-22
View File
@@ -674,29 +674,7 @@ static int daE_ARROW_Create(fopAc_ac_c* i_this) {
} }
int phase_state = dComIfG_resLoad(&a_this->mPhase, a_this->mResName); int phase_state = dComIfG_resLoad(&a_this->mPhase, a_this->mResName);
#if TARGET_PC
static int s_create_frames = 0;
static bool s_first_arrow = true;
static fpc_ProcID s_last_scene_id = 0;
s_create_frames++;
fpc_ProcID cur_scene_id = dStage_roomControl_c::getProcID();
if (cur_scene_id != s_last_scene_id) {
s_first_arrow = true;
s_last_scene_id = cur_scene_id;
}
if (phase_state == cPhs_COMPLEATE_e && s_first_arrow && s_create_frames < 4) {
return cPhs_INIT_e;
}
#endif
if (phase_state == cPhs_COMPLEATE_e) { if (phase_state == cPhs_COMPLEATE_e) {
#if TARGET_PC
s_create_frames = 0;
s_first_arrow = false;
#endif
a_this->mArrowType = fopAcM_GetParam(a_this) & 0xF; a_this->mArrowType = fopAcM_GetParam(a_this) & 0xF;
a_this->mFlags = fopAcM_GetParam(a_this) & 0xF0; a_this->mFlags = fopAcM_GetParam(a_this) & 0xF0;
+1 -1
View File
@@ -116,7 +116,7 @@ static int daE_DB_Draw(e_db_class* i_this) {
i_this->stalkLine.update(12, l_color, &actor->tevStr); i_this->stalkLine.update(12, l_color, &actor->tevStr);
dComIfGd_set3DlineMat(&i_this->stalkLine); dComIfGd_set3DlineMat(&i_this->stalkLine);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mStalkLineInterpCurrValid) { if (i_this->mStalkLineInterpCurrValid) {
memcpy(i_this->mStalkLineInterpPrev, i_this->mStalkLineInterpCurr, sizeof(i_this->mStalkLineInterpCurr)); memcpy(i_this->mStalkLineInterpPrev, i_this->mStalkLineInterpCurr, sizeof(i_this->mStalkLineInterpCurr));
i_this->mStalkLineInterpPrevValid = true; i_this->mStalkLineInterpPrevValid = true;
+1 -1
View File
@@ -103,7 +103,7 @@ static int daE_HB_Draw(e_hb_class* i_this) {
i_this->stalkLine.update(12, l_color, &actor->tevStr); i_this->stalkLine.update(12, l_color, &actor->tevStr);
dComIfGd_set3DlineMat(&i_this->stalkLine); dComIfGd_set3DlineMat(&i_this->stalkLine);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mStalkLineInterpCurrValid) { if (i_this->mStalkLineInterpCurrValid) {
memcpy(i_this->mStalkLineInterpPrev, i_this->mStalkLineInterpCurr, sizeof(i_this->mStalkLineInterpCurr)); memcpy(i_this->mStalkLineInterpPrev, i_this->mStalkLineInterpCurr, sizeof(i_this->mStalkLineInterpCurr));
i_this->mStalkLineInterpPrevValid = true; i_this->mStalkLineInterpPrevValid = true;
+1 -1
View File
@@ -105,7 +105,7 @@ static int daE_MB_Draw(e_mb_class* i_this) {
i_this->mRopeMat.update(16, l_color, &a_this->tevStr); i_this->mRopeMat.update(16, l_color, &a_this->tevStr);
dComIfGd_set3DlineMat(&i_this->mRopeMat); dComIfGd_set3DlineMat(&i_this->mRopeMat);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mRopeInterpCurrValid) { if (i_this->mRopeInterpCurrValid) {
memcpy(i_this->mRopeInterpPrev, i_this->mRopeInterpCurr, sizeof(i_this->mRopeInterpCurr)); memcpy(i_this->mRopeInterpPrev, i_this->mRopeInterpCurr, sizeof(i_this->mRopeInterpCurr));
i_this->mRopeInterpPrevValid = true; i_this->mRopeInterpPrevValid = true;
+1 -8
View File
@@ -117,13 +117,6 @@ static void daE_S1_interp_callback(bool isSimFrame, void* pUserWork) {
dst[i] = p0 + (p1 - p0) * alpha; dst[i] = p0 + (p1 - p0) * alpha;
} }
} }
GXColor line_color;
line_color.r = JREG_S(0) + 5;
line_color.g = JREG_S(1) + 10;
line_color.b = JREG_S(2) + 10;
line_color.a = 0xFF;
i_this->mLineMat.update(16, line_color, &i_this->tevStr);
} }
#endif #endif
@@ -161,7 +154,7 @@ static int daE_S1_Draw(e_s1_class* i_this) {
dComIfGd_set3DlineMatDark(&i_this->mLineMat); dComIfGd_set3DlineMatDark(&i_this->mLineMat);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mHairInterpCurrValid) { if (i_this->mHairInterpCurrValid) {
memcpy(i_this->mHairInterpPrev, i_this->mHairInterpCurr, sizeof(i_this->mHairInterpCurr)); memcpy(i_this->mHairInterpPrev, i_this->mHairInterpCurr, sizeof(i_this->mHairInterpCurr));
i_this->mHairInterpPrevValid = true; i_this->mHairInterpPrevValid = true;
+1 -1
View File
@@ -535,7 +535,7 @@ static int daE_WB_Draw(e_wb_class* i_this) {
i_this->himo_tex.update(2, l_color, &actor->tevStr); i_this->himo_tex.update(2, l_color, &actor->tevStr);
dComIfGd_set3DlineMat(&i_this->himo_tex); dComIfGd_set3DlineMat(&i_this->himo_tex);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->himo_interp_curr_valid) { if (i_this->himo_interp_curr_valid) {
memcpy(i_this->himo_mat_interp_prev, i_this->himo_mat_interp_curr, sizeof(i_this->himo_mat_interp_curr)); memcpy(i_this->himo_mat_interp_prev, i_this->himo_mat_interp_curr, sizeof(i_this->himo_mat_interp_curr));
memcpy(i_this->himo_tex_interp_prev, i_this->himo_tex_interp_curr, sizeof(i_this->himo_tex_interp_curr)); memcpy(i_this->himo_tex_interp_prev, i_this->himo_tex_interp_curr, sizeof(i_this->himo_tex_interp_curr));
+1 -1
View File
@@ -107,7 +107,7 @@ static s32 daE_YD_Draw(e_yd_class* i_this) {
i_this->mLineMat.update(12, l_color, &i_this->actor.tevStr); i_this->mLineMat.update(12, l_color, &i_this->actor.tevStr);
dComIfGd_set3DlineMat(&i_this->mLineMat); dComIfGd_set3DlineMat(&i_this->mLineMat);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mLineMatInterpCurrValid) { if (i_this->mLineMatInterpCurrValid) {
memcpy(i_this->mLineMatInterpPrev, i_this->mLineMatInterpCurr, sizeof(i_this->mLineMatInterpCurr)); memcpy(i_this->mLineMatInterpPrev, i_this->mLineMatInterpCurr, sizeof(i_this->mLineMatInterpCurr));
i_this->mLineMatInterpPrevValid = true; i_this->mLineMatInterpPrevValid = true;
+1 -9
View File
@@ -139,7 +139,6 @@ static BOOL pl_check(e_yg_class* i_this, f32 i_dist) {
#if TARGET_PC #if TARGET_PC
static void daE_YG_interp_callback(bool isSimFrame, void* pUserWork) { static void daE_YG_interp_callback(bool isSimFrame, void* pUserWork) {
e_yg_class* i_this = (e_yg_class*)pUserWork; e_yg_class* i_this = (e_yg_class*)pUserWork;
fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->actor;
if (!i_this->mTentacleInterpPrevValid || !i_this->mTentacleInterpCurrValid) { if (!i_this->mTentacleInterpPrevValid || !i_this->mTentacleInterpCurrValid) {
return; return;
} }
@@ -153,13 +152,6 @@ static void daE_YG_interp_callback(bool isSimFrame, void* pUserWork) {
dst[i] = p0 + (p1 - p0) * alpha; dst[i] = p0 + (p1 - p0) * alpha;
} }
} }
GXColor color;
color.r = JREG_S(0) + 20;
color.g = JREG_S(1) + 20;
color.b = JREG_S(2) + 20;
color.a = 0xFF;
i_this->mLineMat.update(10, color, &actor->tevStr);
} }
#endif #endif
@@ -191,7 +183,7 @@ static int daE_YG_Draw(e_yg_class* i_this) {
dComIfGd_set3DlineMatDark(&i_this->mLineMat); dComIfGd_set3DlineMatDark(&i_this->mLineMat);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mTentacleInterpCurrValid) { if (i_this->mTentacleInterpCurrValid) {
memcpy(i_this->mTentacleInterpPrev, i_this->mTentacleInterpCurr, sizeof(i_this->mTentacleInterpCurr)); memcpy(i_this->mTentacleInterpPrev, i_this->mTentacleInterpCurr, sizeof(i_this->mTentacleInterpCurr));
i_this->mTentacleInterpPrevValid = true; i_this->mTentacleInterpPrevValid = true;
+1 -1
View File
@@ -135,7 +135,7 @@ static int daE_YH_Draw(e_yh_class* i_this) {
i_this->mLine.update(12, l_color, &a_this->tevStr); i_this->mLine.update(12, l_color, &a_this->tevStr);
dComIfGd_set3DlineMat(&i_this->mLine); dComIfGd_set3DlineMat(&i_this->mLine);
#if TARGET_PC #if TARGET_PC
if (dusk::frame_interp::is_enabled()) { if (dusk::getSettings().game.enableFrameInterpolation) {
if (i_this->mLineInterpCurrValid) { if (i_this->mLineInterpCurrValid) {
memcpy(i_this->mLineInterpPrev, i_this->mLineInterpCurr, sizeof(i_this->mLineInterpCurr)); memcpy(i_this->mLineInterpPrev, i_this->mLineInterpCurr, sizeof(i_this->mLineInterpCurr));
i_this->mLineInterpPrevValid = true; i_this->mLineInterpPrevValid = true;
+1 -1
View File
@@ -3165,7 +3165,7 @@ void daHorse_c::setReinPosNormalSubstance() {
#if TARGET_PC #if TARGET_PC
void daHorse_c::lerpControlPoints(f32 alpha) { void daHorse_c::lerpControlPoints(f32 alpha) {
// FRAME INTERP NOTE: Currently only lerping points for Epona's reins. Need a more global solution. // FRAME INTERP NOTE: Currently only lerping points for Epona's reins. Need a more global solution.
if (!dusk::frame_interp::is_enabled() || !s_horseReinSimPrevValid || !s_horseReinSimCurrValid) { if (!dusk::getSettings().game.enableFrameInterpolation || !s_horseReinSimPrevValid || !s_horseReinSimCurrValid) {
return; return;
} }
const int nCurr = s_horseReinSimNumCurr; const int nCurr = s_horseReinSimNumCurr;

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