Merge branch 'tphd' into depth-bias-poc-hack
@@ -7,6 +7,10 @@ on:
|
||||
- '*LICENSE'
|
||||
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:
|
||||
SCCACHE_GHA_ENABLED: "true"
|
||||
RUSTC_WRAPPER: "sccache"
|
||||
@@ -22,13 +26,13 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- name: GCC x86_64
|
||||
runner: ubuntu-latest
|
||||
runner: ubuntu-24.04
|
||||
preset: gcc
|
||||
artifact_arch: x86_64
|
||||
# - name: GCC aarch64
|
||||
# runner: ubuntu-24.04-arm
|
||||
# preset: gcc
|
||||
# artifact_arch: aarch64
|
||||
- name: GCC aarch64
|
||||
runner: ubuntu-24.04-arm
|
||||
preset: gcc
|
||||
artifact_arch: aarch64
|
||||
# - name: Clang x86_64
|
||||
# runner: ubuntu-latest
|
||||
# preset: clang
|
||||
@@ -221,12 +225,12 @@ jobs:
|
||||
msvc_arch: amd64
|
||||
vcpkg_arch: x64
|
||||
artifact_arch: x86_64
|
||||
# - name: MSVC arm64
|
||||
# runner: windows-11-arm
|
||||
# preset: arm64-msvc
|
||||
# msvc_arch: arm64
|
||||
# vcpkg_arch: arm64
|
||||
# artifact_arch: arm64
|
||||
- name: MSVC arm64
|
||||
runner: windows-latest
|
||||
preset: arm64-msvc
|
||||
msvc_arch: amd64_arm64
|
||||
vcpkg_arch: arm64
|
||||
artifact_arch: arm64
|
||||
# - name: Clang x86_64
|
||||
# runner: windows-latest
|
||||
# preset: clang
|
||||
@@ -255,7 +259,7 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
choco install ninja
|
||||
vcpkg install freetype:${{matrix.vcpkg_arch}}-windows-static zstd:${{matrix.vcpkg_arch}}-windows-static
|
||||
vcpkg install freetype:${{matrix.vcpkg_arch}}-windows zstd:${{matrix.vcpkg_arch}}-windows
|
||||
|
||||
- name: Configure CMake
|
||||
run: cmake --preset x-windows-ci-${{matrix.preset}}
|
||||
|
||||
@@ -11,6 +11,7 @@ if (DUSK_VERSION_OVERRIDE)
|
||||
set(DUSK_WC_DESCRIBE "${DUSK_VERSION_OVERRIDE}")
|
||||
set(DUSK_VERSION_STRING "0.0.0.0")
|
||||
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
||||
set(DUSK_VERSION_CODE "1")
|
||||
set(DUSK_WC_REVISION "")
|
||||
set(DUSK_WC_BRANCH "")
|
||||
set(DUSK_WC_DATE "")
|
||||
@@ -61,6 +62,9 @@ endif ()
|
||||
|
||||
if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
|
||||
set(DUSK_SHORT_VERSION_STRING "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
|
||||
set(_ver_major ${CMAKE_MATCH_1})
|
||||
set(_ver_minor ${CMAKE_MATCH_2})
|
||||
set(_ver_patch ${CMAKE_MATCH_3})
|
||||
set(DUSK_VERSION_TWEAK "0")
|
||||
if (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+)(-dirty)?$")
|
||||
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
|
||||
@@ -68,10 +72,19 @@ if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
|
||||
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
|
||||
endif ()
|
||||
set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.${DUSK_VERSION_TWEAK}")
|
||||
if(DUSK_VERSION_TWEAK GREATER 999)
|
||||
set(_tweak 999)
|
||||
else()
|
||||
set(_tweak ${DUSK_VERSION_TWEAK})
|
||||
endif()
|
||||
# encoding: major*1e7 + minor*1e5 + patch*1e3 + tweak; collision-free for major<210, minor<100, patch<100, tweak<=999
|
||||
math(EXPR DUSK_VERSION_CODE
|
||||
"${_ver_major} * 10000000 + ${_ver_minor} * 100000 + ${_ver_patch} * 1000 + ${_tweak}")
|
||||
else ()
|
||||
set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION")
|
||||
set(DUSK_VERSION_STRING "0.0.0.0")
|
||||
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
||||
set(DUSK_VERSION_CODE "1")
|
||||
endif ()
|
||||
|
||||
endif ()
|
||||
@@ -79,6 +92,7 @@ endif ()
|
||||
# Add version information to CI environment variables
|
||||
if(DEFINED ENV{GITHUB_ENV})
|
||||
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
|
||||
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION_CODE=${DUSK_VERSION_CODE}\n")
|
||||
endif()
|
||||
message(STATUS "Dusklight version set to ${DUSK_WC_DESCRIBE}")
|
||||
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
||||
@@ -86,6 +100,8 @@ project(dusklight LANGUAGES C CXX VERSION ${DUSK_VERSION_STRING})
|
||||
if (APPLE)
|
||||
enable_language(OBJC OBJCXX)
|
||||
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)
|
||||
# ios.toolchain.cmake hack for SDL
|
||||
set(TVOS ON)
|
||||
@@ -160,6 +176,7 @@ if (DUSK_MOVIE_SUPPORT)
|
||||
endif ()
|
||||
set(_jpeg_cmake_args
|
||||
-DCMAKE_INSTALL_PREFIX=${_jpeg_install_dir}
|
||||
-DCMAKE_PROJECT_INCLUDE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/WindowsTargetProcessor.cmake
|
||||
-DENABLE_SHARED=OFF
|
||||
-DWITH_TURBOJPEG=ON
|
||||
-DWITH_JAVA=OFF
|
||||
@@ -357,6 +374,10 @@ endif ()
|
||||
|
||||
if (WIN32)
|
||||
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 ()
|
||||
|
||||
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/no_backend.cpp)
|
||||
@@ -493,6 +514,10 @@ if (ANDROID)
|
||||
target_link_options(dusklight PRIVATE "-Wl,-u,SDL_main")
|
||||
endif ()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
||||
target_link_options(dusklight PRIVATE "-Wl,--build-id=sha1")
|
||||
endif ()
|
||||
|
||||
if (NOT APPLE)
|
||||
add_custom_command(TARGET dusklight POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
|
||||
@@ -33,7 +33,11 @@
|
||||
"value": true
|
||||
},
|
||||
"DUSK_SENTRY_DSN": "$env{SENTRY_DSN}",
|
||||
"DUSK_SENTRY_ENVIRONMENT": "production"
|
||||
"DUSK_SENTRY_ENVIRONMENT": "production",
|
||||
"Rust_RUSTUP_INSTALL_MISSING_TARGET": {
|
||||
"type": "BOOL",
|
||||
"value": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -322,7 +326,9 @@
|
||||
"BUILD_SHARED_LIBS": {
|
||||
"type": "BOOL",
|
||||
"value": false
|
||||
}
|
||||
},
|
||||
"AURORA_SDL3_VERSION": "3.4.8",
|
||||
"AURORA_SDL3_REF": "refs/tags/release-3.4.8"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -430,7 +436,6 @@
|
||||
"x-macos-ci"
|
||||
],
|
||||
"cacheVariables": {
|
||||
"AURORA_DAWN_PROVIDER": "vendor",
|
||||
"CMAKE_OSX_ARCHITECTURES": "x86_64",
|
||||
"Rust_CARGO_TARGET": "x86_64-apple-darwin"
|
||||
}
|
||||
@@ -490,7 +495,10 @@
|
||||
"inherits": [
|
||||
"x-windows-ci",
|
||||
"windows-arm64-msvc"
|
||||
]
|
||||
],
|
||||
"cacheVariables": {
|
||||
"VCPKG_TARGET_TRIPLET": "arm64-windows"
|
||||
}
|
||||
}
|
||||
],
|
||||
"buildPresets": [
|
||||
|
||||
@@ -22,16 +22,11 @@ It aims to be as accurate as possible to the original while also providing new o
|
||||
> [!IMPORTANT]
|
||||
> At a minimum, Dusklight requires a GPU with support for either D3D12, Vulkan, or Metal. Your experience with specific hardware, operating systems, and drivers may vary. In particular, older Intel iGPUs have a high likelihood of incompatibility. We are also aware of a number of issues on devices with Adreno GPUs and are working to resolve them.
|
||||
|
||||
### 1. Verify your dump
|
||||
### 1. Dump your game
|
||||
|
||||
First, make sure your dump of the game is clean and supported by Dusklight. You can do this by checking the SHA-1 hash of your dump against this list of supported versions:
|
||||
You must dump your own copy of the game, please see [this article](https://wiki.dolphin-emu.org/index.php?title=Ripping_Games) for instructions. After dumping, you can use a program like [Dolphin](https://dolphin-emu.org/) or [nodtool](https://github.com/encounter/nod/releases) to convert the `.iso` to a `.rvz` to save space.
|
||||
|
||||
| Version | SHA-1 hash |
|
||||
|--------------| ------------------------------------------ |
|
||||
| GameCube USA | `75edd3ddff41f125d1b4ce1a40378f1b565519e7` |
|
||||
| GameCube EUR | `2601822a488eeb86fb89db16ca8f29c2c953e1ca` |
|
||||
|
||||
*Support for other versions of the game is planned in the future.
|
||||
Currently, only the GameCube USA and EUR releases are supported. Support for other versions of the game is planned in the future.
|
||||
|
||||
### 2. Download [Dusklight](https://github.com/TwilitRealm/dusklight/releases)
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ fi
|
||||
|
||||
build_dir="$PWD/build"
|
||||
linuxdeploy="$build_dir/linuxdeploy-$(uname -m).AppImage"
|
||||
lib_dir="/usr/lib/$(uname -m)-linux-gnu"
|
||||
|
||||
# Get linuxdeploy
|
||||
mkdir -p "$build_dir"
|
||||
@@ -19,8 +20,8 @@ for install_path in build/install/*; do
|
||||
cp -r "$install_path" build/appdir/usr/bin
|
||||
done
|
||||
cp -r platforms/freedesktop/{16x16,32x32,48x48,64x64,128x128,256x256,512x512,1024x1024} build/appdir/usr/share/icons/hicolor
|
||||
cp platforms/freedesktop/dusklight.desktop build/appdir/usr/share/applications
|
||||
cp platforms/freedesktop/dev.twilitrealm.dusk.desktop build/appdir/usr/share/applications
|
||||
|
||||
cd build/install
|
||||
VERSION="$DUSK_VERSION" NO_STRIP=1 "$linuxdeploy" \
|
||||
-l /usr/lib/x86_64-linux-gnu/libusb-1.0.so --appdir "$build_dir/appdir" --output appimage
|
||||
-l "$lib_dir/libusb-1.0.so" --appdir "$build_dir/appdir" --output appimage
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
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 ()
|
||||
@@ -1432,6 +1432,7 @@ set(DUSK_FILES
|
||||
src/d/actor/d_a_alink_dusk.cpp
|
||||
src/dusk/asserts.cpp
|
||||
src/dusk/config.cpp
|
||||
src/dusk/crash_handler.cpp
|
||||
src/dusk/crash_reporting.cpp
|
||||
src/dusk/data.cpp
|
||||
src/dusk/data.hpp
|
||||
@@ -1451,6 +1452,7 @@ set(DUSK_FILES
|
||||
src/dusk/logging.cpp
|
||||
src/dusk/settings.cpp
|
||||
src/dusk/speedrun.cpp
|
||||
src/dusk/string.cpp
|
||||
src/dusk/stubs.cpp
|
||||
src/dusk/update_check.cpp
|
||||
src/dusk/update_check.hpp
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1775710090,
|
||||
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
|
||||
"lastModified": 1778869304,
|
||||
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "4c1018dae018162ec878d42fec712642d214fdfa",
|
||||
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -1,219 +1,374 @@
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
};
|
||||
outputs = { self, nixpkgs }:
|
||||
description = "Dusklight — native PC port of the Twilight Princess decompilation";
|
||||
|
||||
inputs.nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
|
||||
outputs =
|
||||
{ self, nixpkgs }:
|
||||
let
|
||||
inherit (nixpkgs) lib;
|
||||
|
||||
supportedSystems = [
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
"x86_64-darwin"
|
||||
"aarch64-darwin"
|
||||
];
|
||||
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||
pkgsFor = system: import nixpkgs { inherit system; };
|
||||
forAllSystems = lib.genAttrs supportedSystems;
|
||||
|
||||
# Dependencies that are not packaged in nixpkgs (used by the Linux package build):
|
||||
buildSources = pkgs: {
|
||||
dawn-src = pkgs.fetchzip {
|
||||
url = "https://github.com/encounter/dawn-build/releases/download/v20260423.175430/dawn-linux-x86_64.tar.gz";
|
||||
dawnVersion = "v20260423.175430";
|
||||
nodVersion = "v2.0.0-alpha.8";
|
||||
versionSuffix = "nix-" + (self.shortRev or self.dirtyShortRev or "dirty");
|
||||
|
||||
dawnInfo = {
|
||||
"x86_64-linux" = {
|
||||
triple = "linux-x86_64";
|
||||
hash = "sha256-HXfKTLHtMPwupnFnaflCARtXVPuS/0PoCePXidjE5xs=";
|
||||
stripRoot = false;
|
||||
};
|
||||
nod-src = pkgs.fetchzip {
|
||||
url = "https://github.com/encounter/nod/releases/download/v2.0.0-alpha.8/libnod-linux-x86_64.tar.gz";
|
||||
hash = "sha256-mUqvLsbsqaZ+HAjMmHYPYO+MgtanGRTw7Gzn5uXR5rE=";
|
||||
stripRoot = false;
|
||||
"aarch64-linux" = {
|
||||
triple = "linux-aarch64";
|
||||
hash = "sha256-34yyFpfqBZUwoFXQ41F0AwAU78FaNihOSY0oriwn6B0=";
|
||||
};
|
||||
# The version of imgui on nixpkgs does not map cleanly.
|
||||
imgui-src = pkgs.fetchFromGitHub {
|
||||
owner = "ocornut";
|
||||
repo = "imgui";
|
||||
rev = "v1.91.9b-docking";
|
||||
hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ=";
|
||||
"aarch64-darwin" = {
|
||||
triple = "darwin-arm64";
|
||||
hash = "sha256-eQnzrBp6gjiBek1VYQ9A5W13ClYWrDDKjIqv/7eNTR4=";
|
||||
};
|
||||
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=";
|
||||
"x86_64-darwin" = {
|
||||
triple = "darwin-x86_64";
|
||||
hash = "sha256-QGWiGdxiI9kci3NPXH6QFFirxn16851zB/w3jqhIBJ4=";
|
||||
};
|
||||
};
|
||||
|
||||
# Dusklight Actual (Linux x86_64 only — relies on prebuilt dawn/nod binaries)
|
||||
mkDusklight = pkgs:
|
||||
let srcs = buildSources pkgs;
|
||||
versionSuffix = if self ? shortRev && self.shortRev != null
|
||||
then "nix-${self.shortRev}"
|
||||
else "nix-dirty";
|
||||
in
|
||||
pkgs.stdenv.mkDerivation {
|
||||
name = "dusklight";
|
||||
src = ./.;
|
||||
postUnpack = ''
|
||||
sed -i '/add_subdirectory(tests)/d' $sourceRoot/extern/aurora/CMakeLists.txt
|
||||
'';
|
||||
# Remove last line to re-enable tests
|
||||
cmakeFlags = [
|
||||
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
|
||||
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_CXXOPTS=${pkgs.cxxopts.src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_JSON=${pkgs.nlohmann_json.src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_DAWN_PREBUILT=${srcs.dawn-src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_XXHASH=${pkgs.xxHash.src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_FMT=${pkgs.fmt.src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_TRACY=${pkgs.tracy.src}"
|
||||
"-DAURORA_SDL3_PROVIDER=system"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_NOD_PREBUILT=${srcs.nod-src}"
|
||||
"-DAURORA_NOD_PROVIDER=package"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_FREETYPE=${pkgs.freetype.src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_ZSTD=${pkgs.zstd.src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_SQLITE3=${srcs.sqlite-src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_IMGUI=${srcs.imgui-src}"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_RMLUI=${srcs.rmlui-src}"
|
||||
"-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.
|
||||
];
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
cp dusklight $out/bin/dusklight
|
||||
cp -r ./res $out/bin/res
|
||||
nodPrebuiltInfo = {
|
||||
"x86_64-linux" = {
|
||||
triple = "linux-x86_64";
|
||||
hash = "sha256-mUqvLsbsqaZ+HAjMmHYPYO+MgtanGRTw7Gzn5uXR5rE=";
|
||||
};
|
||||
"aarch64-darwin" = {
|
||||
triple = "macos-arm64";
|
||||
hash = "sha256-UPy1ywCcv0K6VJOU3uUelJuUdBh3UNaPRlyP5LOBeDw=";
|
||||
};
|
||||
};
|
||||
|
||||
mkdir -p $out/share/applications
|
||||
cp $src/platforms/freedesktop/dusklight.desktop $out/share/applications/dusklight.desktop
|
||||
perSystem =
|
||||
system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
||||
hasNodPrebuilt = nodPrebuiltInfo ? ${system};
|
||||
|
||||
for size in 16 32 48 64 128 256 512 1024; do
|
||||
install -Dm644 $src/platforms/freedesktop/''${size}x''${size}/apps/dusklight.png \
|
||||
$out/share/icons/hicolor/''${size}x''${size}/apps/dusklight.png
|
||||
done
|
||||
'';
|
||||
nativeBuildInputs = [
|
||||
aurora = pkgs.fetchFromGitHub {
|
||||
owner = "encounter";
|
||||
repo = "aurora";
|
||||
rev = "10006618ee493f248b8597e4dfa1d2871d76a1d9";
|
||||
hash = "sha256-lY2xuVyB7aPJ9+2wwLRB3F5U/BuPSxdSpegdG+qNd9o=";
|
||||
};
|
||||
|
||||
dawn = pkgs.fetchzip {
|
||||
url = "https://github.com/encounter/dawn-build/releases/download/${dawnVersion}/dawn-${dawnInfo.${system}.triple}.tar.gz";
|
||||
hash = dawnInfo.${system}.hash;
|
||||
stripRoot = false;
|
||||
};
|
||||
|
||||
corrosion = pkgs.fetchFromGitHub {
|
||||
owner = "corrosion-rs";
|
||||
repo = "corrosion";
|
||||
rev = "v0.6.1";
|
||||
hash = "sha256-ppuDNObfKhneD9AlnPAvyCRHKW3BidXKglD1j/LE9CM=";
|
||||
};
|
||||
|
||||
nodFromSource = pkgs.stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "nod";
|
||||
version = nodVersion;
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "encounter";
|
||||
repo = "nod";
|
||||
rev = nodVersion;
|
||||
hash = "sha256-+zrtVzjo0+X/6uMcNUn1+FaSR+jOhrcQSDNBFjw0NDs=";
|
||||
};
|
||||
cargoDeps = pkgs.rustPlatform.importCargoLock {
|
||||
lockFile = "${finalAttrs.src}/Cargo.lock";
|
||||
};
|
||||
postPatch = ''
|
||||
substituteInPlace CMakeLists.txt \
|
||||
--replace-warn "add_subdirectory(nod-ffi/examples)" ""
|
||||
'';
|
||||
nativeBuildInputs = [
|
||||
pkgs.cmake
|
||||
pkgs.ninja
|
||||
pkgs.rustPlatform.cargoSetupHook
|
||||
pkgs.cargo
|
||||
pkgs.rustc
|
||||
];
|
||||
CARGO_NET_OFFLINE = "true";
|
||||
cmakeFlags = [
|
||||
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
||||
"-DFETCHCONTENT_SOURCE_DIR_CORROSION=${corrosion}"
|
||||
"-DNOD_ENABLE_INSTALL=ON"
|
||||
"-DBUILD_SHARED_LIBS=OFF"
|
||||
];
|
||||
doCheck = false;
|
||||
});
|
||||
|
||||
nod =
|
||||
if hasNodPrebuilt then
|
||||
pkgs.fetchzip {
|
||||
url = "https://github.com/encounter/nod/releases/download/${nodVersion}/libnod-${
|
||||
nodPrebuiltInfo.${system}.triple
|
||||
}.tar.gz";
|
||||
hash = nodPrebuiltInfo.${system}.hash;
|
||||
stripRoot = false;
|
||||
}
|
||||
else
|
||||
nodFromSource;
|
||||
|
||||
fetchContentDirs = {
|
||||
DAWN_PREBUILT = dawn;
|
||||
NOD_PREBUILT = nod;
|
||||
CXXOPTS = pkgs.cxxopts.src;
|
||||
JSON = pkgs.nlohmann_json.src;
|
||||
XXHASH = pkgs.xxHash.src;
|
||||
ZSTD = pkgs.zstd.src;
|
||||
FMT = pkgs.fetchzip {
|
||||
url = "https://github.com/fmtlib/fmt/archive/refs/tags/11.1.4.tar.gz";
|
||||
hash = "sha256-sUbxlYi/Aupaox3JjWFqXIjcaQa0LFjclQAOleT+FRA=";
|
||||
};
|
||||
TRACY = pkgs.fetchzip {
|
||||
url = "https://github.com/wolfpld/tracy/archive/a64b9a20294d59421a2f57aeca3c6383d8c48169.tar.gz";
|
||||
hash = "sha256-hbNGOsGeyGSvCJ2No8RkwOib1lX2on3vNZSzyVkZdXw=";
|
||||
};
|
||||
IMGUI = pkgs.fetchFromGitHub {
|
||||
owner = "ocornut";
|
||||
repo = "imgui";
|
||||
rev = "v1.91.9b-docking";
|
||||
hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ=";
|
||||
};
|
||||
SQLITE3 = pkgs.fetchzip {
|
||||
url = "https://sqlite.org/2026/sqlite-amalgamation-3510300.zip";
|
||||
hash = "sha256-pNMR8zxaaqfAzQ0AQBOXMct4usdjey1Q0Gnitg06UhM=";
|
||||
};
|
||||
RMLUI = pkgs.fetchzip {
|
||||
url = "https://github.com/mikke89/RmlUi/archive/f9b8c9e2935d5df2c7dff2c190d3968e99b0c3dc.tar.gz";
|
||||
hash = "sha256-g4O/JZUrrcseOz8o2QJRt+2CeuiLnVeuDJc906xvuIg=";
|
||||
};
|
||||
};
|
||||
|
||||
dusklight = pkgs.stdenv.mkDerivation {
|
||||
pname = "dusklight";
|
||||
version = versionSuffix;
|
||||
src = ./.;
|
||||
|
||||
postUnpack = ''
|
||||
chmod -R u+w "$sourceRoot"
|
||||
rm -rf "$sourceRoot/extern/aurora"
|
||||
mkdir -p "$sourceRoot/extern"
|
||||
cp -r ${aurora} "$sourceRoot/extern/aurora"
|
||||
chmod -R u+w "$sourceRoot/extern/aurora"
|
||||
substituteInPlace "$sourceRoot/extern/aurora/CMakeLists.txt" \
|
||||
--replace-warn "add_subdirectory(tests)" ""
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkgs.cmake
|
||||
pkgs.ninja
|
||||
pkgs.pkg-config
|
||||
pkgs.python3
|
||||
pkgs.python3Packages.markupsafe
|
||||
]
|
||||
++ lib.optionals (!isDarwin) [ pkgs.autoPatchelfHook ];
|
||||
|
||||
buildInputs = [
|
||||
pkgs.sdl3
|
||||
pkgs.freetype
|
||||
pkgs.zstd
|
||||
pkgs.cxxopts
|
||||
pkgs.nlohmann_json
|
||||
pkgs.xxHash
|
||||
pkgs.abseil-cpp
|
||||
pkgs.zlib
|
||||
pkgs.libpng
|
||||
pkgs.libjpeg_turbo
|
||||
pkgs.curl
|
||||
pkgs.openssl
|
||||
]
|
||||
++ lib.optionals isDarwin [
|
||||
pkgs.apple-sdk_15
|
||||
pkgs.libiconv
|
||||
]
|
||||
++ lib.optionals (!isDarwin) [
|
||||
pkgs.libGL
|
||||
pkgs.libGLU
|
||||
pkgs.libglvnd
|
||||
pkgs.vulkan-loader
|
||||
pkgs.libX11
|
||||
pkgs.libxcb
|
||||
pkgs.libXcursor
|
||||
pkgs.libxi
|
||||
pkgs.libxrandr
|
||||
pkgs.libxscrnsaver
|
||||
pkgs.libxtst
|
||||
pkgs.libxinerama
|
||||
pkgs.libxkbcommon
|
||||
pkgs.wayland
|
||||
pkgs.libdecor
|
||||
pkgs.alsa-lib
|
||||
pkgs.libpulseaudio
|
||||
pkgs.pipewire
|
||||
pkgs.dbus
|
||||
pkgs.udev
|
||||
pkgs.libusb1
|
||||
pkgs.libunwind
|
||||
pkgs.gtk3
|
||||
];
|
||||
|
||||
cmakeBuildType = "RelWithDebInfo";
|
||||
ninjaFlags = [ "dusklight" ];
|
||||
|
||||
cmakeFlags = [
|
||||
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
|
||||
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
||||
"-DAURORA_DAWN_PROVIDER=package"
|
||||
"-DAURORA_DAWN_LINKAGE=static"
|
||||
"-DAURORA_NOD_PROVIDER=package"
|
||||
"-DAURORA_NOD_LINKAGE=static"
|
||||
"-DAURORA_SDL3_PROVIDER=system"
|
||||
]
|
||||
++ lib.mapAttrsToList (key: src: "-DFETCHCONTENT_SOURCE_DIR_${key}=${src}") fetchContentDirs;
|
||||
|
||||
installPhase =
|
||||
if isDarwin then
|
||||
''
|
||||
runHook preInstall
|
||||
mkdir -p "$out/Applications"
|
||||
cp -r Dusklight.app "$out/Applications/Dusklight.app"
|
||||
runHook postInstall
|
||||
''
|
||||
else
|
||||
''
|
||||
runHook preInstall
|
||||
install -Dm755 dusklight "$out/bin/dusklight"
|
||||
cp -r "$src/res" "$out/bin/res"
|
||||
install -Dm644 "$src/platforms/freedesktop/dev.twilitrealm.dusk.desktop" \
|
||||
"$out/share/applications/dev.twilitrealm.dusk.desktop"
|
||||
for size in 16 32 48 64 128 256 512 1024; do
|
||||
install -Dm644 "$src/platforms/freedesktop/''${size}x''${size}/apps/dev.twilitrealm.dusk.png" \
|
||||
"$out/share/icons/hicolor/''${size}x''${size}/apps/dev.twilitrealm.dusk.png"
|
||||
done
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
dontStrip = true;
|
||||
|
||||
meta = {
|
||||
description = "Dusklight — native PC port of the Twilight Princess decompilation";
|
||||
homepage = "https://github.com/zeldaret/tp";
|
||||
platforms = supportedSystems;
|
||||
mainProgram = "dusklight";
|
||||
};
|
||||
};
|
||||
|
||||
# Tooling common to every supported host (Linux and macOS).
|
||||
commonDevTools = [
|
||||
pkgs.cmake
|
||||
pkgs.ninja
|
||||
pkgs.pkg-config
|
||||
pkgs.wayland
|
||||
pkgs.git
|
||||
pkgs.python3
|
||||
pkgs.python3Packages.markupsafe
|
||||
pkgs.rustc
|
||||
pkgs.cargo
|
||||
pkgs.sccache
|
||||
];
|
||||
buildInputs = [
|
||||
pkgs.libGL
|
||||
pkgs.libX11
|
||||
pkgs.libXcursor
|
||||
pkgs.libxi
|
||||
pkgs.libxcb
|
||||
pkgs.libxrandr
|
||||
pkgs.libxscrnsaver
|
||||
pkgs.libxtst
|
||||
pkgs.libjpeg8
|
||||
pkgs.libxkbcommon
|
||||
pkgs.libglvnd
|
||||
|
||||
# Linux-only system libraries — mirrors the apt deps from .github/workflows/build.yml
|
||||
# so the cmake presets resolve the same set of headers as CI.
|
||||
linuxDevDeps = [
|
||||
# Compilers / linkers
|
||||
pkgs.clang
|
||||
pkgs.lld
|
||||
# C/C++ utilities
|
||||
pkgs.curl
|
||||
pkgs.openssl
|
||||
pkgs.zlib
|
||||
pkgs.libpng
|
||||
pkgs.libjpeg_turbo
|
||||
pkgs.freetype
|
||||
pkgs.zstd
|
||||
pkgs.fmt
|
||||
pkgs.tracy
|
||||
pkgs.cxxopts
|
||||
pkgs.abseil-cpp
|
||||
pkgs.sdl3
|
||||
pkgs.fmt
|
||||
pkgs.tracy
|
||||
pkgs.freetype
|
||||
pkgs.zstd
|
||||
pkgs.ncurses
|
||||
pkgs.libunwind
|
||||
pkgs.libusb1
|
||||
pkgs.fuse
|
||||
# Wayland / display server
|
||||
pkgs.wayland
|
||||
pkgs.wayland-protocols
|
||||
pkgs.libxkbcommon
|
||||
pkgs.libdecor
|
||||
# OpenGL / Vulkan
|
||||
pkgs.libGL
|
||||
pkgs.libGLU
|
||||
pkgs.libglvnd
|
||||
pkgs.vulkan-headers
|
||||
pkgs.vulkan-loader
|
||||
# X11
|
||||
pkgs.libX11
|
||||
pkgs.libxcb
|
||||
pkgs.libXcursor
|
||||
pkgs.libxi
|
||||
pkgs.libxrandr
|
||||
pkgs.libxscrnsaver
|
||||
pkgs.libxtst
|
||||
pkgs.libxinerama
|
||||
# Audio
|
||||
pkgs.alsa-lib
|
||||
pkgs.libpulseaudio
|
||||
pkgs.pipewire
|
||||
# System integration
|
||||
pkgs.dbus
|
||||
pkgs.udev
|
||||
pkgs.gtk3
|
||||
];
|
||||
|
||||
# On macOS we deliberately avoid pulling Nix's cc-wrapper so CMake picks up
|
||||
# Apple Clang and the Xcode SDK directly, matching the macOS CI workflow.
|
||||
darwinShell = pkgs.mkShellNoCC {
|
||||
packages = commonDevTools;
|
||||
shellHook = ''
|
||||
echo "Dusklight dev shell (macOS)"
|
||||
echo "Requires Xcode Command Line Tools for Apple Clang and the macOS SDK."
|
||||
echo "Configure: cmake --preset macos-default-relwithdebinfo"
|
||||
echo "Build: cmake --build --preset macos-default-relwithdebinfo"
|
||||
'';
|
||||
};
|
||||
|
||||
linuxShell = pkgs.mkShell {
|
||||
packages = commonDevTools ++ linuxDevDeps;
|
||||
shellHook = ''
|
||||
echo "Dusklight dev shell (Linux)"
|
||||
echo "Configure: cmake --preset linux-default-relwithdebinfo"
|
||||
echo " cmake --preset linux-clang-relwithdebinfo"
|
||||
echo "Build: cmake --build --preset <preset>"
|
||||
'';
|
||||
};
|
||||
in
|
||||
{
|
||||
packages = {
|
||||
default = dusklight;
|
||||
dusklight = dusklight;
|
||||
}
|
||||
// lib.optionalAttrs (!hasNodPrebuilt) { nod = nodFromSource; };
|
||||
|
||||
devShells.default = if isDarwin then darwinShell else linuxShell;
|
||||
};
|
||||
|
||||
# Tooling common to every supported host (Linux and macOS).
|
||||
commonDevTools = pkgs: [
|
||||
pkgs.cmake
|
||||
pkgs.ninja
|
||||
pkgs.pkg-config
|
||||
pkgs.git
|
||||
pkgs.python3
|
||||
pkgs.python3Packages.markupsafe
|
||||
pkgs.rustc
|
||||
pkgs.cargo
|
||||
pkgs.sccache
|
||||
];
|
||||
|
||||
# Linux-only system libraries — mirrors the apt deps from .github/workflows/build.yml
|
||||
# so the cmake presets resolve the same set of headers as CI.
|
||||
linuxDevDeps = 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);
|
||||
});
|
||||
systems = forAllSystems perSystem;
|
||||
in
|
||||
{
|
||||
packages = lib.mapAttrs (_: s: s.packages) systems;
|
||||
devShells = lib.mapAttrs (_: s: s.devShells) systems;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4564,6 +4564,7 @@ public:
|
||||
cXyz mIBChainInterpCurrHandRoot;
|
||||
bool mIBChainInterpPrevValid;
|
||||
bool mIBChainInterpCurrValid;
|
||||
bool mIsRollstab = false;
|
||||
#endif
|
||||
}; // Size: 0x385C
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <thp.h>
|
||||
#else
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#endif
|
||||
#include "f_op/f_op_actor.h"
|
||||
#include "d/d_drawlist.h"
|
||||
@@ -125,6 +126,7 @@ struct daMP_THPPlayer {
|
||||
/* 0x0D4 */ s32 curCount;
|
||||
#if TARGET_PC
|
||||
/* 0x0D8 */ std::atomic<s32> videoDecodeCount;
|
||||
std::chrono::steady_clock::time_point thpPlaybackClock;
|
||||
#else
|
||||
/* 0x0D8 */ s32 videoDecodeCount;
|
||||
#endif
|
||||
|
||||
@@ -77,7 +77,7 @@ private:
|
||||
#define PLAYER_CREATE_ANM_HEAP_F(heap, type, fmt, ...) \
|
||||
{ \
|
||||
char pcah_name_buf[32]; \
|
||||
sprintf(pcah_name_buf, fmt, ##__VA_ARGS__); \
|
||||
snprintf(pcah_name_buf, sizeof(pcah_name_buf), fmt, ##__VA_ARGS__); \
|
||||
(heap).createHeap(type, pcah_name_buf); \
|
||||
\
|
||||
}
|
||||
|
||||
@@ -444,8 +444,7 @@ public:
|
||||
/* 0x1C */ f32 mFovy;
|
||||
/* 0x20 */ f32 mBank;
|
||||
/* 0x24 */ fopAc_ac_c* mRelActor;
|
||||
/* 0x28 */ char mRelUseMask;
|
||||
/* 0x29 */ char field_0x29;
|
||||
/* 0x28 */ char mRelUseMask[4];
|
||||
/* 0x2C */ int mTimer;
|
||||
/* 0x30 */ bool field_0x30;
|
||||
/* 0x34 */ cXyz mBasePos;
|
||||
@@ -526,7 +525,7 @@ public:
|
||||
/* 0x3C */ fopAc_ac_c* field_0x3c;
|
||||
/* 0x40 */ fopAc_ac_c* field_0x40;
|
||||
/* 0x44 */ fpc_ProcID field_0x44;
|
||||
/* 0x48 */ char field_0x48;
|
||||
/* 0x48 */ char field_0x48[4];
|
||||
/* 0x4C */ int field_0x4c;
|
||||
};
|
||||
|
||||
@@ -541,11 +540,7 @@ public:
|
||||
/* 0x3C */ f32 field_0x3c;
|
||||
/* 0x40 */ fopAc_ac_c* mRelActor;
|
||||
/* 0x44 */ fpc_ProcID mRelActorID;
|
||||
/* 0x48 */ char mRelUseMask;
|
||||
/* 0x49 */ char field_0x49;
|
||||
/* 0x4A */ char field_0x4a;
|
||||
/* 0x4B */ char field_0x4b;
|
||||
/* 0x4C */ u8 field_0x4c[4];
|
||||
/* 0x48 */ char mRelUseMask[8];
|
||||
/* 0x50 */ int mTimer;
|
||||
/* 0x54 */ int mTransType;
|
||||
/* 0x58 */ f32 mCushion;
|
||||
@@ -696,8 +691,7 @@ public:
|
||||
/* 0x24 */ f32* field_0x24;
|
||||
/* 0x28 */ f32 field_0x28;
|
||||
/* 0x2C */ fopAc_ac_c* mRelActor;
|
||||
/* 0x30 */ char mRelUseMask;
|
||||
/* 0x31 */ char field_0x31;
|
||||
/* 0x30 */ char mRelUseMask[4];
|
||||
/* 0x34 */ int mTimer;
|
||||
/* 0x38 */ int field_0x38;
|
||||
/* 0x3C */ int mChoice;
|
||||
@@ -780,8 +774,7 @@ public:
|
||||
/* 0xAC */ f32 field_0xac;
|
||||
/* 0xB0 */ fopAc_ac_c* mRelActor;
|
||||
/* 0xB4 */ fpc_ProcID mRelActorID;
|
||||
/* 0xB8 */ char mRelUseMask;
|
||||
/* 0xB9 */ char field_0xb9;
|
||||
/* 0xB8 */ char mRelUseMask[4];
|
||||
/* 0xBC */ f32 mCushion;
|
||||
/* 0xC0 */ u32 field_0xc0[6];
|
||||
};
|
||||
@@ -917,7 +910,12 @@ public:
|
||||
char* getEvStringPntData(char*, char*);
|
||||
char* getEvStringPntData(char*);
|
||||
bool getEvXyzData(cXyz*, char*, cXyz);
|
||||
#if TARGET_PC
|
||||
template<size_t N>
|
||||
bool getEvStringData(char (&)[N], char*, char*);
|
||||
#else
|
||||
bool getEvStringData(char*, char*, char*);
|
||||
#endif
|
||||
fopAc_ac_c* getEvActor(char*);
|
||||
fopAc_ac_c* getEvActor(char*, char*);
|
||||
bool pauseEvCamera();
|
||||
|
||||
@@ -1851,7 +1851,7 @@ inline u16 dComIfGs_getDeathCount() {
|
||||
}
|
||||
#endif
|
||||
|
||||
inline char* dComIfGs_getPlayerName() {
|
||||
inline TEXT_SPAN dComIfGs_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);
|
||||
}
|
||||
|
||||
inline char* dComIfGs_getHorseName() {
|
||||
inline TEXT_SPAN dComIfGs_getHorseName() {
|
||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getHorseName();
|
||||
}
|
||||
|
||||
|
||||
@@ -46,10 +46,10 @@ private:
|
||||
/* 0x22 */ u8 field_0x22;
|
||||
/* 0x24 */ CPaneMgrAlpha* mDatBase;
|
||||
/* 0x28 */ CPaneMgrAlpha* mNoDatBase;
|
||||
/* 0x2C */ char* mPlayerName;
|
||||
/* 0x30 */ char* mSaveDate;
|
||||
/* 0x34 */ char* mPlayTime;
|
||||
/* 0x38 */ char* mSaveStatus;
|
||||
/* 0x2C */ TEXT_SPAN mPlayerName;
|
||||
/* 0x30 */ TEXT_SPAN mSaveDate;
|
||||
/* 0x34 */ TEXT_SPAN mPlayTime;
|
||||
/* 0x38 */ TEXT_SPAN mSaveStatus;
|
||||
};
|
||||
|
||||
typedef void (dFile_info_c::*warningFunc)(void);
|
||||
|
||||
@@ -11,7 +11,42 @@
|
||||
|
||||
class dFile_info_c;
|
||||
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 {
|
||||
public:
|
||||
void draw();
|
||||
@@ -530,7 +565,7 @@ public:
|
||||
/* 0x0130 */ int field_0x0130;
|
||||
/* 0x0134 */ int field_0x0134;
|
||||
/* 0x0138 */ CPaneMgrAlpha* mErrorMsgTxtPane[2];
|
||||
/* 0x0140 */ char* mErrorMsgStringPtr[2];
|
||||
/* 0x0140 */ TEXT_SPAN mErrorMsgStringPtr[2];
|
||||
/* 0x0148 */ u8 mErrorTxtDispIdx;
|
||||
/* 0x0149 */ u8 field_0x0149;
|
||||
/* 0x014A */ bool field_0x014a;
|
||||
@@ -574,7 +609,7 @@ public:
|
||||
/* 0x020A */ u8 mFadeTimer;
|
||||
/* 0x020B */ u8 field_0x020b;
|
||||
/* 0x020C */ CPaneMgrAlpha* mHeaderTxtPane[2];
|
||||
/* 0x0214 */ char* mHeaderStringPtr[2];
|
||||
/* 0x0214 */ TEXT_SPAN mHeaderStringPtr[2];
|
||||
/* 0x021C */ u8 mHeaderTxtDispIdx;
|
||||
/* 0x021D */ u8 field_0x021d;
|
||||
/* 0x021E */ u8 field_0x021e;
|
||||
@@ -591,7 +626,7 @@ public:
|
||||
/* 0x024B */ u8 field_0x024b;
|
||||
/* 0x024C */ u8 field_0x024c;
|
||||
/* 0x024B */ u8 field_0x024d[3];
|
||||
/* 0x0250 */ char* mModoruStringPtr;
|
||||
/* 0x0250 */ TEXT_SPAN mModoruStringPtr;
|
||||
/* 0x0254 */ STControl* stick;
|
||||
/* 0x0258 */ u8 mIsDataNew[3];
|
||||
/* 0x025B */ u8 mIsNoData[3];
|
||||
|
||||
@@ -15,6 +15,49 @@ class dMenu_Fishing_c;
|
||||
class dMenu_Skill_c;
|
||||
class dMenu_Insect_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_Collect2DTop_c : public dDlst_base_c {
|
||||
|
||||
@@ -183,6 +183,11 @@ public:
|
||||
/* 0xDD8 */ u8 field_0xdd8;
|
||||
/* 0xDD9 */ u8 field_0xdd9;
|
||||
/* 0xDDA */ u8 field_0xdda;
|
||||
|
||||
#if TARGET_PC
|
||||
J2DTextBox* mpPoeCountPane;
|
||||
J2DPicture* mpPoeCountIcon;
|
||||
#endif
|
||||
};
|
||||
|
||||
class dMenu_Dmap_c {
|
||||
|
||||
@@ -421,6 +421,12 @@ public:
|
||||
/* 0xC2 */ u8 mAlphaButtonZ;
|
||||
/* 0xC3 */ u8 mAlphaAnalogStick;
|
||||
/* 0xC4 */ u8 mAlphaDpad;
|
||||
|
||||
#if TARGET_PC
|
||||
J2DTextBox* mpPoeCountPane;
|
||||
J2DPicture* mpPoeCountIcon;
|
||||
u8 mSelectRegionNo;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* D_MENU_D_MENU_FMAP2D_H */
|
||||
|
||||
@@ -76,6 +76,11 @@ public:
|
||||
}
|
||||
#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 {
|
||||
// Incomplete class
|
||||
|
||||
|
||||
@@ -313,7 +313,7 @@ private:
|
||||
/* 0x00B8 */ int field_0xb8;
|
||||
/* 0x00BC */ int field_0xbc;
|
||||
/* 0x00C0 */ CPaneMgrAlpha* mpErrTxtPane[2];
|
||||
/* 0x00C8 */ char* mpErrTxt[2];
|
||||
/* 0x00C8 */ TEXT_SPAN mpErrTxt[2];
|
||||
/* 0x00D0 */ u8 mErrTxtType;
|
||||
/* 0x00D1 */ u8 mErrTxtAnmComplete;
|
||||
/* 0x00D2 */ u8 field_0xd2;
|
||||
@@ -344,7 +344,7 @@ private:
|
||||
/* 0x0160 */ J2DAnmTevRegKey* field_0x160;
|
||||
/* 0x0164 */ int field_0x164;
|
||||
/* 0x0168 */ CPaneMgrAlpha* mpHeaderTxtPane[2];
|
||||
/* 0x0170 */ char* mpHeaderTxt[2];
|
||||
/* 0x0170 */ TEXT_SPAN mpHeaderTxt[2];
|
||||
/* 0x0178 */ u8 mHeaderTxtType; // 0: Select Menu 1: YesNo Menu
|
||||
/* 0x0179 */ u8 mHeaderAnmComplete;
|
||||
/* 0x017A */ u8 field_0x17a;
|
||||
|
||||
@@ -67,9 +67,9 @@ public:
|
||||
s16 decFloatingMessageTimer();
|
||||
void resetFloatingMessage();
|
||||
void decMsgKeyWaitTimer();
|
||||
void getString(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
|
||||
void getStringKana(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
|
||||
void getStringKanji(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
|
||||
void getString(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry);
|
||||
void getStringKana(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry);
|
||||
void getStringKanji(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry);
|
||||
f32 getStringLength(J2DTextBox* i_textbox, char* i_string);
|
||||
f32 getStringLength(JUTFont* i_font, f32 param_2, f32 param_3, char* i_string);
|
||||
void onDirectUseItem(int);
|
||||
@@ -348,15 +348,15 @@ inline CPaneMgr* dMeter2Info_getMeterItemPanePtr(s32 i_idx) {
|
||||
return g_meter2_info.getMeterItemPanePtr(i_idx);
|
||||
}
|
||||
|
||||
inline void dMeter2Info_getString(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||
inline void dMeter2Info_getString(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||
g_meter2_info.getString(i_stringID, o_string, i_msgEntry);
|
||||
}
|
||||
|
||||
inline void dMeter2Info_getStringKanji(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||
inline void dMeter2Info_getStringKanji(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||
g_meter2_info.getStringKanji(i_stringID, o_string, i_msgEntry);
|
||||
}
|
||||
|
||||
inline void dMeter2Info_getStringKana(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||
inline void dMeter2Info_getStringKana(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||
g_meter2_info.getStringKana(i_stringID, o_string, i_msgEntry);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "JSystem/JMessage/JMessage.h"
|
||||
#include "SSystem/SComponent/c_xyz.h"
|
||||
#include "dusk/endian.h"
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
#if REGION_JPN
|
||||
#define D_MSG_CLASS_PAGE_CNT_MAX 30
|
||||
@@ -67,7 +68,7 @@ struct jmessage_tReference : public JMessage::TReference {
|
||||
void pageSend();
|
||||
void selectMessage();
|
||||
void inputNumber();
|
||||
char* getWord(int);
|
||||
TEXT_SPAN getWord(int);
|
||||
void resetWord();
|
||||
void setCharactor(u16);
|
||||
void addCharactor(u16);
|
||||
@@ -228,11 +229,11 @@ struct jmessage_tReference : public JMessage::TReference {
|
||||
f32 getSelRubyCharSpace() { return mSelRubyCharSpace; }
|
||||
f32 getRubySize() { return mRubySize; }
|
||||
f32 getRubyCharSpace() { return mRubyCharSpace; }
|
||||
char* getSelTextPtr(int idx) { return mSelText[idx]; }
|
||||
char* getSelRubyPtr(int idx) { return mSelRuby[idx]; }
|
||||
char* getTextPtr() { return mText; }
|
||||
char* getTextSPtr() { return mTextS; }
|
||||
char* getRubyPtr() { return mRuby; }
|
||||
TEXT_SPAN getSelTextPtr(int idx) { return mSelText[idx]; }
|
||||
TEXT_SPAN getSelRubyPtr(int idx) { return mSelRuby[idx]; }
|
||||
TEXT_SPAN getTextPtr() { return mText; }
|
||||
TEXT_SPAN getTextSPtr() { return mTextS; }
|
||||
TEXT_SPAN getRubyPtr() { return mRuby; }
|
||||
u8 getSelectRubyFlag() { return mSelectRubyFlag; }
|
||||
f32 getSelTBoxWidth() { return mSelTBoxWidth; }
|
||||
u8 getSelectPos() { return mSelectPos; }
|
||||
@@ -463,7 +464,7 @@ struct jmessage_tRenderingProcessor : public JMessage::TRenderingProcessor {
|
||||
f32 getLineLength(int);
|
||||
void do_strcat(char*, bool, bool, bool);
|
||||
void do_rubyset(void const*, u32);
|
||||
void do_rubystrcat(char*, char*, f32, f32);
|
||||
void do_rubystrcat(char*, TEXT_SPAN, f32, f32);
|
||||
void do_name1();
|
||||
void do_numset(s16);
|
||||
void push_word();
|
||||
|
||||
@@ -53,8 +53,8 @@ public:
|
||||
void demoMessageGroupLocal();
|
||||
void endFlowGroupLocal();
|
||||
void changeGroupLocal(s16);
|
||||
bool getStringLocal(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, char*,
|
||||
char*, char*, s16*);
|
||||
bool getStringLocal(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, TEXT_SPAN,
|
||||
TEXT_SPAN, TEXT_SPAN, s16*);
|
||||
bool isGetItemMessage();
|
||||
bool isKanbanMessage();
|
||||
bool isHowlMessage();
|
||||
@@ -121,7 +121,7 @@ public:
|
||||
static void endFlowGroup();
|
||||
static void changeGroup(s16);
|
||||
static bool getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
|
||||
char*, char*, char*, s16*);
|
||||
TEXT_SPAN, TEXT_SPAN, TEXT_SPAN, s16*);
|
||||
static void* getMsgDtPtr();
|
||||
static void setProcessID(fpc_ProcID);
|
||||
static msg_class* getActor();
|
||||
@@ -246,12 +246,12 @@ public:
|
||||
|
||||
static void setWord(const char* i_word);
|
||||
void setWordLocal(const char* i_word) {
|
||||
strcpy(mWord, i_word);
|
||||
SAFE_STRCPY(mWord, i_word);
|
||||
}
|
||||
|
||||
static void setSelectWord(int i_no, const char* i_word);
|
||||
void setSelectWordLocal(int i_no, const char* i_word) {
|
||||
strcpy(mSelectWord[i_no], i_word);
|
||||
SAFE_STRCPY(mSelectWord[i_no], i_word);
|
||||
}
|
||||
|
||||
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,
|
||||
JUTFont* i_font, COutFont_c* i_outFont, char* o_text,
|
||||
char* o_ruby, char* o_textS, s16* param_8) {
|
||||
JUTFont* i_font, COutFont_c* i_outFont, TEXT_SPAN o_text,
|
||||
TEXT_SPAN o_ruby, TEXT_SPAN o_textS, s16* param_8) {
|
||||
return dMsgObject_getMsgObjectClass()->getString(i_msgId, i_tbox, i_rubyTbox, i_font, i_outFont, o_text, o_ruby,
|
||||
o_textS, param_8);
|
||||
}
|
||||
|
||||
@@ -20,12 +20,12 @@ public:
|
||||
f32 getStringPageLocal(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*,
|
||||
COutFont_c*, u8);
|
||||
u8 getPageMax(int);
|
||||
f32 getMessageLocal(u32, char*);
|
||||
f32 getMessageLocal(u32, TEXT_SPAN);
|
||||
|
||||
virtual f32 getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, u8);
|
||||
virtual f32 getStringPage(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
|
||||
u8);
|
||||
virtual f32 getMessage(u32, char*);
|
||||
virtual f32 getMessage(u32, TEXT_SPAN);
|
||||
virtual void resetStringLocal(J2DTextBox*);
|
||||
virtual void drawOutFontLocal(J2DTextBox*, f32);
|
||||
virtual void drawFontLocal(J2DTextBox*, u8, f32, f32, f32, f32, u32, u8);
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
class dMsgUnit_c {
|
||||
public:
|
||||
dMsgUnit_c();
|
||||
void setTag(int, int, char*, bool);
|
||||
void setTag(int, int, TEXT_SPAN, bool);
|
||||
|
||||
virtual ~dMsgUnit_c();
|
||||
};
|
||||
|
||||
extern dMsgUnit_c g_msg_unit;
|
||||
|
||||
inline void dMsgUnit_setTag(int param_0, int param_1, char* param_2) {
|
||||
inline void dMsgUnit_setTag(int param_0, int param_1, TEXT_SPAN param_2) {
|
||||
g_msg_unit.setTag(param_0, param_1, param_2, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ public:
|
||||
u8 isInputEnd() { return mIsInputEnd; }
|
||||
char* getInputStrPtr() { return mInputStr; }
|
||||
void hideIcon() { mSelIcon->setAlphaRate(0.0f); }
|
||||
void setNextNameStr(char* i_name) { strcpy(mNextNameStr,i_name); }
|
||||
void setNextNameStr(char* i_name) { SAFE_STRCPY(mNextNameStr,i_name); }
|
||||
void draw() { _draw(); }
|
||||
|
||||
private:
|
||||
@@ -140,9 +140,9 @@ private:
|
||||
/* 0x02C */ J2DAnmTextureSRTKey* mCursorTexKey;
|
||||
/* 0x030 */ int mCurTexAnmF;
|
||||
/* 0x034 */ CPaneMgrAlpha* mNameCursor[8];
|
||||
/* 0x054 */ char* mNameText[8];
|
||||
/* 0x054 */ TEXT_SPAN mNameText[8];
|
||||
/* 0x074 */ CPaneMgr* mMojiIcon[65];
|
||||
/* 0x178 */ char* mMojiText[65];
|
||||
/* 0x178 */ TEXT_SPAN mMojiText[65];
|
||||
/* 0x27C */ J2DPane* mMojiPane;
|
||||
/* 0x280 */ J2DPane* mMenuPane;
|
||||
/* 0x284 */ CPaneMgr* mMenuIcon[4];
|
||||
|
||||
@@ -488,21 +488,25 @@ public:
|
||||
}
|
||||
#if TARGET_PC
|
||||
u16 getDeathCount() const { return mDeathCount; }
|
||||
#endif
|
||||
TEXT_SPAN getPlayerName() const { return const_cast<char(&)[17]>(mPlayerName); }
|
||||
#else
|
||||
char* getPlayerName() const { return const_cast<char*>(mPlayerName); }
|
||||
#endif
|
||||
void setPlayerName(const char* i_name) {
|
||||
#if AVOID_UB
|
||||
strncpy(mPlayerName, i_name, sizeof(mPlayerName) - 1);
|
||||
mPlayerName[sizeof(mPlayerName) - 1] = '\0';
|
||||
dusk::SafeStringCopyTruncate(mPlayerName, i_name);
|
||||
#else
|
||||
strcpy(mPlayerName, i_name);
|
||||
#endif
|
||||
}
|
||||
#if TARGET_PC
|
||||
TEXT_SPAN getHorseName() const { return const_cast<char(&)[17]>(mHorseName); }
|
||||
#else
|
||||
char* getHorseName() const { return const_cast<char*>(mHorseName); }
|
||||
#endif
|
||||
void setHorseName(const char* i_name) {
|
||||
#if AVOID_UB
|
||||
strncpy(mHorseName, i_name, sizeof(mHorseName) - 1);
|
||||
mHorseName[sizeof(mHorseName) - 1] = '\0';
|
||||
dusk::SafeStringCopyTruncate(mHorseName, i_name);
|
||||
#else
|
||||
strcpy(mHorseName, i_name);
|
||||
#endif
|
||||
|
||||
@@ -51,7 +51,7 @@ public:
|
||||
f32 getPositionX() const { return mPositionX; }
|
||||
f32 getPositionY() const { return mPositionY; }
|
||||
|
||||
void refreshAspectScale();
|
||||
void refreshAspectScale(f32 param_0);
|
||||
#endif
|
||||
|
||||
void onUpdateFlag() { mUpdateFlag = true; }
|
||||
|
||||
@@ -1225,7 +1225,7 @@ public:
|
||||
#endif
|
||||
}
|
||||
static JKRExpHeap* getMemoryBlockHeap(int i_no) { return mMemoryBlock[i_no]; }
|
||||
static char* getDemoArcName() { return mDemoArcName; }
|
||||
static TEXT_SPAN getDemoArcName() { return mDemoArcName; }
|
||||
static void offNoChangeRoom() { mNoChangeRoom = false; }
|
||||
static void onNoChangeRoom() { mNoChangeRoom = true; }
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <queue>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include "nlohmann/json.hpp"
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
// Signals are visible to all achievement checks within the same tick, then cleared.
|
||||
void signal(const char* key);
|
||||
bool hasSignal(const char* key) const;
|
||||
int signalCount(const char* key) const;
|
||||
|
||||
std::vector<Achievement> getAchievements() const;
|
||||
|
||||
@@ -62,7 +63,7 @@ private:
|
||||
void processEntry(Entry& e);
|
||||
|
||||
std::vector<Entry> m_entries;
|
||||
std::unordered_set<std::string_view> m_signals;
|
||||
std::unordered_map<std::string_view, int> m_signals;
|
||||
bool m_loaded = false;
|
||||
bool m_dirty = false;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
namespace dusk::crash_handler {
|
||||
|
||||
void install();
|
||||
|
||||
} // namespace dusk::crash_handler
|
||||
@@ -12,6 +12,7 @@ namespace dusk {
|
||||
void InitializeFileLogging(const std::filesystem::path& configDir, AuroraLogLevel logLevel);
|
||||
void ShutdownFileLogging();
|
||||
const char* GetLogFilePath();
|
||||
int GetLogFileDescriptor();
|
||||
void SendToStubLog(AuroraLogLevel level, const char* module, const char* message);
|
||||
}
|
||||
|
||||
@@ -19,7 +20,11 @@ extern bool StubLogEnabled;
|
||||
|
||||
extern aurora::Module DuskLog;
|
||||
|
||||
#ifndef NDEBUG
|
||||
#define STUB_LOG() DuskLog.debug("{} is a stub", __FUNCTION__)
|
||||
#else
|
||||
#define STUB_LOG()
|
||||
#endif
|
||||
|
||||
#if TARGET_PC
|
||||
#define STUB_RET(...) \
|
||||
|
||||
@@ -15,6 +15,12 @@ enum class BloomMode : int {
|
||||
Dusk = 2,
|
||||
};
|
||||
|
||||
enum class DepthOfFieldMode : int {
|
||||
Off = 0,
|
||||
Classic = 1,
|
||||
Dusk = 2,
|
||||
};
|
||||
|
||||
enum class Resampler : int {
|
||||
Bilinear = 0,
|
||||
Area = 1,
|
||||
@@ -45,6 +51,12 @@ enum class FrameInterpMode : u8 {
|
||||
Unlimited = 2,
|
||||
};
|
||||
|
||||
enum class MenuScaling : u8 {
|
||||
GameCube = 0,
|
||||
Wii = 1,
|
||||
Dusklight = 2,
|
||||
};
|
||||
|
||||
namespace config {
|
||||
template <>
|
||||
struct ConfigEnumRange<BloomMode> {
|
||||
@@ -52,6 +64,12 @@ struct ConfigEnumRange<BloomMode> {
|
||||
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;
|
||||
@@ -81,6 +99,12 @@ 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
|
||||
@@ -133,6 +157,7 @@ struct UserSettings {
|
||||
ConfigVar<bool> instantText;
|
||||
ConfigVar<bool> sunsSong;
|
||||
ConfigVar<bool> autoSave;
|
||||
ConfigVar<bool> enhancedMapMenus;
|
||||
|
||||
// Preferences
|
||||
ConfigVar<bool> enableMirrorMode;
|
||||
@@ -142,17 +167,18 @@ struct UserSettings {
|
||||
ConfigVar<bool> enableAchievementToasts;
|
||||
ConfigVar<bool> enableControllerToasts;
|
||||
ConfigVar<bool> enableDiscordPresence;
|
||||
ConfigVar<MenuScaling> menuScalingMode;
|
||||
|
||||
// Graphics
|
||||
ConfigVar<BloomMode> bloomMode;
|
||||
ConfigVar<float> bloomMultiplier;
|
||||
ConfigVar<DepthOfFieldMode> depthOfFieldMode;
|
||||
ConfigVar<bool> disableWaterRefraction;
|
||||
ConfigVar<bool> enableTextureReplacements;
|
||||
ConfigVar<FrameInterpMode> enableFrameInterpolation;
|
||||
ConfigVar<int> internalResolutionScale;
|
||||
ConfigVar<int> shadowResolutionMultiplier;
|
||||
ConfigVar<Resampler> resampler;
|
||||
ConfigVar<bool> enableDepthOfField;
|
||||
ConfigVar<bool> enableMapBackground;
|
||||
ConfigVar<bool> disableCutscenePillarboxing;
|
||||
|
||||
@@ -176,6 +202,8 @@ struct UserSettings {
|
||||
ConfigVar<bool> invertCameraYAxis;
|
||||
ConfigVar<bool> invertFirstPersonXAxis;
|
||||
ConfigVar<bool> invertFirstPersonYAxis;
|
||||
ConfigVar<bool> invertAirSwimX;
|
||||
ConfigVar<bool> invertAirSwimY;
|
||||
ConfigVar<float> freeCameraSensitivity;
|
||||
ConfigVar<bool> debugFlyCam;
|
||||
ConfigVar<bool> debugFlyCamLockEvents;
|
||||
@@ -212,6 +240,7 @@ struct UserSettings {
|
||||
ConfigVar<bool> liveSplitEnabled;
|
||||
ConfigVar<bool> showSpeedrunRTATimer;
|
||||
ConfigVar<bool> recordingMode;
|
||||
ConfigVar<bool> removeQuestMapMarkers;
|
||||
ConfigVar<bool> showInputViewer;
|
||||
ConfigVar<bool> showInputViewerGyro;
|
||||
} game;
|
||||
@@ -242,6 +271,8 @@ struct UserSettings {
|
||||
|
||||
UserSettings& getSettings();
|
||||
|
||||
bool tphd_active();
|
||||
|
||||
void registerSettings();
|
||||
|
||||
// Transient settings
|
||||
|
||||
@@ -1,22 +1,55 @@
|
||||
#ifndef DUSK_STRING_HPP
|
||||
#define DUSK_STRING_HPP
|
||||
|
||||
#include "global.h"
|
||||
#include <cstring>
|
||||
#include <dolphin/os.h>
|
||||
#include <cstdarg>
|
||||
|
||||
namespace dusk {
|
||||
|
||||
inline void strncpyProxy(char* dst, const char* src, size_t count) {
|
||||
#if _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4996)
|
||||
struct TextSpan {
|
||||
char* buffer;
|
||||
size_t size;
|
||||
|
||||
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
|
||||
strncpy(dst, src, count);
|
||||
#if _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
}
|
||||
|
||||
void SafeStringCopyTruncate(char* buffer, size_t bufSize, const char* src);
|
||||
|
||||
/**
|
||||
* Copy a string to a fixed-size array.
|
||||
@@ -25,13 +58,28 @@ inline void strncpyProxy(char* dst, const char* src, size_t count) {
|
||||
template <size_t BufSize>
|
||||
void SafeStringCopyTruncate(char (&buffer)[BufSize], const char* src) {
|
||||
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
||||
SafeStringCopyTruncate(buffer, BufSize, src);
|
||||
}
|
||||
|
||||
if (buffer == src) {
|
||||
CRASH("Cannot copy string to same buffer");
|
||||
}
|
||||
void SafeStringCopy(char* buffer, size_t bufSize, const char* src);
|
||||
void SafeStringCat(char* buffer, size_t bufSize, const char* src);
|
||||
int SafeStringVPrintf(char* buffer, size_t bufSize, const char* src, std::va_list args);
|
||||
|
||||
strncpyProxy(buffer, src, BufSize);
|
||||
buffer[BufSize - 1] = 0;
|
||||
inline void SafeStringCopy(TextSpan dst, const char* src) {
|
||||
SafeStringCopy(dst.buffer, dst.size, src);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,18 +89,40 @@ void SafeStringCopyTruncate(char (&buffer)[BufSize], const char* src) {
|
||||
template <size_t BufSize>
|
||||
void SafeStringCopy(char (&buffer)[BufSize], const char* src) {
|
||||
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
||||
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;
|
||||
SafeStringCopy(buffer, BufSize, src);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -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_messageSetDemo(u32 i_msgidx);
|
||||
msg_class* fopMsgM_SearchByID(fpc_ProcID i_id);
|
||||
char* fopMsgM_messageGet(char* i_stringBuf, u32 i_msgId);
|
||||
TEXT_SPAN fopMsgM_messageGet(TEXT_SPAN 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,
|
||||
f32 param_5, f32 param_6, f32 param_7, f32 param_8,
|
||||
fopMsgCreateFunc i_createFunc);
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "JSystem/J2DGraph/J2DMaterial.h"
|
||||
#include "JSystem/J2DGraph/J2DPane.h"
|
||||
#include "dusk/endian.h"
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
class J2DMaterial;
|
||||
class JUTFont;
|
||||
@@ -98,7 +99,8 @@ public:
|
||||
void initiate(ResFONT const*, char const*, s16, J2DTextBoxHBinding,
|
||||
J2DTextBoxVBinding);
|
||||
void private_readStream(J2DPane*, JSURandomInputStream*, JKRArchive*);
|
||||
char* getStringPtr() const;
|
||||
TEXT_SPAN getStringPtr() const;
|
||||
dusk::TextSpan getSpan() const;
|
||||
s32 setString(s16, char const*, ...);
|
||||
s32 setString(char const*, ...);
|
||||
|
||||
|
||||
@@ -1575,6 +1575,12 @@ struct J3DAlphaComp {
|
||||
u8 getRef1() const { return mRef1; }
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include <cstring>
|
||||
#include <types.h>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
J2DMaterialFactory::J2DMaterialFactory(J2DMaterialBlock const& param_0) {
|
||||
mMaterialNum = param_0.field_0x8;
|
||||
mpMaterialInitData = JSUConvertOffsetToPtr<J2DMaterialInitData>(¶m_0, param_0.field_0xc);
|
||||
@@ -92,7 +94,7 @@ J2DMaterial* J2DMaterialFactory::create(J2DMaterial* param_0, int index, u32 par
|
||||
}
|
||||
if (local_380 == NULL && J2DScreen::getDataManage() != NULL) {
|
||||
char acStack_230[257];
|
||||
strcpy(acStack_230, param_3->getName(texNo));
|
||||
SAFE_STRCPY(acStack_230, param_3->getName(texNo));
|
||||
local_380 = J2DScreen::getDataManage()->get(acStack_230);
|
||||
}
|
||||
}
|
||||
@@ -111,7 +113,7 @@ J2DMaterial* J2DMaterialFactory::create(J2DMaterial* param_0, int index, u32 par
|
||||
}
|
||||
if (local_388 == NULL && J2DScreen::getDataManage() != NULL) {
|
||||
char acStack_334[257];
|
||||
strcpy(acStack_334, param_4->getName(param_0->getTevBlock()->getFontNo()));
|
||||
SAFE_STRCPY(acStack_334, param_4->getName(param_0->getTevBlock()->getFontNo()));
|
||||
local_388 = J2DScreen::getDataManage()->get(acStack_334);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,8 +309,12 @@ void J2DTextBox::draw(f32 posX, f32 posY, f32 param_2, J2DTextBoxHBinding hBind)
|
||||
}
|
||||
}
|
||||
|
||||
char* J2DTextBox::getStringPtr() const {
|
||||
TEXT_SPAN J2DTextBox::getStringPtr() const {
|
||||
#if TARGET_PC
|
||||
return { mStringPtr, mStringLength };
|
||||
#else
|
||||
return mStringPtr;
|
||||
#endif
|
||||
}
|
||||
|
||||
s32 J2DTextBox::setString(char const* string, ...) {
|
||||
@@ -330,7 +334,7 @@ s32 J2DTextBox::setString(char const* string, ...) {
|
||||
|
||||
if (mStringPtr) {
|
||||
mStringLength = len + 1;
|
||||
strcpy(mStringPtr, string);
|
||||
SAFE_STRCPY_BOUNDED(mStringPtr, mStringLength, string);
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include <JSystem/JUtility/JUTAssert.h>
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
u32 JAHVirtualNode::smVirNodeNum;
|
||||
|
||||
void JAHVirtualNode::virtualMessage(JAHControl& control) {
|
||||
@@ -77,7 +79,7 @@ void JAHVirtualNode::setVirNodeName(const char* name) {
|
||||
// clang-format off
|
||||
JUT_ASSERT(141, size<32);
|
||||
// clang-format on
|
||||
strcpy(mName, name);
|
||||
SAFE_STRCPY(mName, name);
|
||||
}
|
||||
|
||||
JAHVirtualNode::JAHVirtualNode(const char* name) : mTree(this) {
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
#include "JSystem/JAHostIO/JAHioMessage.h"
|
||||
#include "JSystem/JAHostIO/JAHioMgr.h"
|
||||
#include "JSystem/JAHostIO/JAHioNode.h"
|
||||
|
||||
#include "JSystem/JHostIO/JORServer.h"
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
JAHioNode* JAHioNode::smCurrentNode;
|
||||
|
||||
@@ -32,7 +34,7 @@ void JAHioNode::updateNode() {
|
||||
void JAHioNode::setNodeName(const char* name) {
|
||||
int size = strlen(name) + 1;
|
||||
JUT_ASSERT(51, size < 32);
|
||||
strcpy(mName, name);
|
||||
SAFE_STRCPY(mName, name);
|
||||
}
|
||||
|
||||
void JAHioNode::genMessage(JORMContext* mctx) {
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include <os.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
JASHeap* JASWaveArcLoader::sAramHeap;
|
||||
|
||||
JASHeap* JASWaveArcLoader::getRootHeap() {
|
||||
@@ -22,7 +24,7 @@ char JASWaveArcLoader::sCurrentDir[DIR_MAX] = "/AudioRes/Waves/";
|
||||
|
||||
void JASWaveArcLoader::setCurrentDir(char const* dir) {
|
||||
JUT_ASSERT(40, std::strlen(dir) < DIR_MAX - 1);
|
||||
strcpy(sCurrentDir, dir);
|
||||
SAFE_STRCPY(sCurrentDir, dir);
|
||||
u32 len = strlen(sCurrentDir);
|
||||
if (sCurrentDir[len - 1] != '/') {
|
||||
JUT_ASSERT(45, len + 1 < DIR_MAX);
|
||||
@@ -170,8 +172,8 @@ void JASWaveArc::setFileName(char const* fileName) {
|
||||
length = length + strlen(fileName);
|
||||
char* path = JKR_NEW_ARRAY_ARGS(char, length + 1, JASKernel::getSystemHeap(), -4);
|
||||
JUT_ASSERT(322, path);
|
||||
strcpy(path, currentDir);
|
||||
strcat(path, fileName);
|
||||
SAFE_STRCPY_BOUNDED(path, length + 1, currentDir);
|
||||
SAFE_STRCAT_BOUNDED(path, length + 1, fileName);
|
||||
path[length] = '\0';
|
||||
int entryNum = DVDConvertPathToEntrynum(path);
|
||||
JKR_DELETE_ARRAY(path);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <cctype>
|
||||
#include <cstring>
|
||||
#include "dusk/string.hpp"
|
||||
#include "global.h"
|
||||
|
||||
JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) {
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
|
||||
#define MSL_USE_INLINES 1 // needed to inline tolower call. not inlined elsewhere in the repo
|
||||
|
||||
#include <cstring>
|
||||
#include <cctype>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include "JSystem/JKernel/JKRHeap.h"
|
||||
#include "dusk/string.hpp"
|
||||
#include "global.h"
|
||||
|
||||
JKRFileLoader* JKRFileLoader::sCurrentVolume;
|
||||
@@ -104,7 +105,7 @@ const char* JKRFileLoader::fetchVolumeName(char* buffer, s32 bufferSize, const c
|
||||
static char rootPath[2] = "/";
|
||||
|
||||
if (strcmp(path, "/") == 0) {
|
||||
strcpy(buffer, rootPath);
|
||||
SAFE_STRCPY_BOUNDED(buffer, bufferSize, rootPath);
|
||||
return rootPath;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
#include "global.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/os.h"
|
||||
#endif
|
||||
@@ -274,7 +276,7 @@ void JKRThreadSwitch::draw(JKRThreadName_* thread_name_list, JUTConsole* console
|
||||
|
||||
if (!thread_print_name) {
|
||||
char buffer[16];
|
||||
sprintf(buffer, "%d", loadInfo->getId());
|
||||
SAFE_SPRINTF(buffer, "%d", loadInfo->getId());
|
||||
thread_print_name = buffer;
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
|
||||
void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = ptcl->mPrmClr;
|
||||
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
|
||||
@@ -87,6 +88,7 @@ void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
|
||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = ptcl->mPrmClr;
|
||||
GXColor env = ptcl->mEnvClr;
|
||||
@@ -225,6 +227,7 @@ void JPAGenTexCrdMtxPrj(JPAEmitterWorkData* param_0) {
|
||||
}
|
||||
|
||||
void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
JPABaseShape* shape = work->mpRes->getBsp();
|
||||
f32 dVar16 = work->mpEmtr->mTick;
|
||||
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
|
||||
@@ -256,6 +259,7 @@ void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
||||
}
|
||||
|
||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
ZoneScoped;
|
||||
JPABaseShape* shape = work->mpRes->getBsp();
|
||||
f32 dVar16 = param_1->mAge;
|
||||
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
|
||||
@@ -286,14 +290,17 @@ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1)
|
||||
}
|
||||
|
||||
void JPALoadTex(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpRes->getBsp()->getTexIdx()), GX_TEXMAP0);
|
||||
}
|
||||
|
||||
void JPALoadTexAnm(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0);
|
||||
}
|
||||
|
||||
void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
ZoneScoped;
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0);
|
||||
}
|
||||
|
||||
@@ -446,6 +453,7 @@ void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneScoped;
|
||||
JGeometry::TVec3<f32> pos;
|
||||
#if TARGET_PC
|
||||
Mtx ptclPosMtx;
|
||||
@@ -475,6 +483,7 @@ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneScoped;
|
||||
if (work->mpRes->getUsrIdx() == 0x89d7) {
|
||||
int a = 0;
|
||||
}
|
||||
@@ -518,6 +527,7 @@ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneScoped;
|
||||
JGeometry::TVec3<f32> local_48;
|
||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
||||
Mtx local_38;
|
||||
@@ -542,6 +552,7 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneScoped;
|
||||
JGeometry::TVec3<f32> local_48;
|
||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
||||
f32 sinRot = JMASSin(param_1->mRotateAngle);
|
||||
@@ -1268,6 +1279,8 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
}
|
||||
|
||||
void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
if (emtr->mpEmtrCallBack == NULL) {
|
||||
return;
|
||||
@@ -1282,6 +1295,7 @@ void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneScoped;
|
||||
emtr->mpPtclCallBack->draw(emtr, ptcl);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#include <gx.h>
|
||||
|
||||
void JPALoadExTex(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
|
||||
JPAExTexShape* ets = work->mpRes->getEts();
|
||||
|
||||
GXTexCoordID secTexCoordID = GX_TEXCOORD1;
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
||||
|
||||
#include "JSystem/JUtility/JUTConsole.h"
|
||||
#include <cstdio>
|
||||
#include <vi.h>
|
||||
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
|
||||
#include "JSystem/JKernel/JKRHeap.h"
|
||||
#include "JSystem/JUtility/JUTAssert.h"
|
||||
#include "JSystem/JUtility/JUTConsole.h"
|
||||
#include "JSystem/JUtility/JUTDirectPrint.h"
|
||||
#include "JSystem/JUtility/JUTVideo.h"
|
||||
#include <vi.h>
|
||||
#include <cstdio>
|
||||
#include "dusk/string.hpp"
|
||||
#include "global.h"
|
||||
|
||||
JUTConsoleManager* JUTConsoleManager::sManager;
|
||||
@@ -204,10 +205,10 @@ void JUTConsole::doDraw(JUTConsole::EConsoleType consoleType) const {
|
||||
mFont->drawString_scale((int)f31, sp94, mFontSizeX, mFontSizeY, spA8, TRUE);
|
||||
f31 += mFontSizeX * 13.0f;
|
||||
if (sp88) {
|
||||
sprintf(spB8, "ALL");
|
||||
SAFE_SPRINTF(spB8, "ALL");
|
||||
} else {
|
||||
f32 f29 = sp8C / (f32)(sp90 - mHeight);
|
||||
sprintf(spB8, "%3d%%(%dL)", (int)(100.0 * f29), sp90);
|
||||
SAFE_SPRINTF(spB8, "%3d%%(%dL)", (int)(100.0 * f29), sp90);
|
||||
}
|
||||
mFont->drawString_scale(f31, sp94, mFontSizeX, mFontSizeY, spB8, TRUE);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
#ifdef __REVOLUTION_SDK__
|
||||
#include <revolution.h>
|
||||
#else
|
||||
@@ -845,8 +847,8 @@ bool JUTException::queryMapAddress(char* mapPath, u32 address, s32 section_id, u
|
||||
bool begin_with_newline) {
|
||||
if (mapPath) {
|
||||
char buffer[80];
|
||||
strcpy(buffer, mapPath);
|
||||
strcat(buffer, ".map");
|
||||
SAFE_STRCPY(buffer, mapPath);
|
||||
SAFE_STRCAT(buffer, ".map");
|
||||
if (queryMapAddress_single(buffer, address, section_id, out_addr, out_size, out_line,
|
||||
line_length, print, begin_with_newline) == true)
|
||||
{
|
||||
|
||||
@@ -13,20 +13,33 @@ inline denormal_state denormals_enable()
|
||||
}
|
||||
inline void denormals_restore(denormal_state saved) { _mm_setcsr(saved); }
|
||||
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
|
||||
|
||||
#include <cstdint>
|
||||
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
|
||||
#include <intrin.h>
|
||||
#endif
|
||||
using denormal_state = uint64_t;
|
||||
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;
|
||||
asm volatile("mrs %0, fpcr" : "=r"(saved));
|
||||
asm volatile("msr fpcr, %0" :: "r"(saved | (1ULL << 24))); // FZ
|
||||
return saved;
|
||||
#endif
|
||||
}
|
||||
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));
|
||||
#endif
|
||||
}
|
||||
|
||||
#elif defined(__arm__) || defined(_M_ARM)
|
||||
|
||||
@@ -2,6 +2,9 @@ plugins {
|
||||
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 duskGeneratedAssetsDir = layout.buildDirectory.dir('generated/assets/dusklight').get().asFile
|
||||
def syncDuskAssets = tasks.register('syncDuskAssets', Sync) {
|
||||
@@ -20,8 +23,8 @@ android {
|
||||
applicationId 'dev.twilitrealm.dusk'
|
||||
minSdk 26
|
||||
targetSdk 36
|
||||
versionCode 1
|
||||
versionName '0.1.0'
|
||||
versionCode versionCodeInt
|
||||
versionName versionNameStr
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
|
||||
@@ -12,6 +12,7 @@ import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.provider.DocumentsContract;
|
||||
import android.provider.OpenableColumns;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
@@ -27,10 +28,12 @@ import java.util.List;
|
||||
public class DuskActivity extends SDLActivity {
|
||||
private static final String TAG = "DuskActivity";
|
||||
private static final int FOLDER_DIALOG_REQUEST_CODE = 0x4455;
|
||||
private static final int MANAGE_STORAGE_REQUEST_CODE = 0x4456;
|
||||
private static final String EXTERNAL_STORAGE_AUTHORITY =
|
||||
"com.android.externalstorage.documents";
|
||||
|
||||
private long folderDialogUserdata = 0;
|
||||
private boolean awaitingManageStoragePermission = false;
|
||||
|
||||
private static native void nativeFolderDialogResult(long userdata, String path, String error);
|
||||
|
||||
@@ -89,6 +92,9 @@ public class DuskActivity extends SDLActivity {
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
hideSystemBars();
|
||||
if (awaitingManageStoragePermission) {
|
||||
resumeFolderDialogAfterPermissionGrant();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -171,6 +177,19 @@ public class DuskActivity extends SDLActivity {
|
||||
}
|
||||
|
||||
folderDialogUserdata = userdata;
|
||||
if (requiresManageStoragePermission() && !hasManageStoragePermission()) {
|
||||
if (!requestManageStoragePermission()) {
|
||||
finishFolderDialogWithError("Unable to request Android file access permission");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
openFolderDialog();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void openFolderDialog() {
|
||||
runOnUiThread(() -> {
|
||||
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
||||
@@ -185,9 +204,71 @@ public class DuskActivity extends SDLActivity {
|
||||
finishFolderDialog(Activity.RESULT_CANCELED, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean requiresManageStoragePermission() {
|
||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
|
||||
}
|
||||
|
||||
private boolean hasManageStoragePermission() {
|
||||
return !requiresManageStoragePermission() || Environment.isExternalStorageManager();
|
||||
}
|
||||
|
||||
private boolean requestManageStoragePermission() {
|
||||
if (!requiresManageStoragePermission()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
awaitingManageStoragePermission = true;
|
||||
runOnUiThread(() -> {
|
||||
if (tryStartManageStorageIntent(
|
||||
new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
|
||||
.setData(Uri.parse("package:" + getPackageName()))) ||
|
||||
tryStartManageStorageIntent(
|
||||
new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
finishFolderDialogWithError("Unable to request Android file access permission");
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean tryStartManageStorageIntent(Intent intent) {
|
||||
try {
|
||||
startActivityForResult(intent, MANAGE_STORAGE_REQUEST_CODE);
|
||||
return true;
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Log.w(TAG, "Unable to open all-files access settings.", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void resumeFolderDialogAfterPermissionGrant() {
|
||||
awaitingManageStoragePermission = false;
|
||||
if (folderDialogUserdata == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (hasManageStoragePermission()) {
|
||||
openFolderDialog();
|
||||
return;
|
||||
}
|
||||
|
||||
finishFolderDialogWithError(
|
||||
"Allow \"All files access\" for Dusklight before choosing a custom data folder");
|
||||
}
|
||||
|
||||
private void finishFolderDialogWithError(String error) {
|
||||
long userdata = folderDialogUserdata;
|
||||
folderDialogUserdata = 0;
|
||||
awaitingManageStoragePermission = false;
|
||||
if (userdata != 0) {
|
||||
nativeFolderDialogResult(userdata, null, error);
|
||||
}
|
||||
}
|
||||
|
||||
private void finishFolderDialog(int resultCode, Intent data) {
|
||||
long userdata = folderDialogUserdata;
|
||||
folderDialogUserdata = 0;
|
||||
|
||||
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
private static final String TAG = "SDL";
|
||||
private static final int SDL_MAJOR_VERSION = 3;
|
||||
private static final int SDL_MINOR_VERSION = 4;
|
||||
private static final int SDL_MICRO_VERSION = 4;
|
||||
private static final int SDL_MICRO_VERSION = 8;
|
||||
/*
|
||||
// Display InputType.SOURCE/CLASS of events and devices
|
||||
//
|
||||
@@ -570,7 +570,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
public static int getNaturalOrientation() {
|
||||
int result = SDL_ORIENTATION_UNKNOWN;
|
||||
|
||||
Activity activity = (Activity)getContext();
|
||||
Activity activity = getContext();
|
||||
if (activity != null) {
|
||||
Configuration config = activity.getResources().getConfiguration();
|
||||
Display display = activity.getWindowManager().getDefaultDisplay();
|
||||
@@ -590,7 +590,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
public static int getCurrentRotation() {
|
||||
int result = 0;
|
||||
|
||||
Activity activity = (Activity)getContext();
|
||||
Activity activity = getContext();
|
||||
if (activity != null) {
|
||||
Display display = activity.getWindowManager().getDefaultDisplay();
|
||||
switch (display.getRotation()) {
|
||||
@@ -1292,7 +1292,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
public static double getDiagonal()
|
||||
{
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
Activity activity = (Activity)getContext();
|
||||
Activity activity = getContext();
|
||||
if (activity == null) {
|
||||
return 0.0;
|
||||
}
|
||||
@@ -1940,7 +1940,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
return;
|
||||
}
|
||||
|
||||
Activity activity = (Activity)getContext();
|
||||
Activity activity = getContext();
|
||||
if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
|
||||
activity.requestPermissions(new String[]{permission}, requestCode);
|
||||
} 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
|
||||
Comment=PC port of a classic adventure game
|
||||
Exec=dusklight
|
||||
Icon=dusklight
|
||||
Icon=dev.twilitrealm.dusk
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Game;
|
||||
@@ -447,6 +447,7 @@ body.animate-in .intro-item {
|
||||
top: auto;
|
||||
text-align: right;
|
||||
font-size: 16dp;
|
||||
gap: 8dp;
|
||||
}
|
||||
|
||||
#disc-status {
|
||||
@@ -468,6 +469,7 @@ body.animate-in .intro-item {
|
||||
top: 32dp;
|
||||
text-align: right;
|
||||
font-size: 16dp;
|
||||
gap: 8dp;
|
||||
}
|
||||
|
||||
.update {
|
||||
|
||||
@@ -183,7 +183,7 @@ bool Z2SoundMgr::startSound(JAISoundID soundID, JAISoundHandle* handle, const JG
|
||||
return streamMgr_.startSound(soundID, handle, posPtr);
|
||||
default:
|
||||
char error[64];
|
||||
sprintf(error, "Unknown Sound-Type id :%08x\n", (u32)soundID);
|
||||
SAFE_SPRINTF(error, "Unknown Sound-Type id :%08x\n", (u32)soundID);
|
||||
JUT_WARN(277, "%s", error);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#include "dusk/settings.h"
|
||||
#include "res/Object/Alink.h"
|
||||
#include <cstring>
|
||||
#include <dusk/string.hpp>
|
||||
#endif
|
||||
|
||||
static int daAlink_Create(fopAc_ac_c* i_this);
|
||||
|
||||
@@ -1165,6 +1165,10 @@ int daAlink_c::procCutFinishInit(int i_type) {
|
||||
const daAlink_cutParamTbl* cutParams = &cutParamTable[i_type];
|
||||
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);
|
||||
setCutType(cutParams->m_cutType);
|
||||
field_0x3198 = cutParams->m_recoilAnmID;
|
||||
|
||||
@@ -4359,7 +4359,7 @@ void daAlink_c::dungeonReturnWarp() {
|
||||
s16 angle = dComIfGs_getWarpPlayerAngleY();
|
||||
s8 room = dComIfGs_getWarpRoomNo();
|
||||
char name[8];
|
||||
strcpy(name, dComIfGs_getWarpStageName());
|
||||
SAFE_STRCPY(name, dComIfGs_getWarpStageName());
|
||||
|
||||
dComIfGs_setRestartRoom(pos, angle, room);
|
||||
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) {
|
||||
char stageName[32];
|
||||
strcpy(stageName, dComIfGp_getStartStageName());
|
||||
SAFE_STRCPY(stageName, dComIfGp_getStartStageName());
|
||||
|
||||
for (int i = 0; i < 32; i++) {
|
||||
if ((s64)stageName[i] == 0) {
|
||||
|
||||
@@ -216,7 +216,7 @@ void daAlink_c::setSpeedAndAngleSwim() {
|
||||
if (checkEventRun()) {
|
||||
var_r28 = mMoveAngle;
|
||||
} else {
|
||||
var_r28 = shape_angle.y + (16384.0f * cM_ssin(mStickAngle));
|
||||
var_r28 = shape_angle.y + (16384.0f * cM_ssin(mStickAngle) IF_DUSK(* (dusk::getSettings().game.invertAirSwimX ? -1.0f : 1.0f)));
|
||||
}
|
||||
|
||||
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 {
|
||||
s16 var_r24;
|
||||
if (checkInputOnR() && !checkEventRun()) {
|
||||
var_r24 = 13653.0f * cM_scos(mStickAngle);
|
||||
var_r24 = 13653.0f * cM_scos(mStickAngle) IF_DUSK(* (dusk::getSettings().game.invertAirSwimY ? -1.0f : 1.0f));
|
||||
} else {
|
||||
var_r24 = 0;
|
||||
}
|
||||
|
||||
@@ -4005,7 +4005,13 @@ int daAlink_c::procWolfHowlDemoInit() {
|
||||
} else if (name == fpcNm_Tag_WaraHowl_e) {
|
||||
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daTagWrHowl_c*>(field_0x27f4)->getTuneId());
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
if (mZ2WolfHowlMgr.getCorrectCurveID() != 9) {
|
||||
mZ2WolfHowlMgr.setCorrectCurve(-1);
|
||||
}
|
||||
#else
|
||||
mZ2WolfHowlMgr.setCorrectCurve(-1);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
|
||||
@@ -2192,6 +2192,9 @@ static void damage_check(b_gnd_class* i_this) {
|
||||
i_this->mDamageInvulnerabilityTimer = 100;
|
||||
}
|
||||
}
|
||||
#if TARGET_PC
|
||||
dusk::AchievementSystem::get().signal("ganondorf_hit");
|
||||
#endif
|
||||
}
|
||||
|
||||
cXyz hitmark_size(1.0f, 1.0f, 1.0f);
|
||||
@@ -2218,6 +2221,7 @@ static void damage_check(b_gnd_class* i_this) {
|
||||
i_this->field_0xc7c = 0;
|
||||
dScnPly_c::setPauseTimer(7);
|
||||
a_this->health = 100;
|
||||
dusk::AchievementSystem::get().signal("ganondorf_knocked_down");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5,24 +5,25 @@
|
||||
|
||||
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
||||
|
||||
#include "d/actor/d_a_bg_obj.h"
|
||||
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
||||
#include <cstdio>
|
||||
#include <os.h>
|
||||
#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_set_bgobj.h"
|
||||
#include "d/d_s_play.h"
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
static const char* getBmdName(int param_0, int param_1) {
|
||||
static char l_bmdName[16];
|
||||
|
||||
switch (param_1) {
|
||||
case 0:
|
||||
sprintf(l_bmdName, "model%d.bmd", param_0);
|
||||
SAFE_SPRINTF(l_bmdName, "model%d.bmd", param_0);
|
||||
break;
|
||||
default:
|
||||
sprintf(l_bmdName, "model%d_%d.bmd", param_0, param_1);
|
||||
SAFE_SPRINTF(l_bmdName, "model%d_%d.bmd", param_0, param_1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -34,10 +35,10 @@ static const char* getBtkName(int param_0, int param_1) {
|
||||
|
||||
switch (param_1) {
|
||||
case 0:
|
||||
sprintf(l_btkName, "model%d.btk", param_0);
|
||||
SAFE_SPRINTF(l_btkName, "model%d.btk", param_0);
|
||||
break;
|
||||
default:
|
||||
sprintf(l_btkName, "model%d_%d.btk", param_0, param_1);
|
||||
SAFE_SPRINTF(l_btkName, "model%d_%d.btk", param_0, param_1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -49,10 +50,10 @@ static const char* getBrkName(int param_0, int param_1) {
|
||||
|
||||
switch (param_1) {
|
||||
case 0:
|
||||
sprintf(l_brkName, "model%d.brk", param_0);
|
||||
SAFE_SPRINTF(l_brkName, "model%d.brk", param_0);
|
||||
break;
|
||||
default:
|
||||
sprintf(l_brkName, "model%d_%d.brk", param_0, param_1);
|
||||
SAFE_SPRINTF(l_brkName, "model%d_%d.brk", param_0, param_1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -62,7 +63,7 @@ static const char* getBrkName(int param_0, int param_1) {
|
||||
static const char* getDzbName(int param_0) {
|
||||
static char l_dzbName[16];
|
||||
|
||||
sprintf(l_dzbName, "model%d.dzb", param_0);
|
||||
SAFE_SPRINTF(l_dzbName, "model%d.dzb", param_0);
|
||||
return l_dzbName;
|
||||
}
|
||||
|
||||
@@ -95,12 +96,12 @@ u8* daBgObj_c::spec_data_c::initTexShareBlock(u8* i_dataPtr) {
|
||||
u8* dataPos = i_dataPtr + 8;
|
||||
|
||||
for (; i < mTexShareNum; i++) {
|
||||
strcpy(sp48, (char*)dataPos);
|
||||
SAFE_STRCPY(sp48, (char*)dataPos);
|
||||
int len = strlen((char*)dataPos);
|
||||
|
||||
dataPos += len + 1;
|
||||
if (*dataPos != 0) {
|
||||
strcpy(sp8, (char*)dataPos);
|
||||
SAFE_STRCPY(sp8, (char*)dataPos);
|
||||
dataPos += strlen((char*)dataPos) + 1;
|
||||
} else if (*dataPos == 0 && dataPos[1] == 1) {
|
||||
dataPos += 2;
|
||||
@@ -658,14 +659,14 @@ void daBgObj_c::doShareTexture() {
|
||||
u8* spec_res_name = mSpecData.mpTexShareBlock + 8;
|
||||
|
||||
for (int i = 0; i < mSpecData.mTexShareNum; i++) {
|
||||
strcpy(res_name, (char*)spec_res_name);
|
||||
SAFE_STRCPY(res_name, (char*)spec_res_name);
|
||||
spec_res_name += strlen((char*)spec_res_name) + 1;
|
||||
|
||||
J3DModelData* modelData =
|
||||
(J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), res_name);
|
||||
|
||||
if (*spec_res_name != 0) {
|
||||
strcpy(share_res_name, (char*)spec_res_name);
|
||||
SAFE_STRCPY(share_res_name, (char*)spec_res_name);
|
||||
spec_res_name += strlen((char*)spec_res_name) + 1;
|
||||
|
||||
J3DModelData* shareModelData =
|
||||
|
||||
@@ -51,7 +51,7 @@ static char* l_bmd_base_name = "door-pushDouble_";
|
||||
|
||||
char* daDbDoor00_c::getBmdName() {
|
||||
static char l_bmdName[32];
|
||||
sprintf(l_bmdName, "%s%02d.bmd", l_bmd_base_name, door_param2_c::getDoorModel(this));
|
||||
SAFE_SPRINTF(l_bmdName, "%s%02d.bmd", l_bmd_base_name, door_param2_c::getDoorModel(this));
|
||||
return l_bmdName;
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ static char* l_bmd_base_name = "door-knob_";
|
||||
char* daKnob20_c::getBmd() {
|
||||
static char l_bmdName[32];
|
||||
|
||||
sprintf(l_bmdName, "%s%02d.bmd", l_bmd_base_name, knob_param_c::getDoorModel(this));
|
||||
SAFE_SPRINTF(l_bmdName, "%s%02d.bmd", l_bmd_base_name, knob_param_c::getDoorModel(this));
|
||||
return l_bmdName;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,10 +65,10 @@ char* daDoor20_c::getBmdName() {
|
||||
case 10:
|
||||
case 12:
|
||||
default:
|
||||
sprintf(bmdName, "door-shutter_%02d.bmd", door_param2_c::getDoorModel(this));
|
||||
SAFE_SPRINTF(bmdName, "door-shutter_%02d.bmd", door_param2_c::getDoorModel(this));
|
||||
break;
|
||||
case 9:
|
||||
sprintf(bmdName, "door-knob_%02d.bmd", door_param2_c::getDoorModel(this));
|
||||
SAFE_SPRINTF(bmdName, "door-knob_%02d.bmd", door_param2_c::getDoorModel(this));
|
||||
break;
|
||||
}
|
||||
return bmdName;
|
||||
|
||||
@@ -94,9 +94,9 @@ const char* daSpiral_c::getBmd(int i_type) {
|
||||
const char* daSpiral_c::getBmd2(int i_type) {
|
||||
static char bmdName[32];
|
||||
if (i_type == daSpiral_TYPE_DOWN_e) {
|
||||
sprintf(bmdName, "door-stairSpiralU.bmd");
|
||||
SAFE_SPRINTF(bmdName, "door-stairSpiralU.bmd");
|
||||
} else {
|
||||
sprintf(bmdName, "door-stairSpiralD.bmd");
|
||||
SAFE_SPRINTF(bmdName, "door-stairSpiralD.bmd");
|
||||
}
|
||||
|
||||
return bmdName;
|
||||
|
||||
@@ -3530,6 +3530,15 @@ void daKago_c::action() {
|
||||
#endif
|
||||
mStickY = mDoCPd_c::getStickY(PAD_1);
|
||||
|
||||
#ifdef TARGET_PC
|
||||
if(dusk::getSettings().game.invertAirSwimX) {
|
||||
mStickX = -mStickX;
|
||||
}
|
||||
if(dusk::getSettings().game.invertAirSwimY) {
|
||||
mStickY = -mStickY;
|
||||
}
|
||||
#endif
|
||||
|
||||
u8 prevIsWaterfall = mIsWaterfall;
|
||||
mIsWaterfall = FALSE;
|
||||
fpcM_Search(s_waterfall, this);
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "d/actor/d_a_player.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include <cstring>
|
||||
#include <dusk/ui/settings.hpp>
|
||||
|
||||
static int daKytag04_Draw(kytag04_class* i_this) {
|
||||
dScnKy_env_light_c* kankyo = dKy_getEnvlight();
|
||||
@@ -260,8 +261,10 @@ static int daKytag04_Create(fopAc_ac_c* i_this) {
|
||||
|
||||
a_this->mNeedDropNum = i_this->current.angle.z & 0xFF;
|
||||
|
||||
#if DUSK_TPHD
|
||||
a_this->mNeedDropNum = 12;
|
||||
#if TARGET_PC
|
||||
if (dusk::tphd_active()) {
|
||||
a_this->mNeedDropNum = 12;
|
||||
}
|
||||
#endif
|
||||
|
||||
int phase_state = dComIfG_resLoad(&a_this->mPhase, "Kytag04");
|
||||
@@ -270,8 +273,11 @@ static int daKytag04_Create(fopAc_ac_c* i_this) {
|
||||
a_this->mStageNo = (i_this->current.angle.z >> 8) & 0xFF;
|
||||
a_this->mExitID = fopAcM_GetParam(i_this) & 0xFF;
|
||||
a_this->mNeedDropNum = i_this->current.angle.z & 0xFF;
|
||||
#if DUSK_TPHD
|
||||
a_this->mNeedDropNum = 12;
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::tphd_active()) {
|
||||
a_this->mNeedDropNum = 12;
|
||||
}
|
||||
#endif
|
||||
|
||||
a_this->field_0x5b5 = fopAcM_GetParam(i_this) >> 0x10;
|
||||
|
||||
@@ -25,7 +25,10 @@
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/settings.h"
|
||||
#include "dusk/version.hpp"
|
||||
#endif
|
||||
|
||||
class dmg_rod_HIO_c : public JORReflexible {
|
||||
public:
|
||||
@@ -1137,8 +1140,14 @@ static int lure_standby(dmg_rod_class* i_this) {
|
||||
dComIfGp_setDoStatusForce(42, 0);
|
||||
}
|
||||
|
||||
i_this->rod_stick_x = mDoCPd_c::getStickX3D(PAD_1) * mDoCPd_c::getStickX3D(PAD_1);
|
||||
if (mDoCPd_c::getStickX3D(PAD_1) < 0.0f) {
|
||||
f32 stick_x = mDoCPd_c::getStickX3D(PAD_1);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
stick_x = -stick_x;
|
||||
}
|
||||
#endif
|
||||
i_this->rod_stick_x = stick_x * stick_x;
|
||||
if (stick_x < 0.0f) {
|
||||
i_this->rod_stick_x *= -1.0f;
|
||||
}
|
||||
|
||||
@@ -3671,7 +3680,13 @@ static void uki_standby(dmg_rod_class* i_this) {
|
||||
cLib_addCalc2(&i_this->field_0x150c, substickX, 0.5f, 0.2f);
|
||||
|
||||
if (i_this->field_0x1508 > 0.3f && i_this->play_cam_mode < 5) {
|
||||
ANGLE_ADD(i_this->field_0x1418, (-500.0f + VREG_F(3)) * mDoCPd_c::getStickX3D(PAD_1));
|
||||
f32 stick_x = mDoCPd_c::getStickX3D(PAD_1);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
stick_x = -stick_x;
|
||||
}
|
||||
#endif
|
||||
ANGLE_ADD(i_this->field_0x1418, (-500.0f + VREG_F(3)) * stick_x);
|
||||
}
|
||||
|
||||
cMtx_YrotS(*calc_mtx, i_this->field_0x1418);
|
||||
@@ -5043,8 +5058,15 @@ static void play_camera(dmg_rod_class* i_this) {
|
||||
static f32 old_stick_x = 0.0f;
|
||||
static f32 old_stick_sx = 0.0f;
|
||||
|
||||
f32 stick_x = mDoCPd_c::getStickX3D(PAD_1);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
stick_x = -stick_x;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (
|
||||
(mDoCPd_c::getStickX3D(PAD_1) >= 0.8f && old_stick_x < 0.8f) || (mDoCPd_c::getStickX3D(PAD_1) <= -0.8f && old_stick_x > -0.8f)
|
||||
(stick_x >= 0.8f && old_stick_x < 0.8f) || (stick_x <= -0.8f && old_stick_x > -0.8f)
|
||||
#if VERSION != VERSION_SHIELD_DEBUG
|
||||
|| (mDoCPd_c::getSubStickX3D(PAD_1) >= 0.8f && old_stick_sx < 0.8f) || (mDoCPd_c::getSubStickX3D(PAD_1) <= -0.8f && old_stick_sx > -0.8f)
|
||||
#endif
|
||||
@@ -5060,7 +5082,7 @@ static void play_camera(dmg_rod_class* i_this) {
|
||||
}
|
||||
|
||||
if (i_this->play_cam_timer >= 15) {
|
||||
if (mDoCPd_c::getStickX3D(PAD_1) >= 0.5f
|
||||
if (stick_x >= 0.5f
|
||||
#if VERSION != VERSION_SHIELD_DEBUG
|
||||
|| mDoCPd_c::getSubStickX3D(PAD_1) >= 0.5f
|
||||
#endif
|
||||
@@ -5082,8 +5104,8 @@ static void play_camera(dmg_rod_class* i_this) {
|
||||
}
|
||||
}
|
||||
|
||||
old_stick_x = mDoCPd_c::getStickX3D(PAD_1);
|
||||
old_stick_sx = mDoCPd_c::getSubStickX(PAD_1);
|
||||
old_stick_x = stick_x;
|
||||
old_stick_sx = mDoCPd_c::getSubStickX3D(PAD_1);
|
||||
|
||||
if (i_this->play_cam_timer == 1) {
|
||||
if (i_this->field_0xf81 == 0) {
|
||||
@@ -5788,7 +5810,14 @@ static int dmg_rod_Execute(dmg_rod_class* i_this) {
|
||||
|
||||
i_this->rod_stick_x = mDoCPd_c::getStickX3D(PAD_1);
|
||||
i_this->rod_stick_y = mDoCPd_c::getStickY(PAD_1);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
i_this->rod_stick_x = -i_this->rod_stick_x;
|
||||
}
|
||||
i_this->rod_substick_x = mDoCPd_c::getSubStickX3D(PAD_1);
|
||||
#else
|
||||
i_this->rod_substick_x = mDoCPd_c::getSubStickX(PAD_1);
|
||||
#endif
|
||||
i_this->prev_rod_substick_y = i_this->rod_substick_y;
|
||||
i_this->rod_substick_y = mDoCPd_c::getSubStickY(PAD_1);
|
||||
|
||||
|
||||
@@ -26,15 +26,16 @@
|
||||
|
||||
#include "f_op/f_op_overlap_mng.h"
|
||||
|
||||
#include "JSystem/JAudio2/JASCriticalSection.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/gx_helper.h"
|
||||
#include "dusk/os.h"
|
||||
#include "dusk/layout.hpp"
|
||||
|
||||
#include "JSystem/JAudio2/JASCriticalSection.h"
|
||||
|
||||
#if MOVIE_SUPPORT
|
||||
#include "turbojpeg.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
inline s32 daMP_NEXT_READ_SIZE(daMP_THPReadBuffer* readBuf) {
|
||||
return *(BE(s32)*)readBuf->ptr;
|
||||
@@ -3912,13 +3913,20 @@ static BOOL daMP_ProperTimingForGettingNextFrame() {
|
||||
return TRUE;
|
||||
}
|
||||
} else {
|
||||
s32 frameRate = daMP_ActivePlayer.header.frameRate * 100.0f;
|
||||
#if TARGET_PC
|
||||
// DUSK HACK: We only fire retrace callbacks *half* as often as the game expects,
|
||||
// because we only run them once per frame, and normally there should be two scans
|
||||
// per game frame.
|
||||
frameRate *= 2;
|
||||
#endif
|
||||
const f32 fps = daMP_ActivePlayer.header.frameRate;
|
||||
if (fps > 0.0f) {
|
||||
const f32 elapsed = std::chrono::duration<f32>(
|
||||
std::chrono::steady_clock::now() - daMP_ActivePlayer.thpPlaybackClock).count();
|
||||
const s32 desired = static_cast<s32>(elapsed * fps);
|
||||
if (desired != daMP_ActivePlayer.prevCount) {
|
||||
daMP_ActivePlayer.prevCount = desired;
|
||||
daMP_ActivePlayer.curCount = desired;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
#else
|
||||
s32 frameRate = daMP_ActivePlayer.header.frameRate * 100.0f;
|
||||
if (VIGetTvFormat() == VI_PAL) {
|
||||
daMP_ActivePlayer.curCount = daMP_ActivePlayer.retaceCount * frameRate / 5000;
|
||||
} else {
|
||||
@@ -3929,6 +3937,7 @@ static BOOL daMP_ProperTimingForGettingNextFrame() {
|
||||
daMP_ActivePlayer.prevCount = daMP_ActivePlayer.curCount;
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
@@ -4133,6 +4142,9 @@ static BOOL daMP_THPPlayerPlay() {
|
||||
daMP_ActivePlayer.prevCount = 0;
|
||||
daMP_ActivePlayer.curCount = 0;
|
||||
daMP_ActivePlayer.retaceCount = -1;
|
||||
#if TARGET_PC
|
||||
daMP_ActivePlayer.thpPlaybackClock = std::chrono::steady_clock::now();
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -4482,7 +4494,7 @@ int daMP_c::daMP_c_Init() {
|
||||
JUT_ASSERT(9507, 0 <= movieNo && movieNo <= 99);
|
||||
|
||||
char path[32];
|
||||
sprintf(path, "/Movie/demo_movie%02d_%02d.thp", demoNo, movieNo);
|
||||
SAFE_SPRINTF(path, "/Movie/demo_movie%02d_%02d.thp", demoNo, movieNo);
|
||||
|
||||
if (!daMP_ActivePlayer_Init(path)) {
|
||||
daMP_Fail_alloc = TRUE;
|
||||
|
||||
@@ -943,6 +943,11 @@ static int ni_play(ni_class* i_this) {
|
||||
s16 var_r28 = 0x4000;
|
||||
|
||||
i_this->mPadMainStickX = mDoCPd_c::getStickX3D(PAD_1);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
i_this->mPadMainStickX = -i_this->mPadMainStickX;
|
||||
}
|
||||
#endif
|
||||
i_this->mPadMainStickY = mDoCPd_c::getStickY(PAD_1);
|
||||
i_this->mPadSubStickY = mDoCPd_c::getSubStickY(PAD_1);
|
||||
i_this->mPadSubStickX = mDoCPd_c::getSubStickX(PAD_1);
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
static int l_bmdData[4][2] = {
|
||||
{14, 1}, {26, 2},
|
||||
{25, 2}, {3, 4},
|
||||
@@ -1336,8 +1338,8 @@ int daNpc_Hanjo_c::cutAppearHawker(int param_1) {
|
||||
home.angle.y += 0x8000;
|
||||
setAngle(home.angle.y);
|
||||
initTalk(0xcf, NULL);
|
||||
strcpy(acStack_98, l_evtList[9].eventName);
|
||||
strcat(acStack_98, "@");
|
||||
SAFE_STRCPY(acStack_98, l_evtList[9].eventName);
|
||||
SAFE_STRCAT(acStack_98, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(this, acStack_98);
|
||||
dComIfGp_getEvent()->onSkipFade();
|
||||
dComIfGp_getVibration().StartShock( 9, 15, cXyz(0.0f, 1.0f, 0.0f));
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include "d/actor/d_a_e_ym.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
enum saru_TW_RES_File_ID {
|
||||
/* BMDR */
|
||||
/* 0x4 */ BMDR_SARU_BARA_TW = 0x4,
|
||||
@@ -956,8 +958,8 @@ int daNpc_Saru_c::cutYmLook(int param_1) {
|
||||
if (dComIfGp_getEventManager().getIsAddvance(param_1) != 0) {
|
||||
switch (iVar1) {
|
||||
case 0:
|
||||
strcpy(acStack_88, l_evtList[2].eventName);
|
||||
strcat(acStack_88, "@");
|
||||
SAFE_STRCPY(acStack_88, l_evtList[2].eventName);
|
||||
SAFE_STRCAT(acStack_88, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(this, acStack_88);
|
||||
dComIfGp_getEvent()->onSkipFade();
|
||||
field_0xfd9 = 1;
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "d/actor/d_a_npc_shop0.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
static int createHeapCallBack(fopAc_ac_c* i_this) {
|
||||
return static_cast<daNpc_Shop0_c*>(i_this)->createHeap();
|
||||
}
|
||||
@@ -184,8 +186,8 @@ int daNpc_Shop0_c::init() {
|
||||
static char l_fileName[21];
|
||||
|
||||
J3DAnmTransform* daNpc_Shop0_c::getTrnsfrmAnmP(int i_fileIndex, char** i_fileName) {
|
||||
strcpy(l_fileName, i_fileName[i_fileIndex]);
|
||||
strcat(l_fileName, ".bck");
|
||||
SAFE_STRCPY(l_fileName, i_fileName[i_fileIndex]);
|
||||
SAFE_STRCAT(l_fileName, ".bck");
|
||||
return (J3DAnmTransform*) dComIfG_getObjectRes(getResName(), l_fileName);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include "d/actor/d_a_demo_item.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
static daNpc_GetParam1 l_bmdData[3] = {
|
||||
{3, 1},
|
||||
{3, 4},
|
||||
@@ -1137,8 +1139,8 @@ BOOL daNpc_Yelia_c::cutTakeWoodStatue(int i_staffId) {
|
||||
mItemId = fpcM_ERROR_PROCESS_ID_e;
|
||||
mEventTimer = timer;
|
||||
Z2GetAudioMgr()->muteSceneBgm(90, 0.0f);
|
||||
strcpy(name, l_evtList[EVENT_TAKE_WOODSTATUE].eventName);
|
||||
strcat(name, "@");
|
||||
SAFE_STRCPY(name, l_evtList[EVENT_TAKE_WOODSTATUE].eventName);
|
||||
SAFE_STRCAT(name, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(this, name);
|
||||
dComIfGp_getEvent()->onSkipFade();
|
||||
break;
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#include "m_Do/m_Do_ext.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
#if DEBUG
|
||||
class daNpc_ykW_HIO_c : public mDoHIO_entry_c {
|
||||
public:
|
||||
@@ -1411,11 +1413,11 @@ int daNpc_ykW_c::cutGoIntoBossRoom(int param_0) {
|
||||
|
||||
if (skip != 0 && (prm == 0 || prm == 4)) {
|
||||
if (prm == 0) {
|
||||
strcpy(unkStrBuf1, l_evtList[4].eventName);
|
||||
SAFE_STRCPY(unkStrBuf1, l_evtList[4].eventName);
|
||||
} else {
|
||||
strcpy(unkStrBuf1, l_evtList[5].eventName);
|
||||
SAFE_STRCPY(unkStrBuf1, l_evtList[5].eventName);
|
||||
}
|
||||
strcat(unkStrBuf1, "@");
|
||||
SAFE_STRCAT(unkStrBuf1, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(this, unkStrBuf1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
daObjDrop_HIO_c l_HIO;
|
||||
#endif
|
||||
|
||||
#include <dusk/ui/settings.hpp>
|
||||
|
||||
static void* searchParentSub(void* pproc, void* pdata) {
|
||||
daObjDrop_c* pdrop = (daObjDrop_c*)pdata;
|
||||
fopAc_ac_c* pym = (fopAc_ac_c*)pproc;
|
||||
@@ -103,8 +105,12 @@ void daObjDrop_c::dropGet() {
|
||||
dComIfGs_setLightDropNum(dComIfGp_getStartStageDarkArea(), num + 1);
|
||||
|
||||
if (dComIfGp_getStartStageDarkArea() == 2 &&
|
||||
#if DUSK_TPHD
|
||||
dComIfGs_getLightDropNum(dComIfGp_getStartStageDarkArea()) == 11)
|
||||
#if TARGET_PC
|
||||
((dusk::tphd_active() &&
|
||||
dComIfGs_getLightDropNum(dComIfGp_getStartStageDarkArea()) == 11) ||
|
||||
!dusk::tphd_active() &&
|
||||
dComIfGs_getLightDropNum(dComIfGp_getStartStageDarkArea()) == 15
|
||||
))
|
||||
#else
|
||||
dComIfGs_getLightDropNum(dComIfGp_getStartStageDarkArea()) == 15)
|
||||
#endif
|
||||
|
||||
@@ -192,7 +192,7 @@ inline int daObjFlag_c::createHeap() {
|
||||
tmp = true;
|
||||
|
||||
char resName[12];
|
||||
sprintf(resName, "flag%02d.bmd", angle);
|
||||
SAFE_SPRINTF(resName, "flag%02d.bmd", angle);
|
||||
|
||||
shape_angle.setall(0);
|
||||
current.angle.setall(0);
|
||||
|
||||
@@ -370,7 +370,7 @@ int daObjFlag2_c::createHeap() {
|
||||
s8 flagNum = (u8)shape_angle.x;
|
||||
if (mFlagValid) {
|
||||
char acStack_40[16];
|
||||
sprintf(acStack_40, "flag%02d.bti", flagNum);
|
||||
SAFE_SPRINTF(acStack_40, "flag%02d.bti", flagNum);
|
||||
shape_angle.setall(0);
|
||||
current.angle.setall(0);
|
||||
ResTIMG* image = (ResTIMG*)dComIfG_getObjectRes(mFlagName, "flag.bti");
|
||||
@@ -409,7 +409,7 @@ int daObjFlag2_c::create() {
|
||||
mFlagValid = false;
|
||||
} else {
|
||||
mFlagValid = true;
|
||||
sprintf(mFlagName, "FlagObj%02d", flagNum);
|
||||
SAFE_SPRINTF(mFlagName, "FlagObj%02d", flagNum);
|
||||
int rv = dComIfG_resLoad(&mFlagPhase, mFlagName);
|
||||
if (rv != cPhs_COMPLEATE_e) {
|
||||
return rv;
|
||||
|
||||
@@ -299,7 +299,7 @@ int daObjFlag3_c::createHeap() {
|
||||
s8 flagNum = (u8)shape_angle.x;
|
||||
if (mFlagValid) {
|
||||
char acStack_40[16];
|
||||
sprintf(acStack_40, "flag%02d.bti", flagNum);
|
||||
SAFE_SPRINTF(acStack_40, "flag%02d.bti", flagNum);
|
||||
shape_angle.setall(0);
|
||||
current.angle.setall(0);
|
||||
ResTIMG* image = (ResTIMG*)dComIfG_getObjectRes(mFlagName, "flag.bti");
|
||||
@@ -486,7 +486,7 @@ int daObjFlag3_c::create() {
|
||||
mFlagValid = false;
|
||||
} else {
|
||||
mFlagValid = true;
|
||||
sprintf(mFlagName, "FlagObj%02d", flagNum);
|
||||
SAFE_SPRINTF(mFlagName, "FlagObj%02d", flagNum);
|
||||
int rv = dComIfG_resLoad(&mFlagPhase, mFlagName);
|
||||
if (rv != cPhs_COMPLEATE_e) {
|
||||
return rv;
|
||||
|
||||
@@ -5,13 +5,14 @@
|
||||
|
||||
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
||||
|
||||
#include "d/actor/d_a_obj_gra2.h"
|
||||
#include "d/actor/d_a_npc4.h"
|
||||
#include "d/actor/d_a_obj_gra2.h"
|
||||
#include "d/actor/d_a_tag_gra.h"
|
||||
#include "d/d_bg_w.h"
|
||||
#include "d/d_cc_uty.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/d_com_inf_actor.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "dusk/string.hpp"
|
||||
#if DEBUG
|
||||
#include "d/d_debug_viewer.h"
|
||||
#endif
|
||||
@@ -539,7 +540,7 @@ const char* daObj_GrA_c::getResName() {
|
||||
|
||||
u8 daObj_GrA_c::getMode() {
|
||||
u32 uVar1 = fopAcM_GetParam(this) >> 28 & 3;
|
||||
strcpy(field_0x744, "Obj_grA");
|
||||
SAFE_STRCPY(field_0x744, "Obj_grA");
|
||||
|
||||
switch (uVar1) {
|
||||
case 1:
|
||||
|
||||
@@ -268,6 +268,11 @@ int daItem_c::_daItem_create() {
|
||||
}
|
||||
|
||||
m_itemNo = daItem_prm::getItemNo(this);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.noHeartDrops && isHeart(m_itemNo)) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
#endif
|
||||
BOOL flag = dItem_data::chkFlag(m_itemNo, 2);
|
||||
|
||||
#if DEBUG
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "d/actor/d_a_tag_kmsg.h"
|
||||
#include <types.h>
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
#include "f_op/f_op_actor_mng.h"
|
||||
#include "f_op/f_op_msg.h"
|
||||
|
||||
@@ -1364,8 +1366,8 @@ int daObj_Sekizoa_c::cutStart(int i_staffIdx) {
|
||||
daObj_SMTile_c* actor_4 = (daObj_SMTile_c*)mActorMngrs[4].getActorP();
|
||||
actor_4->reset();
|
||||
dComIfGp_getEvent()->setPt2(actor_4);
|
||||
strcpy(acStack_90, l_evtList[2].eventName);
|
||||
strcat(acStack_90, "@");
|
||||
SAFE_STRCPY(acStack_90, l_evtList[2].eventName);
|
||||
SAFE_STRCAT(acStack_90, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(this, acStack_90);
|
||||
dComIfGp_getEvent()->onSkipFade();
|
||||
if (daNpcT_getPlayerInfoFromPlayerList(1, fopAcM_GetRoomNo(this), &c_stack_9c,
|
||||
@@ -1856,8 +1858,8 @@ int daObj_Sekizoa_c::cutGoal(int i_staffIdx) {
|
||||
switch (prm) {
|
||||
case 0:
|
||||
if (mType == TYPE_0) {
|
||||
strcpy(acStack_9c, l_evtList[6].eventName);
|
||||
strcat(acStack_9c, "@");
|
||||
SAFE_STRCPY(acStack_9c, l_evtList[6].eventName);
|
||||
SAFE_STRCAT(acStack_9c, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(this, acStack_9c);
|
||||
dComIfGp_getEvent()->onSkipFade();
|
||||
}
|
||||
@@ -2222,8 +2224,8 @@ int daObj_Sekizoa_c::cutExtinction(int i_staffIdx) {
|
||||
cStack_b0 += actor_0->current.pos;
|
||||
daPy_getPlayerActorClass()->setPlayerPosAndAngle(&cStack_b0,
|
||||
actor_0->shape_angle.y - -0x8000, 0);
|
||||
strcpy(acStack_a4, l_evtList[9].eventName);
|
||||
strcat(acStack_a4, "@");
|
||||
SAFE_STRCPY(acStack_a4, l_evtList[9].eventName);
|
||||
SAFE_STRCAT(acStack_a4, "@");
|
||||
dComIfGp_getEvent()->setSkipZev(actor_0, acStack_a4);
|
||||
dComIfGp_getEvent()->onSkipFade();
|
||||
actor_0->pullMasterSword();
|
||||
|
||||
@@ -26,7 +26,7 @@ int daSetBgObj_c::CreateInit() {
|
||||
int daSetBgObj_c::create() {
|
||||
fopAcM_ct(this, daSetBgObj_c);
|
||||
|
||||
sprintf(mArcName, "%s", getArcName(this));
|
||||
SAFE_SPRINTF(mArcName, "%s", getArcName(this));
|
||||
|
||||
int phase = dComIfG_resLoad(&mPhase, mArcName);
|
||||
if (phase == cPhs_COMPLEATE_e) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "f_op/f_op_actor_mng.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
static char* l_evtNameList[] = {
|
||||
NULL,
|
||||
"JUMP_DEMOSTAGE",
|
||||
@@ -26,7 +28,7 @@ int daTag_Evt_c::create() {
|
||||
cPhs_Step phase = dComIfG_resLoad(&mPhase, l_resFileName);
|
||||
if (phase == cPhs_COMPLEATE_e) {
|
||||
eventInfo.setArchiveName(l_resFileName);
|
||||
strcpy(field_0x568, "TagEvt");
|
||||
SAFE_STRCPY(field_0x568, "TagEvt");
|
||||
getParam();
|
||||
field_0x572 = -1;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include "d/d_debug_viewer.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
static int createHeapCallBack(fopAc_ac_c* i_this) {
|
||||
daTag_Msg_c* msg = (daTag_Msg_c*)i_this;
|
||||
return msg->createHeap();
|
||||
@@ -219,7 +221,7 @@ void daTag_Msg_c::getParam() {
|
||||
|
||||
scale.x *= 100.0f;
|
||||
scale.y *= 100.0f;
|
||||
strcpy(mStaffName, "Tag_ms");
|
||||
SAFE_STRCPY(mStaffName, "Tag_ms");
|
||||
}
|
||||
|
||||
char* daTag_Msg_c::mEvtCutTBL[2] = {
|
||||
|
||||
@@ -250,7 +250,7 @@ void daTitle_c::loadWait_proc() {
|
||||
text[i]->setFont(mpFont);
|
||||
text[i]->setString(0x80, "");
|
||||
|
||||
char* msg = text[i]->getStringPtr();
|
||||
TEXT_SPAN msg = text[i]->getStringPtr();
|
||||
fopMsgM_messageGet(msg, 100);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "JSystem/JKernel/JKRSolidHeap.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
void dBgp_c::material_c::draw() {
|
||||
material_c* material = this;
|
||||
do {
|
||||
@@ -255,7 +257,7 @@ void dBgp_c::share_c::reset() {
|
||||
|
||||
const char* dBgp_c::share_c::getArcName() {
|
||||
static char arcName[8];
|
||||
sprintf(arcName, "@mt%04x", mId);
|
||||
SAFE_SPRINTF(arcName, "@mt%04x", mId);
|
||||
return arcName;
|
||||
}
|
||||
|
||||
@@ -430,7 +432,7 @@ dBgp_c::packet_c::packet_c() {
|
||||
void dBgp_c::create(s8 i_roomNo, void* i_data) {
|
||||
mPointer = i_data;
|
||||
mPacket.setRoomNo(i_roomNo);
|
||||
strcpy(mArcName, dComIfG_getRoomArcName(i_roomNo));
|
||||
SAFE_STRCPY(mArcName, dComIfG_getRoomArcName(i_roomNo));
|
||||
|
||||
if (mPointer != NULL) {
|
||||
JKRExpHeap* block = dStage_roomControl_c::getMemoryBlock(i_roomNo);
|
||||
@@ -457,7 +459,7 @@ void dBgp_c::create(s8 i_roomNo, void* i_data) {
|
||||
unit_group_class* unitGroup = mapUnit->groups;
|
||||
for (int i = 0; i < mapUnit->num; i++) {
|
||||
char resName[16];
|
||||
sprintf(resName, "bp%04d.dzb", i);
|
||||
SAFE_SPRINTF(resName, "bp%04d.dzb", i);
|
||||
|
||||
cBgD_t* dzb = (cBgD_t*)dComIfG_getStageRes(mArcName, resName);
|
||||
if (dzb != NULL) {
|
||||
@@ -534,7 +536,7 @@ int dBgp_c::remove() {
|
||||
|
||||
const char* dBgp_c::getArcName(u16 i_id, u16 i_arg) {
|
||||
static char arcName[8];
|
||||
sprintf(arcName, "@%03x%03x", i_id, i_arg);
|
||||
SAFE_SPRINTF(arcName, "@%03x%03x", i_id, i_arg);
|
||||
return arcName;
|
||||
}
|
||||
|
||||
|
||||