#ifndef GAME_DATA_H_9C42AC51
#define GAME_DATA_H_9C42AC51
#include <map>
#include <optional>
#include <string>
#include <vector>
enum class LingoColor {
kNone,
kBlack,
kRed,
kBlue,
kYellow,
kGreen,
kOrange,
kPurple,
kBrown,
kGray
};
constexpr int kLOCATION_NORMAL = 1;
constexpr int kLOCATION_REDUCED = 2;
constexpr int kLOCATION_INSANITY = 4;
constexpr int kLOCATION_SMALL_SPHERE_ONE = 8;
enum class EntranceType {
kNormal,
kPainting,
kSunwarp,
kWarp,
kPilgrimage,
kCrossroadsRoofAccess,
};
enum class DoorType {
kNormal,
kSunwarp,
kSunPainting,
};
struct Panel {
int id;
int room;
std::string name;
std::string nodepath;
std::vector<LingoColor> colors;
std::vector<int> required_rooms;
std::vector<int> required_doors;
std::vector<int> required_panels;
bool check = false;
bool exclude_reduce = false;
bool achievement = false;
std::string achievement_name;
std::string location_name;
bool non_counting = false;
int ap_location_id = -1;
bool hunt = false;
int panel_door = -1;
};
struct ProgressiveRequirement {
std::string item_name;
int ap_item_id = -1;
int quantity = 0;
};
struct Door {
int id;
int room;
std::string name;
std::string location_name;
std::string item_name;
std::string group_name;
bool skip_location = false;
bool skip_item = false;
bool is_event = false;
std::vector<int> panels;
bool exclude_reduce = true;
std::vector<ProgressiveRequirement> progressives;
int ap_item_id = -1;
int group_ap_item_id = -1;
int ap_location_id = -1;
DoorType type = DoorType::kNormal;
};
struct PanelDoor {
int ap_item_id = -1;
int group_ap_item_id = -1;
std::vector<ProgressiveRequirement> progressives;
};
struct Exit {
int source_room;
int destination_room;
std::optional<int> door;
EntranceType type = EntranceType::kNormal;
};
struct PaintingExit {
int id;
int room;
std::string internal_id;
std::optional<int> door;
bool entrance = false;
};
struct Room {
std::string name;
std::vector<Exit> exits;
std::vector<int> paintings;
std::vector<int> sunwarps;
std::vector<int> panels;
};
struct Location {
std::string name;
std::string ap_location_name;
int ap_location_id = -1;
int room;
std::vector<int> panels;
int classification = 0;
bool hunt = false;
std::optional<int> single_panel;
};
struct MapArea {
int id;
std::string name;
std::vector<Location> locations;
std::vector<int> paintings;
int map_x;
int map_y;
int classification = 0;
bool hunt = false;
bool has_single_panel = false;
};
enum class SubwaySunwarpType {
kEnter,
kExit,
kFinal
};
struct SubwaySunwarp {
int dots;
SubwaySunwarpType type;
bool operator<(const SubwaySunwarp& rhs) const;
};
struct SubwayItem {
int id;
int x;
int y;
std::optional<int> door;
std::vector<std::string> paintings;
std::vector<std::string> tags; // 2-way teleports
std::vector<std::string> entrances; // teleport entrances
std::vector<std::string> exits; // teleport exits
std::optional<SubwaySunwarp> sunwarp;
std::optional<std::string> special;
bool HasWarps() const;
};
const std::vector<MapArea>& GD_GetMapAreas();
const MapArea& GD_GetMapArea(int id);
int GD_GetRoomByName(const std::string& name);
const Room& GD_GetRoom(int room_id);
const std::vector<Door>& GD_GetDoors();
const Door& GD_GetDoor(int door_id);
int GD_GetDoorByName(const std::string& name);
const Panel& GD_GetPanel(int panel_id);
const PanelDoor& GD_GetPanelDoor(int panel_door_id);
const PaintingExit& GD_GetPaintingExit(int painting_id);
int GD_GetPaintingByName(const std::string& name);
const std::vector<int>& GD_GetAchievementPanels();
int GD_GetItemIdForColor(LingoColor color);
const std::vector<int>& GD_GetSunwarpDoors();
int GD_GetRoomForSunwarp(int index);
const std::vector<SubwayItem>& GD_GetSubwayItems();
const SubwayItem& GD_GetSubwayItem(int id);
std::optional<int> GD_GetSubwayItemForPainting(const std::string& painting_id);
int GD_GetSubwayItemForSunwarp(const SubwaySunwarp& sunwarp);
#endif /* end of include guard: GAME_DATA_H_9C42AC51 */