mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-05 03:29:45 -04:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1a7c853d9b | |||
| 9a3428983b | |||
| 15a846478b | |||
| ff3eb9aa48 | |||
| 513fdd2312 | |||
| f33c3bdf72 | |||
| e08b427650 | |||
| 9f0fa12c6e | |||
| ad4f75bbb6 | |||
| 5d2811955c | |||
| 3b30c09e79 | |||
| 8adc40708e | |||
| 2541c3f293 | |||
| 30b003c9d9 | |||
| c77ed40208 | |||
| af8300a77c | |||
| 1ce1003e1a | |||
| 10e2181692 | |||
| 424d1d7b71 | |||
| 26be454999 | |||
| cf89da811a | |||
| f02c7bd1ac | |||
| 53abb8b96d | |||
| 6a27fa23c8 | |||
| 025a425884 | |||
| 5064385c8c | |||
| e52d9e9b71 | |||
| 3520bb746c | |||
| 1e10d95936 | |||
| a923aa24e1 | |||
| 9c4f61678e | |||
| 7967ee1f66 | |||
| 2bdc7b6c09 | |||
| 232f73365c | |||
| a913f1699f | |||
| 01b4eaa2fa | |||
| 9d2ba3eb49 | |||
| 6026b4bb9b | |||
| 7a77d48954 | |||
| 4ee0d8ed4b | |||
| 00704ad838 | |||
| f52c715364 |
@@ -276,6 +276,12 @@ if (DUSK_ENABLE_SENTRY_NATIVE)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Use signed char on ARM to match the original game (and x86)
|
||||||
|
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _arch)
|
||||||
|
if(_arch MATCHES "^(arm|aarch64)" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
|
||||||
|
add_compile_options(-fsigned-char)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
|
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
|
||||||
set(PLATFORM_NAME win32)
|
set(PLATFORM_NAME win32)
|
||||||
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
|
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
|
||||||
|
|||||||
@@ -1,33 +1,40 @@
|
|||||||
# Installing Dusklight on iOS via AltStore
|
# Installing Dusklight on iOS via iloader
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Mac with Homebrew installed
|
- A Windows, Linux, or macOS device
|
||||||
- iPhone connected via USB
|
- iOS device connected to computer via USB
|
||||||
- Dusklight IPA file (download the latest `Dusklight-vX.X.X-ios-arm64.ipa` from the [releases page](https://github.com/TwilitRealm/dusk/releases))
|
- Dusklight IPA file (download the latest `Dusklight-vX.X.X-ios-arm64.ipa` from the [releases page](https://github.com/TwilitRealm/dusk/releases))
|
||||||
- Game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL)
|
- Game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL)
|
||||||
|
|
||||||
## 1. Install AltServer
|
## 1. Install AltServer
|
||||||
|
|
||||||
```sh
|
- Executable bundles can be installed from [iloader's main page](https://iloader.app/) or [their GitHub](https://github.com/nab138/iloader) for Windows, Linux, and macOS.
|
||||||
brew install altserver
|
- Windows WILL require iTunes to be installed
|
||||||
open -a AltServer
|
- Linux WILL require usbmuxd to be installed, this is installed by default in most distros though
|
||||||
```
|
|
||||||
|
|
||||||
AltServer will appear in your menu bar.
|
|
||||||
|
|
||||||
## 2. Enable Developer Mode (iOS 16+)
|
## 2. Enable Developer Mode (iOS 16+)
|
||||||
|
|
||||||
- On your iPhone, go to **Settings > Privacy & Security > Developer Mode**
|
- On your iPhone, go to **Settings > Privacy & Security > Developer Mode**
|
||||||
- Toggle it on and restart when prompted
|
- Toggle it on and restart when prompted
|
||||||
|
|
||||||
## 3. Install AltStore on Your iPhone
|
## 3. Install Dusklight on Your iPhone
|
||||||
|
|
||||||
- Click AltServer in the menu bar
|
1. Sign into your Apple ID (this is required for registering app IDs, it is sent securely and not stored by iloader)
|
||||||
- Click **Install AltStore > [Your iPhone]**
|
* You may be prompted to put in a code from your iOS device, do so
|
||||||
- Enter your Apple ID credentials when prompted
|
2. Plug in your iOS device via USB into your PC. If you're missing a dependency, an error pop-up will tell you to install it
|
||||||
- On your iPhone, go to **Settings > General > VPN & Device Management**
|
* You will need to hit `Refresh` after plugging it in at this stage so that it can be detected, it does not automatically refresh
|
||||||
- Tap your Apple ID under "Developer App" and tap **Trust**
|
3. Leave settings unchanged (the Anisette server should stay Sidestore (.io))
|
||||||
|
3.(a) Installing SideStore directly is not required, but provides you a way to install Dusklight on your phone without being plugged into a computer later
|
||||||
|
4. Press `Import IPA` and choose your downloaded `Dusk-v.X.X.X-ios-arm64.ipa`, it will begin installing on your device
|
||||||
|
|
||||||
|
**NOTE:** *At various stages, you may be prompted to trust your device, do so*
|
||||||
|
|
||||||
|
## 3. Getting Dusk trusted
|
||||||
|
When installing sideloaded iOS applications, at first you will need to manually trust the app due to Apple's security policies
|
||||||
|
* Go to **Settings > General > VPN & Device Management**
|
||||||
|
* Tap the Apple ID you signed into iloader with under "Developer App" and tap **Trust**
|
||||||
|
* Tap **Allow** on the pop-up
|
||||||
|
|
||||||
## 4. Copy Files to Your iPhone
|
## 4. Copy Files to Your iPhone
|
||||||
|
|
||||||
@@ -38,9 +45,4 @@ Transfer the IPA and game disc to your iPhone so they're accessible in the Files
|
|||||||
- **USB transfer** - Connect your iPhone and drag files via Finder's sidebar
|
- **USB transfer** - Connect your iPhone and drag files via Finder's sidebar
|
||||||
- **Cloud storage** - Upload to Google Drive, Dropbox, etc. and download on your iPhone
|
- **Cloud storage** - Upload to Google Drive, Dropbox, etc. and download on your iPhone
|
||||||
|
|
||||||
## 5. Install via AltStore
|
You may now use Dusklight on iOS, iPadOS!
|
||||||
|
|
||||||
- Open **AltStore** on your iPhone
|
|
||||||
- Go to the **My Apps** tab
|
|
||||||
- Tap the **+** button (top left)
|
|
||||||
- Open the **Files** app and select the `.ipa` file
|
|
||||||
Vendored
+1
-1
Submodule extern/aurora updated: 3643a369ad...40913d532e
@@ -1,8 +1,19 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include <dolphin/types.h>
|
#include <dolphin/types.h>
|
||||||
|
|
||||||
namespace dusk::audio {
|
namespace dusk::audio {
|
||||||
|
|
||||||
|
// Converts a 0-1 volume to a linear amplitude multiplier.
|
||||||
|
// The curve is -4 dB per 10% step: 100% = 0 dB, 90% = -4 dB, ..., 0% = -inf dB
|
||||||
|
inline f32 MasterVolumeToLinear(f32 v) {
|
||||||
|
if (v <= 0.0f) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
return std::pow(10.0f, (v - 1.0f) * 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the audio system and start playing audio.
|
* Initialize the audio system and start playing audio.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <m_Do/m_Do_MemCardRWmng.h>
|
#include <m_Do/m_Do_MemCardRWmng.h>
|
||||||
#include <m_Do/m_Do_MemCard.h>
|
#include <m_Do/m_Do_MemCard.h>
|
||||||
|
#include <d/actor/d_a_alink.h>
|
||||||
|
|
||||||
void noAutoSave();
|
void noAutoSave();
|
||||||
void triggerAutoSave();
|
void triggerAutoSave();
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ class ConfigVar : public ConfigVarBase {
|
|||||||
T defaultValue;
|
T defaultValue;
|
||||||
T value;
|
T value;
|
||||||
T overrideValue;
|
T overrideValue;
|
||||||
|
ConfigVarLayer priorLayer = ConfigVarLayer::Default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
@@ -265,6 +266,7 @@ public:
|
|||||||
void setSpeedrunValue(T newValue) {
|
void setSpeedrunValue(T newValue) {
|
||||||
checkRegistered();
|
checkRegistered();
|
||||||
if (layer != ConfigVarLayer::Override) {
|
if (layer != ConfigVarLayer::Override) {
|
||||||
|
priorLayer = layer;
|
||||||
overrideValue = std::move(newValue);
|
overrideValue = std::move(newValue);
|
||||||
layer = ConfigVarLayer::Speedrun;
|
layer = ConfigVarLayer::Speedrun;
|
||||||
}
|
}
|
||||||
@@ -282,7 +284,7 @@ public:
|
|||||||
checkRegistered();
|
checkRegistered();
|
||||||
if (layer == ConfigVarLayer::Speedrun) {
|
if (layer == ConfigVarLayer::Speedrun) {
|
||||||
overrideValue = {};
|
overrideValue = {};
|
||||||
layer = ConfigVarLayer::Value;
|
layer = priorLayer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +295,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
[[nodiscard]] constexpr const T& getValueForSave() const noexcept {
|
[[nodiscard]] constexpr const T& getValueForSave() const noexcept {
|
||||||
checkRegistered();
|
checkRegistered();
|
||||||
return layer == ConfigVarLayer::Default ? defaultValue : value;
|
const ConfigVarLayer effectiveLayer = (layer == ConfigVarLayer::Speedrun) ? priorLayer : layer;
|
||||||
|
return effectiveLayer == ConfigVarLayer::Default ? defaultValue : value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ void ensure_initialized();
|
|||||||
void begin_record();
|
void begin_record();
|
||||||
void end_record();
|
void end_record();
|
||||||
void begin_sim_tick();
|
void begin_sim_tick();
|
||||||
|
uint64_t sim_tick_seq();
|
||||||
void begin_frame(bool enabled, bool is_sim_frame, float step);
|
void begin_frame(bool enabled, bool is_sim_frame, float step);
|
||||||
void interpolate();
|
void interpolate();
|
||||||
float get_interpolation_step();
|
float get_interpolation_step();
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ struct fopAcM_search_prm {
|
|||||||
struct fOpAcm_HIO_entry_c : public mDoHIO_entry_c {
|
struct fOpAcm_HIO_entry_c : public mDoHIO_entry_c {
|
||||||
virtual ~fOpAcm_HIO_entry_c() {}
|
virtual ~fOpAcm_HIO_entry_c() {}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG && !TARGET_PC
|
||||||
void removeHIO(const fopAc_ac_c* i_this) { removeHIO(*i_this); }
|
void removeHIO(const fopAc_ac_c* i_this) { removeHIO(*i_this); }
|
||||||
void removeHIO(const fopAc_ac_c& i_this) { removeHIO(i_this.base); }
|
void removeHIO(const fopAc_ac_c& i_this) { removeHIO(i_this.base); }
|
||||||
void removeHIO(const fopEn_enemy_c& i_this) { removeHIO(i_this.base); }
|
void removeHIO(const fopEn_enemy_c& i_this) { removeHIO(i_this.base); }
|
||||||
|
|||||||
@@ -28,7 +28,9 @@
|
|||||||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>LSApplicationCategoryType</key>
|
||||||
|
<string>public.app-category.adventure-games</string>
|
||||||
<key>LSSupportsGameMode</key>
|
<key>LSSupportsGameMode</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -58,6 +58,10 @@ toast:active {
|
|||||||
background-color: rgba(45, 43, 26, 80%);
|
background-color: rgba(45, 43, 26, 80%);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
b {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
toast heading {
|
toast heading {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 18dp;
|
gap: 18dp;
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ body {
|
|||||||
color: #E0DBC8;
|
color: #E0DBC8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
window {
|
window {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: column;
|
flex-flow: column;
|
||||||
|
|||||||
@@ -7562,12 +7562,7 @@ void daAlink_c::setBlendMoveAnime(f32 i_morf) {
|
|||||||
f32 sp2C;
|
f32 sp2C;
|
||||||
f32 sp28 = mpHIO->mMove.m.mFootPositionRatio;
|
f32 sp28 = mpHIO->mMove.m.mFootPositionRatio;
|
||||||
BOOL sp24 = checkEventRun();
|
BOOL sp24 = checkEventRun();
|
||||||
BOOL sp20 = checkBootsMoveAnime(1);
|
BOOL sp20 = checkBootsMoveAnime(1) IF_DUSK(&& !dusk::getSettings().game.enableFastIronBoots);
|
||||||
#if TARGET_PC
|
|
||||||
if (dusk::getSettings().game.enableFastIronBoots) {
|
|
||||||
sp20 = FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
f32 var_f29;
|
f32 var_f29;
|
||||||
|
|
||||||
@@ -8080,7 +8075,7 @@ void daAlink_c::setBlendAtnBackMoveAnime(f32 i_morf) {
|
|||||||
daAlink_ANM var_r27;
|
daAlink_ANM var_r27;
|
||||||
daAlink_ANM var_r29;
|
daAlink_ANM var_r29;
|
||||||
|
|
||||||
if (checkBootsMoveAnime(1)) {
|
if (checkBootsMoveAnime(1) IF_DUSK(&& !dusk::getSettings().game.enableFastIronBoots)) {
|
||||||
mMaxSpeed = mpHIO->mAtnMove.m.mMaxBackwardsSpeed;
|
mMaxSpeed = mpHIO->mAtnMove.m.mMaxBackwardsSpeed;
|
||||||
var_f27 = mpHIO->mAtnMove.m.mMinBackWalkFrame;
|
var_f27 = mpHIO->mAtnMove.m.mMinBackWalkFrame;
|
||||||
var_f31 = mpHIO->mAtnMove.m.mBackWalkChangeRate;
|
var_f31 = mpHIO->mAtnMove.m.mBackWalkChangeRate;
|
||||||
|
|||||||
@@ -77,7 +77,12 @@ int daAlink_c::loadModelDVD() {
|
|||||||
mpWlMidnaHairModel = NULL;
|
mpWlMidnaHairModel = NULL;
|
||||||
|
|
||||||
if (!checkNoResetFlg2(FLG2_UNK_280000)) {
|
if (!checkNoResetFlg2(FLG2_UNK_280000)) {
|
||||||
dComIfG_resDelete(&mPhaseReq, mArcName);
|
if (!dComIfG_resDelete(&mPhaseReq, mArcName)) {
|
||||||
|
#if TARGET_PC
|
||||||
|
// resDelete no-ops if load was in-progress; force-unregister before freeAll
|
||||||
|
dComIfG_deleteObjectResMain(mArcName);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
cPhs_Reset(&mPhaseReq);
|
cPhs_Reset(&mPhaseReq);
|
||||||
mpArcHeap->freeAll();
|
mpArcHeap->freeAll();
|
||||||
|
|
||||||
|
|||||||
@@ -8723,6 +8723,12 @@ int daAlink_c::procWolfCargoCarry() {
|
|||||||
return checkNextActionWolf(0);
|
return checkNextActionWolf(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
if (field_0x280c.getActor() == NULL) {
|
||||||
|
return checkNextActionWolf(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
mDoMtx_stack_c::copy(((e_yc_class*)field_0x280c.getActor())->getLegR3Mtx());
|
mDoMtx_stack_c::copy(((e_yc_class*)field_0x280c.getActor())->getLegR3Mtx());
|
||||||
mDoMtx_stack_c::transM(-9.0f, -7.0f, -30.0f);
|
mDoMtx_stack_c::transM(-9.0f, -7.0f, -30.0f);
|
||||||
mDoMtx_stack_c::multVecZero(¤t.pos);
|
mDoMtx_stack_c::multVecZero(¤t.pos);
|
||||||
|
|||||||
@@ -157,6 +157,21 @@ static void* s_h_sub(void* i_actor, void* i_data) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
static void sort_target_info_by_id() {
|
||||||
|
for (int i = 1; i < target_info_count; i++) {
|
||||||
|
void* key = target_info[i];
|
||||||
|
fpc_ProcID key_id = fopAcM_GetID(key);
|
||||||
|
int j = i - 1;
|
||||||
|
while (j >= 0 && fopAcM_GetID(target_info[j]) > key_id) {
|
||||||
|
target_info[j + 1] = target_info[j];
|
||||||
|
j--;
|
||||||
|
}
|
||||||
|
target_info[j + 1] = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static daPillar_c* search_hasira(e_mk_class* i_this) {
|
static daPillar_c* search_hasira(e_mk_class* i_this) {
|
||||||
fopEn_enemy_c* actor = (fopEn_enemy_c*)&i_this->actor;
|
fopEn_enemy_c* actor = (fopEn_enemy_c*)&i_this->actor;
|
||||||
daPillar_c* pillar_p;
|
daPillar_c* pillar_p;
|
||||||
@@ -170,6 +185,9 @@ static daPillar_c* search_hasira(e_mk_class* i_this) {
|
|||||||
|
|
||||||
if (i_this->firstHasiraFlag == 0) {
|
if (i_this->firstHasiraFlag == 0) {
|
||||||
i_this->firstHasiraFlag++;
|
i_this->firstHasiraFlag++;
|
||||||
|
#if TARGET_PC
|
||||||
|
sort_target_info_by_id();
|
||||||
|
#endif
|
||||||
return (daPillar_c*)target_info[TREG_S(7) + 5];
|
return (daPillar_c*)target_info[TREG_S(7) + 5];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7053,6 +7053,12 @@ static int daE_RD_IsDelete(e_rd_class*) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int daE_RD_Delete(e_rd_class* i_this) {
|
static int daE_RD_Delete(e_rd_class* i_this) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (boss == i_this) {
|
||||||
|
boss = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
fopEn_enemy_c* enemy = (fopEn_enemy_c*)&i_this->enemy;
|
fopEn_enemy_c* enemy = (fopEn_enemy_c*)&i_this->enemy;
|
||||||
fopAcM_RegisterDeleteID(i_this, "E_RD");
|
fopAcM_RegisterDeleteID(i_this, "E_RD");
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include "dusk/dusk.h"
|
#include "dusk/dusk.h"
|
||||||
|
#include "dusk/frame_interpolation.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// FRAME INTERP NOTE: Sim tick control point snapshots for interpolation
|
// FRAME INTERP NOTE: Sim tick control point snapshots for interpolation
|
||||||
@@ -32,6 +33,7 @@ int s_horseReinSimNumPrev;
|
|||||||
int s_horseReinSimNumCurr;
|
int s_horseReinSimNumCurr;
|
||||||
bool s_horseReinSimPrevValid;
|
bool s_horseReinSimPrevValid;
|
||||||
bool s_horseReinSimCurrValid;
|
bool s_horseReinSimCurrValid;
|
||||||
|
uint64_t s_horseReinSimRolledSeq;
|
||||||
} // namespace
|
} // namespace
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -3033,10 +3035,14 @@ void daHorse_c::copyReinPos() {
|
|||||||
}
|
}
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
if (field_0x1204 > 0) {
|
if (field_0x1204 > 0) {
|
||||||
if (s_horseReinSimCurrValid && s_horseReinSimNumCurr > 0) {
|
const uint64_t simSeq = dusk::frame_interp::sim_tick_seq();
|
||||||
memcpy(s_horseReinSimPrev, s_horseReinSimCurr, s_horseReinSimNumCurr * sizeof(cXyz));
|
if (simSeq != s_horseReinSimRolledSeq) {
|
||||||
s_horseReinSimNumPrev = s_horseReinSimNumCurr;
|
s_horseReinSimRolledSeq = simSeq;
|
||||||
s_horseReinSimPrevValid = true;
|
if (s_horseReinSimCurrValid && s_horseReinSimNumCurr > 0) {
|
||||||
|
memcpy(s_horseReinSimPrev, s_horseReinSimCurr, s_horseReinSimNumCurr * sizeof(cXyz));
|
||||||
|
s_horseReinSimNumPrev = s_horseReinSimNumCurr;
|
||||||
|
s_horseReinSimPrevValid = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
memcpy(s_horseReinSimCurr, m_reinLine.getPos(0), field_0x1204 * sizeof(cXyz));
|
memcpy(s_horseReinSimCurr, m_reinLine.getPos(0), field_0x1204 * sizeof(cXyz));
|
||||||
s_horseReinSimNumCurr = field_0x1204;
|
s_horseReinSimNumCurr = field_0x1204;
|
||||||
|
|||||||
@@ -1967,7 +1967,11 @@ static void demo_camera_shop(npc_henna_class* i_this) {
|
|||||||
i_this->mMsgFlow.init(actor, 0x365, 0, NULL);
|
i_this->mMsgFlow.init(actor, 0x365, 0, NULL);
|
||||||
/* dSv_event_flag_c::KORO2_ALLCLEAR - Fishing - After all stages (8-8) of roll goal game cleared */
|
/* dSv_event_flag_c::KORO2_ALLCLEAR - Fishing - After all stages (8-8) of roll goal game cleared */
|
||||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x335]);
|
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x335]);
|
||||||
|
#if TARGET_PC
|
||||||
|
dComIfGp_setItemRupeeCount(dComIfGs_getRupeeMax());
|
||||||
|
#else
|
||||||
dComIfGp_setItemRupeeCount(1000);
|
dComIfGp_setItemRupeeCount(1000);
|
||||||
|
#endif
|
||||||
} else if ((lbl_82_bss_91 & 0x38) == 0) {
|
} else if ((lbl_82_bss_91 & 0x38) == 0) {
|
||||||
i_this->mMsgFlow.init(actor, 0x34f, 0, NULL);
|
i_this->mMsgFlow.init(actor, 0x34f, 0, NULL);
|
||||||
/* dSv_event_flag_c::F_0469 - Fishing Pond - Reserved for fishing */
|
/* dSv_event_flag_c::F_0469 - Fishing Pond - Reserved for fishing */
|
||||||
|
|||||||
@@ -299,7 +299,8 @@ int daObjDrop_c::modeParentWait() {
|
|||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static inline BOOL checkGetCargoRide() {
|
static inline BOOL checkGetCargoRide() {
|
||||||
if ((daPy_getPlayerActorClass()->checkCargoCarry() && strcmp(dComIfGp_getStartStageName(), "F_SP112") == 0) ||
|
if (daPy_getPlayerActorClass()->checkCargoCarry() &&
|
||||||
|
strcmp(dComIfGp_getStartStageName(), "F_SP112") == 0 &&
|
||||||
dComIfGs_isLightDropGetFlag(dComIfGp_getStartStageDarkArea()))
|
dComIfGs_isLightDropGetFlag(dComIfGp_getStartStageDarkArea()))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+10
-10
@@ -13,7 +13,7 @@ const u16 l_J_Ohana00_64TEX__height = 63;
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include "dusk/dvd_asset.hpp"
|
#include "dusk/dvd_asset.hpp"
|
||||||
using GameVersion = dusk::version::GameVersion;
|
using GameVersion = dusk::version::GameVersion;
|
||||||
static u8* l_J_Ohana00_64TEX_get() { static u8 buf[0x800]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9060}, {GameVersion::GcnPal, 0x9060}}, 0x800), true); return buf; }
|
static u8* l_J_Ohana00_64TEX_get() { static u8 buf[0x800]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9060}, {GameVersion::GcnPal, 0x9060}, {GameVersion::GcnJpn, 0x9060}}, 0x800), true); return buf; }
|
||||||
#define l_J_Ohana00_64TEX (l_J_Ohana00_64TEX_get())
|
#define l_J_Ohana00_64TEX (l_J_Ohana00_64TEX_get())
|
||||||
#else
|
#else
|
||||||
#include "assets/l_J_Ohana00_64TEX.h"
|
#include "assets/l_J_Ohana00_64TEX.h"
|
||||||
@@ -111,10 +111,10 @@ static u8 l_flowerTexCoord[] = {
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
using GameVersion = dusk::version::GameVersion;
|
using GameVersion = dusk::version::GameVersion;
|
||||||
|
|
||||||
static u8* l_J_hana00DL_get() { static u8 buf[0x150]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9D20}, {GameVersion::GcnPal, 0x9D20}}, 0x150), true); return buf; }
|
static u8* l_J_hana00DL_get() { static u8 buf[0x150]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9D20}, {GameVersion::GcnPal, 0x9D20}, {GameVersion::GcnJpn, 0x9D20}}, 0x150), true); return buf; }
|
||||||
static u8* l_J_hana00_cDL_get() { static u8 buf[0xDE]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9E80}, {GameVersion::GcnPal, 0x9E80}}, 0xDE), true); return buf; }
|
static u8* l_J_hana00_cDL_get() { static u8 buf[0xDE]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9E80}, {GameVersion::GcnPal, 0x9E80}, {GameVersion::GcnJpn, 0x9E80}}, 0xDE), true); return buf; }
|
||||||
static u8* l_matDL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9F60}, {GameVersion::GcnPal, 0x9F60}}, 0x99), true); return buf; }
|
static u8* l_matDL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x9F60}, {GameVersion::GcnPal, 0x9F60}, {GameVersion::GcnJpn, 0x9F60}}, 0x99), true); return buf; }
|
||||||
static u8* l_matLight4DL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xA000}, {GameVersion::GcnPal, 0xA000}}, 0x99), true); return buf; }
|
static u8* l_matLight4DL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xA000}, {GameVersion::GcnPal, 0xA000}, {GameVersion::GcnJpn, 0xA000}}, 0x99), true); return buf; }
|
||||||
#define l_J_hana00DL (l_J_hana00DL_get())
|
#define l_J_hana00DL (l_J_hana00DL_get())
|
||||||
#define l_J_hana00_cDL (l_J_hana00_cDL_get())
|
#define l_J_hana00_cDL (l_J_hana00_cDL_get())
|
||||||
#define l_matDL (l_matDL_get())
|
#define l_matDL (l_matDL_get())
|
||||||
@@ -270,11 +270,11 @@ static u8 l_flowerTexCoord2[] = {
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
using GameVersion = dusk::version::GameVersion;
|
using GameVersion = dusk::version::GameVersion;
|
||||||
|
|
||||||
static u8* l_J_hana01DL_get() { static u8 buf[0x138]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xB7C0}, {GameVersion::GcnPal, 0xB7C0}}, 0x138), true); return buf; }
|
static u8* l_J_hana01DL_get() { static u8 buf[0x138]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xB7C0}, {GameVersion::GcnPal, 0xB7C0}, {GameVersion::GcnJpn, 0xB7C0}}, 0x138), true); return buf; }
|
||||||
static u8* l_J_hana01_c_00DL_get() { static u8 buf[0xDE]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xB900}, {GameVersion::GcnPal, 0xB900}}, 0xDE), true); return buf; }
|
static u8* l_J_hana01_c_00DL_get() { static u8 buf[0xDE]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xB900}, {GameVersion::GcnPal, 0xB900}, {GameVersion::GcnJpn, 0xB900}}, 0xDE), true); return buf; }
|
||||||
static u8* l_J_hana01_c_01DL_get() { static u8 buf[0x128]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xB9E0}, {GameVersion::GcnPal, 0xB9E0}}, 0x128), true); return buf; }
|
static u8* l_J_hana01_c_01DL_get() { static u8 buf[0x128]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xB9E0}, {GameVersion::GcnPal, 0xB9E0}, {GameVersion::GcnJpn, 0xB9E0}}, 0x128), true); return buf; }
|
||||||
static u8* l_mat2DL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xBB20}, {GameVersion::GcnPal, 0xBB20}}, 0x99), true); return buf; }
|
static u8* l_mat2DL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xBB20}, {GameVersion::GcnPal, 0xBB20}, {GameVersion::GcnJpn, 0xBB20}}, 0x99), true); return buf; }
|
||||||
static u8* l_mat2Light4DL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xBBC0}, {GameVersion::GcnPal, 0xBBC0}}, 0x99), true); return buf; }
|
static u8* l_mat2Light4DL_get() { static u8 buf[0x99]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0xBBC0}, {GameVersion::GcnPal, 0xBBC0}, {GameVersion::GcnJpn, 0xBBC0}}, 0x99), true); return buf; }
|
||||||
#define l_J_hana01DL (l_J_hana01DL_get())
|
#define l_J_hana01DL (l_J_hana01DL_get())
|
||||||
#define l_J_hana01_c_00DL (l_J_hana01_c_00DL_get())
|
#define l_J_hana01_c_00DL (l_J_hana01_c_00DL_get())
|
||||||
#define l_J_hana01_c_01DL (l_J_hana01_c_01DL_get())
|
#define l_J_hana01_c_01DL (l_J_hana01_c_01DL_get())
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ const u16 l_M_kusa05_RGBATEX__height = 31;
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include "dusk/dvd_asset.hpp"
|
#include "dusk/dvd_asset.hpp"
|
||||||
using GameVersion = dusk::version::GameVersion;
|
using GameVersion = dusk::version::GameVersion;
|
||||||
static u8* l_M_kusa05_RGBATEX_get() { static u8 buf[0x800]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x7680}, {GameVersion::GcnPal, 0x7680}}, 0x800), true); return buf; }
|
static u8* l_M_kusa05_RGBATEX_get() { static u8 buf[0x800]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x7680}, {GameVersion::GcnPal, 0x7680}, {GameVersion::GcnJpn, 0x7680}}, 0x800), true); return buf; }
|
||||||
static u8* l_M_Hijiki00TEX_get() { static u8 buf[0x800]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x7E80}, {GameVersion::GcnPal, 0x7E80}}, 0x800), true); return buf; }
|
static u8* l_M_Hijiki00TEX_get() { static u8 buf[0x800]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x7E80}, {GameVersion::GcnPal, 0x7E80}, {GameVersion::GcnJpn, 0x7E80}}, 0x800), true); return buf; }
|
||||||
#define l_M_kusa05_RGBATEX (l_M_kusa05_RGBATEX_get())
|
#define l_M_kusa05_RGBATEX (l_M_kusa05_RGBATEX_get())
|
||||||
#define l_M_Hijiki00TEX (l_M_Hijiki00TEX_get())
|
#define l_M_Hijiki00TEX (l_M_Hijiki00TEX_get())
|
||||||
#else
|
#else
|
||||||
@@ -116,12 +116,12 @@ static u8 l_texCoord[160] = {
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
using GameVersion = dusk::version::GameVersion;
|
using GameVersion = dusk::version::GameVersion;
|
||||||
|
|
||||||
static u8* l_M_Kusa_9qDL_get() { static u8 buf[0xCB]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8B00}, {GameVersion::GcnPal, 0x8B00}}, 0xCB), true); return buf; }
|
static u8* l_M_Kusa_9qDL_get() { static u8 buf[0xCB]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8B00}, {GameVersion::GcnPal, 0x8B00}, {GameVersion::GcnJpn, 0x8B00}}, 0xCB), true); return buf; }
|
||||||
static u8* l_M_Kusa_9q_cDL_get() { static u8 buf[0xCB]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8BE0}, {GameVersion::GcnPal, 0x8BE0}}, 0xCB), true); return buf; }
|
static u8* l_M_Kusa_9q_cDL_get() { static u8 buf[0xCB]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8BE0}, {GameVersion::GcnPal, 0x8BE0}, {GameVersion::GcnJpn, 0x8BE0}}, 0xCB), true); return buf; }
|
||||||
static u8* l_M_TenGusaDL_get() { static u8 buf[0xD4]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8CC0}, {GameVersion::GcnPal, 0x8CC0}}, 0xD4), true); return buf; }
|
static u8* l_M_TenGusaDL_get() { static u8 buf[0xD4]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8CC0}, {GameVersion::GcnPal, 0x8CC0}, {GameVersion::GcnJpn, 0x8CC0}}, 0xD4), true); return buf; }
|
||||||
static u8* l_Tengusa_matDL_get() { static u8 buf[0xA8]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8DA0}, {GameVersion::GcnPal, 0x8DA0}}, 0xA8), true); return buf; }
|
static u8* l_Tengusa_matDL_get() { static u8 buf[0xA8]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8DA0}, {GameVersion::GcnPal, 0x8DA0}, {GameVersion::GcnJpn, 0x8DA0}}, 0xA8), true); return buf; }
|
||||||
static u8* l_kusa9q_matDL_get() { static u8 buf[0xA8]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8E60}, {GameVersion::GcnPal, 0x8E60}}, 0xA8), true); return buf; }
|
static u8* l_kusa9q_matDL_get() { static u8 buf[0xA8]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8E60}, {GameVersion::GcnPal, 0x8E60}, {GameVersion::GcnJpn, 0x8E60}}, 0xA8), true); return buf; }
|
||||||
static u8* l_kusa9q_l4_matDL_get() { static u8 buf[0xA8]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8F20}, {GameVersion::GcnPal, 0x8F20}}, 0xA8), true); return buf; }
|
static u8* l_kusa9q_l4_matDL_get() { static u8 buf[0xA8]; static bool _ = (dusk::LoadArchivedRelAsset(buf, 'AMEM', "d_a_grass.rel", {{GameVersion::GcnUsa, 0x8F20}, {GameVersion::GcnPal, 0x8F20}, {GameVersion::GcnJpn, 0x8F20}}, 0xA8), true); return buf; }
|
||||||
#define l_M_Kusa_9qDL (l_M_Kusa_9qDL_get())
|
#define l_M_Kusa_9qDL (l_M_Kusa_9qDL_get())
|
||||||
#define l_M_Kusa_9q_cDL (l_M_Kusa_9q_cDL_get())
|
#define l_M_Kusa_9q_cDL (l_M_Kusa_9q_cDL_get())
|
||||||
#define l_M_TenGusaDL (l_M_TenGusaDL_get())
|
#define l_M_TenGusaDL (l_M_TenGusaDL_get())
|
||||||
|
|||||||
@@ -143,13 +143,12 @@ void dBrightCheck_c::modeMove() {
|
|||||||
if (mDoCPd_c::getTrigA(PAD_1) || mDoCPd_c::getTrigStart(PAD_1)) {
|
if (mDoCPd_c::getTrigA(PAD_1) || mDoCPd_c::getTrigStart(PAD_1)) {
|
||||||
mDoAud_seStart(Z2SE_ENTER_GAME, NULL, 0, 0);
|
mDoAud_seStart(Z2SE_ENTER_GAME, NULL, 0, 0);
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
dusk::speedrun::start();
|
|
||||||
|
|
||||||
if (dusk::getSettings().game.speedrunMode && !dusk::getSettings().game.hideTvSettingsScreen) {
|
if (dusk::getSettings().game.speedrunMode && !dusk::getSettings().game.hideTvSettingsScreen) {
|
||||||
// start a new run if a run isn't already in progress
|
// start a new run if a run isn't already in progress
|
||||||
if (!dusk::m_speedrunInfo.m_isRunStarted) {
|
if (!dusk::m_speedrunInfo.m_isRunStarted) {
|
||||||
dusk::resetForSpeedrunMode();
|
dusk::resetForSpeedrunMode();
|
||||||
dusk::m_speedrunInfo.startRun();
|
dusk::m_speedrunInfo.startRun();
|
||||||
|
dusk::speedrun::start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "d/d_timer.h"
|
#include "d/d_timer.h"
|
||||||
#include "f_op/f_op_msg_mng.h"
|
#include "f_op/f_op_msg_mng.h"
|
||||||
#include "f_op/f_op_scene_mng.h"
|
#include "f_op/f_op_scene_mng.h"
|
||||||
|
#include "m_Do/m_Do_MemCard.h"
|
||||||
#include "m_Do/m_Do_Reset.h"
|
#include "m_Do/m_Do_Reset.h"
|
||||||
#include "m_Do/m_Do_controller_pad.h"
|
#include "m_Do/m_Do_controller_pad.h"
|
||||||
#include "m_Do/m_Do_graphic.h"
|
#include "m_Do/m_Do_graphic.h"
|
||||||
@@ -1238,6 +1239,13 @@ BOOL dComIfG_resetToOpening(scene_class* i_scene) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
if (!mDoMemCd_isCardCommNone()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
g_mDoMemCd_control.SaveSync();
|
||||||
|
#endif
|
||||||
|
|
||||||
dComIfG_changeOpeningScene(i_scene, fpcNm_OPENING_SCENE_e);
|
dComIfG_changeOpeningScene(i_scene, fpcNm_OPENING_SCENE_e);
|
||||||
mDoAud_bgmStop(30);
|
mDoAud_bgmStop(30);
|
||||||
mDoAud_resetProcess();
|
mDoAud_resetProcess();
|
||||||
|
|||||||
@@ -3882,7 +3882,11 @@ bool dCamera_c::hintTalkEvCamera() {
|
|||||||
|
|
||||||
cSAngle acStack_1fc(20.0f);
|
cSAngle acStack_1fc(20.0f);
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
|
#if AVOID_UB
|
||||||
|
for (j = 0; j < 10; j++) {
|
||||||
|
#else
|
||||||
for (j = 0; j < 12; j++) {
|
for (j = 0; j < 12; j++) {
|
||||||
|
#endif
|
||||||
cSAngle acStack_200(local_b0[j] * fVar22);
|
cSAngle acStack_200(local_b0[j] * fVar22);
|
||||||
hintTalk->mDirection.U(acStack_1f8 + acStack_200);
|
hintTalk->mDirection.U(acStack_1f8 + acStack_200);
|
||||||
hintTalk->mDirection.V(((hintTalk->field_0x28.V() * acStack_200.Cos()) * 0.2f) + acStack_1fc);
|
hintTalk->mDirection.V(((hintTalk->field_0x28.V() * acStack_200.Cos()) * 0.2f) + acStack_1fc);
|
||||||
|
|||||||
@@ -26,6 +26,10 @@
|
|||||||
#include "f_op/f_op_overlap_mng.h"
|
#include "f_op/f_op_overlap_mng.h"
|
||||||
#include "m_Do/m_Do_controller_pad.h"
|
#include "m_Do/m_Do_controller_pad.h"
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
#include "dusk/frame_interpolation.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
class dDlst_MENU_CAPTURE_c : public dDlst_base_c {
|
class dDlst_MENU_CAPTURE_c : public dDlst_base_c {
|
||||||
public:
|
public:
|
||||||
virtual void draw() {
|
virtual void draw() {
|
||||||
@@ -1088,6 +1092,10 @@ void dMw_c::dMw_ring_create(u8 i_origin) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mpCapture->setCaptureFlag();
|
mpCapture->setCaptureFlag();
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
dusk::frame_interp::request_presentation_sync();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dMw_c::dMw_ring_delete() {
|
bool dMw_c::dMw_ring_delete() {
|
||||||
|
|||||||
+67
-7
@@ -17,6 +17,62 @@ static bool isPalOrJpn() {
|
|||||||
return dusk::version::isRegionPal() || dusk::version::isRegionJpn();
|
return dusk::version::isRegionPal() || dusk::version::isRegionJpn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
static const char* l_mojiHira[65] = {
|
||||||
|
"\x82\xA0", "\x82\xA2", "\x82\xA4", "\x82\xA6", "\x82\xA8", "\x82\xA9", "\x82\xAB", "\x82\xAD", "\x82\xAF", "\x82\xB1", "\x82\xB3", "\x82\xB5", "\x82\xB7",
|
||||||
|
"\x82\xB9", "\x82\xBB", "\x82\xBD", "\x82\xBF", "\x82\xC2", "\x82\xC4", "\x82\xC6", "\x82\xC8", "\x82\xC9", "\x82\xCA", "\x82\xCB", "\x82\xCC", "\x82\xCD",
|
||||||
|
"\x82\xD0", "\x82\xD3", "\x82\xD6", "\x82\xD9", "\x82\xDC", "\x82\xDD", "\x82\xDE", "\x82\xDF", "\x82\xE0", "\x82\xE2", "\x81\x40", "\x82\xE4", "\x81\x40",
|
||||||
|
"\x82\xE6", "\x82\xE7", "\x82\xE8", "\x82\xE9", "\x82\xEA", "\x82\xEB", "\x82\xED", "\x81\x40", "\x82\xF0", "\x81\x40", "\x82\xF1", "\x82\x9F", "\x82\xA1",
|
||||||
|
"\x82\xA3", "\x82\xA5", "\x82\xA7", "\x82\xE1", "\x81\x40", "\x82\xE3", "\x81\x40", "\x82\xE5", "\x82\xC1", "\x81\x40", "\x81\x5B", "\x81\x4A", "\x81\x4B",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* l_mojiHira2[65] = {
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x82\xAA", "\x82\xAC", "\x82\xAE", "\x82\xB0", "\x82\xB2", "\x82\xB4", "\x82\xB6", "\x82\xB8",
|
||||||
|
"\x82\xBA", "\x82\xBC", "\x82\xBE", "\x82\xC0", "\x82\xC3", "\x82\xC5", "\x82\xC7", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x82\xCE",
|
||||||
|
"\x82\xD1", "\x82\xD4", "\x82\xD7", "\x82\xDA", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* l_mojiHira3[65] = {
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x82\xCF",
|
||||||
|
"\x82\xD2", "\x82\xD5", "\x82\xD8", "\x82\xDB", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* l_mojikata[65] = {
|
||||||
|
"\x83\x41", "\x83\x43", "\x83\x45", "\x83\x47", "\x83\x49", "\x83\x4A", "\x83\x4C", "\x83\x4E", "\x83\x50", "\x83\x52", "\x83\x54", "\x83\x56", "\x83\x58",
|
||||||
|
"\x83\x5A", "\x83\x5C", "\x83\x5E", "\x83\x60", "\x83\x63", "\x83\x65", "\x83\x67", "\x83\x69", "\x83\x6A", "\x83\x6B", "\x83\x6C", "\x83\x6D", "\x83\x6E",
|
||||||
|
"\x83\x71", "\x83\x74", "\x83\x77", "\x83\x7A", "\x83\x7D", "\x83\x7E", "\x83\x80", "\x83\x81", "\x83\x82", "\x83\x84", "\x81\x40", "\x83\x86", "\x81\x40",
|
||||||
|
"\x83\x88", "\x83\x89", "\x83\x8A", "\x83\x8B", "\x83\x8C", "\x83\x8D", "\x83\x8F", "\x81\x40", "\x83\x93", "\x81\x40", "\x83\x93", "\x83\x40", "\x83\x42"
|
||||||
|
"\x83\x44", "\x83\x46", "\x83\x48", "\x83\x83", "\x81\x40", "\x83\x85", "\x81\x40", "\x83\x87", "\x83\x62", "\x81\x40", "\x81\x5B", "\x81\x4A", "\x81\x4B",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* l_mojikata2[65] = {
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x83\x94", "\x81\x8F", "\x81\x8F", "\x83\x4B", "\x83\x4D", "\x83\x4F", "\x83\x51", "\x83\x53", "\x83\x55", "\x83\x57", "\x83\x59",
|
||||||
|
"\x83\x5B", "\x83\x5D", "\x83\x5F", "\x83\x61", "\x83\x64", "\x83\x66", "\x83\x68", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x83\x6F",
|
||||||
|
"\x83\x72", "\x83\x75", "\x83\x78", "\x83\x7B", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* l_mojikata3[65] = {
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x83\x70",
|
||||||
|
"\x83\x73", "\x83\x76", "\x83\x79", "\x83\x7C", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
"\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F", "\x81\x8F",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* l_mojiEisu[65] = {
|
||||||
|
"A", "N", "a", "n", "1", "B", "O", "b", "o", "2", "C", "P", "c", "p", "3", "D", "Q",
|
||||||
|
"d", "q", "4", "E", "R", "e", "r", "5", "F", "S", "f", "s", "6", "G", "T", "g", "t",
|
||||||
|
"7", "H", "U", "h", "u", "8", "I", "V", "i", "v", "9", "J", "W", "j", "w", "0", "K",
|
||||||
|
"X", "k", "x", ",", "L", "Y", "l", "y", ".", "M", "Z", "m", "z", " ",
|
||||||
|
};
|
||||||
|
#else
|
||||||
static const char* l_mojiHira[65] = {
|
static const char* l_mojiHira[65] = {
|
||||||
"あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す",
|
"あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す",
|
||||||
"せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は",
|
"せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は",
|
||||||
@@ -71,22 +127,23 @@ static const char* l_mojiEisu[65] = {
|
|||||||
"7", "H", "U", "h", "u", "8", "I", "V", "i", "v", "9", "J", "W", "j", "w", "0", "K",
|
"7", "H", "U", "h", "u", "8", "I", "V", "i", "v", "9", "J", "W", "j", "w", "0", "K",
|
||||||
"X", "k", "x", ",", "L", "Y", "l", "y", ".", "M", "Z", "m", "z", " ",
|
"X", "k", "x", ",", "L", "Y", "l", "y", ".", "M", "Z", "m", "z", " ",
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
// The game normally mutates this string list to fill in the real character codes.
|
// The game normally mutates this string list to fill in the real character codes.
|
||||||
// That can't work on a modern platform, so instead I've filled them out ahead of time.
|
// That can't work on a modern platform, so instead I've filled them out ahead of time.
|
||||||
static const char* l_mojiEisuPal_1[65] = {
|
static const char* l_mojiEisuPal_1[65] = {
|
||||||
"A", "N", "\xC0", "\xCF", "1", "B", "O", "\xC1", "\xD0", "2", "C", "P", "\xC2", "\xD1", "3", "D", "Q",
|
"A", "N", "\xC0", "\xCF", "1", "B", "O", "\xC1", "\xD0", "2", "C", "P", "\xC2", "\xD1", "3", "D", "Q",
|
||||||
"\xC3", "\xD2", "4", "E", "R", "\xC4", "\xD3", "5", "F", "S", "\xC5", "\xD4", "6", "G", "T", "\xC6", "\xD5",
|
"\xC4", "\xD2", "4", "E", "R", "\xC6", "\xD3", "5", "F", "S", "\xC7", "\xD4", "6", "G", "T", "\xC8", "\xD6",
|
||||||
"7", "H", "U", "\xC7", "\xD6", "8", "I", "V", "\xC8", "\xD7", "9", "J", "W", "\xC9", "\xD8", "0", "K",
|
"7", "H", "U", "\xC9", "\x8C", "8", "I", "V", "\xCA", "\xD9", "9", "J", "W", "\xCB", "\xDA", "0", "K",
|
||||||
"X", "\xCA", "\xD9", ",", "L", "Y", "\xCB", "\xDA", ".", "M", "Z", "\xCC", "\xDB", " ",
|
"X", "\xCC", "\xDB", ",", "L", "Y", "\xCD", "\xDC", ".", "M", "Z", "\xCE", "\x2D", " ",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* l_mojiEisuPal_2[65] = {
|
static const char* l_mojiEisuPal_2[65] = {
|
||||||
"a", "n", "\xE0", "\xEF", "1", "b", "o", "\xE1", "\xF0", "2", "c", "p", "\xE2", "\xF1", "3", "d", "q",
|
"a", "n", "\xE0", "\xEF", "1", "b", "o", "\xE1", "\xF0", "2", "c", "p", "\xE2", "\xF1", "3", "d", "q",
|
||||||
"\xE3", "\xF2", "4", "e", "r", "\xE4", "\xF3", "5", "f", "s", "\xE5", "\xF4", "6", "g", "t", "\xE6",
|
"\xE4", "\xF2", "4", "e", "r", "\xE6", "\xF3", "5", "f", "s", "\xE7", "\xF4", "6", "g", "t", "\xE8",
|
||||||
"\xF5", "7", "h", "u", "\xE7", "\xF6", "8", "i", "v", "\xE8", "\xF7", "9", "j", "w", "\xE9", "\xF8", "0",
|
"\xF6", "7", "h", "u", "\xE9", "\x9C", "8", "i", "v", "\xEA", "\xF9", "9", "j", "w", "\xEB", "\xFA", "0",
|
||||||
"k", "x", "\xEA", "\xF9", ",", "l", "y", "\xEB", "\xFA", ".", "m", "z", "\xEC", "\xFB", " ",
|
"k", "x", "\xEC", "\xFB", ",", "l", "y", "\xED", "\xFC", ".", "m", "z", "\xEE", "\xDF", " ",
|
||||||
};
|
};
|
||||||
#elif REGION_PAL
|
#elif REGION_PAL
|
||||||
static const char* l_mojiEisuPal_1[65] = {
|
static const char* l_mojiEisuPal_1[65] = {
|
||||||
@@ -295,6 +352,7 @@ void dName_c::_move() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#endif
|
||||||
|
#if !TARGET_PC
|
||||||
if (mDoCPd_c::getTrigRight(PAD_1)) {
|
if (mDoCPd_c::getTrigRight(PAD_1)) {
|
||||||
// BUG: this check only fails if the cursor is at exactly 7
|
// BUG: this check only fails if the cursor is at exactly 7
|
||||||
// setMoji allows the cursor to reach 8, which is out of bounds here
|
// setMoji allows the cursor to reach 8, which is out of bounds here
|
||||||
@@ -311,7 +369,9 @@ void dName_c::_move() {
|
|||||||
mCurPos--;
|
mCurPos--;
|
||||||
nameCursorMove();
|
nameCursorMove();
|
||||||
}
|
}
|
||||||
} else if (mDoCPd_c::getTrigB(PAD_1)) {
|
} else
|
||||||
|
#endif
|
||||||
|
if (mDoCPd_c::getTrigB(PAD_1)) {
|
||||||
if (mCurPos == 0) {
|
if (mCurPos == 0) {
|
||||||
mDoAud_seStart(Z2SE_SY_MENU_BACK, 0, 0, 0);
|
mDoAud_seStart(Z2SE_SY_MENU_BACK, 0, 0, 0);
|
||||||
field_0x2ac = mSelProc;
|
field_0x2ac = mSelProc;
|
||||||
|
|||||||
+8
-1
@@ -907,7 +907,14 @@ dScnLogo_c::~dScnLogo_c() {
|
|||||||
mDoExt_getRubyFont();
|
mDoExt_getRubyFont();
|
||||||
mDoExt_setAraCacheSize(free_size - aram_heap->getTotalFreeSize());
|
mDoExt_setAraCacheSize(free_size - aram_heap->getTotalFreeSize());
|
||||||
|
|
||||||
#if VERSION == VERSION_GCN_JPN
|
#if TARGET_PC
|
||||||
|
if (getGameVersion() == GameVersion::GcnJpn) {
|
||||||
|
if (dComIfGp_getFontArchive() != NULL) {
|
||||||
|
dComIfGp_getFontArchive()->unmount();
|
||||||
|
dComIfGp_setFontArchive(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif VERSION == VERSION_GCN_JPN
|
||||||
if (dComIfGp_getFontArchive() != NULL) {
|
if (dComIfGp_getFontArchive() != NULL) {
|
||||||
dComIfGp_getFontArchive()->unmount();
|
dComIfGp_getFontArchive()->unmount();
|
||||||
dComIfGp_setFontArchive(NULL);
|
dComIfGp_setFontArchive(NULL);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "d/d_meter2_info.h"
|
#include "d/d_meter2_info.h"
|
||||||
#include "d/d_s_name.h"
|
#include "d/d_s_name.h"
|
||||||
#include "dusk/imgui/ImGuiConsole.hpp"
|
#include "dusk/imgui/ImGuiConsole.hpp"
|
||||||
|
#include "dusk/livesplit.h"
|
||||||
#include "dusk/memory.h"
|
#include "dusk/memory.h"
|
||||||
#include "dusk/speedrun.h"
|
#include "dusk/speedrun.h"
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
@@ -422,6 +423,7 @@ void dScnName_c::changeGameScene() {
|
|||||||
if (!dusk::m_speedrunInfo.m_isRunStarted) {
|
if (!dusk::m_speedrunInfo.m_isRunStarted) {
|
||||||
dusk::resetForSpeedrunMode();
|
dusk::resetForSpeedrunMode();
|
||||||
dusk::m_speedrunInfo.startRun();
|
dusk::m_speedrunInfo.startRun();
|
||||||
|
dusk::speedrun::start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-5
@@ -30,7 +30,9 @@
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
#include <f_ap/f_ap_game.h>
|
#include <f_ap/f_ap_game.h>
|
||||||
#include <dusk/autosave.h>
|
|
||||||
|
#include "dusk/string.hpp"
|
||||||
|
#define strcpy dusk::SafeStringCopy
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static u8 dSv_item_rename(u8 i_itemNo) {
|
static u8 dSv_item_rename(u8 i_itemNo) {
|
||||||
@@ -349,10 +351,6 @@ void dSv_player_item_c::setItem(int i_slotNo, u8 i_itemNo) {
|
|||||||
dComIfGp_setSelectItem(i);
|
dComIfGp_setSelectItem(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
triggerAutoSave();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 dSv_player_item_c::getItem(int i_slotNo, bool i_checkCombo) const {
|
u8 dSv_player_item_c::getItem(int i_slotNo, bool i_checkCombo) const {
|
||||||
|
|||||||
@@ -191,13 +191,17 @@ std::vector<AchievementSystem::Entry> AchievementSystem::makeEntries() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool hasJewelRod = false;
|
bool hasJewelRod = false;
|
||||||
for (int slot = 0; slot < 24 && !hasJewelRod; ++slot) {
|
bool hasAncientDoc = false;
|
||||||
|
for (int slot = 0; slot < 24; ++slot) {
|
||||||
const u8 item = dComIfGs_getItem(slot, false);
|
const u8 item = dComIfGs_getItem(slot, false);
|
||||||
if (item == dItemNo_JEWEL_ROD_e || item == dItemNo_JEWEL_BEE_ROD_e || item == dItemNo_JEWEL_WORM_ROD_e) {
|
if (item == dItemNo_JEWEL_ROD_e || item == dItemNo_JEWEL_BEE_ROD_e || item == dItemNo_JEWEL_WORM_ROD_e) {
|
||||||
hasJewelRod = true;
|
hasJewelRod = true;
|
||||||
}
|
}
|
||||||
|
if (item == dItemNo_ANCIENT_DOCUMENT_e || item == dItemNo_ANCIENT_DOCUMENT2_e || item == dItemNo_AIR_LETTER_e) {
|
||||||
|
hasAncientDoc = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!hasJewelRod) {
|
if (!hasJewelRod || !hasAncientDoc) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +216,6 @@ std::vector<AchievementSystem::Entry> AchievementSystem::makeEntries() {
|
|||||||
dItemNo_KANTERA_e,
|
dItemNo_KANTERA_e,
|
||||||
dItemNo_PACHINKO_e,
|
dItemNo_PACHINKO_e,
|
||||||
dItemNo_HAWK_EYE_e,
|
dItemNo_HAWK_EYE_e,
|
||||||
dItemNo_ANCIENT_DOCUMENT_e,
|
|
||||||
dItemNo_HORSE_FLUTE_e,
|
dItemNo_HORSE_FLUTE_e,
|
||||||
};
|
};
|
||||||
for (u8 required : requiredWheelItems) {
|
for (u8 required : requiredWheelItems) {
|
||||||
|
|||||||
+26
-6
@@ -14,9 +14,23 @@ static AutoSaveFuncs AutoSaveFuncsProc[] = {
|
|||||||
|
|
||||||
void noAutoSave() {}
|
void noAutoSave() {}
|
||||||
|
|
||||||
|
bool canAutoSave() {
|
||||||
|
daAlink_c* player = (daAlink_c*)daAlink_getAlinkActorClass();
|
||||||
|
if (player == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->checkCargoCarry() || player->checkCanoeRide()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dusk::getSettings().game.autoSave && shouldAutoSave && mAutoSaveProc == 0 &&
|
||||||
|
strcmp(dComIfGp_getStartStageName(), "F_SP102") != 0 &&
|
||||||
|
strcmp(dComIfGp_getStartStageName(), "F_SP112") != 0;
|
||||||
|
}
|
||||||
|
|
||||||
void triggerAutoSave() {
|
void triggerAutoSave() {
|
||||||
if (dusk::getSettings().game.autoSave && shouldAutoSave && mAutoSaveProc == 0 &&
|
if (canAutoSave())
|
||||||
strcmp(dComIfGp_getStartStageName(), "F_SP102") != 0)
|
|
||||||
{
|
{
|
||||||
mAutoSaveProc = 1;
|
mAutoSaveProc = 1;
|
||||||
}
|
}
|
||||||
@@ -26,8 +40,12 @@ void updateAutoSave() {
|
|||||||
(AutoSaveFuncsProc[mAutoSaveProc])();
|
(AutoSaveFuncsProc[mAutoSaveProc])();
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeAutoSave() {
|
bool writeAutoSave() {
|
||||||
int stageNo = dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo());
|
stage_stag_info_class* stagInfo = dComIfGp_getStageStagInfo();
|
||||||
|
if (stagInfo == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int stageNo = dStage_stagInfo_GetSaveTbl(stagInfo);
|
||||||
|
|
||||||
dComIfGs_putSave(stageNo);
|
dComIfGs_putSave(stageNo);
|
||||||
dComIfGs_setMemoryToCard(mSaveBuffer, dComIfGs_getDataNum());
|
dComIfGs_setMemoryToCard(mSaveBuffer, dComIfGs_getDataNum());
|
||||||
@@ -40,6 +58,7 @@ void writeAutoSave() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_mDoMemCd_control.save(mSaveBuffer, sizeof(mSaveBuffer), 0);
|
g_mDoMemCd_control.save(mSaveBuffer, sizeof(mSaveBuffer), 0);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void autoSaving() {
|
void autoSaving() {
|
||||||
@@ -48,8 +67,9 @@ void autoSaving() {
|
|||||||
if (cardState == 2) {
|
if (cardState == 2) {
|
||||||
mAutoSaveProc = 1;
|
mAutoSaveProc = 1;
|
||||||
} else if (cardState == 1) {
|
} else if (cardState == 1) {
|
||||||
writeAutoSave();
|
if (writeAutoSave()) {
|
||||||
mAutoSaveProc = 3;
|
mAutoSaveProc = 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+43
-23
@@ -78,6 +78,7 @@ struct MigrationStats {
|
|||||||
|
|
||||||
std::optional<std::filesystem::path> sConfiguredDataPath;
|
std::optional<std::filesystem::path> sConfiguredDataPath;
|
||||||
std::optional<std::filesystem::path> sActiveDescriptorPath;
|
std::optional<std::filesystem::path> sActiveDescriptorPath;
|
||||||
|
std::optional<std::filesystem::path> sActivePrefPath;
|
||||||
|
|
||||||
std::filesystem::path path_from_utf8(std::string_view value) {
|
std::filesystem::path path_from_utf8(std::string_view value) {
|
||||||
return std::filesystem::path{
|
return std::filesystem::path{
|
||||||
@@ -86,19 +87,22 @@ std::filesystem::path path_from_utf8(std::string_view value) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path get_legacy_path() {
|
std::filesystem::path legacy_path_for_pref_path(const std::filesystem::path& prefPath) {
|
||||||
if (std::string_view{LegacyAppName}.empty()) {
|
if (std::string_view{LegacyAppName}.empty() || prefPath.empty()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
char* prefPath = SDL_GetPrefPath(OrgName, LegacyAppName);
|
auto normalizedPrefPath = prefPath;
|
||||||
if (!prefPath) {
|
if (normalizedPrefPath.filename().empty()) {
|
||||||
Log.fatal("Unable to get PrefPath: {}", SDL_GetError());
|
normalizedPrefPath = normalizedPrefPath.parent_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path result{reinterpret_cast<const char8_t*>(prefPath)};
|
const auto parentPath = normalizedPrefPath.parent_path();
|
||||||
SDL_free(prefPath);
|
if (parentPath.empty()) {
|
||||||
return result;
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return parentPath / LegacyAppName;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path get_pref_path() {
|
std::filesystem::path get_pref_path() {
|
||||||
@@ -112,6 +116,13 @@ std::filesystem::path get_pref_path() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::filesystem::path active_pref_path() {
|
||||||
|
if (sActivePrefPath) {
|
||||||
|
return *sActivePrefPath;
|
||||||
|
}
|
||||||
|
return get_pref_path();
|
||||||
|
}
|
||||||
|
|
||||||
std::filesystem::path base_path_relative(const std::filesystem::path& path) {
|
std::filesystem::path base_path_relative(const std::filesystem::path& path) {
|
||||||
const auto* basePath = SDL_GetBasePath();
|
const auto* basePath = SDL_GetBasePath();
|
||||||
if (!basePath) {
|
if (!basePath) {
|
||||||
@@ -265,12 +276,12 @@ std::filesystem::path absolute_path(const std::filesystem::path& path) {
|
|||||||
return absolute.lexically_normal();
|
return absolute.lexically_normal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rename_legacy_pref_path(
|
std::filesystem::path rename_legacy_pref_path(
|
||||||
const std::filesystem::path& legacyPath, const std::filesystem::path& prefPath) {
|
const std::filesystem::path& legacyPath, const std::filesystem::path& prefPath) {
|
||||||
if (legacyPath.empty() || prefPath.empty() ||
|
if (legacyPath.empty() || prefPath.empty() ||
|
||||||
normalized_path(legacyPath) == normalized_path(prefPath))
|
normalized_path(legacyPath) == normalized_path(prefPath))
|
||||||
{
|
{
|
||||||
return;
|
return prefPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
@@ -279,14 +290,14 @@ void rename_legacy_pref_path(
|
|||||||
Log.warn("Failed to inspect legacy data directory '{}': {}",
|
Log.warn("Failed to inspect legacy data directory '{}': {}",
|
||||||
io::fs_path_to_string(legacyPath), ec.message());
|
io::fs_path_to_string(legacyPath), ec.message());
|
||||||
}
|
}
|
||||||
return;
|
return prefPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool prefExists = std::filesystem::exists(prefPath, ec);
|
const bool prefExists = std::filesystem::exists(prefPath, ec);
|
||||||
if (ec) {
|
if (ec) {
|
||||||
Log.warn("Failed to inspect data directory '{}': {}", io::fs_path_to_string(prefPath),
|
Log.warn("Failed to inspect data directory '{}': {}", io::fs_path_to_string(prefPath),
|
||||||
ec.message());
|
ec.message());
|
||||||
return;
|
return prefPath;
|
||||||
}
|
}
|
||||||
if (prefExists) {
|
if (prefExists) {
|
||||||
if (!std::filesystem::is_directory(prefPath, ec) ||
|
if (!std::filesystem::is_directory(prefPath, ec) ||
|
||||||
@@ -299,14 +310,14 @@ void rename_legacy_pref_path(
|
|||||||
Log.info("Skipping legacy data directory rename because '{}' is not empty",
|
Log.info("Skipping legacy data directory rename because '{}' is not empty",
|
||||||
io::fs_path_to_string(prefPath));
|
io::fs_path_to_string(prefPath));
|
||||||
}
|
}
|
||||||
return;
|
return prefPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::remove(prefPath, ec);
|
std::filesystem::remove(prefPath, ec);
|
||||||
if (ec) {
|
if (ec) {
|
||||||
Log.warn("Failed to remove empty data directory '{}' before legacy rename: {}",
|
Log.warn("Failed to remove empty data directory '{}' before legacy rename: {}",
|
||||||
io::fs_path_to_string(prefPath), ec.message());
|
io::fs_path_to_string(prefPath), ec.message());
|
||||||
return;
|
return prefPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,11 +325,18 @@ void rename_legacy_pref_path(
|
|||||||
if (ec) {
|
if (ec) {
|
||||||
Log.warn("Failed to rename legacy data directory '{}' to '{}': {}",
|
Log.warn("Failed to rename legacy data directory '{}' to '{}': {}",
|
||||||
io::fs_path_to_string(legacyPath), io::fs_path_to_string(prefPath), ec.message());
|
io::fs_path_to_string(legacyPath), io::fs_path_to_string(prefPath), ec.message());
|
||||||
return;
|
ec.clear();
|
||||||
|
if (!std::filesystem::exists(prefPath, ec) && !ec) {
|
||||||
|
Log.info("Using legacy data directory '{}' because the new data directory is absent",
|
||||||
|
io::fs_path_to_string(legacyPath));
|
||||||
|
return legacyPath;
|
||||||
|
}
|
||||||
|
return prefPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.info("Renamed legacy data directory '{}' to '{}'", io::fs_path_to_string(legacyPath),
|
Log.info("Renamed legacy data directory '{}' to '{}'", io::fs_path_to_string(legacyPath),
|
||||||
io::fs_path_to_string(prefPath));
|
io::fs_path_to_string(prefPath));
|
||||||
|
return prefPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_same_or_inside(const std::filesystem::path& root, const std::filesystem::path& path) {
|
bool is_same_or_inside(const std::filesystem::path& root, const std::filesystem::path& path) {
|
||||||
@@ -394,7 +412,7 @@ std::filesystem::path current_data_path() {
|
|||||||
if (!ConfigPath.empty()) {
|
if (!ConfigPath.empty()) {
|
||||||
return ConfigPath;
|
return ConfigPath;
|
||||||
}
|
}
|
||||||
const auto prefPath = get_pref_path();
|
const auto prefPath = active_pref_path();
|
||||||
const auto descriptor = read_location_descriptor(prefPath);
|
const auto descriptor = read_location_descriptor(prefPath);
|
||||||
if (descriptor) {
|
if (descriptor) {
|
||||||
sActiveDescriptorPath = descriptor->path;
|
sActiveDescriptorPath = descriptor->path;
|
||||||
@@ -460,7 +478,7 @@ bool write_location_descriptor(LocationMode mode, const std::filesystem::path& t
|
|||||||
json["previousPath"] = io::fs_path_to_string(descriptor.previousPath);
|
json["previousPath"] = io::fs_path_to_string(descriptor.previousPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto prefPath = get_pref_path();
|
const auto prefPath = active_pref_path();
|
||||||
for (const auto& path : descriptor_write_paths(prefPath)) {
|
for (const auto& path : descriptor_write_paths(prefPath)) {
|
||||||
if (write_descriptor_json(path, json)) {
|
if (write_descriptor_json(path, json)) {
|
||||||
sActiveDescriptorPath = path;
|
sActiveDescriptorPath = path;
|
||||||
@@ -1013,12 +1031,12 @@ bool set_portable_data_path() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool reset_data_path() {
|
bool reset_data_path() {
|
||||||
const auto prefPath = get_pref_path();
|
const auto prefPath = active_pref_path();
|
||||||
return write_location_descriptor(LocationMode::Default, default_data_path(prefPath));
|
return write_location_descriptor(LocationMode::Default, default_data_path(prefPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_default_data_path() {
|
bool is_default_data_path() {
|
||||||
const auto prefPath = get_pref_path();
|
const auto prefPath = active_pref_path();
|
||||||
return normalized_path(configured_data_path()) == normalized_path(default_data_path(prefPath));
|
return normalized_path(configured_data_path()) == normalized_path(default_data_path(prefPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1027,7 +1045,7 @@ std::filesystem::path configured_data_path() {
|
|||||||
return *sConfiguredDataPath;
|
return *sConfiguredDataPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto prefPath = get_pref_path();
|
const auto prefPath = active_pref_path();
|
||||||
const auto descriptor = read_location_descriptor(prefPath);
|
const auto descriptor = read_location_descriptor(prefPath);
|
||||||
if (descriptor) {
|
if (descriptor) {
|
||||||
sActiveDescriptorPath = descriptor->path;
|
sActiveDescriptorPath = descriptor->path;
|
||||||
@@ -1041,7 +1059,7 @@ std::filesystem::path cache_path() {
|
|||||||
if (!CachePath.empty()) {
|
if (!CachePath.empty()) {
|
||||||
return CachePath;
|
return CachePath;
|
||||||
}
|
}
|
||||||
return get_pref_path();
|
return active_pref_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_data_path_restart_pending() {
|
bool is_data_path_restart_pending() {
|
||||||
@@ -1053,8 +1071,10 @@ bool is_data_path_restart_pending() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Paths initialize_data() {
|
Paths initialize_data() {
|
||||||
const auto prefPath = get_pref_path();
|
const auto preferredPrefPath = get_pref_path();
|
||||||
rename_legacy_pref_path(get_legacy_path(), prefPath);
|
const auto prefPath =
|
||||||
|
rename_legacy_pref_path(legacy_path_for_pref_path(preferredPrefPath), preferredPrefPath);
|
||||||
|
sActivePrefPath = prefPath;
|
||||||
|
|
||||||
const auto descriptor = read_location_descriptor(prefPath);
|
const auto descriptor = read_location_descriptor(prefPath);
|
||||||
if (descriptor) {
|
if (descriptor) {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ bool g_sync_presentation = false;
|
|||||||
float g_step = 0.0f;
|
float g_step = 0.0f;
|
||||||
bool g_is_sim_frame = false;
|
bool g_is_sim_frame = false;
|
||||||
bool g_ui_tick_pending = false;
|
bool g_ui_tick_pending = false;
|
||||||
|
uint64_t g_sim_tick_seq = 0;
|
||||||
|
|
||||||
Recording g_current_recording;
|
Recording g_current_recording;
|
||||||
Recording g_previous_recording;
|
Recording g_previous_recording;
|
||||||
@@ -66,19 +67,18 @@ void copy_view_to_snap(CameraSnapshot* dst, const view_class& v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void lerp_matrix(Mtx out, const Mtx lhs, const Mtx rhs, float step) {
|
inline void lerp_matrix(Mtx out, const Mtx lhs, const Mtx rhs, float step) {
|
||||||
const float old_weight = 1.0f - step;
|
|
||||||
for (size_t row = 0; row < 3; ++row) {
|
for (size_t row = 0; row < 3; ++row) {
|
||||||
for (size_t col = 0; col < 4; ++col) {
|
for (size_t col = 0; col < 4; ++col) {
|
||||||
out[row][col] = lhs[row][col] * old_weight + rhs[row][col] * step;
|
const float l = lhs[row][col];
|
||||||
|
out[row][col] = l + (rhs[row][col] - l) * step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void lerp_xyz(cXyz* out, const cXyz& lhs, const cXyz& rhs, float step) {
|
inline void lerp_xyz(cXyz* out, const cXyz& lhs, const cXyz& rhs, float step) {
|
||||||
const float old_weight = 1.0f - step;
|
out->x = lhs.x + (rhs.x - lhs.x) * step;
|
||||||
out->x = lhs.x * old_weight + rhs.x * step;
|
out->y = lhs.y + (rhs.y - lhs.y) * step;
|
||||||
out->y = lhs.y * old_weight + rhs.y * step;
|
out->z = lhs.z + (rhs.z - lhs.z) * step;
|
||||||
out->z = lhs.z * old_weight + rhs.z * step;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static s16 lerp_bank(s16 a, s16 b, f32 t) {
|
static s16 lerp_bank(s16 a, s16 b, f32 t) {
|
||||||
@@ -135,6 +135,11 @@ void begin_sim_tick() {
|
|||||||
|
|
||||||
s_interpolationCallBackWork.clear();
|
s_interpolationCallBackWork.clear();
|
||||||
s_cam_prev = std::move(s_cam_curr);
|
s_cam_prev = std::move(s_cam_curr);
|
||||||
|
++g_sim_tick_seq;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t sim_tick_seq() {
|
||||||
|
return g_sim_tick_seq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void begin_frame(bool enabled, bool is_sim_frame, float step) {
|
void begin_frame(bool enabled, bool is_sim_frame, float step) {
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ namespace dusk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (getSettings().game.enableResetKeybind && ImGui::GetIO().KeyCtrl &&
|
if (getSettings().game.enableResetKeybind && ImGui::GetIO().KeyCtrl &&
|
||||||
ImGui::IsKeyPressed(ImGuiKey_R) && !fpcM_SearchByName(fpcNm_LOGO_SCENE_e))
|
ImGui::IsKeyReleased(ImGuiKey_R) && !fpcM_SearchByName(fpcNm_LOGO_SCENE_e))
|
||||||
{
|
{
|
||||||
JUTGamePad::C3ButtonReset::sResetSwitchPushing = true;
|
JUTGamePad::C3ButtonReset::sResetSwitchPushing = true;
|
||||||
}
|
}
|
||||||
@@ -322,8 +322,8 @@ namespace dusk {
|
|||||||
}
|
}
|
||||||
ImGui::PushFont(ImGuiEngine::fontLarge);
|
ImGui::PushFont(ImGuiEngine::fontLarge);
|
||||||
ImGuiTextCenter("Failed to initialize any graphics backend.");
|
ImGuiTextCenter("Failed to initialize any graphics backend.");
|
||||||
ImGuiTextCenter("\nYour system may be misconfigured, or your hardware may not support the required versions of any of the available backends.");
|
ImGuiTextCenter("\nDusklight requires Vulkan 1.1+, or Direct X 12.0.");
|
||||||
ImGuiTextCenter("\nA clean reinstall of Dusklight may help. For further assistance, please visit #tech-support on the Twilit Realm Discord server.");
|
ImGuiTextCenter("\nTry updating your Operating System and GPU drivers.");
|
||||||
const auto& style = ImGui::GetStyle();
|
const auto& style = ImGui::GetStyle();
|
||||||
const auto retrySize = ImGui::CalcTextSize("Retry (Auto backend)");
|
const auto retrySize = ImGui::CalcTextSize("Retry (Auto backend)");
|
||||||
const auto quitSize = ImGui::CalcTextSize("Quit");
|
const auto quitSize = ImGui::CalcTextSize("Quit");
|
||||||
|
|||||||
@@ -60,18 +60,6 @@ const char* verification_state_name(dusk::DiscVerificationState state) noexcept
|
|||||||
|
|
||||||
namespace dusk::iso {
|
namespace dusk::iso {
|
||||||
|
|
||||||
enum class Platform : u8 {
|
|
||||||
GameCube,
|
|
||||||
Wii,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Region : u8 {
|
|
||||||
NorthAmerica,
|
|
||||||
Europe,
|
|
||||||
Japan,
|
|
||||||
Korea,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct KnownDisc {
|
struct KnownDisc {
|
||||||
std::string_view id;
|
std::string_view id;
|
||||||
Platform platform;
|
Platform platform;
|
||||||
@@ -88,7 +76,7 @@ struct KnownDisc {
|
|||||||
|
|
||||||
constexpr auto KNOWN_DISCS = std::to_array<KnownDisc>({
|
constexpr auto KNOWN_DISCS = std::to_array<KnownDisc>({
|
||||||
{"GZ2E01", Platform::GameCube, Region::NorthAmerica, "14e886f08e548a000afde98a3195e788"},
|
{"GZ2E01", Platform::GameCube, Region::NorthAmerica, "14e886f08e548a000afde98a3195e788"},
|
||||||
{"GZ2J01", Platform::GameCube, Region::Japan},
|
{"GZ2J01", Platform::GameCube, Region::Japan, "5967dc7a6a553652f4d2050aeef6f368"},
|
||||||
{"GZ2P01", Platform::GameCube, Region::Europe, "9ef597588b0035ca9e91b333fa9a8a7e"},
|
{"GZ2P01", Platform::GameCube, Region::Europe, "9ef597588b0035ca9e91b333fa9a8a7e"},
|
||||||
{"RZDE01", Platform::Wii, Region::NorthAmerica},
|
{"RZDE01", Platform::Wii, Region::NorthAmerica},
|
||||||
{"RZDJ01", Platform::Wii, Region::Japan},
|
{"RZDJ01", Platform::Wii, Region::Japan},
|
||||||
@@ -216,7 +204,9 @@ ValidationError validate(const char* path, VerificationStatus& status, DiscInfo&
|
|||||||
return ValidationError::WrongGame;
|
return ValidationError::WrongGame;
|
||||||
}
|
}
|
||||||
status.knownDisc = knownDisc;
|
status.knownDisc = knownDisc;
|
||||||
info.isPal = knownDisc->region == Region::Europe;
|
|
||||||
|
info.platform = knownDisc->platform;
|
||||||
|
info.region = knownDisc->region;
|
||||||
if (!knownDisc->supported) {
|
if (!knownDisc->supported) {
|
||||||
return ValidationError::WrongVersion;
|
return ValidationError::WrongVersion;
|
||||||
}
|
}
|
||||||
@@ -251,7 +241,9 @@ ValidationError inspect(const char* path, DiscInfo& info) {
|
|||||||
if (!knownDisc) {
|
if (!knownDisc) {
|
||||||
return ValidationError::WrongGame;
|
return ValidationError::WrongGame;
|
||||||
}
|
}
|
||||||
info.isPal = knownDisc->region == Region::Europe;
|
|
||||||
|
info.platform = knownDisc->platform;
|
||||||
|
info.region = knownDisc->region;
|
||||||
if (!knownDisc->supported) {
|
if (!knownDisc->supported) {
|
||||||
return ValidationError::WrongVersion;
|
return ValidationError::WrongVersion;
|
||||||
}
|
}
|
||||||
@@ -260,7 +252,7 @@ ValidationError inspect(const char* path, DiscInfo& info) {
|
|||||||
|
|
||||||
bool isPal(const char* path) {
|
bool isPal(const char* path) {
|
||||||
DiscInfo info{};
|
DiscInfo info{};
|
||||||
return inspect(path, info) == ValidationError::Success && info.isPal;
|
return inspect(path, info) == ValidationError::Success && info.region == Region::Europe;
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_verification_state(std::string_view path, DiscVerificationState state) {
|
void log_verification_state(std::string_view path, DiscVerificationState state) {
|
||||||
|
|||||||
@@ -17,6 +17,18 @@ enum class ValidationError : u8 {
|
|||||||
Success
|
Success
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class Platform : u8 {
|
||||||
|
GameCube,
|
||||||
|
Wii,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class Region : u8 {
|
||||||
|
NorthAmerica,
|
||||||
|
Europe,
|
||||||
|
Japan,
|
||||||
|
Korea,
|
||||||
|
};
|
||||||
|
|
||||||
struct VerificationStatus {
|
struct VerificationStatus {
|
||||||
std::atomic_size_t bytesRead = 0;
|
std::atomic_size_t bytesRead = 0;
|
||||||
std::atomic_size_t bytesTotal = 0;
|
std::atomic_size_t bytesTotal = 0;
|
||||||
@@ -25,7 +37,8 @@ struct VerificationStatus {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct DiscInfo {
|
struct DiscInfo {
|
||||||
bool isPal = false;
|
Platform platform = Platform::GameCube;
|
||||||
|
Region region = Region::NorthAmerica;
|
||||||
};
|
};
|
||||||
|
|
||||||
ValidationError inspect(const char* path, DiscInfo& info);
|
ValidationError inspect(const char* path, DiscInfo& info);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ UserSettings g_userSettings = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
.audio = {
|
.audio = {
|
||||||
.masterVolume {"audio.masterVolume", 80},
|
.masterVolume {"audio.masterVolume", 60},
|
||||||
.mainMusicVolume {"audio.mainMusicVolume", 100},
|
.mainMusicVolume {"audio.mainMusicVolume", 100},
|
||||||
.subMusicVolume {"audio.subMusicVolume", 100},
|
.subMusicVolume {"audio.subMusicVolume", 100},
|
||||||
.soundEffectsVolume {"audio.soundEffectsVolume", 100},
|
.soundEffectsVolume {"audio.soundEffectsVolume", 100},
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ Rml::String format_graphics_setting_value(GraphicsOption option, int value) {
|
|||||||
case BloomMode::Classic:
|
case BloomMode::Classic:
|
||||||
return "Classic";
|
return "Classic";
|
||||||
case BloomMode::Dusk:
|
case BloomMode::Dusk:
|
||||||
return "Dusk";
|
return "Dusklight";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GraphicsOption::BloomMultiplier:
|
case GraphicsOption::BloomMultiplier:
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ Rml::String back_button_name() {
|
|||||||
#if defined(TARGET_ANDROID) || (defined(__APPLE__) && TARGET_OS_IOS && !TARGET_OS_MACCATALYST)
|
#if defined(TARGET_ANDROID) || (defined(__APPLE__) && TARGET_OS_IOS && !TARGET_OS_MACCATALYST)
|
||||||
constexpr auto kMenuNotificationPrefix = "3-finger tap or";
|
constexpr auto kMenuNotificationPrefix = "3-finger tap or";
|
||||||
#else
|
#else
|
||||||
constexpr auto kMenuNotificationPrefix = "Press F1 or";
|
constexpr auto kMenuNotificationPrefix = "Press <b>F1</b> or";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Rml::Element* create_menu_notification(Rml::Element* parent) {
|
Rml::Element* create_menu_notification(Rml::Element* parent) {
|
||||||
@@ -169,7 +169,7 @@ Rml::Element* create_menu_notification(Rml::Element* parent) {
|
|||||||
append(row, "span")->SetInnerRML(kMenuNotificationPrefix);
|
append(row, "span")->SetInnerRML(kMenuNotificationPrefix);
|
||||||
auto* icon = append(row, "icon");
|
auto* icon = append(row, "icon");
|
||||||
icon->SetClass("controller", true);
|
icon->SetClass("controller", true);
|
||||||
append(row, "span")->SetInnerRML(escape(padButton));
|
append(row, "span")->SetInnerRML("<b>" + escape(padButton) + "</b>");
|
||||||
append(row, "span")->SetInnerRML("to open menu");
|
append(row, "span")->SetInnerRML("to open menu");
|
||||||
|
|
||||||
return elem;
|
return elem;
|
||||||
@@ -354,8 +354,9 @@ void Overlay::update() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 count = 0;
|
||||||
const bool showControllerWarning = PADGetIndexForPort(PAD_CHAN0) < 0 &&
|
const bool showControllerWarning = PADGetIndexForPort(PAD_CHAN0) < 0 &&
|
||||||
PADGetKeyButtonBindings(PAD_CHAN0, nullptr) == nullptr &&
|
PADGetKeyButtonBindings(PAD_CHAN0, &count) == nullptr &&
|
||||||
dynamic_cast<Window*>(top_document()) == nullptr &&
|
dynamic_cast<Window*>(top_document()) == nullptr &&
|
||||||
dynamic_cast<WindowSmall*>(top_document()) == nullptr;
|
dynamic_cast<WindowSmall*>(top_document()) == nullptr;
|
||||||
if (showControllerWarning && mControllerWarning == nullptr) {
|
if (showControllerWarning && mControllerWarning == nullptr) {
|
||||||
|
|||||||
@@ -877,8 +877,36 @@ void Prelaunch::update() {
|
|||||||
if (mDiscDetail != nullptr) {
|
if (mDiscDetail != nullptr) {
|
||||||
if (activeDiscLoaded) {
|
if (activeDiscLoaded) {
|
||||||
mDiscDetail->SetProperty(Rml::PropertyId::Display, Rml::Style::Display::Block);
|
mDiscDetail->SetProperty(Rml::PropertyId::Display, Rml::Style::Display::Block);
|
||||||
Rml::String innerRML = "GameCube • ";
|
Rml::String innerRML = "";
|
||||||
innerRML += state.activeDiscInfo.isPal ? "EUR" : "USA";
|
|
||||||
|
switch (state.activeDiscInfo.platform) {
|
||||||
|
case iso::Platform::GameCube:
|
||||||
|
innerRML += "GameCube";
|
||||||
|
break;
|
||||||
|
case iso::Platform::Wii:
|
||||||
|
innerRML += "Wii";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
innerRML += " • ";
|
||||||
|
|
||||||
|
switch (state.activeDiscInfo.region) {
|
||||||
|
case iso::Region::Japan:
|
||||||
|
innerRML += "JPN";
|
||||||
|
break;
|
||||||
|
case iso::Region::Europe:
|
||||||
|
innerRML += "EUR";
|
||||||
|
break;
|
||||||
|
case iso::Region::NorthAmerica:
|
||||||
|
innerRML += "USA";
|
||||||
|
break;
|
||||||
|
case iso::Region::Korea:
|
||||||
|
innerRML += "KOR";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
innerRML += "Unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
mDiscDetail->SetInnerRML(innerRML);
|
mDiscDetail->SetInnerRML(innerRML);
|
||||||
} else {
|
} else {
|
||||||
mDiscDetail->SetProperty(Rml::PropertyId::Display, Rml::Style::Display::None);
|
mDiscDetail->SetProperty(Rml::PropertyId::Display, Rml::Style::Display::None);
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ PresetWindow::PresetWindow() : WindowSmall("modal", "modal-dialog") {
|
|||||||
"Enhancements disabled to match the GameCube version. "
|
"Enhancements disabled to match the GameCube version. "
|
||||||
"Good for speedrunning or simple nostalgia!",
|
"Good for speedrunning or simple nostalgia!",
|
||||||
applyPresetClassic},
|
applyPresetClassic},
|
||||||
{"Dusk",
|
{"Dusklight",
|
||||||
"Graphics & quality of life tweaks, including some from the Wii U version. "
|
"Graphics & quality of life tweaks, including some from the Wii U version. "
|
||||||
"Our recommended way to play!",
|
"Our recommended way to play!",
|
||||||
applyPresetDusk},
|
applyPresetDusk},
|
||||||
|
|||||||
@@ -562,7 +562,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
.getValue =
|
.getValue =
|
||||||
[] {
|
[] {
|
||||||
const auto& state = prelaunch_state();
|
const auto& state = prelaunch_state();
|
||||||
if (!state.configuredDiscCanLaunch || !state.configuredDiscInfo.isPal) {
|
if (!state.configuredDiscCanLaunch || state.configuredDiscInfo.region != iso::Region::Europe) {
|
||||||
return kLanguageNames[0];
|
return kLanguageNames[0];
|
||||||
}
|
}
|
||||||
const u8 idx = static_cast<u8>(getSettings().game.language.getValue());
|
const u8 idx = static_cast<u8>(getSettings().game.language.getValue());
|
||||||
@@ -572,7 +572,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
[] {
|
[] {
|
||||||
const auto& state = prelaunch_state();
|
const auto& state = prelaunch_state();
|
||||||
return !state.configuredDiscCanLaunch ||
|
return !state.configuredDiscCanLaunch ||
|
||||||
!state.configuredDiscInfo.isPal;
|
state.configuredDiscInfo.region != iso::Region::Europe;
|
||||||
},
|
},
|
||||||
.isModified =
|
.isModified =
|
||||||
[] {
|
[] {
|
||||||
@@ -953,7 +953,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
[](int value) {
|
[](int value) {
|
||||||
getSettings().audio.masterVolume.setValue(value);
|
getSettings().audio.masterVolume.setValue(value);
|
||||||
config::Save();
|
config::Save();
|
||||||
audio::SetMasterVolume(value / 100.f);
|
audio::SetMasterVolume(audio::MasterVolumeToLinear(value / 100.0f));
|
||||||
},
|
},
|
||||||
.isModified =
|
.isModified =
|
||||||
[] {
|
[] {
|
||||||
@@ -1068,8 +1068,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
addOption("Faster Tears of Light", getSettings().game.fastTears,
|
addOption("Faster Tears of Light", getSettings().game.fastTears,
|
||||||
"Tears of Light dropped by Shadow Insects pop out faster like the HD version.");
|
"Tears of Light dropped by Shadow Insects pop out faster like the HD version.");
|
||||||
addSpeedrunDisabledOption("Autosave", getSettings().game.autoSave,
|
addSpeedrunDisabledOption("Autosave", getSettings().game.autoSave,
|
||||||
"Autosaves the game when going to a new area, opening a dungeon door, "
|
"Autosaves the game when going to a new area or opening a dungeon door.");
|
||||||
"or getting a new item.");
|
|
||||||
addOption("Instant Saves", getSettings().game.instantSaves,
|
addOption("Instant Saves", getSettings().game.instantSaves,
|
||||||
"Skips the delay when writing to the Memory Card.");
|
"Skips the delay when writing to the Memory Card.");
|
||||||
addOption("Hold B for Instant Text", getSettings().game.instantText,
|
addOption("Hold B for Instant Text", getSettings().game.instantText,
|
||||||
@@ -1166,7 +1165,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
addCheat("Always Greatspin", getSettings().game.alwaysGreatspin,
|
addCheat("Always Greatspin", getSettings().game.alwaysGreatspin,
|
||||||
"Allows the Great Spin attack without requiring full health.");
|
"Allows the Great Spin attack without requiring full health.");
|
||||||
addCheat("Fast Iron Boots", getSettings().game.enableFastIronBoots,
|
addCheat("Fast Iron Boots", getSettings().game.enableFastIronBoots,
|
||||||
"Speeds up movement while wearing the Iron Boots.");
|
"Speeds up movement while heavy, including wearing the Iron Boots, holding the Ball and Chain, wearing Magic Armor without rupees, etc.");
|
||||||
addCheat("Can Transform Anywhere", getSettings().game.canTransformAnywhere,
|
addCheat("Can Transform Anywhere", getSettings().game.canTransformAnywhere,
|
||||||
"Allows transforming even if NPCs are looking.");
|
"Allows transforming even if NPCs are looking.");
|
||||||
addCheat("Fast Roll", getSettings().game.fastRoll,
|
addCheat("Fast Roll", getSettings().game.fastRoll,
|
||||||
@@ -1301,7 +1300,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
config_bool_select(leftPane, rightPane, getSettings().game.enableDiscordPresence,
|
config_bool_select(leftPane, rightPane, getSettings().game.enableDiscordPresence,
|
||||||
{
|
{
|
||||||
.key = "Enable Discord Rich Presence",
|
.key = "Enable Discord Rich Presence",
|
||||||
.helpText = "Enable Dusk to integrate with Discord Rich Presence. This allows Discord to show your status in-game.",
|
.helpText = "Enable Dusklight to integrate with Discord Rich Presence. This allows Discord to show your status in-game.",
|
||||||
.onChange = [](bool enabled) {
|
.onChange = [](bool enabled) {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
dusk::discord::initialize();
|
dusk::discord::initialize();
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ void init() {
|
|||||||
gameVersion = GameVersion::GcnUsa;
|
gameVersion = GameVersion::GcnUsa;
|
||||||
} else if (game == "GZ2P") {
|
} else if (game == "GZ2P") {
|
||||||
gameVersion = GameVersion::GcnPal;
|
gameVersion = GameVersion::GcnPal;
|
||||||
|
} else if (game == "GZ2J") {
|
||||||
|
gameVersion = GameVersion::GcnJpn;
|
||||||
} else {
|
} else {
|
||||||
// TODO: Handle remaining valid versions.
|
// TODO: Handle remaining valid versions.
|
||||||
DuskLog.fatal("Unknown/unsupported game version in disc: {}", game);
|
DuskLog.fatal("Unknown/unsupported game version in disc: {}", game);
|
||||||
|
|||||||
@@ -807,7 +807,7 @@ static void duskExecute() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dusk::getSettings().game.infiniteRupees) {
|
if (dusk::getSettings().game.infiniteRupees) {
|
||||||
dComIfGs_setRupee(9999);
|
dComIfGs_setRupee(dComIfGs_getRupeeMax());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dusk::getSettings().game.infiniteOxygen) {
|
if (dusk::getSettings().game.infiniteOxygen) {
|
||||||
|
|||||||
+10
-1
@@ -136,8 +136,17 @@ base_process_class* fpcBs_Create(s16 i_profname, fpc_ProcID i_procID, void* i_ap
|
|||||||
u32 size;
|
u32 size;
|
||||||
|
|
||||||
pprofile = (process_profile_definition*)fpcPf_Get(i_profname);
|
pprofile = (process_profile_definition*)fpcPf_Get(i_profname);
|
||||||
|
if (pprofile == NULL) {
|
||||||
|
#if TARGET_PC
|
||||||
|
DuskLog.debug("fpcBs_Create: profile not found for profname={}", i_profname);
|
||||||
|
#endif
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
const char* procName = getProcName(i_profname);
|
||||||
DuskLog.debug("fpcBs_Create: pid={} profname={} ({}) profile={} procSize={} unkSize={}",
|
DuskLog.debug("fpcBs_Create: pid={} profname={} ({}) profile={} procSize={} unkSize={}",
|
||||||
i_procID, getProcName(i_profname), i_profname, (void*)pprofile, pprofile->process_size, pprofile->unk_size);
|
i_procID, procName ? procName : "(unknown)", i_profname, (void*)pprofile, pprofile->process_size, pprofile->unk_size);
|
||||||
|
#endif
|
||||||
size = pprofile->process_size + pprofile->unk_size;
|
size = pprofile->process_size + pprofile->unk_size;
|
||||||
|
|
||||||
pprocess = (base_process_class*)cMl::memalignB(-4, size);
|
pprocess = (base_process_class*)cMl::memalignB(-4, size);
|
||||||
|
|||||||
+17
-2
@@ -26,6 +26,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "dusk/logging.h"
|
#include "dusk/logging.h"
|
||||||
#include "dusk/frame_interpolation.h"
|
#include "dusk/frame_interpolation.h"
|
||||||
|
#include "dusk/version.hpp"
|
||||||
|
|
||||||
u8 mDoExt::CurrentHeapAdjustVerbose;
|
u8 mDoExt::CurrentHeapAdjustVerbose;
|
||||||
u8 mDoExt::HeapAdjustVerbose;
|
u8 mDoExt::HeapAdjustVerbose;
|
||||||
@@ -3701,7 +3702,15 @@ static ResFONT* mDoExt_resfont0;
|
|||||||
|
|
||||||
static void mDoExt_initFont0() {
|
static void mDoExt_initFont0() {
|
||||||
static char const fontdata[] = "rodan_b_24_22.bfn";
|
static char const fontdata[] = "rodan_b_24_22.bfn";
|
||||||
#if REGION_JPN
|
#if TARGET_PC
|
||||||
|
if (dusk::version::getGameVersion() == dusk::version::GameVersion::GcnJpn) {
|
||||||
|
mDoExt_initFontCommon(&mDoExt_font0, &mDoExt_resfont0, mDoExt_getZeldaHeap(),
|
||||||
|
fontdata, dComIfGp_getFontArchive(), 0, 200, 512);
|
||||||
|
} else {
|
||||||
|
mDoExt_initFontCommon(&mDoExt_font0, &mDoExt_resfont0, mDoExt_getZeldaHeap(),
|
||||||
|
fontdata, dComIfGp_getFontArchive(), 1, 0, 0);
|
||||||
|
}
|
||||||
|
#elif REGION_JPN
|
||||||
mDoExt_initFontCommon(&mDoExt_font0, &mDoExt_resfont0, mDoExt_getZeldaHeap(),
|
mDoExt_initFontCommon(&mDoExt_font0, &mDoExt_resfont0, mDoExt_getZeldaHeap(),
|
||||||
fontdata, dComIfGp_getFontArchive(), 0, 200, 512);
|
fontdata, dComIfGp_getFontArchive(), 0, 200, 512);
|
||||||
#else
|
#else
|
||||||
@@ -3728,7 +3737,13 @@ void mDoExt_removeMesgFont() {
|
|||||||
JKR_DELETE(mDoExt_font0);
|
JKR_DELETE(mDoExt_font0);
|
||||||
mDoExt_font0 = NULL;
|
mDoExt_font0 = NULL;
|
||||||
if (mDoExt_resfont0 != NULL) {
|
if (mDoExt_resfont0 != NULL) {
|
||||||
#if REGION_JPN
|
#if TARGET_PC
|
||||||
|
if (dusk::version::getGameVersion() == dusk::version::GameVersion::GcnJpn) {
|
||||||
|
JKRFileLoader::removeResource(mDoExt_resfont0, NULL);
|
||||||
|
} else {
|
||||||
|
JKRFree(mDoExt_resfont0);
|
||||||
|
}
|
||||||
|
#elif REGION_JPN
|
||||||
JKRFileLoader::removeResource(mDoExt_resfont0, NULL);
|
JKRFileLoader::removeResource(mDoExt_resfont0, NULL);
|
||||||
#else
|
#else
|
||||||
JKRFree(mDoExt_resfont0);
|
JKRFree(mDoExt_resfont0);
|
||||||
|
|||||||
@@ -96,8 +96,8 @@ void mDoLib_project(Vec* src, Vec* dst) {
|
|||||||
xSize = FB_WIDTH;
|
xSize = FB_WIDTH;
|
||||||
} else {
|
} else {
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
xOffset = mDoGph_gInf_c::getSafeMinXF();
|
xOffset = mDoGph_gInf_c::getMinXF();
|
||||||
xSize = viewPort->width * mDoGph_gInf_c::hudAspectScaleUp;
|
xSize = mDoGph_gInf_c::getWidthF();
|
||||||
#else
|
#else
|
||||||
xOffset = viewPort->x_orig;
|
xOffset = viewPort->x_orig;
|
||||||
xSize = viewPort->width;
|
xSize = viewPort->width;
|
||||||
|
|||||||
@@ -585,7 +585,7 @@ int game_main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
VISetFrameBufferScale(dusk::getSettings().game.internalResolutionScale.getValue());
|
VISetFrameBufferScale(dusk::getSettings().game.internalResolutionScale.getValue());
|
||||||
|
|
||||||
dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f);
|
dusk::audio::SetMasterVolume(dusk::audio::MasterVolumeToLinear(dusk::getSettings().audio.masterVolume / 100.0f));
|
||||||
dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb);
|
dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb);
|
||||||
dusk::audio::EnableHrtf = dusk::getSettings().audio.enableHrtf;
|
dusk::audio::EnableHrtf = dusk::getSettings().audio.enableHrtf;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user