diff options
Diffstat (limited to 'src/tracker_panel.cpp')
| -rw-r--r-- | src/tracker_panel.cpp | 54 | 
1 files changed, 51 insertions, 3 deletions
| diff --git a/src/tracker_panel.cpp b/src/tracker_panel.cpp index d60c1b6..2e1497b 100644 --- a/src/tracker_panel.cpp +++ b/src/tracker_panel.cpp | |||
| @@ -1,11 +1,15 @@ | |||
| 1 | #include "tracker_panel.h" | 1 | #include "tracker_panel.h" | 
| 2 | 2 | ||
| 3 | #include <fmt/core.h> | ||
| 3 | #include <wx/dcbuffer.h> | 4 | #include <wx/dcbuffer.h> | 
| 4 | 5 | ||
| 6 | #include <algorithm> | ||
| 7 | |||
| 5 | #include "ap_state.h" | 8 | #include "ap_state.h" | 
| 6 | #include "area_popup.h" | 9 | #include "area_popup.h" | 
| 7 | #include "game_data.h" | 10 | #include "game_data.h" | 
| 8 | #include "global.h" | 11 | #include "global.h" | 
| 12 | #include "godot_variant.h" | ||
| 9 | #include "tracker_config.h" | 13 | #include "tracker_config.h" | 
| 10 | #include "tracker_state.h" | 14 | #include "tracker_state.h" | 
| 11 | 15 | ||
| @@ -53,6 +57,35 @@ void TrackerPanel::UpdateIndicators() { | |||
| 53 | Redraw(); | 57 | Redraw(); | 
| 54 | } | 58 | } | 
| 55 | 59 | ||
| 60 | void TrackerPanel::SetSavedataPath(std::string savedata_path) { | ||
| 61 | if (!panels_mode_) { | ||
| 62 | wxButton *refresh_button = new wxButton(this, wxID_ANY, "Refresh", {15, 15}); | ||
| 63 | refresh_button->Bind(wxEVT_BUTTON, &TrackerPanel::OnRefreshSavedata, this); | ||
| 64 | } | ||
| 65 | |||
| 66 | savedata_path_ = savedata_path; | ||
| 67 | panels_mode_ = true; | ||
| 68 | |||
| 69 | RefreshSavedata(); | ||
| 70 | } | ||
| 71 | |||
| 72 | void TrackerPanel::RefreshSavedata() { | ||
| 73 | solved_panels_.clear(); | ||
| 74 | |||
| 75 | GodotVariant godot_variant = ParseGodotFile(*savedata_path_); | ||
| 76 | for (const GodotVariant &panel_node : godot_variant.AsArray()) { | ||
| 77 | const std::vector<GodotVariant> &fields = panel_node.AsArray(); | ||
| 78 | if (fields[1].AsBool()) { | ||
| 79 | const std::vector<std::string> &nodepath = fields[0].AsNodePath(); | ||
| 80 | std::string key = fmt::format("{}/{}", nodepath[3], nodepath[4]); | ||
| 81 | solved_panels_.insert(key); | ||
| 82 | } | ||
| 83 | } | ||
| 84 | |||
| 85 | UpdateIndicators(); | ||
| 86 | Refresh(); | ||
| 87 | } | ||
| 88 | |||
| 56 | void TrackerPanel::OnPaint(wxPaintEvent &event) { | 89 | void TrackerPanel::OnPaint(wxPaintEvent &event) { | 
| 57 | if (GetSize() != rendered_.GetSize()) { | 90 | if (GetSize() != rendered_.GetSize()) { | 
| 58 | Redraw(); | 91 | Redraw(); | 
| @@ -92,6 +125,10 @@ void TrackerPanel::OnMouseMove(wxMouseEvent &event) { | |||
| 92 | event.Skip(); | 125 | event.Skip(); | 
| 93 | } | 126 | } | 
| 94 | 127 | ||
| 128 | void TrackerPanel::OnRefreshSavedata(wxCommandEvent &event) { | ||
| 129 | RefreshSavedata(); | ||
| 130 | } | ||
| 131 | |||
| 95 | void TrackerPanel::Redraw() { | 132 | void TrackerPanel::Redraw() { | 
| 96 | wxSize panel_size = GetSize(); | 133 | wxSize panel_size = GetSize(); | 
| 97 | wxSize image_size = map_image_.GetSize(); | 134 | wxSize image_size = map_image_.GetSize(); | 
| @@ -142,21 +179,32 @@ void TrackerPanel::Redraw() { | |||
| 142 | 179 | ||
| 143 | for (AreaIndicator &area : areas_) { | 180 | for (AreaIndicator &area : areas_) { | 
| 144 | const MapArea &map_area = GD_GetMapArea(area.area_id); | 181 | const MapArea &map_area = GD_GetMapArea(area.area_id); | 
| 145 | if (!AP_IsLocationVisible(map_area.classification) && | 182 | if (panels_mode_) { | 
| 183 | area.active = map_area.panel; | ||
| 184 | } else if (!AP_IsLocationVisible(map_area.classification) && | ||
| 146 | !(map_area.hunt && GetTrackerConfig().show_hunt_panels) && | 185 | !(map_area.hunt && GetTrackerConfig().show_hunt_panels) && | 
| 147 | !(AP_IsPaintingShuffle() && !map_area.paintings.empty())) { | 186 | !(AP_IsPaintingShuffle() && !map_area.paintings.empty())) { | 
| 148 | area.active = false; | 187 | area.active = false; | 
| 149 | continue; | ||
| 150 | } else { | 188 | } else { | 
| 151 | area.active = true; | 189 | area.active = true; | 
| 152 | } | 190 | } | 
| 153 | 191 | ||
| 192 | if (!area.active) { | ||
| 193 | continue; | ||
| 194 | } | ||
| 195 | |||
| 154 | bool has_reachable_unchecked = false; | 196 | bool has_reachable_unchecked = false; | 
| 155 | bool has_unreachable_unchecked = false; | 197 | bool has_unreachable_unchecked = false; | 
| 156 | for (const Location §ion : map_area.locations) { | 198 | for (const Location §ion : map_area.locations) { | 
| 157 | bool has_unchecked = false; | 199 | bool has_unchecked = false; | 
| 158 | if (IsLocationWinCondition(section)) { | 200 | if (IsLocationWinCondition(section)) { | 
| 159 | has_unchecked = !AP_HasReachedGoal(); | 201 | has_unchecked = !AP_HasReachedGoal(); | 
| 202 | } else if (panels_mode_) { | ||
| 203 | has_unchecked = section.panel && std::any_of( | ||
| 204 | section.panels.begin(), section.panels.end(), [this](int panel_id) { | ||
| 205 | const Panel &panel = GD_GetPanel(panel_id); | ||
| 206 | return !solved_panels_.contains(panel.nodepath); | ||
| 207 | }); | ||
| 160 | } else if (AP_IsLocationVisible(section.classification)) { | 208 | } else if (AP_IsLocationVisible(section.classification)) { | 
| 161 | has_unchecked = !AP_HasCheckedGameLocation(section.ap_location_id); | 209 | has_unchecked = !AP_HasCheckedGameLocation(section.ap_location_id); | 
| 162 | } else if (section.hunt && GetTrackerConfig().show_hunt_panels) { | 210 | } else if (section.hunt && GetTrackerConfig().show_hunt_panels) { | 
| @@ -172,7 +220,7 @@ void TrackerPanel::Redraw() { | |||
| 172 | } | 220 | } | 
| 173 | } | 221 | } | 
| 174 | 222 | ||
| 175 | if (AP_IsPaintingShuffle()) { | 223 | if (AP_IsPaintingShuffle() && !panels_mode_) { | 
| 176 | for (int painting_id : map_area.paintings) { | 224 | for (int painting_id : map_area.paintings) { | 
| 177 | const PaintingExit &painting = GD_GetPaintingExit(painting_id); | 225 | const PaintingExit &painting = GD_GetPaintingExit(painting_id); | 
| 178 | if (!AP_IsPaintingChecked(painting.internal_id)) { | 226 | if (!AP_IsPaintingChecked(painting.internal_id)) { | 
