Item tracker (#707)

* Core tracker code mostly done.

* Format

* Clean up enums.

* Format

* Header cleanup

* Update

* use CVars

* format

* Add editor to modern menu

* format

* Fix item tracker cvar loading/saving and add item tracker button for modern menu

* update button label

---------

Co-authored-by: Archez <archez39@me.com>
This commit is contained in:
louist103
2024-11-08 11:51:58 -05:00
committed by GitHub
co-authored by Archez
parent d1bbba626d
commit be70a5a123
7 changed files with 717 additions and 1 deletions
+17 -1
View File
@@ -21,6 +21,9 @@
#include "include/global.h"
#include "include/z64audio.h"
#include "Enhancements/Trackers/ItemTracker.h"
#include "Enhancements/Trackers/ItemTrackerSettings.h"
namespace BenGui {
// MARK: - Delegates
@@ -38,6 +41,8 @@ std::shared_ptr<EventLogWindow> mEventLogWindow;
std::shared_ptr<BenMenu> mBenMenu;
std::shared_ptr<BenInputEditorWindow> mBenInputEditorWindow;
std::shared_ptr<Notification::Window> mNotificationWindow;
std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
std::shared_ptr<ItemTrackerSettingsWindow> mItemTrackerSettingsWindow;
void SetupGuiElements() {
auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui();
@@ -94,6 +99,13 @@ void SetupGuiElements() {
mEventLogWindow = std::make_shared<EventLogWindow>("gWindows.EventLog", "Event Log", ImVec2(520, 600));
gui->AddGuiWindow(mEventLogWindow);
mItemTrackerWindow = std::make_shared<ItemTrackerWindow>("gWindows.ItemTracker", "Item Tracker");
gui->AddGuiWindow(mItemTrackerWindow);
mItemTrackerSettingsWindow = std::make_shared<ItemTrackerSettingsWindow>("gWindows.ItemTrackerSettings",
"Item Tracker Settings", ImVec2(800, 400));
gui->AddGuiWindow(mItemTrackerSettingsWindow);
gui->SetPadBtnTogglesMenu();
mNotificationWindow = std::make_shared<Notification::Window>("gWindows.Notifications", "Notifications Window");
@@ -102,6 +114,9 @@ void SetupGuiElements() {
}
void Destroy() {
auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui();
gui->RemoveAllGuiWindows();
mBenMenuBar = nullptr;
mBenMenu = nullptr;
mStatsWindow = nullptr;
@@ -111,9 +126,10 @@ void Destroy() {
mCollisionViewerWindow = nullptr;
mEventLogWindow = nullptr;
mNotificationWindow = nullptr;
mSaveEditorWindow = nullptr;
mHudEditorWindow = nullptr;
mActorViewerWindow = nullptr;
mItemTrackerWindow = nullptr;
mItemTrackerSettingsWindow = nullptr;
}
} // namespace BenGui
+14
View File
@@ -12,6 +12,9 @@
#include "2s2h/DeveloperTools/DeveloperTools.h"
#include "HudEditor.h"
#include "2s2h/Enhancements/Trackers/ItemTracker.h"
#include "2s2h/Enhancements/Trackers/ItemTrackerSettings.h"
extern "C" {
#include "z64.h"
#include "functions.h"
@@ -345,6 +348,8 @@ void DrawSettingsMenu() {
}
extern std::shared_ptr<HudEditorWindow> mHudEditorWindow;
extern std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
extern std::shared_ptr<ItemTrackerSettingsWindow> mItemTrackerSettingsWindow;
void DrawEnhancementsMenu() {
if (UIWidgets::BeginMenu("Enhancements")) {
@@ -799,6 +804,15 @@ void DrawEnhancementsMenu() {
{ .tooltip = "Enables the Hud Editor window, allowing you to edit your hud" });
}
if (mItemTrackerWindow) {
UIWidgets::WindowButton("Item Tracker", "gWindows.ItemTracker", mItemTrackerWindow);
}
if (mItemTrackerSettingsWindow) {
UIWidgets::WindowButton("Item Tracker Settings", "gWindows.ItemTrackerSettings",
mItemTrackerSettingsWindow);
}
ImGui::EndMenu();
}
}
+9
View File
@@ -1424,6 +1424,15 @@ void AddEnhancements() {
"Enables the HUD Editor window, allowing you to modify your HUD",
WIDGET_WINDOW_BUTTON,
{ .size = UIWidgets::Sizes::Inline, .windowName = "HUD Editor" } } } } });
enhancementsSidebar.push_back(
{ "Item Tracker",
1,
{ // Item Tracker Settings
{ { "Popout Item Tracker Settings",
"gWindows.ItemTrackerSettings",
"",
WIDGET_WINDOW_BUTTON,
{ .size = UIWidgets::Sizes::Inline, .windowName = "Item Tracker Settings" } } } } });
}
void AddDevTools() {
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,82 @@
#include "window/gui/Gui.h"
#include "window/gui/GuiWindow.h"
#include <array>
typedef enum class TrackerWindowType : uint8_t {
Floating,
Window,
} TrackerWindowType;
typedef enum class ItemTrackerDisplayType : int8_t {
Hidden,
MainWindow,
Seperate,
} ItemTrackerDisplayType;
typedef enum {
SECTION_INVENTORY,
SECTION_MASKS,
SECTION_SONGS,
SECTION_DUNGEON,
SECTION_MAX,
} ItemTrackerSection;
typedef enum {
DrawCurrent,
DrawCurCapacity,
DrawMaxCapacity,
DrawCapacityMax,
} ItemTrackerCapacityMode;
class ItemTrackerWindow : public Ship::GuiWindow {
typedef struct AmmoInfo {
uint8_t cur;
uint8_t curCap;
uint8_t maxCap;
} AmmoInfo;
public:
using GuiWindow::GuiWindow;
~ItemTrackerWindow();
void Draw() override;
ImVec4* GetBgColorPtr();
float* GetIconSizePtr();
float* GetIconSpacingPtr();
float* GetTextSizePtr();
float* GetTextOffsetPtr();
TrackerWindowType* GetWindowTypePtr();
bool* GetIsDraggablePtr();
bool* GetOnlyShowPausedPtr();
ItemTrackerDisplayType* GetDrawModePtr(ItemTrackerSection type);
bool* GetCapacityModePtr(ItemTrackerCapacityMode mode);
void LoadSettings();
protected:
void InitElement() override;
void DrawElement() override;
void UpdateElement() override{};
private:
void BeginFloatingWindows(const char* name, ImGuiWindowFlags flags = 0);
void DrawItemsInRows(int columns = 6);
int DrawItems(int columns, int startAt);
int DrawMasks(int columns, int startAt);
int DrawSongs(int columns, int startAt);
void DrawNote(size_t songIndex, bool drawFaded);
int DrawDungeonItemsVert(int columns, int startAt);
void DrawAmmoCount(int itemId, const ImVec2& iconPos);
bool HasAmmoCount(int itemId);
AmmoInfo GetAmmoInfo(int itemId);
ImVec4 mBgColor;
float mIconSize = 36.0f;
float mIconSpacing = 12.0f;
float mTextSize = 13.0f;
float mTextOffset = 0.0f;
TrackerWindowType mWindowType = TrackerWindowType::Floating;
bool mIsDraggable = false;
bool mOnlyDrawPaused = false;
std::array<bool, DrawCapacityMax> mCapacityModes;
std::array<ItemTrackerDisplayType, SECTION_MAX> mItemDrawModes;
};
@@ -0,0 +1,77 @@
#include "ItemTrackerSettings.h"
#include "ItemTracker.h"
#include "../../BenGui/UIWidgets.hpp"
namespace BenGui {
extern std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
}
using namespace BenGui;
void ItemTrackerSettingsWindow::UpdateElement() {
}
void ItemTrackerSettingsWindow::InitElement() {
}
static const char* windowTypes[2] = { "Floating", "Window" };
static const char* displayTypes[3] = { "Hidden", "Main Window", "Separate" };
static const char* displayModes[2] = { "Always", "Combo Button Hold" };
void ItemTrackerSettingsWindow::DrawElement() {
ImGui::SetNextWindowSize(ImVec2(733, 472), ImGuiCond_FirstUseEver);
const UIWidgets::FloatSliderOptions sliderOpts = { .format = "%.0f", .step = 1.0f };
if (!ImGui::BeginChild("Item Tracker Settings")) {
ImGui::EndChild();
return;
}
UIWidgets::WindowButton("Show/Hide Item Tracker", "gWindows.ItemTracker", mItemTrackerWindow,
{ .size = UIWidgets::Sizes::Inline });
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f });
ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV);
ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f);
ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f);
ImGui::TableHeadersRow();
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::Text("BG Color");
ImGui::SameLine();
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
ImGui::ColorEdit4("BG Color", (float*)mItemTrackerWindow->GetBgColorPtr(),
ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel);
UIWidgets::Combobox("Window Type", mItemTrackerWindow->GetWindowTypePtr(), windowTypes);
UIWidgets::Checkbox("Enable Dragging", mItemTrackerWindow->GetIsDraggablePtr());
UIWidgets::Checkbox("Only enable while paused", mItemTrackerWindow->GetOnlyShowPausedPtr());
UIWidgets::SliderFloat("Icon size : %.0fpx", mItemTrackerWindow->GetIconSizePtr(), 0.0f, 128.0f, sliderOpts);
UIWidgets::SliderFloat("Icon margins : %.0fpx", mItemTrackerWindow->GetIconSpacingPtr(), -5.0f, 50.0f, sliderOpts);
UIWidgets::SliderFloat("Text size : %.0fpx", mItemTrackerWindow->GetTextSizePtr(), 1.0f, 30.0f, sliderOpts);
UIWidgets::SliderFloat("Text Offset : %0.fpx", mItemTrackerWindow->GetTextOffsetPtr(), 0.0f, 40.0f, sliderOpts);
ImGui::TableNextColumn();
UIWidgets::Combobox("Inventory", mItemTrackerWindow->GetDrawModePtr(SECTION_INVENTORY), displayTypes);
UIWidgets::Combobox("Masks", mItemTrackerWindow->GetDrawModePtr(SECTION_MASKS), displayTypes);
UIWidgets::Combobox("Songs", mItemTrackerWindow->GetDrawModePtr(SECTION_SONGS), displayTypes);
UIWidgets::Combobox("Dungeon Items", mItemTrackerWindow->GetDrawModePtr(SECTION_DUNGEON), displayTypes);
UIWidgets::Checkbox("Draw Current Ammo",
mItemTrackerWindow->GetCapacityModePtr(ItemTrackerCapacityMode::DrawCurrent));
UIWidgets::Checkbox("Draw Current Capacity",
mItemTrackerWindow->GetCapacityModePtr(ItemTrackerCapacityMode::DrawCurCapacity));
UIWidgets::Checkbox("Draw Max Capacity",
mItemTrackerWindow->GetCapacityModePtr(ItemTrackerCapacityMode::DrawMaxCapacity));
ImGui::PopStyleVar(1);
ImGui::EndTable();
ImGui::EndChild();
}
@@ -0,0 +1,12 @@
#include "window/gui/Gui.h"
#include "window/gui/GuiWindow.h"
class ItemTrackerSettingsWindow : public Ship::GuiWindow {
public:
using GuiWindow::GuiWindow;
protected:
void InitElement() override;
void DrawElement() override;
void UpdateElement() override;
};