#ifndef TOOLS_UTIL_IDENTIFIERS_H_ #define TOOLS_UTIL_IDENTIFIERS_H_ #include #include #include #include "proto/human.pb.h" namespace com::fourisland::lingo2_archipelago { class RoomIdentifierLess { public: bool operator()(const RoomIdentifier& lhs, const RoomIdentifier& rhs) const { return std::tie(lhs.map(), lhs.name()) < std::tie(rhs.map(), rhs.name()); } }; class DoorIdentifierLess { public: bool operator()(const DoorIdentifier& lhs, const DoorIdentifier& rhs) const { return std::tie(lhs.map(), lhs.name()) < std::tie(rhs.map(), rhs.name()); } }; class PortIdentifierLess { public: bool operator()(const PortIdentifier& lhs, const PortIdentifier& rhs) const { return std::tie(lhs.map(), lhs.room(), lhs.name()) < std::tie(rhs.map(), rhs.room(), rhs.name()); } }; class PaintingIdentifierLess { public: bool operator()(const PaintingIdentifier& lhs, const PaintingIdentifier& rhs) const { return std::tie(lhs.map(), lhs.room(), lhs.name()) < std::tie(rhs.map(), rhs.room(), rhs.name()); } }; class PanelIdentifierLess { public: bool operator()(const PanelIdentifier& lhs, const PanelIdentifier& rhs) const { return std::tie(lhs.map(), lhs.room(), lhs.name(), lhs.answer()) < std::tie(rhs.map(), rhs.room(), rhs.name(), rhs.answer()); } }; class KeyholderIdentifierLess { public: bool operator()(const KeyholderIdentifier& lhs, const KeyholderIdentifier& rhs) const { return std::tie(lhs.map(), lhs.room(), lhs.name(), lhs.key()) < std::tie(rhs.map(), rhs.room(), rhs.name(), rhs.key()); } }; std::optional GetCompleteRoomIdentifier( RoomIdentifier identifier, std::optional map_name); std::optional GetCompleteDoorIdentifier( DoorIdentifier identifier, std::optional map_name); std::optional GetCompletePortIdentifier( PortIdentifier identifier, std::optional map_name, std::optional room_name); std::optional GetCompletePaintingIdentifier( PaintingIdentifier identifier, std::optional map_name, std::optional room_name); std::optional GetCompletePanelIdentifierWithoutAnswer( PanelIdentifier identifier, std::optional map_name, std::optional room_name); std::optional GetCompleteKeyholderIdentifierWithoutKey( KeyholderIdentifier identifier, const std::string& map_name, std::optional room_name); } // namespace com::fourisland::lingo2_archipelago #endif /* TOOLS_UTIL_IDENTIFIERS_H_ */ 02f526b04c44623aa39c9b3cb6dee1ff'>root/tools/util/ids_yaml_format.cpp
blob: f72f60ef14381271aa586878e781e9c6f85f6c62 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "ids_yaml_format.h"

#include <yaml-cpp/yaml.h>

#include <fstream>
#include <functional>

namespace com::fourisland::lingo2_archipelago {
namespace {

template <typename T>
void OperateOnSortedMap(
    const T& map, std::function<void(const std::string& name,
                                     const typename T::mapped_type& value)>
                      callback) {
  std::vector<std::string> names;
  for (const auto& it : map) {
    names.push_back(it.first);
  }

  std::sort(names.begin(), names.end());

  for (const std::string& name : names) {
    callback(name, map.at(name));
  }
}

}  // namespace

IdMappings ReadIdsFromYaml(const std::string& filename) {
  IdMappings result;

  YAML::Node document = YAML::LoadFile(filename);

  if (document["maps"]) {
    for (const auto& map_it : document["maps"]) {
      IdMappings::MapIds& map_ids =
          (*result.mutable_maps())[map_it.first.as<std::string>()];

      if (map_it.second["rooms"]) {
        for (const auto& room_it : map_it.second["rooms"]) {
          IdMappings::RoomIds& room_ids =
              (*map_ids.mutable_rooms())[room_it.first.as<std::string>()];

          if (room_it.second["panels"]) {
            for (const auto& panel_it : room_it.second["panels"]) {
              (*room_ids.mutable_panels())[panel_it.first.as<std::string>()] =
                  panel_it.second.as<uint64_t>();
            }
          }

          if (room_it.second["masteries"]) {
            for (const auto& mastery_it : room_it.second["masteries"]) {
              (*room_ids
                    .mutable_masteries())[mastery_it.first.as<std::string>()] =
                  mastery_it.second.as<uint64_t>();
            }
          }
        }
      }

      if (map_it.second["doors"]) {
        for (const auto& door_it : map_it.second["doors"]) {
          (*map_ids.mutable_doors())[door_it.first.as<std::string>()] =
              door_it.second.as<uint64_t>();
        }
      }
    }
  }

  if (document["letters"]) {
    for (const auto& letter_it : document["letters"]) {
      (*result.mutable_letters())[letter_it.first.as<std::string>()] =
          letter_it.second.as<uint64_t>();
    }
  }

  if (document["endings"]) {
    for (const auto& ending_it : document["endings"]) {
      (*result.mutable_endings())[ending_it.first.as<std::string>()] =
          ending_it.second.as<uint64_t>();
    }
  }

  if (document["special"]) {
    for (const auto& special_it : document["special"]) {
      (*result.mutable_special())[special_it.first.as<std::string>()] =
          special_it.second.as<uint64_t>();
    }
  }

  return result;
}

void WriteIdsAsYaml(const IdMappings& ids, const std::string& filename) {
  YAML::Node result;

  OperateOnSortedMap(ids.maps(), [&result](const std::string& map_name,
                                           const IdMappings::MapIds& map_ids) {
    YAML::Node map_node;

    OperateOnSortedMap(
        map_ids.rooms(), [&map_node](const std::string& room_name,
                                     const IdMappings::RoomIds& room_ids) {
          YAML::Node room_node;

          OperateOnSortedMap(
              room_ids.panels(),
              [&room_node](const std::string& panel_name, uint64_t panel_id) {
                room_node["panels"][panel_name] = panel_id;
              });

          OperateOnSortedMap(room_ids.masteries(),
                             [&room_node](const std::string& mastery_name,
                                          uint64_t mastery_id) {
                               room_node["masteries"][mastery_name] =
                                   mastery_id;
                             });

          map_node["rooms"][room_name] = std::move(room_node);
        });

    OperateOnSortedMap(
        map_ids.doors(),
        [&map_node](const std::string& door_name, uint64_t door_id) {
          map_node["doors"][door_name] = door_id;
        });

    result["maps"][map_name] = std::move(map_node);
  });

  OperateOnSortedMap(ids.letters(), [&result](const std::string& letter_name,
                                              uint64_t letter_id) {
    result["letters"][letter_name] = letter_id;
  });

  OperateOnSortedMap(ids.endings(), [&result](const std::string& ending_name,
                                              uint64_t ending_id) {
    result["endings"][ending_name] = ending_id;
  });

  OperateOnSortedMap(ids.special(), [&result](const std::string& special_name,
                                              uint64_t special_id) {
    result["special"][special_name] = special_id;
  });

  std::ofstream output_stream(filename);
  output_stream << result << std::endl;
}

}  // namespace com::fourisland::lingo2_archipelago