mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2025-04-28 13:27:58 +03:00
Implemented D-Pad support for the World Map, Gaia Colossus, Super Sonic and the Bobsleigh (#150)
* Implemented D-Pad support for World Map, Super Sonic (WIP) and Bobsleigh * Implemented D-Pad support for Gaia Colossus and Super Sonic * Improved touchpad sensitivity
This commit is contained in:
parent
ca6b42e20e
commit
686ef22c4d
11 changed files with 623 additions and 22 deletions
|
@ -59,6 +59,7 @@
|
|||
#include "SWA/CSD/CsdTexListMirage.h"
|
||||
#include "SWA/CSD/GameObjectCSD.h"
|
||||
#include "SWA/Camera/Camera.h"
|
||||
#include "SWA/Camera/CameraController.h"
|
||||
#include "SWA/CharacterUtility/CharacterProxy.h"
|
||||
#include "SWA/HUD/GeneralWindow/GeneralWindow.h"
|
||||
#include "SWA/HUD/Loading/Loading.h"
|
||||
|
@ -74,6 +75,7 @@
|
|||
#include "SWA/Inspire/InspireTextureAnimationInfo.h"
|
||||
#include "SWA/Inspire/InspireTextureOverlay.h"
|
||||
#include "SWA/Inspire/InspireTextureOverlayInfo.h"
|
||||
#include "SWA/Menu/MenuWindowBase.h"
|
||||
#include "SWA/Movie/MovieDisplayer.h"
|
||||
#include "SWA/Movie/MovieManager.h"
|
||||
#include "SWA/Player/Character/EvilSonic/EvilSonic.h"
|
||||
|
@ -98,6 +100,9 @@
|
|||
#include "SWA/System/GameMode/Title/TitleMenu.h"
|
||||
#include "SWA/System/GameMode/Title/TitleStateBase.h"
|
||||
#include "SWA/System/GameMode/Title/TitleStateIntro.h"
|
||||
#include "SWA/System/GameMode/Title/TitleStateWorldMap.h"
|
||||
#include "SWA/System/GameMode/WorldMap/WorldMapCamera.h"
|
||||
#include "SWA/System/GameMode/WorldMap/WorldMapCursor.h"
|
||||
#include "SWA/System/GameObject.h"
|
||||
#include "SWA/System/GameParameter.h"
|
||||
#include "SWA/System/GammaController.h"
|
||||
|
|
17
UnleashedRecomp/api/SWA/Camera/CameraController.h
Normal file
17
UnleashedRecomp/api/SWA/Camera/CameraController.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CCameraController : public Hedgehog::Universe::CStateMachineBase::CStateBase
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x04);
|
||||
be<float> m_FieldOfView;
|
||||
SWA_INSERT_PADDING(0x68);
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CCameraController, m_FieldOfView, 0x64);
|
||||
SWA_ASSERT_SIZEOF(CCameraController, 0xD0);
|
||||
}
|
12
UnleashedRecomp/api/SWA/Menu/MenuWindowBase.h
Normal file
12
UnleashedRecomp/api/SWA/Menu/MenuWindowBase.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CMenuWindowBase
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x10);
|
||||
};
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
#include <SWA/System/GameMode/WorldMap/WorldMapCursor.h>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CTitleStateWorldMap : public CTitleStateBase
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
xpointer<CWorldMapCursor> m_pWorldMapCursor;
|
||||
};
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CWorldMapCamera : public CCameraController
|
||||
{
|
||||
public:
|
||||
be<float> m_Pitch;
|
||||
be<float> m_Yaw;
|
||||
be<float> m_Distance;
|
||||
be<float> m_RotationSpeed;
|
||||
SWA_INSERT_PADDING(0x08);
|
||||
bool m_CanMove;
|
||||
SWA_INSERT_PADDING(0x34);
|
||||
be<float> m_TiltToEarthTransitionSpeed;
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCamera, m_Pitch, 0xD0);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCamera, m_Yaw, 0xD4);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCamera, m_Distance, 0xD8);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCamera, m_RotationSpeed, 0xDC);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCamera, m_CanMove, 0xE8);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCamera, m_TiltToEarthTransitionSpeed, 0x120);
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
#pragma once
|
||||
|
||||
#include <SWA.inl>
|
||||
|
||||
namespace SWA
|
||||
{
|
||||
class CWorldMapCursor : public CMenuWindowBase
|
||||
{
|
||||
public:
|
||||
SWA_INSERT_PADDING(0x24);
|
||||
be<float> m_LeftStickVertical;
|
||||
be<float> m_LeftStickHorizontal;
|
||||
bool m_IsCursorMoving;
|
||||
SWA_INSERT_PADDING(0x07);
|
||||
be<float> m_CursorY;
|
||||
be<float> m_CursorX;
|
||||
};
|
||||
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCursor, m_LeftStickVertical, 0x34);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCursor, m_LeftStickHorizontal, 0x38);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCursor, m_IsCursorMoving, 0x3C);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCursor, m_CursorY, 0x44);
|
||||
SWA_ASSERT_OFFSETOF(CWorldMapCursor, m_CursorX, 0x48);
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
#include <SDL.h>
|
||||
#include <user/config.h>
|
||||
#include <hid/hid.h>
|
||||
#include <os/logger.h>
|
||||
#include <ui/game_window.h>
|
||||
#include <kernel/xdm.h>
|
||||
#include <app.h>
|
||||
|
@ -170,6 +171,15 @@ static void SetControllerInputDevice(Controller* controller)
|
|||
|
||||
hid::g_inputDevice = controller->GetInputDevice();
|
||||
hid::g_inputDeviceController = hid::g_inputDevice;
|
||||
|
||||
auto controllerType = (hid::EInputDeviceExplicit)controller->GetControllerType();
|
||||
|
||||
if (hid::g_inputDeviceExplicit != controllerType)
|
||||
{
|
||||
hid::g_inputDeviceExplicit = controllerType;
|
||||
|
||||
LOGFN("Detected controller: {}", hid::GetInputDeviceName());
|
||||
}
|
||||
}
|
||||
|
||||
int HID_OnSDLEvent(void*, SDL_Event* event)
|
||||
|
@ -199,6 +209,7 @@ int HID_OnSDLEvent(void*, SDL_Event* event)
|
|||
case SDL_CONTROLLERBUTTONDOWN:
|
||||
case SDL_CONTROLLERBUTTONUP:
|
||||
case SDL_CONTROLLERAXISMOTION:
|
||||
case SDL_CONTROLLERTOUCHPADDOWN:
|
||||
{
|
||||
auto* controller = FindController(event->cdevice.which);
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
hid::EInputDevice hid::g_inputDevice;
|
||||
hid::EInputDevice hid::g_inputDeviceController;
|
||||
hid::EInputDeviceExplicit hid::g_inputDeviceExplicit;
|
||||
|
||||
uint16_t hid::g_prohibitedButtons;
|
||||
|
||||
|
@ -15,3 +16,59 @@ bool hid::IsInputDeviceController()
|
|||
return hid::g_inputDevice != hid::EInputDevice::Keyboard &&
|
||||
hid::g_inputDevice != hid::EInputDevice::Mouse;
|
||||
}
|
||||
|
||||
std::string hid::GetInputDeviceName()
|
||||
{
|
||||
switch (g_inputDevice)
|
||||
{
|
||||
case EInputDevice::Keyboard:
|
||||
return "Keyboard";
|
||||
|
||||
case EInputDevice::Mouse:
|
||||
return "Mouse";
|
||||
}
|
||||
|
||||
switch (g_inputDeviceExplicit)
|
||||
{
|
||||
case EInputDeviceExplicit::Xbox360:
|
||||
return "Xbox 360";
|
||||
|
||||
case EInputDeviceExplicit::XboxOne:
|
||||
return "Xbox One";
|
||||
|
||||
case EInputDeviceExplicit::DualShock3:
|
||||
return "DualShock 3";
|
||||
|
||||
case EInputDeviceExplicit::DualShock4:
|
||||
return "DualShock 4";
|
||||
|
||||
case EInputDeviceExplicit::SwitchPro:
|
||||
return "Nintendo Switch Pro";
|
||||
|
||||
case EInputDeviceExplicit::Virtual:
|
||||
return "Virtual";
|
||||
|
||||
case EInputDeviceExplicit::DualSense:
|
||||
return "DualSense";
|
||||
|
||||
case EInputDeviceExplicit::Luna:
|
||||
return "Amazon Luna";
|
||||
|
||||
case EInputDeviceExplicit::Stadia:
|
||||
return "Google Stadia";
|
||||
|
||||
case EInputDeviceExplicit::NvShield:
|
||||
return "NVIDIA Shield";
|
||||
|
||||
case EInputDeviceExplicit::SwitchJCLeft:
|
||||
return "Nintendo Switch Joy-Con (Left)";
|
||||
|
||||
case EInputDeviceExplicit::SwitchJCRight:
|
||||
return "Nintendo Switch Joy-Con (Right)";
|
||||
|
||||
case EInputDeviceExplicit::SwitchJCPair:
|
||||
return "Nintendo Switch Joy-Con (Pair)";
|
||||
}
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
|
|
@ -10,8 +10,27 @@ namespace hid
|
|||
PlayStation
|
||||
};
|
||||
|
||||
enum class EInputDeviceExplicit
|
||||
{
|
||||
Unknown,
|
||||
Xbox360,
|
||||
XboxOne,
|
||||
DualShock3,
|
||||
DualShock4,
|
||||
SwitchPro,
|
||||
Virtual,
|
||||
DualSense,
|
||||
Luna,
|
||||
Stadia,
|
||||
NvShield,
|
||||
SwitchJCLeft,
|
||||
SwitchJCRight,
|
||||
SwitchJCPair
|
||||
};
|
||||
|
||||
extern EInputDevice g_inputDevice;
|
||||
extern EInputDevice g_inputDeviceController;
|
||||
extern EInputDeviceExplicit g_inputDeviceExplicit;
|
||||
|
||||
extern uint16_t g_prohibitedButtons;
|
||||
|
||||
|
@ -23,4 +42,5 @@ namespace hid
|
|||
uint32_t GetCapabilities(uint32_t dwUserIndex, XAMINPUT_CAPABILITIES* pCaps);
|
||||
|
||||
bool IsInputDeviceController();
|
||||
std::string GetInputDeviceName();
|
||||
}
|
||||
|
|
|
@ -1,28 +1,193 @@
|
|||
#include <api/SWA.h>
|
||||
#include <hid/hid.h>
|
||||
#include <ui/sdl_listener.h>
|
||||
#include <app.h>
|
||||
#include <exports.h>
|
||||
|
||||
static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool negate)
|
||||
class WorldMapTouchParams
|
||||
{
|
||||
public:
|
||||
float CancelDeadzone{ 0.31f };
|
||||
float Damping{ 0.99f };
|
||||
float FlickAccelX{ 0.25f };
|
||||
float FlickAccelY{ 0.1f };
|
||||
float FlickTerminalVelocity{ 40.0f };
|
||||
float FlickThreshold{ 2.25f };
|
||||
float SensitivityX{};
|
||||
float SensitivityY{};
|
||||
float Smoothing{ 0.8f };
|
||||
};
|
||||
|
||||
class WorldMapTouchParamsProspero : public WorldMapTouchParams
|
||||
{
|
||||
public:
|
||||
WorldMapTouchParamsProspero()
|
||||
{
|
||||
SensitivityX = 1.15f;
|
||||
SensitivityY = 1.05f;
|
||||
}
|
||||
}
|
||||
g_worldMapTouchParamsProspero;
|
||||
|
||||
class WorldMapTouchParamsOrbis : public WorldMapTouchParams
|
||||
{
|
||||
public:
|
||||
WorldMapTouchParamsOrbis()
|
||||
{
|
||||
SensitivityX = 0.95f;
|
||||
SensitivityY = 1.0f;
|
||||
}
|
||||
}
|
||||
g_worldMapTouchParamsOrbis;
|
||||
|
||||
WorldMapTouchParams g_worldMapTouchParams{};
|
||||
|
||||
static bool g_isTouchActive;
|
||||
|
||||
static float g_worldMapTouchVelocityX;
|
||||
static float g_worldMapTouchVelocityY;
|
||||
|
||||
class SDLEventListenerForInputPatches : public SDLEventListener
|
||||
{
|
||||
static inline int ms_touchpadFingerCount;
|
||||
|
||||
static inline float ms_touchpadX;
|
||||
static inline float ms_touchpadY;
|
||||
static inline float ms_touchpadDeltaX;
|
||||
static inline float ms_touchpadDeltaY;
|
||||
static inline float ms_touchpadPrevX;
|
||||
static inline float ms_touchpadPrevY;
|
||||
|
||||
public:
|
||||
static void Update(float deltaTime)
|
||||
{
|
||||
/* NOTE (Hyper): this code was written at 144Hz and was
|
||||
discovered later to be faulty at any other frame rate,
|
||||
so this is here to account for that without changing
|
||||
all the constants that I had tuned. */
|
||||
constexpr auto referenceDeltaTime = 1.0f / 144.0f;
|
||||
|
||||
if (g_isTouchActive)
|
||||
{
|
||||
auto dxNorm = ms_touchpadDeltaX / referenceDeltaTime;
|
||||
auto dyNorm = ms_touchpadDeltaY / referenceDeltaTime;
|
||||
auto dxSens = dxNorm * g_worldMapTouchParams.SensitivityX;
|
||||
auto dySens = dyNorm * g_worldMapTouchParams.SensitivityY;
|
||||
|
||||
auto smoothing = powf(g_worldMapTouchParams.Smoothing, deltaTime / referenceDeltaTime);
|
||||
|
||||
g_worldMapTouchVelocityX = smoothing * g_worldMapTouchVelocityX + (1.0f - smoothing) * dxSens;
|
||||
g_worldMapTouchVelocityY = smoothing * g_worldMapTouchVelocityY + (1.0f - smoothing) * dySens;
|
||||
|
||||
auto flickThreshold = g_worldMapTouchParams.FlickThreshold;
|
||||
|
||||
if (fabs(dxSens) > flickThreshold || fabs(dySens) > flickThreshold)
|
||||
{
|
||||
g_worldMapTouchVelocityX += dxNorm * g_worldMapTouchParams.FlickAccelX * (deltaTime / referenceDeltaTime);
|
||||
g_worldMapTouchVelocityY += dyNorm * g_worldMapTouchParams.FlickAccelY * (deltaTime / referenceDeltaTime);
|
||||
}
|
||||
|
||||
auto terminalVelocity = g_worldMapTouchParams.FlickTerminalVelocity;
|
||||
|
||||
g_worldMapTouchVelocityX = std::clamp(g_worldMapTouchVelocityX, -terminalVelocity, terminalVelocity);
|
||||
g_worldMapTouchVelocityY = std::clamp(g_worldMapTouchVelocityY, -terminalVelocity, terminalVelocity);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto dampingFactor = powf(g_worldMapTouchParams.Damping, deltaTime / referenceDeltaTime);
|
||||
|
||||
g_worldMapTouchVelocityX *= dampingFactor;
|
||||
g_worldMapTouchVelocityY *= dampingFactor;
|
||||
}
|
||||
}
|
||||
|
||||
void OnSDLEvent(SDL_Event* event) override
|
||||
{
|
||||
switch (event->type)
|
||||
{
|
||||
case SDL_CONTROLLERTOUCHPADMOTION:
|
||||
{
|
||||
g_isTouchActive = true;
|
||||
|
||||
if (ms_touchpadFingerCount > 1)
|
||||
{
|
||||
g_isTouchActive = false;
|
||||
break;
|
||||
}
|
||||
|
||||
ms_touchpadX = event->ctouchpad.x;
|
||||
ms_touchpadY = event->ctouchpad.y;
|
||||
ms_touchpadDeltaX = ms_touchpadX - ms_touchpadPrevX;
|
||||
ms_touchpadDeltaY = ms_touchpadY - ms_touchpadPrevY;
|
||||
ms_touchpadPrevX = ms_touchpadX;
|
||||
ms_touchpadPrevY = ms_touchpadY;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_CONTROLLERTOUCHPADDOWN:
|
||||
{
|
||||
g_worldMapTouchParams = hid::g_inputDeviceExplicit == hid::EInputDeviceExplicit::DualSense
|
||||
? (WorldMapTouchParams)g_worldMapTouchParamsProspero
|
||||
: (WorldMapTouchParams)g_worldMapTouchParamsOrbis;
|
||||
|
||||
ms_touchpadFingerCount++;
|
||||
ms_touchpadPrevX = event->ctouchpad.x;
|
||||
ms_touchpadPrevY = event->ctouchpad.y;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_CONTROLLERTOUCHPADUP:
|
||||
g_isTouchActive = false;
|
||||
ms_touchpadFingerCount--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
g_sdlEventListenerForInputPatches;
|
||||
|
||||
// -------------- COMMON --------------- //
|
||||
|
||||
static bool IsDPadActive(SWA::SPadState* pPadState)
|
||||
{
|
||||
return pPadState->IsDown(SWA::eKeyState_DpadUp) ||
|
||||
pPadState->IsDown(SWA::eKeyState_DpadDown) ||
|
||||
pPadState->IsDown(SWA::eKeyState_DpadLeft) ||
|
||||
pPadState->IsDown(SWA::eKeyState_DpadRight);
|
||||
}
|
||||
|
||||
static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool invert, float max = 1.0f)
|
||||
{
|
||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadLeft))
|
||||
x.f64 = negate ? 1.0f : -1.0f;
|
||||
x.f64 = invert ? max : -max;
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadRight))
|
||||
x.f64 = negate ? -1.0f : 1.0f;
|
||||
x.f64 = invert ? -max : max;
|
||||
}
|
||||
|
||||
static void SetDPadAnalogDirectionY(PPCRegister& pPadState, PPCRegister& y, bool negate)
|
||||
static void SetDPadAnalogDirectionY(PPCRegister& pPadState, PPCRegister& y, bool invert, float max = 1.0f)
|
||||
{
|
||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadUp))
|
||||
y.f64 = negate ? -1.0f : 1.0f;
|
||||
y.f64 = invert ? -max : max;
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadDown))
|
||||
y.f64 = negate ? 1.0f : -1.0f;
|
||||
y.f64 = invert ? max : -max;
|
||||
}
|
||||
|
||||
// -------------- PLAYER --------------- //
|
||||
|
||||
void PostureDPadSupportMidAsmHook(PPCRegister& pPadState, PPCRegister& x, PPCRegister& y)
|
||||
{
|
||||
SetDPadAnalogDirectionX(pPadState, x, false);
|
||||
SetDPadAnalogDirectionY(pPadState, y, false);
|
||||
}
|
||||
|
||||
void PostureDPadSupportInvertYMidAsmHook(PPCRegister& pPadState, PPCRegister& x, PPCRegister& y)
|
||||
{
|
||||
SetDPadAnalogDirectionX(pPadState, x, false);
|
||||
SetDPadAnalogDirectionY(pPadState, y, true);
|
||||
|
@ -38,8 +203,146 @@ void PostureDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCRegister& y)
|
|||
SetDPadAnalogDirectionY(pPadState, y, false);
|
||||
}
|
||||
|
||||
void PostureDPadSupportPathLocalMidAsmHook(PPCRegister& pPadState, PPCRegister& x, PPCRegister& y)
|
||||
void PostureSpaceHurrierDPadSupportXMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector)
|
||||
{
|
||||
SetDPadAnalogDirectionX(pPadState, x, false);
|
||||
SetDPadAnalogDirectionY(pPadState, y, false);
|
||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadLeft))
|
||||
vector.f32[3] = -1.0f;
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadRight))
|
||||
vector.f32[3] = 1.0f;
|
||||
}
|
||||
|
||||
void PostureSpaceHurrierDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector)
|
||||
{
|
||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadUp))
|
||||
vector.f32[3] = 1.0f;
|
||||
|
||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadDown))
|
||||
vector.f32[3] = -1.0f;
|
||||
}
|
||||
|
||||
// ------------- WORLD MAP ------------- //
|
||||
|
||||
bool WorldMapTouchSupportMidAsmHook()
|
||||
{
|
||||
SDLEventListenerForInputPatches::Update(App::s_deltaTime);
|
||||
|
||||
auto vxAbs = fabs(g_worldMapTouchVelocityX);
|
||||
auto vyAbs = fabs(g_worldMapTouchVelocityY);
|
||||
|
||||
/* Reduce touch noise if the player has
|
||||
their finger resting on the touchpad,
|
||||
but allow much precise values without
|
||||
touch for proper interpolation to zero. */
|
||||
if (vxAbs < 0.05f || vyAbs < 0.05f)
|
||||
return !g_isTouchActive;
|
||||
|
||||
return vxAbs > 0 || vyAbs > 0;
|
||||
}
|
||||
|
||||
bool WorldMapTouchMagnetismSupportMidAsmHook(PPCRegister& f0)
|
||||
{
|
||||
return fabs(g_worldMapTouchVelocityX) > f0.f64 || fabs(g_worldMapTouchVelocityY) > f0.f64;
|
||||
}
|
||||
|
||||
void TouchAndDPadSupportWorldMapXMidAsmHook(PPCRegister& pPadState, PPCRegister& x)
|
||||
{
|
||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||
|
||||
if (fabs(pGuestPadState->LeftStickHorizontal) > g_worldMapTouchParams.CancelDeadzone ||
|
||||
fabs(pGuestPadState->LeftStickVertical) > g_worldMapTouchParams.CancelDeadzone)
|
||||
{
|
||||
g_worldMapTouchVelocityX = 0;
|
||||
}
|
||||
|
||||
if (IsDPadActive(pGuestPadState))
|
||||
{
|
||||
g_worldMapTouchVelocityX = 0;
|
||||
|
||||
SetDPadAnalogDirectionX(pPadState, x, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fabs(g_worldMapTouchVelocityX) > 0)
|
||||
x.f64 = -g_worldMapTouchVelocityX;
|
||||
}
|
||||
}
|
||||
|
||||
void TouchAndDPadSupportWorldMapYMidAsmHook(PPCRegister& pPadState, PPCRegister& y)
|
||||
{
|
||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||
|
||||
if (fabs(pGuestPadState->LeftStickHorizontal) > g_worldMapTouchParams.CancelDeadzone ||
|
||||
fabs(pGuestPadState->LeftStickVertical) > g_worldMapTouchParams.CancelDeadzone)
|
||||
{
|
||||
g_worldMapTouchVelocityY = 0;
|
||||
}
|
||||
|
||||
if (IsDPadActive(pGuestPadState))
|
||||
{
|
||||
g_worldMapTouchVelocityY = 0;
|
||||
|
||||
SetDPadAnalogDirectionY(pPadState, y, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fabs(g_worldMapTouchVelocityY) > 0)
|
||||
y.f64 = g_worldMapTouchVelocityY;
|
||||
}
|
||||
}
|
||||
|
||||
// SWA::CWorldMapCamera::Update
|
||||
PPC_FUNC_IMPL(__imp__sub_82486968);
|
||||
PPC_FUNC(sub_82486968)
|
||||
{
|
||||
auto pWorldMapCamera = (SWA::CWorldMapCamera*)g_memory.Translate(ctx.r3.u32);
|
||||
|
||||
// Reset vertical velocity if maximum pitch reached.
|
||||
if (fabs(pWorldMapCamera->m_Pitch) >= 80.0f)
|
||||
g_worldMapTouchVelocityY = 0;
|
||||
|
||||
__imp__sub_82486968(ctx, base);
|
||||
}
|
||||
|
||||
// World Map cursor move hook.
|
||||
PPC_FUNC(sub_8256C938)
|
||||
{
|
||||
auto pWorldMapCursor = (SWA::CWorldMapCursor*)g_memory.Translate(ctx.r3.u32);
|
||||
|
||||
pWorldMapCursor->m_IsCursorMoving = g_isTouchActive;
|
||||
|
||||
if (ctx.r4.u8)
|
||||
{
|
||||
pWorldMapCursor->m_LeftStickVertical = 0;
|
||||
pWorldMapCursor->m_LeftStickHorizontal = 0;
|
||||
}
|
||||
else if (auto pInputState = SWA::CInputState::GetInstance())
|
||||
{
|
||||
auto& rPadState = pInputState->GetPadState();
|
||||
|
||||
pWorldMapCursor->m_LeftStickVertical = rPadState.LeftStickVertical;
|
||||
pWorldMapCursor->m_LeftStickHorizontal = rPadState.LeftStickHorizontal;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_DpadUp))
|
||||
pWorldMapCursor->m_LeftStickVertical = 1.0f;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_DpadDown))
|
||||
pWorldMapCursor->m_LeftStickVertical = -1.0f;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_DpadLeft))
|
||||
pWorldMapCursor->m_LeftStickHorizontal = -1.0f;
|
||||
|
||||
if (rPadState.IsDown(SWA::eKeyState_DpadRight))
|
||||
pWorldMapCursor->m_LeftStickHorizontal = 1.0f;
|
||||
|
||||
if (sqrtf((pWorldMapCursor->m_LeftStickHorizontal * pWorldMapCursor->m_LeftStickHorizontal) +
|
||||
(pWorldMapCursor->m_LeftStickVertical * pWorldMapCursor->m_LeftStickVertical)) > 0.7f)
|
||||
{
|
||||
pWorldMapCursor->m_IsCursorMoving = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -548,41 +548,153 @@ jump_address = 0x82585480
|
|||
name = "LoadingScreenControllerMidAsmHook"
|
||||
address = 0x824DC9D4
|
||||
|
||||
# CPlayerSpeedPostureInputOnPath
|
||||
# SWA::Player::CPlayerSpeedPostureInputOnPath
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
name = "PostureDPadSupportInvertYMidAsmHook"
|
||||
address = 0x8234F194
|
||||
registers = ["r31", "f13", "f0"]
|
||||
|
||||
# CPlayerSpeedPostureInputOnPathLocal
|
||||
# SWA::Player::CPlayerSpeedPostureInputOnPathLocal
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportPathLocalMidAsmHook"
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
address = 0x8234F610
|
||||
registers = ["r30", "f0", "f13"]
|
||||
|
||||
# CPlayerSpeedPostureInput3DStandard
|
||||
# SWA::Player::CPlayerSpeedPostureInput3DStandard
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
name = "PostureDPadSupportInvertYMidAsmHook"
|
||||
address = 0x8234EEE8
|
||||
registers = ["r31", "f12", "f13"]
|
||||
|
||||
# CEvilPostureInputStandard
|
||||
# SWA::Player::CEvilPostureInputStandard
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
name = "PostureDPadSupportInvertYMidAsmHook"
|
||||
address = 0x823CDA60
|
||||
registers = ["r3", "f11", "f12"]
|
||||
|
||||
# CEvilPostureInputStandard
|
||||
# SWA::Player::CEvilPostureInputStandard
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportXMidAsmHook"
|
||||
address = 0x823CDA74
|
||||
registers = ["r3", "f0"]
|
||||
|
||||
# CEvilPostureInputStandard
|
||||
# SWA::Player::CEvilPostureInputStandard
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportYMidAsmHook"
|
||||
address = 0x823CDA88
|
||||
registers = ["r3", "f12"]
|
||||
name = "PostureDPadSupportXMidAsmHook"
|
||||
address = 0x823CDA74
|
||||
registers = ["r3", "f0"]
|
||||
|
||||
# SWA::CObjBobsleigh::CStateMode3D
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportXMidAsmHook"
|
||||
address = 0x8266B5F0
|
||||
registers = ["r29", "f13"]
|
||||
|
||||
# SWA::CObjBobsleigh::CStateMode3D
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportXMidAsmHook"
|
||||
address = 0x8266B8B4
|
||||
registers = ["r29", "f0"]
|
||||
|
||||
# SWA::CObjBobsleigh::CStateMode3D
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportXMidAsmHook"
|
||||
address = 0x8266B618
|
||||
registers = ["r29", "f0"]
|
||||
|
||||
# SWA::CObjBobsleigh::CStateMode3D
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportXMidAsmHook"
|
||||
address = 0x8266B6AC
|
||||
registers = ["r29", "f0"]
|
||||
|
||||
# SWA::Boss::Temple::CTemple (shared)
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
address = 0x82A77E68
|
||||
registers = ["r31", "f31", "f30"]
|
||||
|
||||
# SWA::Boss::Temple::CTempleStateMove
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
address = 0x82A7B3CC
|
||||
registers = ["r30", "f29", "f28"]
|
||||
|
||||
# SWA::Boss::Temple::CTempleStateMove
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
address = 0x82A7B288
|
||||
registers = ["r30", "f13", "f10"]
|
||||
|
||||
# SWA::Player::CSuperSonicPostureInputSpaceHurrier
|
||||
[[midasm_hook]]
|
||||
name = "PostureSpaceHurrierDPadSupportXMidAsmHook"
|
||||
address = 0x82455DD8
|
||||
registers = ["r30", "v61"]
|
||||
|
||||
# SWA::Player::CSuperSonicPostureInputSpaceHurrier
|
||||
[[midasm_hook]]
|
||||
name = "PostureSpaceHurrierDPadSupportYMidAsmHook"
|
||||
address = 0x82455DC8
|
||||
registers = ["r30", "v63"]
|
||||
|
||||
# SWA::Player::CSuperSonicPostureNights
|
||||
[[midasm_hook]]
|
||||
name = "PostureDPadSupportMidAsmHook"
|
||||
address = 0x82454104
|
||||
registers = ["r29", "f28", "f27"]
|
||||
after_instruction = true
|
||||
|
||||
# SWA::CWorldMapCamera - disable rotation deadzone for touch
|
||||
[[midasm_hook]]
|
||||
name = "WorldMapTouchSupportMidAsmHook"
|
||||
address = 0x824862EC
|
||||
jump_address_on_true = 0x824862F0
|
||||
|
||||
# SWA::CWorldMapCamera - disable flag magnetism for touch
|
||||
[[midasm_hook]]
|
||||
name = "WorldMapTouchMagnetismSupportMidAsmHook"
|
||||
address = 0x824866D4
|
||||
registers = ["f0"]
|
||||
jump_address_on_true = 0x82486838
|
||||
|
||||
# SWA::CWorldMapCamera - touch and D-Pad support for camera adjustment threshold on the X axis
|
||||
[[midasm_hook]]
|
||||
name = "TouchAndDPadSupportWorldMapXMidAsmHook"
|
||||
address = 0x824862D8
|
||||
registers = ["r30", "f12"]
|
||||
|
||||
# SWA::CWorldMapCamera - touch and D-Pad support for adjusing camera yaw
|
||||
[[midasm_hook]]
|
||||
name = "TouchAndDPadSupportWorldMapXMidAsmHook"
|
||||
address = 0x82486318
|
||||
registers = ["r30", "f12"]
|
||||
|
||||
# SWA::CWorldMapCamera - touch and D-Pad support for camera adjustment threshold on the Y axis
|
||||
[[midasm_hook]]
|
||||
name = "TouchAndDPadSupportWorldMapYMidAsmHook"
|
||||
address = 0x824862CC
|
||||
registers = ["r30", "f0"]
|
||||
|
||||
# SWA::CWorldMapCamera - touch and D-Pad support for adjusing camera pitch
|
||||
[[midasm_hook]]
|
||||
name = "TouchAndDPadSupportWorldMapYMidAsmHook"
|
||||
address = 0x824862F4
|
||||
registers = ["r30", "f0"]
|
||||
|
||||
# SWA::CWorldMapCamera - touch and D-Pad support for flag magnetism on the X axis
|
||||
[[midasm_hook]]
|
||||
name = "TouchAndDPadSupportWorldMapXMidAsmHook"
|
||||
address = 0x8248665C
|
||||
registers = ["r27", "f29"]
|
||||
after_instruction = true
|
||||
|
||||
# SWA::CWorldMapCamera - touch and D-Pad support for flag magnetism on the Y axis
|
||||
[[midasm_hook]]
|
||||
name = "TouchAndDPadSupportWorldMapYMidAsmHook"
|
||||
address = 0x82486658
|
||||
registers = ["r27", "f28"]
|
||||
after_instruction = true
|
||||
|
||||
[[midasm_hook]]
|
||||
name = "LoadingUpdateMidAsmHook"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue