#include "area_popup.h" #include #include #include "ap_state.h" #include "game_data.h" #include "global.h" #include "tracker_config.h" #include "tracker_panel.h" #include "tracker_state.h" AreaPopup::AreaPopup(wxWindow* parent, int area_id) : wxScrolledCanvas(parent, wxID_ANY), area_id_(area_id) { SetBackgroundStyle(wxBG_STYLE_PAINT); unchecked_eye_ = wxBitmap(wxImage(GetAbsolutePath("assets/unchecked.png").c_str(), wxBITMAP_TYPE_PNG) .Scale(32, 32)); checked_eye_ = wxBitmap( wxImage(GetAbsolutePath("assets/checked.png").c_str(), wxBITMAP_TYPE_PNG) .Scale(32, 32)); SetScrollRate(5, 5); SetBackgroundColour(*wxBLACK); Hide(); Bind(wxEVT_PAINT, &AreaPopup::OnPaint, this); UpdateIndicators(); } void AreaPopup::UpdateIndicators() { const MapArea& map_area = GD_GetMapArea(area_id_); // Start calculating extents. wxMemoryDC mem_dc; mem_dc.SetFont(GetFont().Bold()); wxSize header_extent = mem_dc.GetTextExtent(map_area.name); int acc_height = header_extent.GetHeight() + 20; int col_width = 0; mem_dc.SetFont(GetFont()); TrackerPanel* tracker_panel = dynamic_cast(GetParent()); std::vector real_locations; for (int section_id = 0; section_id < map_area.locations.size(); section_id++) { const Location& location = map_area.locations.at(section_id); if (tracker_panel->IsPanelsMode()) { if (!location.panel) { continue; } } else { if (!AP_IsLocationVisible(location.classification) && !(location.hunt && GetTrackerConfig().show_hunt_panels)) { continue; } } real_locations.push_back(section_id); wxSize item_extent = mem_dc.GetTextExtent(location.name); int item_height = std::max(32, item_extent.GetHeight()) + 10; acc_height += item_height; if (item_extent.GetWidth() > col_width) { col_width = item_extent.GetWidth(); } } if (AP_IsPaintingShuffle() && !tracker_panel->IsPanelsMode()) { for (int painting_id : map_area.paintings) { const PaintingExit& painting = GD_GetPaintingExit(painting_id); wxSize item_extent = mem_dc.GetTextExtent(painting.internal_id); // TODO: Replace with a friendly name. int item_height = std::max(32, item_extent.GetHeight()) + 10; acc_height += item_height; if (item_extent.GetWidth() > col_width) { col_width = item_extent.GetWidth(); } } } int item_width = col_width + 10 + 32; int full_width = std::max(header_extent.GetWidth(), item_width) + 20; Fit(); SetVirtualSize(full_width, acc_height); rendered_ = wxBitmap(full_width, acc_height); mem_dc.SelectObject(rendered_); mem_dc.SetPen(*wxTRANSPARENT_PEN); mem_dc.SetBrush(*wxBLACK_BRUSH); mem_dc.DrawRectangle({0, 0}, {full_width, acc_height}); mem_dc.SetFont(GetFont().Bold()); mem_dc.SetTextForeground(*wxWHITE); mem_dc.DrawText(map_area.name, {(full_width - header_extent.GetWidth()) / 2, 10}); int cur_height = header_extent.GetHeight() + 20; mem_dc.SetFont(GetFont()); for (int section_id : real_locations) { const Location& location = map_area.locations.at(section_id); bool checked = false; if (IsLocationWinCondition(location)) { checked = AP_HasReachedGoal(); } else if (tracker_panel->IsPanelsMode()) { checked = location.panel && std::any_of( location.panels.begin(), location.panels.end(), [tracker_panel](int panel_id) { const Panel& panel = GD_GetPanel(panel_id); return tracker_panel->GetSolvedPanels().contains(panel.nodepath); }); } else { checked = AP_HasCheckedGameLocation(location.ap_location_id) || (location.hunt && AP_HasCheckedHuntPanel(location.ap_location_id)); } wxBitmap* eye_ptr = checked ? &checked_eye_ : &unchecked_eye_; mem_dc.DrawBitmap(*eye_ptr, {10, cur_height}); bool reachable = IsLocationReachable(location.ap_location_id); const wxColour* text_color = reachable ? wxWHITE : wxRED; mem_dc.SetTextFore
#include "network_set.h"

void NetworkSet::Clear() {
  network_by_item_.clear();
}

void NetworkSet::AddLink(int id1, int id2) {
  if (id2 > id1) {
    // Make sure id1 < id2
    std::swap(id1, id2);
  }

  if (!network_by_item_.count(id1)) {
    network_by_item_[id1] = {};
  }
  if (!network_by_item_.count(id2)) {
    network_by_item_[id2] = {};
  }

  network_by_item_[id1].insert({id1, id2});
  network_by_item_[id2].insert({id1, id2});
}

bool NetworkSet::IsItemInNetwork(int id) const {
  return network_by_item_.count(id);
}

const std::set<std::pair<int, int>>& NetworkSet::GetNetworkGraph(int id) const {
  return network_by_item_.at(id);
}