Merge branch 'develop' of https://github.com/HarbourMasters/Shipwright into rando-custom-messages

This commit is contained in:
Christopher Leggett 2022-07-14 10:06:05 -04:00
commit 9c57ed6642
No known key found for this signature in database
GPG Key ID: 7093AE5FF7037D79
13 changed files with 72 additions and 353 deletions

View File

@ -89,15 +89,10 @@ void Ship::ControlDeck::LoadControllerSettings() {
profile.Mappings.clear(); profile.Mappings.clear();
profile.Thresholds.clear(); profile.Thresholds.clear();
profile.GyroThresholds.clear();
profile.UseRumble = Config->getBool(NESTED("Rumble.Enabled", "")); profile.UseRumble = Config->getBool(NESTED("Rumble.Enabled", ""));
profile.RumbleStrength = Config->getBool(NESTED("Rumble.Strength", "")); profile.RumbleStrength = Config->getFloat(NESTED("Rumble.Strength", ""));
profile.UseGyro = Config->getBool(NESTED("Gyro.Enabled", "")); profile.UseGyro = Config->getBool(NESTED("Gyro.Enabled", ""));
for (auto const& val : rawProfile["Gyro"]["Thresholds"].items()) {
profile.GyroThresholds[std::stoi(val.key())] = val.value();
}
for (auto const& val : rawProfile["Thresholds"].items()) { for (auto const& val : rawProfile["Thresholds"].items()) {
profile.Thresholds[static_cast<ControllerThresholds>(std::stoi(val.key()))] = val.value(); profile.Thresholds[static_cast<ControllerThresholds>(std::stoi(val.key()))] = val.value();
} }
@ -135,12 +130,8 @@ void Ship::ControlDeck::SaveControllerSettings() {
Config->setInt(NESTED("Mappings.%s", val.key().c_str()), -1); Config->setInt(NESTED("Mappings.%s", val.key().c_str()), -1);
} }
for (auto const& [key, val] : profile.GyroThresholds) {
Config->setInt(NESTED("Gyro.Thresholds.%d", key), val);
}
for (auto const& [key, val] : profile.Thresholds) { for (auto const& [key, val] : profile.Thresholds) {
Config->setInt(NESTED("Thresholds.%d", key), val); Config->setFloat(NESTED("Thresholds.%d", key), val);
} }
for (auto const& [key, val] : profile.Mappings) { for (auto const& [key, val] : profile.Mappings) {

View File

@ -26,52 +26,45 @@ namespace Ship {
pad->button |= dwPressedButtons[slot] & 0xFFFF; pad->button |= dwPressedButtons[slot] & 0xFFFF;
// Stick Inputs // Stick Inputs
if (pad->stick_x == 0) { if (wStickX == 0) {
if (dwPressedButtons[slot] & BTN_STICKLEFT) { if (dwPressedButtons[slot] & BTN_STICKLEFT) {
pad->stick_x = -128; pad->stick_x = -128;
} } else if (dwPressedButtons[slot] & BTN_STICKRIGHT) {
else if (dwPressedButtons[slot] & BTN_STICKRIGHT) {
pad->stick_x = 127; pad->stick_x = 127;
} }
else { } else {
pad->stick_x = wStickX; pad->stick_x = wStickX;
}
} }
if (pad->stick_y == 0) { if (wStickY == 0) {
if (dwPressedButtons[slot] & BTN_STICKDOWN) { if (dwPressedButtons[slot] & BTN_STICKDOWN) {
pad->stick_y = -128; pad->stick_y = -128;
} } else if (dwPressedButtons[slot] & BTN_STICKUP) {
else if (dwPressedButtons[slot] & BTN_STICKUP) {
pad->stick_y = 127; pad->stick_y = 127;
} }
else { } else {
pad->stick_y = wStickY; pad->stick_y = wStickY;
}
} }
// Stick Inputs // Stick Inputs
if (pad->cam_x == 0) { if (wCamX == 0) {
if (dwPressedButtons[slot] & BTN_VSTICKLEFT) { if (dwPressedButtons[slot] & BTN_VSTICKLEFT) {
pad->cam_x = -128 * 10.0f; pad->cam_x = -128 * 10.0f;
} } else if (dwPressedButtons[slot] & BTN_VSTICKRIGHT) {
else if (dwPressedButtons[slot] & BTN_VSTICKRIGHT) {
pad->cam_x = 127 * 10.0f; pad->cam_x = 127 * 10.0f;
} }
else { } else {
pad->cam_x = wCamX; pad->cam_x = wCamX;
}
} }
if (pad->cam_y == 0) {
if (wCamY == 0) {
if (dwPressedButtons[slot] & BTN_VSTICKDOWN) { if (dwPressedButtons[slot] & BTN_VSTICKDOWN) {
pad->cam_y = -128 * 10.0f; pad->cam_y = -128 * 10.0f;
} } else if (dwPressedButtons[slot] & BTN_VSTICKUP) {
else if (dwPressedButtons[slot] & BTN_VSTICKUP) {
pad->cam_y = 127 * 10.0f; pad->cam_y = 127 * 10.0f;
} }
else { } else {
pad->cam_y = wCamY; pad->cam_y = wCamY;
}
} }
// Gyro // Gyro

View File

@ -29,8 +29,7 @@ namespace Ship {
bool UseRumble = false; bool UseRumble = false;
bool UseGyro = false; bool UseGyro = false;
float RumbleStrength = 1.0f; float RumbleStrength = 1.0f;
std::unordered_map<ControllerThresholds, int32_t> Thresholds; std::unordered_map<ControllerThresholds, float> Thresholds;
std::unordered_map<int32_t, int32_t> GyroThresholds;
std::map<int32_t, int32_t> Mappings; std::map<int32_t, int32_t> Mappings;
}; };

View File

@ -1,277 +0,0 @@
#include "InputEditor.h"
#include "Controller.h"
#include "Window.h"
#include "Lib/ImGui/imgui.h"
#include "ImGuiImpl.h"
#include "Utils/StringHelper.h"
#include "Lib/ImGui/imgui_internal.h"
namespace Ship {
extern "C" uint8_t __enableGameInput;
#define SEPARATION() ImGui::Dummy(ImVec2(0, 5))
void InputEditor::Init() {
BtnReading = -1;
}
std::shared_ptr<Controller> GetControllerPerSlot(int slot) {
const std::vector<int> vDevices = Window::ControllerApi->virtualDevices;
return Window::ControllerApi->physicalDevices[vDevices[slot]];
}
void InputEditor::DrawButton(const char* label, int n64Btn) {
const std::shared_ptr<Controller> backend = GetControllerPerSlot(CurrentPort);
float size = 40;
bool readingMode = BtnReading == n64Btn;
bool disabled = BtnReading != -1 && !readingMode || !backend->Connected();
ImVec2 len = ImGui::CalcTextSize(label);
ImVec2 pos = ImGui::GetCursorPos();
ImGui::SetCursorPosY(pos.y + len.y / 4);
ImGui::SetCursorPosX(pos.x + abs(len.x - size));
ImGui::Text("%s", label);
ImGui::SameLine();
ImGui::SetCursorPosY(pos.y);
if(disabled) {
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f);
}
if(readingMode) {
const int32_t btn = backend->ReadRawPress();
if(btn != -1) {
backend->SetButtonMapping(CurrentPort, n64Btn, btn);
BtnReading = -1;
}
}
const char* BtnName = backend->GetButtonName(CurrentPort, n64Btn);
if (ImGui::Button(StringHelper::Sprintf("%s##HBTNID_%d", readingMode ? "Press a Key..." : BtnName, n64Btn).c_str())) {
BtnReading = n64Btn;
backend->ClearRawPress();
}
if(disabled) {
ImGui::PopItemFlag();
ImGui::PopStyleVar();
}
}
void InputEditor::DrawVirtualStick(const char* label, ImVec2 stick) {
ImGui::SetCursorPos(ImVec2(ImGui::GetCursorPos().x + 5, ImGui::GetCursorPos().y));
ImGui::BeginChild(label, ImVec2(68, 75), false);
ImDrawList* draw_list = ImGui::GetWindowDrawList();
const ImVec2 p = ImGui::GetCursorScreenPos();
float sz = 45.0f;
float rad = sz * 0.5f;
ImVec2 pos = ImVec2(p.x + sz * 0.5f + 12, p.y + sz * 0.5f + 11);
float stickX = (stick.x / 83.0f) * (rad * 0.5f);
float stickY = -(stick.y / 83.0f) * (rad * 0.5f);
ImVec4 rect = ImVec4(p.x + 2, p.y + 2, 65, 65);
draw_list->AddRect(ImVec2(rect.x, rect.y), ImVec2(rect.x + rect.z, rect.y + rect.w), ImColor(100, 100, 100, 255), 0.0f, 0, 1.5f);
draw_list->AddCircleFilled(pos, rad, ImColor(130, 130, 130, 255), 8);
draw_list->AddCircleFilled(ImVec2(pos.x + stickX, pos.y + stickY), 5, ImColor(15, 15, 15, 255), 7);
ImGui::EndChild();
}
void InputEditor::DrawControllerSchema() {
const std::vector<int> vDevices = Window::ControllerApi->virtualDevices;
const std::vector<std::shared_ptr<Controller>> devices = Window::ControllerApi->physicalDevices;
std::shared_ptr<Controller> Backend = devices[vDevices[CurrentPort]];
DeviceProfile& profile =Backend->profiles[CurrentPort];
float sensitivity = profile.Thresholds[SENSITIVITY];
bool IsKeyboard = Backend->GetGuid() == "Keyboard" || !Backend->Connected();
const char* ControllerName = Backend->GetControllerName();
if (ControllerName != nullptr && ImGui::BeginCombo("##ControllerEntries", ControllerName)) {
for (uint8_t i = 0; i < devices.size(); i++) {
if (ImGui::Selectable(devices[i]->GetControllerName(), i == vDevices[CurrentPort])) {
Window::ControllerApi->SetPhysicalDevice(CurrentPort, i);
}
}
ImGui::EndCombo();
}
ImGui::SameLine();
if(ImGui::Button("Refresh")) {
Window::ControllerApi->ScanPhysicalDevices();
}
SohImGui::BeginGroupPanel("Buttons", ImVec2(150, 20));
DrawButton("A", BTN_A);
DrawButton("B", BTN_B);
DrawButton("L", BTN_L);
DrawButton("R", BTN_R);
DrawButton("Z", BTN_Z);
DrawButton("START", BTN_START);
SEPARATION();
SohImGui::EndGroupPanel(IsKeyboard ? 7.0f : 48.0f);
ImGui::SameLine();
SohImGui::BeginGroupPanel("Digital Pad", ImVec2(150, 20));
DrawButton("Up", BTN_DUP);
DrawButton("Down", BTN_DDOWN);
DrawButton("Left", BTN_DLEFT);
DrawButton("Right", BTN_DRIGHT);
SEPARATION();
SohImGui::EndGroupPanel(IsKeyboard ? 53.0f : 94.0f);
ImGui::SameLine();
SohImGui::BeginGroupPanel("Analog Stick", ImVec2(150, 20));
DrawButton("Up", BTN_STICKUP);
DrawButton("Down", BTN_STICKDOWN);
DrawButton("Left", BTN_STICKLEFT);
DrawButton("Right", BTN_STICKRIGHT);
if (!IsKeyboard) {
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 8);
DrawVirtualStick("##MainVirtualStick", ImVec2(Backend->wStickX, Backend->wStickY));
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
ImGui::BeginChild("##MSInput", ImVec2(90, 50), false);
ImGui::Text("Deadzone");
ImGui::PushItemWidth(80);
ImGui::InputInt("##MDZone", &profile.Thresholds[LEFT_STICK]);
ImGui::PopItemWidth();
ImGui::EndChild();
} else {
ImGui::Dummy(ImVec2(0, 6));
}
SohImGui::EndGroupPanel(IsKeyboard ? 52.0f : 24.0f);
ImGui::SameLine();
if (!IsKeyboard) {
ImGui::SameLine();
SohImGui::BeginGroupPanel("Camera Stick", ImVec2(150, 20));
DrawButton("Up", BTN_VSTICKUP);
DrawButton("Down", BTN_VSTICKDOWN);
DrawButton("Left", BTN_VSTICKLEFT);
DrawButton("Right", BTN_VSTICKRIGHT);
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 8);
DrawVirtualStick("##CameraVirtualStick", ImVec2(Backend->wCamX / sensitivity, Backend->wCamY / sensitivity));
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
ImGui::BeginChild("##CSInput", ImVec2(90, 85), false);
ImGui::Text("Deadzone");
ImGui::PushItemWidth(80);
ImGui::InputInt("##MDZone", &profile.Thresholds[RIGHT_STICK]);
ImGui::PopItemWidth();
ImGui::Text("Sensitivity");
ImGui::PushItemWidth(80);
ImGui::InputInt("##MSensitivity", &profile.Thresholds[SENSITIVITY]);
ImGui::PopItemWidth();
ImGui::EndChild();
SohImGui::EndGroupPanel(14.0f);
}
if(Backend->CanGyro()) {
ImGui::SameLine();
SohImGui::BeginGroupPanel("Gyro Options", ImVec2(175, 20));
float cursorX = ImGui::GetCursorPosX() + 5;
ImGui::SetCursorPosX(cursorX);
ImGui::Checkbox("Enable Gyro", &profile.UseGyro);
ImGui::SetCursorPosX(cursorX);
ImGui::Text("Gyro Sensitivity: %d%%", profile.Thresholds[GYRO_SENSITIVITY]);
ImGui::PushItemWidth(135.0f);
ImGui::SetCursorPosX(cursorX);
ImGui::SliderInt("##GSensitivity", &profile.Thresholds[GYRO_SENSITIVITY], 0, 100, "");
ImGui::PopItemWidth();
ImGui::Dummy(ImVec2(0, 1));
ImGui::SetCursorPosX(cursorX);
if (ImGui::Button("Recalibrate Gyro##RGyro")) {
profile.Thresholds[DRIFT_X] = 0;
profile.Thresholds[DRIFT_Y] = 0;
}
ImGui::SetCursorPosX(cursorX);
DrawVirtualStick("##GyroPreview", ImVec2(Backend->wGyroX, Backend->wGyroY));
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
ImGui::BeginChild("##GyInput", ImVec2(90, 85), false);
ImGui::Text("Drift X");
ImGui::PushItemWidth(80);
ImGui::InputInt("##GDriftX", &profile.Thresholds[DRIFT_X]);
ImGui::PopItemWidth();
ImGui::Text("Drift Y");
ImGui::PushItemWidth(80);
ImGui::InputInt("##GDriftY", &profile.Thresholds[DRIFT_Y]);
ImGui::PopItemWidth();
ImGui::EndChild();
SohImGui::EndGroupPanel(14.0f);
}
ImGui::SameLine();
const ImVec2 cursor = ImGui::GetCursorPos();
SohImGui::BeginGroupPanel("C-Buttons", ImVec2(158, 20));
DrawButton("Up", BTN_CUP);
DrawButton("Down", BTN_CDOWN);
DrawButton("Left", BTN_CLEFT);
DrawButton("Right", BTN_CRIGHT);
ImGui::Dummy(ImVec2(0, 5));
SohImGui::EndGroupPanel();
ImGui::SetCursorPosX(cursor.x);
ImGui::SetCursorPosY(cursor.y + 120);
SohImGui::BeginGroupPanel("Options", ImVec2(158, 20));
float cursorX = ImGui::GetCursorPosX() + 5;
ImGui::SetCursorPosX(cursorX);
ImGui::Checkbox("Rumble Enabled", &profile.UseRumble);
if (Backend->CanRumble()) {
ImGui::SetCursorPosX(cursorX);
ImGui::Text("Rumble Force: %d%%", static_cast<int>(100 * profile.RumbleStrength));
ImGui::SetCursorPosX(cursorX);
ImGui::PushItemWidth(135.0f);
ImGui::SliderFloat("##RStrength", &profile.RumbleStrength, 0, 1.0f, "");
ImGui::PopItemWidth();
}
ImGui::Dummy(ImVec2(0, 5));
SohImGui::EndGroupPanel(IsKeyboard ? 0.0f : 2.0f);
}
void InputEditor::DrawHud() {
__enableGameInput = true;
if (!this->Opened) {
BtnReading = -1;
return;
}
ImGui::SetNextWindowSizeConstraints(ImVec2(641, 250), ImVec2(1200, 290));
//OTRTODO: Disable this stupid workaround ( ReadRawPress() only works when the window is on the main viewport )
ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID);
ImGui::Begin("Controller Configuration", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize);
ImGui::BeginTabBar("##Controllers");
for (int i = 0; i < 4; i++) {
if (ImGui::BeginTabItem(StringHelper::Sprintf("Port %d", i + 1).c_str())) {
CurrentPort = i;
ImGui::EndTabItem();
}
}
ImGui::EndTabBar();
// Draw current cfg
DrawControllerSchema();
ImGui::End();
}
}

View File

@ -141,7 +141,7 @@ namespace Ship {
ImGui::BeginChild("##MSInput", ImVec2(90, 50), false); ImGui::BeginChild("##MSInput", ImVec2(90, 50), false);
ImGui::Text("Deadzone"); ImGui::Text("Deadzone");
ImGui::PushItemWidth(80); ImGui::PushItemWidth(80);
ImGui::InputInt("##MDZone", &profile.Thresholds[LEFT_STICK]); ImGui::InputFloat("##MDZone", &profile.Thresholds[LEFT_STICK], 1.0f, 0.0f, "%.0f");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::EndChild(); ImGui::EndChild();
} else { } else {
@ -166,11 +166,11 @@ namespace Ship {
ImGui::BeginChild("##CSInput", ImVec2(90, 85), false); ImGui::BeginChild("##CSInput", ImVec2(90, 85), false);
ImGui::Text("Deadzone"); ImGui::Text("Deadzone");
ImGui::PushItemWidth(80); ImGui::PushItemWidth(80);
ImGui::InputInt("##MDZone", &profile.Thresholds[RIGHT_STICK]); ImGui::InputFloat("##MDZone", &profile.Thresholds[RIGHT_STICK], 1.0f, 0.0f, "%.0f");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::Text("Sensitivity"); ImGui::Text("Sensitivity");
ImGui::PushItemWidth(80); ImGui::PushItemWidth(80);
ImGui::InputInt("##MSensitivity", &profile.Thresholds[SENSITIVITY]); ImGui::InputFloat("##MSensitivity", &profile.Thresholds[SENSITIVITY], 1.0f, 0.0f, "%.0f");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::EndChild(); ImGui::EndChild();
SohImGui::EndGroupPanel(14.0f); SohImGui::EndGroupPanel(14.0f);
@ -184,30 +184,30 @@ namespace Ship {
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
ImGui::Checkbox("Enable Gyro", &profile.UseGyro); ImGui::Checkbox("Enable Gyro", &profile.UseGyro);
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
ImGui::Text("Gyro Sensitivity: %d%%", profile.Thresholds[GYRO_SENSITIVITY]); ImGui::Text("Gyro Sensitivity: %d%%", static_cast<int>(100.0f * profile.Thresholds[GYRO_SENSITIVITY]));
ImGui::PushItemWidth(135.0f); ImGui::PushItemWidth(135.0f);
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
ImGui::SliderInt("##GSensitivity", &profile.Thresholds[GYRO_SENSITIVITY], 0, 100, ""); ImGui::SliderFloat("##GSensitivity", &profile.Thresholds[GYRO_SENSITIVITY], 0.0f, 1.0f, "");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::Dummy(ImVec2(0, 1)); ImGui::Dummy(ImVec2(0, 1));
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
if (ImGui::Button("Recalibrate Gyro##RGyro")) { if (ImGui::Button("Recalibrate Gyro##RGyro")) {
profile.Thresholds[DRIFT_X] = 0; profile.Thresholds[DRIFT_X] = 0.0f;
profile.Thresholds[DRIFT_Y] = 0; profile.Thresholds[DRIFT_Y] = 0.0f;
} }
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
DrawVirtualStick("##GyroPreview", ImVec2(Backend->wGyroX, Backend->wGyroY)); DrawVirtualStick("##GyroPreview", ImVec2(-10.0f * Backend->wGyroY, 10.0f * Backend->wGyroX));
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5); ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
ImGui::BeginChild("##GyInput", ImVec2(90, 85), false); ImGui::BeginChild("##GyInput", ImVec2(90, 85), false);
ImGui::Text("Drift X"); ImGui::Text("Drift X");
ImGui::PushItemWidth(80); ImGui::PushItemWidth(80);
ImGui::InputInt("##GDriftX", &profile.Thresholds[DRIFT_X]); ImGui::InputFloat("##GDriftX", &profile.Thresholds[DRIFT_X], 1.0f, 0.0f, "%.1f");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::Text("Drift Y"); ImGui::Text("Drift Y");
ImGui::PushItemWidth(80); ImGui::PushItemWidth(80);
ImGui::InputInt("##GDriftY", &profile.Thresholds[DRIFT_Y]); ImGui::InputFloat("##GDriftY", &profile.Thresholds[DRIFT_Y], 1.0f, 0.0f, "%.1f");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::EndChild(); ImGui::EndChild();
SohImGui::EndGroupPanel(14.0f); SohImGui::EndGroupPanel(14.0f);
@ -233,10 +233,10 @@ namespace Ship {
ImGui::Checkbox("Rumble Enabled", &profile.UseRumble); ImGui::Checkbox("Rumble Enabled", &profile.UseRumble);
if (Backend->CanRumble()) { if (Backend->CanRumble()) {
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
ImGui::Text("Rumble Force: %d%%", static_cast<int>(100 * profile.RumbleStrength)); ImGui::Text("Rumble Force: %d%%", static_cast<int>(100.0f * profile.RumbleStrength));
ImGui::SetCursorPosX(cursorX); ImGui::SetCursorPosX(cursorX);
ImGui::PushItemWidth(135.0f); ImGui::PushItemWidth(135.0f);
ImGui::SliderFloat("##RStrength", &profile.RumbleStrength, 0, 1.0f, ""); ImGui::SliderFloat("##RStrength", &profile.RumbleStrength, 0.0f, 1.0f, "");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
} }
ImGui::Dummy(ImVec2(0, 5)); ImGui::Dummy(ImVec2(0, 5));

View File

@ -63,8 +63,7 @@ namespace Ship
Deckard = 0, Deckard = 0,
Roy = 1, Roy = 1,
Rachael = 2, Rachael = 2,
Leon = 3, Zhora = 3,
Zhora = 4,
// ... // ...
}; };

View File

@ -100,13 +100,13 @@ namespace Ship {
for (int32_t i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++) { for (int32_t i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++) {
const auto Axis = static_cast<SDL_GameControllerAxis>(i); const auto Axis = static_cast<SDL_GameControllerAxis>(i);
const auto AxisValue = SDL_GameControllerGetAxis(Cont, Axis) / 32767; const auto AxisValue = SDL_GameControllerGetAxis(Cont, Axis) / 32767.0f;
if(AxisValue < 0) { if (AxisValue < -0.7f) {
return -(Axis + AXIS_SCANCODE_BIT); return -(Axis + AXIS_SCANCODE_BIT);
} }
if (AxisValue > 0) { if (AxisValue > 0.7f) {
return (Axis + AXIS_SCANCODE_BIT); return (Axis + AXIS_SCANCODE_BIT);
} }
} }
@ -153,9 +153,9 @@ namespace Ship {
float gyroData[3]; float gyroData[3];
SDL_GameControllerGetSensorData(Cont, SDL_SENSOR_GYRO, gyroData, 3); SDL_GameControllerGetSensorData(Cont, SDL_SENSOR_GYRO, gyroData, 3);
float gyro_drift_x = profile.GyroThresholds[DRIFT_X] / 100.0f; float gyro_drift_x = profile.Thresholds[DRIFT_X] / 100.0f;
float gyro_drift_y = profile.GyroThresholds[DRIFT_Y] / 100.0f; float gyro_drift_y = profile.Thresholds[DRIFT_Y] / 100.0f;
const float gyro_sensitivity = profile.GyroThresholds[SENSITIVITY] / 100.0f; const float gyro_sensitivity = profile.Thresholds[GYRO_SENSITIVITY];
if (gyro_drift_x == 0) { if (gyro_drift_x == 0) {
gyro_drift_x = gyroData[0]; gyro_drift_x = gyroData[0];
@ -165,8 +165,8 @@ namespace Ship {
gyro_drift_y = gyroData[1]; gyro_drift_y = gyroData[1];
} }
profile.GyroThresholds[DRIFT_X] = (int) gyro_drift_x * 100; profile.Thresholds[DRIFT_X] = gyro_drift_x * 100.0f;
profile.GyroThresholds[DRIFT_Y] = (int) gyro_drift_y * 100; profile.Thresholds[DRIFT_Y] = gyro_drift_y * 100.0f;
wGyroX = gyroData[0] - gyro_drift_x; wGyroX = gyroData[0] - gyro_drift_x;
wGyroY = gyroData[1] - gyro_drift_y; wGyroY = gyroData[1] - gyro_drift_y;
@ -175,6 +175,8 @@ namespace Ship {
wGyroY *= gyro_sensitivity; wGyroY *= gyro_sensitivity;
} }
dwPressedButtons[slot] = 0;
for (int32_t i = SDL_CONTROLLER_BUTTON_A; i < SDL_CONTROLLER_BUTTON_MAX; i++) { for (int32_t i = SDL_CONTROLLER_BUTTON_A; i < SDL_CONTROLLER_BUTTON_MAX; i++) {
if (profile.Mappings.contains(i)) { if (profile.Mappings.contains(i)) {
if (SDL_GameControllerGetButton(Cont, static_cast<SDL_GameControllerButton>(i))) { if (SDL_GameControllerGetButton(Cont, static_cast<SDL_GameControllerButton>(i))) {
@ -198,7 +200,7 @@ namespace Ship {
const auto Axis = static_cast<SDL_GameControllerAxis>(i); const auto Axis = static_cast<SDL_GameControllerAxis>(i);
const auto PosScancode = i + AXIS_SCANCODE_BIT; const auto PosScancode = i + AXIS_SCANCODE_BIT;
const auto NegScancode = -PosScancode; const auto NegScancode = -PosScancode;
const auto AxisThreshold = profile.Thresholds[SDLAxisToThreshold(i)]; const auto AxisThreshold = static_cast<int>(profile.Thresholds[SDLAxisToThreshold(i)]);
const auto PosButton = profile.Mappings[PosScancode]; const auto PosButton = profile.Mappings[PosScancode];
const auto NegButton = profile.Mappings[NegScancode]; const auto NegButton = profile.Mappings[NegScancode];
const auto AxisValue = SDL_GameControllerGetAxis(Cont, Axis); const auto AxisValue = SDL_GameControllerGetAxis(Cont, Axis);
@ -467,10 +469,13 @@ namespace Ship {
profile.Mappings[-(SDL_CONTROLLER_AXIS_LEFTX + AXIS_SCANCODE_BIT)] = BTN_STICKLEFT; profile.Mappings[-(SDL_CONTROLLER_AXIS_LEFTX + AXIS_SCANCODE_BIT)] = BTN_STICKLEFT;
profile.Mappings[SDL_CONTROLLER_AXIS_LEFTY + AXIS_SCANCODE_BIT] = BTN_STICKDOWN; profile.Mappings[SDL_CONTROLLER_AXIS_LEFTY + AXIS_SCANCODE_BIT] = BTN_STICKDOWN;
profile.Mappings[-(SDL_CONTROLLER_AXIS_LEFTY + AXIS_SCANCODE_BIT)] = BTN_STICKUP; profile.Mappings[-(SDL_CONTROLLER_AXIS_LEFTY + AXIS_SCANCODE_BIT)] = BTN_STICKUP;
profile.Thresholds[LEFT_STICK] = 16.0; profile.Thresholds[LEFT_STICK] = 16.0f;
profile.Thresholds[RIGHT_STICK] = 16.0; profile.Thresholds[RIGHT_STICK] = 16.0f;
profile.Thresholds[LEFT_TRIGGER] = 0x1E00; profile.Thresholds[LEFT_TRIGGER] = 0x1E00;
profile.Thresholds[RIGHT_TRIGGER] = 0x1E00; profile.Thresholds[RIGHT_TRIGGER] = 0x1E00;
profile.Thresholds[SENSITIVITY] = 16.0; profile.Thresholds[DRIFT_X] = 0.0f;
profile.Thresholds[DRIFT_Y] = 0.0f;
profile.Thresholds[SENSITIVITY] = 16.0f;
profile.Thresholds[GYRO_SENSITIVITY] = 1.0f;
} }
} }

View File

@ -38,38 +38,38 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Testing|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Testing|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Testing|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Testing|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>

View File

@ -942,6 +942,7 @@
<ClCompile Include="src\overlays\misc\ovl_kaleido_scope\z_lmap_mark.c" /> <ClCompile Include="src\overlays\misc\ovl_kaleido_scope\z_lmap_mark.c" />
<ClCompile Include="src\overlays\misc\ovl_kaleido_scope\z_lmap_mark_data.c" /> <ClCompile Include="src\overlays\misc\ovl_kaleido_scope\z_lmap_mark_data.c" />
<ClCompile Include="src\overlays\misc\ovl_map_mark_data\z_map_mark_data.c" /> <ClCompile Include="src\overlays\misc\ovl_map_mark_data\z_map_mark_data.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="soh\Enhancements\cosmetics\CosmeticsEditor.h" /> <ClInclude Include="soh\Enhancements\cosmetics\CosmeticsEditor.h" />

View File

@ -521,7 +521,7 @@ void DebugConsole_LoadLegacyCVars() {
} }
} }
fs::remove("cvars.cfg"); fs::remove(cvarsConfig);
} }
} }

View File

@ -7,6 +7,9 @@
// #include <soh/Enhancements/randomizer.h> // #include <soh/Enhancements/randomizer.h>
#include <Cvar.h> #include <Cvar.h>
#include <GameSettings.h> #include <GameSettings.h>
#define NOGDI
#define WIN32_LEAN_AND_MEAN
#include <GlobalCtx2.h>
#define TICKS_PER_SEC 268123480.0 #define TICKS_PER_SEC 268123480.0
@ -18,7 +21,7 @@ void RandoMain::GenerateRando(std::unordered_map<RandomizerSettingKey, u8> cvarS
// std::string settingsFileName = "./randomizer/latest_settings.json"; // std::string settingsFileName = "./randomizer/latest_settings.json";
// CVar_SetString("gLoadedPreset", settingsFileName.c_str()); // CVar_SetString("gLoadedPreset", settingsFileName.c_str());
std::string fileName = GenerateRandomizer(cvarSettings); std::string fileName = Ship::GlobalCtx2::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings).c_str());
CVar_SetString("gSpoilerLog", fileName.c_str()); CVar_SetString("gSpoilerLog", fileName.c_str());
Game::SaveSettings(); Game::SaveSettings();

View File

@ -26,6 +26,10 @@
#include <filesystem> #include <filesystem>
#include <variables.h> #include <variables.h>
#define NOGDI
#define WIN32_LEAN_AND_MEAN
#include "GlobalCtx2.h"
using json = nlohmann::json; using json = nlohmann::json;
json jsonData; json jsonData;
@ -721,12 +725,13 @@ const char* SpoilerLog_Write(int language) {
//WriteShuffledEntrances(spoilerLog); //WriteShuffledEntrances(spoilerLog);
WriteAllLocations(language); WriteAllLocations(language);
if (!std::filesystem::exists("./Randomizer")) { if (!std::filesystem::exists(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Randomizer"))) {
std::filesystem::create_directory("./Randomizer"); std::filesystem::create_directory(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Randomizer"));
} }
std::string jsonString = jsonData.dump(4); std::string jsonString = jsonData.dump(4);
std::ofstream jsonFile("./Randomizer/" + Settings::seed + ".json"); std::ofstream jsonFile(Ship::GlobalCtx2::GetPathRelativeToAppDirectory(
(std::string("Randomizer/") + std::string(Settings::seed) + std::string(".json")).c_str()));
jsonFile << std::setw(4) << jsonString << std::endl; jsonFile << std::setw(4) << jsonString << std::endl;
jsonFile.close(); jsonFile.close();

View File

@ -1,4 +1,4 @@
const char gBuildVersion[] = "ROY ALFA (2.0.0)"; const char gBuildVersion[] = "RACHAEL ALFA (3.0.0)";
const char gBuildTeam[] = "github.com/harbourmasters"; const char gBuildTeam[] = "github.com/harbourmasters";
const char gBuildDate[] = __DATE__ " " __TIME__; const char gBuildDate[] = __DATE__ " " __TIME__;
const char gBuildMakeOption[] = ""; const char gBuildMakeOption[] = "";