about summary refs log tree commit diff stats
path: root/data/maps/the_partial
Commit message (Expand)AuthorAgeFilesLines
* (Almost) all panels are locations or connections nowStar Rauchenberger2025-11-011-1/+2
* Added backwards compatibility with removed locationsStar Rauchenberger2025-10-261-1/+2
* Mark some doors as "latched"Star Rauchenberger2025-10-202-6/+2
* Added display names to portsStar Rauchenberger2025-09-282-0/+2
* [Data] Annotate shuffleable portsStar Rauchenberger2025-09-212-2/+6
* Added keyholder sanityStar Rauchenberger2025-09-021-0/+1
* Changed how door location names are formattedStar Rauchenberger2025-08-306-5/+1
* Added the_tenaciousStar Rauchenberger2025-08-252-4/+2
* Converted puzzle symbols to an enumStar Rauchenberger2025-08-203-19/+19
* Maps have display names nowStar Rauchenberger2025-08-201-0/+1
* Added the_partialStar Rauchenberger2025-08-177-0/+282
ef='#n141'>141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
syntax = "proto2";

import "data.proto";

package com.fourisland.lingo2_archipelago;

message RoomIdentifier {
  optional string map = 1;
  optional string name = 2;
}

message DoorIdentifier {
  optional string map = 1;
  optional string name = 2;
}

message PortIdentifier {
  optional string map = 1;
  optional string room = 2;
  optional string name = 3;
}

message PaintingIdentifier {
  optional string map = 1;
  optional string room = 2;
  optional string name = 3;
}

message PanelIdentifier {
  optional string map = 1;
  optional string room = 2;
  optional string name = 3;
  optional string answer = 4;
}

message KeyholderIdentifier {
  optional string map = 1;
  optional string room = 2;
  optional string name = 3;
  optional string key = 4;
}

message HumanConnection {
  message Endpoint {
    oneof endpoint {
      RoomIdentifier room = 1;
      PortIdentifier port = 2;
      PaintingIdentifier painting = 3;
      PanelIdentifier panel = 4;
    }
  }

  oneof From {
    Endpoint from = 1;
    string from_room = 5;
  }

  oneof To {
    Endpoint to = 2;
    string to_room = 6;
  }

  optional bool oneway = 3;
  optional DoorIdentifier door = 4;

  // If true, this connection will only be logically allowed if the Daedalus
  // Roof Access option is enabled.
  optional bool roof_access = 7;

  // This means that the connection intentionally skips the target object's
  // required door.
  optional bool bypass_target_door = 8;

  // This means that the connection should additionally require all purple
  // letters when the Strict Purple Ending option is on.
  optional bool purple_ending = 9;

  // This means that the connection should additionally require all cyan letters
  // when the Strict Cyan Ending option is on.
  optional bool cyan_ending = 10;

  // This means that the connection only exists when doors are not shuffled.
  optional bool vanilla_only = 11;
}

message HumanConnections {
  repeated HumanConnection connections = 1;
}

message HumanDoor {
  optional string name = 1;

  repeated string receivers = 2;
  repeated PaintingIdentifier move_paintings = 8;

  // The set of panels that must be solved to open this door.
  repeated PanelIdentifier panels = 3;

  // If set, the number of panels from the above set that need to be solved.
  // Warning: this is a messy kind of OR logic! Consider if there's another way.
  optional uint64 complete_at = 9;

  optional string control_center_color = 6;
  repeated KeyholderIdentifier keyholders = 10;
  repeated RoomIdentifier rooms = 11;
  repeated DoorIdentifier doors = 12;
  optional bool white_ending = 13;
  optional bool double_letters = 15;

  // Sender nodes to be added to the list of requirements for triggering the
  // location. Only for senders that have no logic requirements.
  repeated string senders = 16;

  optional DoorType type = 4;
  optional string location_room = 5;
  optional string location_name = 14;

  // Non-item doors that are latched will stay open once opened, even if the
  // opening trigger is deactivated. This applies to EVENT/LOCATION_ONLY doors,
  // as well as item-locked doors when not shuffling doors.
  optional bool latch = 17;

  // If true, the client will treat this door like a location, even though no
  // location is created for it in the generator. This helps provide backwards
  // compatability with older worlds.
  optional bool legacy_location = 18;
}

message HumanDoors {
  repeated HumanDoor doors = 1;
}

message HumanPanel {
  optional string name = 1;
  optional string path = 5;
  
  optional string clue = 2;
  optional string answer = 3;
  repeated PuzzleSymbol symbols = 4;

  repeated Proxy proxies = 6;

  optional DoorIdentifier required_door = 7;
  optional RoomIdentifier required_room = 8;

  optional string display_name = 9;
}

message HumanPainting {
  optional string name = 1;
  optional string path = 2;

  optional string display_name = 4;

  optional string orientation = 3;
  optional bool move = 6;
  optional bool enter_only = 7;
  optional AxisDirection gravity = 8 [default = Y_MINUS];
  optional bool exit_only = 9;
  
  optional DoorIdentifier required_door = 5;
}

message HumanPort {
  optional string name = 1;
  optional string display_name = 8;
  optional string path = 2;

  optional bool no_shuffle = 7;

  // These specify how the player should be placed when a randomized entrance
  // sends them to this port. "rotation" is in degrees and is counter-clockwise 
  // from the positive X axis.
  optional Vec3d destination = 3;
  optional double rotation = 6;
  optional AxisDirection gravity = 5 [default = Y_MINUS];

  optional DoorIdentifier required_door = 4;
}

message HumanKeyholder {
  optional string name = 1;
  optional string path = 2;

  // If this is set, the keyholder will become a location when keyholder shuffle
  // is enabled. This value specifies the key that is required to clear the
  // location. It should be the same as the key needed for Green Ending. The
  // only cases when this shouldn't be set is the two disappearing keyholders in
  // The Congruent.
  optional string key = 3;
}

message HumanLetter {
  optional string key = 1;
  optional bool level2 = 2;

  optional string path = 3;
}

message HumanMastery {
  optional string name = 1;
  optional string path = 2;
}

message HumanEnding {
  optional string name = 1;
  optional string path = 2;
}

message HumanRoom {
  optional string name = 1;
  optional string display_name = 2;

  // This is used in panelsanity location names and location names for STANDARD
  // doors generated from panels in the same area.
  optional string panel_display_name = 10;

  repeated HumanPanel panels = 3;
  repeated HumanPainting paintings = 4;
  repeated HumanLetter letters = 5;
  repeated HumanPort ports = 6;
  repeated HumanKeyholder keyholders = 7;
  repeated HumanMastery masteries = 8;
  repeated HumanEnding endings = 9;
}

message HumanMap {
  optional string display_name = 1;
  optional MapType type = 4;

  optional PortIdentifier worldport_entrance = 3;

  // These two fields are used by the validator and nothing else. excluded_nodes
  // are objects in the tscn that are intentionally not mentioned in the txtpb.
  // custom_nodes are the reverse of that; objects that are mentioned in the
  // txtpb but not present in the tscn. These are generally created dynamically
  // by the game mod, but may also be used for places where the validator is
  // just wrong about the contents of the map file.
  repeated string excluded_nodes = 2;
  repeated string custom_nodes = 5;
}

message HumanProgressive {
  optional string name = 1;
  repeated DoorIdentifier doors = 2;
}

message HumanProgressives {
  repeated HumanProgressive progressives = 1;
}

message HumanDoorGroup {
  optional string name = 1;
  optional DoorGroupType type = 2;
  repeated DoorIdentifier doors = 3;
}

message HumanDoorGroups {
  repeated HumanDoorGroup door_groups = 1;
}

message HumanGlobalMetadata {
  repeated string special_names = 1;
  optional VersionNumber version = 2;
}

message IdMappings {
  message RoomIds {
    map<string, uint64> panels = 1;
    map<string, uint64> masteries = 2;
    map<string, uint64> keyholders = 3;
    map<string, uint64> ports = 4;
  }

  message MapIds {
    map<string, uint64> doors = 1;
    map<string, RoomIds> rooms = 2;
  }

  map<string, MapIds> maps = 1;
  map<string, uint64> special = 2;
  map<string, uint64> letters = 3;
  map<string, uint64> endings = 4;
  map<string, uint64> progressives = 5;
  map<string, uint64> door_groups = 6;
}