mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-08-03 00:16:36 -04:00
Merge branch 'main' of https://github.com/TwilitRealm/dusk into randomizer
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
#include "d/d_com_inf_game.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include <aurora/texture.hpp>
|
||||
#include "dusk/dvd_asset.hpp"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
|
||||
@@ -40,6 +41,8 @@ static f32* l_texCoord_get() { alignas(32) static f32 buf[338]; static bool _
|
||||
//#define l_pos (l_pos_get())
|
||||
#define l_normal (l_normal_get())
|
||||
#define l_texCoord (l_texCoord_get())
|
||||
|
||||
static bool l_Egnd_mantTEX_hasReplacement = false;
|
||||
#else
|
||||
#include "assets/l_Egnd_mantTEX.h"
|
||||
|
||||
@@ -223,6 +226,7 @@ void daMant_packet_c::draw() {
|
||||
GXInitTexObjCI(
|
||||
&undersideTexObj, l_Egnd_mantTEX_U, 0x80, 0x80, GX_TF_C8, GX_CLAMP, GX_CLAMP, 0, 0);
|
||||
GXInitTexObjLOD(&undersideTexObj, GX_LINEAR, GX_LINEAR, 0.0, 0.0, 0.0, 0, 0, GX_ANISO_1);
|
||||
l_Egnd_mantTEX_hasReplacement = aurora::texture::has_replacement(&mainTexObj, &tlutObj);
|
||||
textureObjsInitialized = true;
|
||||
}
|
||||
#else
|
||||
@@ -636,7 +640,11 @@ static int daMant_Execute(mant_class* i_this) {
|
||||
iVar8 = 0;
|
||||
|
||||
if (i_this->field_0x3967 != 0) {
|
||||
#if TARGET_PC
|
||||
mant_cut_type = l_Egnd_mantTEX_hasReplacement ? 1 : i_this->field_0x3967;
|
||||
#else
|
||||
mant_cut_type = i_this->field_0x3967;
|
||||
#endif
|
||||
|
||||
if (i_this->field_0x3968 < 15) {
|
||||
i_this->field_0x3968++;
|
||||
@@ -648,9 +656,18 @@ static int daMant_Execute(mant_class* i_this) {
|
||||
iVar8 = 20;
|
||||
}
|
||||
|
||||
unaff_r29 = cM_rndF(65536.0f);
|
||||
var_f31 = cM_rndFX(32.0f);
|
||||
var_f30 = cM_rndFX(32.0f);
|
||||
#if TARGET_PC
|
||||
if (l_Egnd_mantTEX_hasReplacement) {
|
||||
unaff_r29 = i_this->mMantRng.getF(65536.0f);
|
||||
var_f31 = i_this->mMantRng.getFX(32.0f);
|
||||
var_f30 = i_this->mMantRng.getFX(32.0f);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
unaff_r29 = cM_rndF(65536.0f);
|
||||
var_f31 = cM_rndFX(32.0f);
|
||||
var_f30 = cM_rndFX(32.0f);
|
||||
}
|
||||
}
|
||||
|
||||
i_this->field_0x3967 = 0;
|
||||
@@ -760,6 +777,8 @@ static int daMant_Create(fopAc_ac_c* i_this) {
|
||||
if(textureObjsInitialized) {
|
||||
GXInitTlutObjData(&tlutObj, l_Egnd_mantPAL); // make sure the cached textures are updated
|
||||
}
|
||||
|
||||
m_this->mMantRng.init(66, 16983, 855);
|
||||
#endif
|
||||
|
||||
lbl_277_bss_0 = 0;
|
||||
|
||||
@@ -7602,6 +7602,10 @@ bool dCamera_c::executeDebugFlyCam() {
|
||||
sFlyCamLastMousePos = mouseValid ? io.MousePos : ImVec2{-1.0f, -1.0f};
|
||||
}
|
||||
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
stickX *= -1.0f;
|
||||
}
|
||||
|
||||
f32 verticalDisp = 0.0f;
|
||||
if (trigR >= FLYCAM_TRIGGER_DEADZONE) {
|
||||
verticalDisp += trigR;
|
||||
|
||||
+20
-12
@@ -426,7 +426,15 @@ void dMenu_Fmap2DBack_c::draw() {
|
||||
}
|
||||
|
||||
mpPointParent->setAlphaRate(mArrowAlpha * mSpotTextureFadeAlpha);
|
||||
mpPointParent->translate(mArrowPos2DX + mTransX, mArrowPos2DY + mTransZ);
|
||||
|
||||
f32 drawX = mArrowPos2DX + mTransX;
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
drawX = getMirrorPosX(drawX, 0.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
mpPointParent->translate(drawX, mArrowPos2DY + mTransZ);
|
||||
mpPointScreen->draw(0.0f, 0.0f, grafPort);
|
||||
}
|
||||
|
||||
@@ -745,7 +753,7 @@ void dMenu_Fmap2DBack_c::zoomMapCalc(f32 i_zoom) {
|
||||
|
||||
f32 tmp2 = (dVar12 + (i_zoom * (centerX - dVar12)));
|
||||
f32 tmp2_ = (dVar11 + (i_zoom * (centerY - dVar11)));
|
||||
|
||||
|
||||
field_0xf0c[mRegionCursor] =
|
||||
((tmp2 + (tmp3 * mZoom)) - mRegionMapSizeX[mRegionCursor] * mZoom * 0.5f) -
|
||||
mRegionMinMapX[mRegionCursor];
|
||||
@@ -1005,6 +1013,11 @@ void dMenu_Fmap2DBack_c::allmap_move2(STControl* param_0) {
|
||||
f32 stickValue = param_0->getValueStick();
|
||||
if (stickValue >= spC) {
|
||||
s16 angle = param_0->getAngleStick();
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
angle = -angle;
|
||||
}
|
||||
#endif
|
||||
f32 local_68 = (mTexMaxX - mTexMinX);
|
||||
f32 zoomRate = local_68 / getAllMapZoomRate();
|
||||
f32 sp24;
|
||||
@@ -1046,11 +1059,6 @@ void dMenu_Fmap2DBack_c::allmap_move2(STControl* param_0) {
|
||||
calcAllMapPos2D((mArrowPos3DX + control_xpos) - mStageTransX,
|
||||
(mArrowPos3DZ + control_ypos) - mStageTransZ, &sp14, &sp10);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
sp14 = getMirrorPosX(sp14, 0.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
mSelectRegion = 0xff;
|
||||
for (int i = 7; i >= 0; i--) {
|
||||
@@ -1907,6 +1915,11 @@ void dMenu_Fmap2DBack_c::regionMapMove(STControl* i_stick) {
|
||||
f32 stick_value = i_stick->getValueStick();
|
||||
if (stick_value >= slow_bound) {
|
||||
s16 angle = i_stick->getAngleStick();
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
angle = -angle;
|
||||
}
|
||||
#endif
|
||||
f32 local_68 = mTexMaxX - mTexMinX;
|
||||
f32 spot_zoom = getSpotMapZoomRate();
|
||||
f32 region_zoom = getRegionMapZoomRate(mRegionCursor);
|
||||
@@ -1946,11 +1959,6 @@ void dMenu_Fmap2DBack_c::regionMapMove(STControl* i_stick) {
|
||||
calcAllMapPos2D(mArrowPos3DX + control_xpos - mStageTransX,
|
||||
mArrowPos3DZ + control_ypos - mStageTransZ, &pos_x, &pos_y);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMirrorMode) {
|
||||
pos_x = getMirrorPosX(pos_x, 0.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
mSelectRegion = 0xff;
|
||||
int region = mRegionCursor;
|
||||
|
||||
@@ -437,7 +437,12 @@ void dMeter2_c::checkStatus() {
|
||||
|
||||
field_0x128 = daPy_py_c::checkNowWolf();
|
||||
|
||||
#if TARGET_PC
|
||||
dMsgObject_c* msgObject = dMsgObject_getMsgObjectClass();
|
||||
if (!dComIfGp_2dShowCheck() || (msgObject != NULL && msgObject->isPlaceMessage())) {
|
||||
#else
|
||||
if (!dComIfGp_2dShowCheck() || dMsgObject_getMsgObjectClass()->isPlaceMessage()) {
|
||||
#endif
|
||||
mStatus |= 0x4000;
|
||||
} else if (dComIfGp_checkPlayerStatus1(0, 1) && dComIfGp_getAStatus() == 0x12) {
|
||||
mStatus |= 0x200000;
|
||||
@@ -2870,8 +2875,14 @@ void dMeter2_c::alphaAnimeButton() {
|
||||
u8 var_31;
|
||||
var_31 = 0;
|
||||
|
||||
#if TARGET_PC
|
||||
dMsgObject_c* msgObject = dMsgObject_getMsgObjectClass();
|
||||
if ((mStatus & 0x4000) ||
|
||||
((mStatus & 0x100) && (msgObject != NULL && msgObject->isAutoMessageFlag())) ||
|
||||
#else
|
||||
if ((mStatus & 0x4000) ||
|
||||
((mStatus & 0x100) && dMsgObject_getMsgObjectClass()->isAutoMessageFlag()) ||
|
||||
#endif
|
||||
((mStatus & 0x40000000) && !(mStatus & 0x100)) || (mStatus & 0x80000000) || (mStatus & 8) ||
|
||||
(mStatus & 0x10) || (mStatus & 0x20) || (mStatus & 0x04000000) || (mStatus & 0x10000000))
|
||||
{
|
||||
|
||||
@@ -378,6 +378,7 @@ nlohmann::json ConfigImpl<ui::ControlLayout>::dumpToJson(const ConfigVar<ui::Con
|
||||
}
|
||||
|
||||
template class ConfigImpl<dusk::FrameInterpMode>;
|
||||
template class ConfigImpl<dusk::TouchTargeting>;
|
||||
template class ConfigImpl<dusk::MenuScaling>;
|
||||
template class ConfigImpl<dusk::Resampler>;
|
||||
template class ConfigImpl<dusk::MagicArmorMode>;
|
||||
|
||||
@@ -96,6 +96,7 @@ UserSettings g_userSettings = {
|
||||
.invertMouseY {"game.invertMouseY", false},
|
||||
.freeCamera {"game.freeCamera", false},
|
||||
.enableTouchControls {"game.enableTouchControls", false},
|
||||
.touchTargeting {"game.touchTargeting", TouchTargeting::Hybrid},
|
||||
.enableMenuPointer {"game.enableMenuPointer", true},
|
||||
.touchControlsLayout {"game.touchControlsLayout", ui::ControlLayout{}},
|
||||
.invertCameraXAxis {"game.invertCameraXAxis", false},
|
||||
@@ -357,6 +358,7 @@ void registerSettings() {
|
||||
Register(g_userSettings.game.invertMouseY);
|
||||
Register(g_userSettings.game.freeCamera);
|
||||
Register(g_userSettings.game.enableTouchControls);
|
||||
Register(g_userSettings.game.touchTargeting);
|
||||
Register(g_userSettings.game.enableMenuPointer);
|
||||
Register(g_userSettings.game.touchControlsLayout);
|
||||
Register(g_userSettings.game.debugFlyCam);
|
||||
|
||||
@@ -7,6 +7,9 @@ float s_pitch_dp = 0.0f;
|
||||
} // namespace
|
||||
|
||||
void add_delta(float yaw_dp, float pitch_dp) noexcept {
|
||||
if (getSettings().game.enableMirrorMode) {
|
||||
yaw_dp *= -1.0;
|
||||
}
|
||||
s_yaw_dp += yaw_dp;
|
||||
s_pitch_dp += pitch_dp;
|
||||
}
|
||||
|
||||
@@ -77,6 +77,18 @@ constexpr std::array kInterpolationModes = {
|
||||
"Unlimited",
|
||||
};
|
||||
|
||||
constexpr std::array kTouchTargetingLabels = {
|
||||
"Hybrid",
|
||||
"Hold",
|
||||
"Switch",
|
||||
};
|
||||
|
||||
constexpr std::array kTouchTargetingDescriptions = {
|
||||
"Tap once to lock on when a target is found. Double-tap when none is found to hold L.",
|
||||
"L stays held only while your finger is on the button.",
|
||||
"Tap L to keep it held. Tap again to release it.",
|
||||
};
|
||||
|
||||
constexpr std::array kGyroInputModeLabels = {
|
||||
"Sensor",
|
||||
"Mouse",
|
||||
@@ -407,6 +419,14 @@ bool gyro_enabled() {
|
||||
return getSettings().game.enableGyroAim || getSettings().game.enableGyroRollgoal;
|
||||
}
|
||||
|
||||
Rml::String touch_targeting_label(TouchTargeting targeting) {
|
||||
const auto index = static_cast<std::size_t>(targeting);
|
||||
if (index >= kTouchTargetingLabels.size()) {
|
||||
return "Unknown";
|
||||
}
|
||||
return kTouchTargetingLabels[index];
|
||||
}
|
||||
|
||||
struct ConfigBoolProps {
|
||||
Rml::String key;
|
||||
Rml::String icon;
|
||||
@@ -1003,6 +1023,45 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
||||
pane.clear();
|
||||
pane.add_text("Open the touch controls layout editor.");
|
||||
});
|
||||
leftPane.register_control(leftPane.add_select_button({
|
||||
.key = "Touch Targeting",
|
||||
.getValue =
|
||||
[] {
|
||||
return touch_targeting_label(
|
||||
getSettings().game.touchTargeting.getValue());
|
||||
},
|
||||
.isDisabled =
|
||||
[] { return !getSettings().game.enableTouchControls; },
|
||||
.isModified =
|
||||
[] {
|
||||
const auto& targeting =
|
||||
getSettings().game.touchTargeting;
|
||||
return targeting.getValue() !=
|
||||
targeting.getDefaultValue();
|
||||
},
|
||||
}),
|
||||
rightPane, [](Pane& pane) {
|
||||
pane.clear();
|
||||
for (int i = 0; i < static_cast<int>(kTouchTargetingLabels.size()); ++i) {
|
||||
pane.add_button({
|
||||
.text = kTouchTargetingLabels[i],
|
||||
.isSelected =
|
||||
[i] {
|
||||
return getSettings().game.touchTargeting.getValue() ==
|
||||
static_cast<TouchTargeting>(i);
|
||||
},
|
||||
})
|
||||
.on_pressed([i] {
|
||||
mDoAud_seStartMenu(kSoundItemChange);
|
||||
getSettings().game.touchTargeting.setValue(
|
||||
static_cast<TouchTargeting>(i));
|
||||
config::Save();
|
||||
});
|
||||
}
|
||||
pane.add_rml(fmt::format("<br/>Hybrid: {}<br/>Hold: {}<br/>Switch: {}",
|
||||
kTouchTargetingDescriptions[0], kTouchTargetingDescriptions[1],
|
||||
kTouchTargetingDescriptions[2]));
|
||||
});
|
||||
config_percent_select(leftPane, rightPane, getSettings().game.touchCameraXSensitivity,
|
||||
"Touch Camera X Sensitivity",
|
||||
"Adjusts touch camera horizontal sensitivity.<br/><br/>Applies to touch input only.",
|
||||
|
||||
@@ -485,43 +485,71 @@ void TouchControls::set_control_pressed(Control control, bool pressed) {
|
||||
mLastLTapTime = {};
|
||||
break;
|
||||
}
|
||||
if (pressed && (mLLatched || mManualLLatched)) {
|
||||
switch (getSettings().game.touchTargeting.getValue()) {
|
||||
case TouchTargeting::Hold:
|
||||
mLPressed = pressed;
|
||||
mLLatched = false;
|
||||
mManualLLatched = false;
|
||||
mLPressed = false;
|
||||
mLReleasePending = true;
|
||||
mLReleasePending = false;
|
||||
mLPressStartTime = {};
|
||||
mLastLTapTime = {};
|
||||
set_control_visual(control, false);
|
||||
} else if (pressed) {
|
||||
const auto now = clock::now();
|
||||
if (!player_attention_locked() && mLastLTapTime != clock::time_point{} &&
|
||||
now - mLastLTapTime <= kLDoubleTapWindow)
|
||||
{
|
||||
mManualLLatched = true;
|
||||
break;
|
||||
case TouchTargeting::Switch:
|
||||
if (pressed) {
|
||||
const bool wasLatched = mLPressed || mLLatched || mManualLLatched;
|
||||
mLPressed = false;
|
||||
mLLatched = false;
|
||||
mManualLLatched = !wasLatched;
|
||||
mLReleasePending = true;
|
||||
} else {
|
||||
mLPressed = false;
|
||||
mLLatched = false;
|
||||
mLReleasePending = false;
|
||||
}
|
||||
mLPressStartTime = {};
|
||||
mLastLTapTime = {};
|
||||
break;
|
||||
case TouchTargeting::Hybrid:
|
||||
default:
|
||||
if (pressed && (mLLatched || mManualLLatched)) {
|
||||
mLLatched = false;
|
||||
mManualLLatched = false;
|
||||
mLPressed = false;
|
||||
mLReleasePending = true;
|
||||
mLPressStartTime = {};
|
||||
mLastLTapTime = {};
|
||||
set_control_visual(control, false);
|
||||
} else if (pressed) {
|
||||
const auto now = clock::now();
|
||||
if (!player_attention_locked() && mLastLTapTime != clock::time_point{} &&
|
||||
now - mLastLTapTime <= kLDoubleTapWindow)
|
||||
{
|
||||
mManualLLatched = true;
|
||||
mLPressed = false;
|
||||
mLReleasePending = true;
|
||||
mLPressStartTime = {};
|
||||
mLastLTapTime = {};
|
||||
} else if (!mLReleasePending) {
|
||||
mLPressed = true;
|
||||
mLPressStartTime = now;
|
||||
}
|
||||
} else if (!mLReleasePending) {
|
||||
mLPressed = true;
|
||||
mLPressStartTime = now;
|
||||
mLPressed = false;
|
||||
}
|
||||
} else if (!mLReleasePending) {
|
||||
mLPressed = false;
|
||||
}
|
||||
if (!pressed) {
|
||||
const auto now = clock::now();
|
||||
if (!mLReleasePending) {
|
||||
const bool wasQuickTap = mLPressStartTime != clock::time_point{} &&
|
||||
now - mLPressStartTime <= kLDoubleTapWindow;
|
||||
mLastLTapTime = wasQuickTap ? now : clock::time_point{};
|
||||
if (!pressed) {
|
||||
const auto now = clock::now();
|
||||
if (!mLReleasePending) {
|
||||
const bool wasQuickTap = mLPressStartTime != clock::time_point{} &&
|
||||
now - mLPressStartTime <= kLDoubleTapWindow;
|
||||
mLastLTapTime = wasQuickTap ? now : clock::time_point{};
|
||||
}
|
||||
mLPressStartTime = {};
|
||||
mLReleasePending = false;
|
||||
}
|
||||
mLPressStartTime = {};
|
||||
mLReleasePending = false;
|
||||
}
|
||||
if (!pressed && !player_attention_locked()) {
|
||||
mLLatched = false;
|
||||
if (!pressed && !player_attention_locked()) {
|
||||
mLLatched = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Control::R:
|
||||
@@ -635,6 +663,17 @@ void TouchControls::apply_control_transform(Control control) noexcept {
|
||||
}
|
||||
|
||||
void TouchControls::sync_l_lock_state() noexcept {
|
||||
const auto targeting = getSettings().game.touchTargeting.getValue();
|
||||
if (targeting == TouchTargeting::Hold) {
|
||||
mLLatched = false;
|
||||
mManualLLatched = false;
|
||||
return;
|
||||
}
|
||||
if (targeting == TouchTargeting::Switch) {
|
||||
mLLatched = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (player_attention_locked()) {
|
||||
if (mLPressed) {
|
||||
mLLatched = true;
|
||||
|
||||
Reference in New Issue
Block a user