add offsets

This commit is contained in:
Christian Semmler 2023-06-19 09:35:38 +02:00
parent 756d488c76
commit 8ea61879cc
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C

View File

@ -1,170 +1,191 @@
#include "legonavcontroller.h" #include "legonavcontroller.h"
#include "legoomni.h" #include "legoomni.h"
#include "legoutil.h" #include "legoutil.h"
int g_mouseDeadzone = 40; // 0x100f4c28
float g_zeroThreshold = 0.001f; int g_mouseDeadzone = 40;
float g_movementMaxSpeed = 40.0f; // 0x100f4c2c
float g_turnMaxSpeed = 20.0f; float g_zeroThreshold = 0.001f;
float g_movementMaxAccel = 15.0f; // 0x100f4c30
float g_turnMaxAccel = 30.0f; float g_movementMaxSpeed = 40.0f;
float g_movementMinAccel = 4.0f; // 0x100f4c34
float g_turnMinAccel = 15.0f; float g_turnMaxSpeed = 20.0f;
float g_movementDecel = 50.0f; // 0x100f4c38
float g_turnDecel = 50.0f; float g_movementMaxAccel = 15.0f;
float g_turnSensitivity = 0.4f; // 0x100f4c3c
MxBool g_turnUseVelocity = MX_FALSE; float g_turnMaxAccel = 30.0f;
// 0x100f4c40
void LegoNavController::GetDefaults(int *p_mouseDeadzone, float *p_movementMaxSpeed, float *p_turnMaxSpeed, float g_movementMinAccel = 4.0f;
float *p_movementMaxAccel, float *p_turnMaxAccel, float *p_movementDecel, // 0x100f4c44
float *p_turnDecel, float *p_movementMinAccel, float *p_turnMinAccel, float g_turnMinAccel = 15.0f;
float *p_turnSensitivity, MxBool *p_turnUseVelocity) // 0x100f4c48
{ float g_movementDecel = 50.0f;
*p_mouseDeadzone = g_mouseDeadzone; // 0x100f4c4c
*p_movementMaxSpeed = g_movementMaxSpeed; float g_turnDecel = 50.0f;
*p_turnMaxSpeed = g_turnMaxSpeed; // 0x100f4c50
*p_movementMaxAccel = g_movementMaxAccel; float g_turnSensitivity = 0.4f;
*p_turnMaxAccel = g_turnMaxAccel; // 0x100f4c54
*p_movementDecel = g_movementDecel; MxBool g_turnUseVelocity = MX_FALSE;
*p_turnDecel = g_turnDecel;
*p_movementMinAccel = g_movementMinAccel; // OFFSET: LEGO1 0x10054d40
*p_turnMinAccel = g_turnMinAccel; void LegoNavController::GetDefaults(int *p_mouseDeadzone, float *p_movementMaxSpeed, float *p_turnMaxSpeed,
*p_turnSensitivity = g_turnSensitivity; float *p_movementMaxAccel, float *p_turnMaxAccel, float *p_movementDecel,
*p_turnUseVelocity = g_turnUseVelocity; float *p_turnDecel, float *p_movementMinAccel, float *p_turnMinAccel,
} float *p_turnSensitivity, MxBool *p_turnUseVelocity)
{
void LegoNavController::SetDefaults(int p_mouseDeadzone, float p_movementMaxSpeed, float p_turnMaxSpeed, *p_mouseDeadzone = g_mouseDeadzone;
float p_movementMaxAccel, float p_turnMaxAccel, float p_movementDecel, *p_movementMaxSpeed = g_movementMaxSpeed;
float p_turnDecel, float p_movementMinAccel, float p_turnMinAccel, *p_turnMaxSpeed = g_turnMaxSpeed;
float p_turnSensitivity, MxBool p_turnUseVelocity) *p_movementMaxAccel = g_movementMaxAccel;
{ *p_turnMaxAccel = g_turnMaxAccel;
g_mouseDeadzone = p_mouseDeadzone; *p_movementDecel = g_movementDecel;
g_movementMaxSpeed = p_movementMaxSpeed; *p_turnDecel = g_turnDecel;
g_turnMaxSpeed = p_turnMaxSpeed; *p_movementMinAccel = g_movementMinAccel;
g_movementMaxAccel = p_movementMaxAccel; *p_turnMinAccel = g_turnMinAccel;
g_turnMaxAccel = p_turnMaxAccel; *p_turnSensitivity = g_turnSensitivity;
g_movementDecel = p_movementDecel; *p_turnUseVelocity = g_turnUseVelocity;
g_turnDecel = p_turnDecel; }
g_movementMinAccel = p_movementMinAccel;
g_turnMinAccel = p_turnMinAccel; // OFFSET: LEGO1 0x10054dd0
g_turnSensitivity = p_turnSensitivity; void LegoNavController::SetDefaults(int p_mouseDeadzone, float p_movementMaxSpeed, float p_turnMaxSpeed,
g_turnUseVelocity = p_turnUseVelocity; float p_movementMaxAccel, float p_turnMaxAccel, float p_movementDecel,
} float p_turnDecel, float p_movementMinAccel, float p_turnMinAccel,
float p_turnSensitivity, MxBool p_turnUseVelocity)
LegoNavController::LegoNavController() {
{ g_mouseDeadzone = p_mouseDeadzone;
ResetToDefault(); g_movementMaxSpeed = p_movementMaxSpeed;
g_turnMaxSpeed = p_turnMaxSpeed;
this->unk_18 = 0.0f; g_movementMaxAccel = p_movementMaxAccel;
this->unk_1C = 0.0f; g_turnMaxAccel = p_turnMaxAccel;
this->m_targetMovementSpeed = 0.0f; g_movementDecel = p_movementDecel;
this->m_targetTurnSpeed = 0.0f; g_turnDecel = p_turnDecel;
this->m_movementAccel = 0.0f; g_movementMinAccel = p_movementMinAccel;
this->m_turnAccel = 0.0f; g_turnMinAccel = p_turnMinAccel;
this->m_trackDefault = MX_FALSE; g_turnSensitivity = p_turnSensitivity;
this->m_unk5D = MX_FALSE; g_turnUseVelocity = p_turnUseVelocity;
this->m_unk6C = MX_FALSE; }
this->m_unk64 = 0;
this->m_unk68 = 0; // OFFSET: LEGO1 0x10054ac0
this->m_unk60 = 0; LegoNavController::LegoNavController()
{
MxTimer *timer = Timer(); ResetToDefault();
this->m_time = timer->GetTime();
this->unk_18 = 0.0f;
// TODO: InputManager() this->unk_1C = 0.0f;
// LegoInputManager* inputManager = InputManager(); this->m_targetMovementSpeed = 0.0f;
// inputManager->Register(this); this->m_targetTurnSpeed = 0.0f;
} this->m_movementAccel = 0.0f;
this->m_turnAccel = 0.0f;
// TODO: InputManager() this->m_trackDefault = MX_FALSE;
// LegoNavController::~LegoNavController() this->m_unk5D = MX_FALSE;
// { this->m_unk6C = MX_FALSE;
// LegoInputManager* inputManager = InputManager(); this->m_unk64 = 0;
// inputManager->UnRegister(this); this->m_unk68 = 0;
// } this->m_unk60 = 0;
// TODO: VideoManager() MxTimer *timer = Timer();
// void LegoNavController::SetControlMax(int p_hMax, int p_vMax) this->m_time = timer->GetTime();
// {
// LegoVideoManager* videoManager = VideoManager(); // TODO: InputManager()
// LegoInputManager* inputManager = InputManager();
// this->m_hMax = p_hMax; // inputManager->Register(this);
// this->m_vMax = p_vMax; }
// Probably checks for MxVideoParamFlags: FULL_SCREEN // TODO: InputManager()
// if ((videoManager->m_unk44 & 0x01) != 0) // OFFSET: LEGO1 0x10054c30
// { // LegoNavController::~LegoNavController()
// this->m_hMax = 640; // {
// this->m_vMax = 480; // LegoInputManager* inputManager = InputManager();
// } // inputManager->UnRegister(this);
// } // }
void LegoNavController::ResetToDefault() // TODO: VideoManager()
{ // OFFSET: LEGO1 0x10054ca0
this->m_mouseDeadzone = g_mouseDeadzone; // void LegoNavController::SetControlMax(int p_hMax, int p_vMax)
this->m_zeroThreshold = g_zeroThreshold; // {
this->m_turnMaxAccel = g_turnMaxAccel; // LegoVideoManager* videoManager = VideoManager();
this->m_movementMaxAccel = g_movementMaxAccel;
this->m_turnMinAccel = g_turnMinAccel; // this->m_hMax = p_hMax;
this->m_movementMinAccel = g_movementMinAccel; // this->m_vMax = p_vMax;
this->m_turnDecel = g_turnDecel;
this->m_movementDecel = g_movementDecel; // Probably checks for MxVideoParamFlags: FULL_SCREEN
this->m_turnMaxSpeed = g_turnMaxSpeed; // if ((videoManager->m_unk44 & 0x01) != 0)
this->m_movementMaxSpeed = g_movementMaxSpeed; // {
this->m_turnUseVelocity = g_turnUseVelocity; // this->m_hMax = 640;
this->m_turnSensitivity = g_turnSensitivity; // this->m_vMax = 480;
} // }
// }
void LegoNavController::SetTargets(int p_hPos, int p_vPos, MxBool p_accel)
{ // OFFSET: LEGO1 0x10054cd0
if (this->m_trackDefault != MX_FALSE) void LegoNavController::ResetToDefault()
{ {
ResetToDefault(); this->m_mouseDeadzone = g_mouseDeadzone;
} this->m_zeroThreshold = g_zeroThreshold;
this->m_turnMaxAccel = g_turnMaxAccel;
if (p_accel != MX_FALSE) this->m_movementMaxAccel = g_movementMaxAccel;
{ this->m_turnMinAccel = g_turnMinAccel;
this->m_targetTurnSpeed = CalculateNewTargetSpeed(p_hPos, this->m_hMax / 2, this->m_turnMaxSpeed); this->m_movementMinAccel = g_movementMinAccel;
this->m_targetMovementSpeed = CalculateNewTargetSpeed(this->m_vMax - p_vPos, this->m_vMax / 2, this->m_movementMaxSpeed); this->m_turnDecel = g_turnDecel;
this->m_turnAccel = CalculateNewAccel(p_hPos, this->m_hMax / 2, this->m_turnMaxAccel, (int)this->m_turnMinAccel); this->m_movementDecel = g_movementDecel;
this->m_movementAccel = CalculateNewAccel(this->m_vMax - p_vPos, this->m_vMax / 2, this->m_movementMaxAccel, (int)this->m_turnMinAccel); this->m_turnMaxSpeed = g_turnMaxSpeed;
} this->m_movementMaxSpeed = g_movementMaxSpeed;
else this->m_turnUseVelocity = g_turnUseVelocity;
{ this->m_turnSensitivity = g_turnSensitivity;
this->m_targetTurnSpeed = 0.0f; }
this->m_targetMovementSpeed = 0.0f;
this->m_movementAccel = this->m_movementDecel; // OFFSET: LEGO1 0x10054e40
this->m_turnAccel = this->m_turnDecel; void LegoNavController::SetTargets(int p_hPos, int p_vPos, MxBool p_accel)
} {
} if (this->m_trackDefault != MX_FALSE)
{
float LegoNavController::CalculateNewTargetSpeed(int p_pos, int p_center, float p_maxSpeed) ResetToDefault();
{ }
float result;
int diff = p_pos - p_center; if (p_accel != MX_FALSE)
{
if (diff > this->m_mouseDeadzone) this->m_targetTurnSpeed = CalculateNewTargetSpeed(p_hPos, this->m_hMax / 2, this->m_turnMaxSpeed);
result = (diff - m_mouseDeadzone) * p_maxSpeed / (p_center - m_mouseDeadzone); this->m_targetMovementSpeed = CalculateNewTargetSpeed(this->m_vMax - p_vPos, this->m_vMax / 2, this->m_movementMaxSpeed);
else if (diff < -m_mouseDeadzone) this->m_turnAccel = CalculateNewAccel(p_hPos, this->m_hMax / 2, this->m_turnMaxAccel, (int)this->m_turnMinAccel);
result = (diff + m_mouseDeadzone) * p_maxSpeed / (p_center - m_mouseDeadzone); this->m_movementAccel = CalculateNewAccel(this->m_vMax - p_vPos, this->m_vMax / 2, this->m_movementMaxAccel, (int)this->m_turnMinAccel);
else }
result = 0.0f; else
{
return result; this->m_targetTurnSpeed = 0.0f;
} this->m_targetMovementSpeed = 0.0f;
this->m_movementAccel = this->m_movementDecel;
float LegoNavController::CalculateNewAccel(int p_pos, int p_center, float p_maxAccel, int p_minAccel) this->m_turnAccel = this->m_turnDecel;
{ }
float result; }
int diff = p_pos - p_center;
// OFFSET: LEGO1 0x10054f10
result = Abs(diff) * p_maxAccel / p_center; float LegoNavController::CalculateNewTargetSpeed(int p_pos, int p_center, float p_maxSpeed)
{
if (result < p_minAccel) float result;
{ int diff = p_pos - p_center;
result = (float)p_minAccel;
} if (diff > this->m_mouseDeadzone)
result = (diff - m_mouseDeadzone) * p_maxSpeed / (p_center - m_mouseDeadzone);
return result; else if (diff < -m_mouseDeadzone)
result = (diff + m_mouseDeadzone) * p_maxSpeed / (p_center - m_mouseDeadzone);
else
result = 0.0f;
return result;
}
// OFFSET: LEGO1 0x10054f90
float LegoNavController::CalculateNewAccel(int p_pos, int p_center, float p_maxAccel, int p_minAccel)
{
float result;
int diff = p_pos - p_center;
result = Abs(diff) * p_maxAccel / p_center;
if (result < p_minAccel)
{
result = (float)p_minAccel;
}
return result;
} }