about summary refs log tree commit diff stats
path: root/tools/util/identifiers.h
blob: 341dee15c242060ebf1772d68260e8c8895b7ed2 (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
#ifndef TOOLS_UTIL_IDENTIFIERS_H_
#define TOOLS_UTIL_IDENTIFIERS_H_

#include <optional>
#include <string>
#include <utility>

#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<RoomIdentifier> GetCompleteRoomIdentifier(
    RoomIdentifier identifier, std::optional<std::string> map_name);

std::optional<DoorIdentifier> GetCompleteDoorIdentifier(
    DoorIdentifier identifier, std::optional<std::string> map_name);

std::optional<PortIdentifier> GetCompletePortIdentifier(
    PortIdentifier identifier, std::optional<std::string> map_name,
    std::optional<std::string> room_name);

std::optional<PaintingIdentifier> GetCompletePaintingIdentifier(
    PaintingIdentifier identifier, std::optional<std::string> map_name,
    std::optional<std::string> room_name);

std::optional<PanelIdentifier> GetCompletePanelIdentifierWithoutAnswer(
    PanelIdentifier identifier, std::optional<std::string> map_name,
    std::optional<std::string> room_name);

std::optional<KeyholderIdentifier> GetCompleteKeyholderIdentifierWithoutKey(
    KeyholderIdentifier identifier, const std::string& map_name,
    std::optional<std::string> room_name);

}  // namespace com::fourisland::lingo2_archipelago

#endif /* TOOLS_UTIL_IDENTIFIERS_H_ */
nipes? "Wall sniping" refers to the fact that you are able to solve puzzles on the other side of opaque walls. This feature is not affected by randomization, but you are almost never required to perform a wall snipe. The exceptions to this are: * In the Courtyard, there is a row of four puzzles that say FIRST, SECOND, THIRD, and FOURTH. FOURTH is behind an opaque wall, but its existence can be inferred from the others. Solving this puzzle while standing in the Courtyard is in logic. * As an aside, this snipe is different from the others in that it is possible to see the face of the panel by going through the nearby door (if it is open), entering the area from the roof, or entering the area through a painting using painting shuffle. Solving the panel in either of those ways does not require a wall snipe and is still in logic. * In the maze outside The Lab, there is a hidden OPEN puzzle within a wall that ordinarily opens the entrance to lab. Its existence can be inferred from the nearby black puzzles with the solutions "OPEN" and "BEHIND". Solving this puzzle while standing in the OPEN BEHIND room is in logic. * In the hallway outside The Undeterred (blue room), there is a row of doors that reveal numbered puzzles. These puzzles number from one to nine. There is also a zero puzzle hidden behind a wall. Its existence can be inferred from the presence of the other numbers. ZERO is actually behind both a black wall and a white door. The white door opens after all of the NINEs have been collected (or upon receiving the appropriate item, in door shuffle mode), revealing the black wall. Solving the ZERO puzzle through the black wall is in logic, but solving it while the white door is still present is not in logic. Any other snipe is considered out of logic. This includes sniping The Bearer's MIDDLE while standing outside The Bold, sniping The Colorful without opening all of the color doors, and sniping WELCOME from next to WELCOME BACK. Because these puzzles are invisible to the player, they are not affected by panel shuffling. Additionally, they are all white puzzles, so they are not affected by color shuffling.