about summary refs log tree commit diff stats
path: root/data/maps/the_between
Commit message (Collapse)AuthorAgeFilesLines
* Changed how door location names are formattedStar Rauchenberger2025-08-305-5/+0
| | | | | | | | | | | | | | | | | | STANDARD type doors with at most four panels in the same map area and no other trigger objects will have their location names generated from the names of the panels used to open the door, similar to Lingo 1. Other door types will use the door's name. In either case, the name can be overridden using the new location_name field. Rooms can also set a panel_display_name field, which will be used in location names for doors, and is used to group panels into areas. Panels themselves can set display names, which differentiates their locations from other panels in the same area. Many maps were updated for this, but note that the_symbolic and the_unyielding have validator failures because of duplicate panel names. This won't matter until panelsanity is implemented.
* Converted puzzle symbols to an enumStar Rauchenberger2025-08-201-28/+28
|
* Maps have display names nowStar Rauchenberger2025-08-201-0/+1
| | | | Also added endings to the apworld.
* Validate that nodes in game files are usedStar Rauchenberger2025-08-186-15/+78
| | | | You can now also list out nodes that you are explicitly not mapping out. The current state of the repo does produce some warnings when the validator is run and they're either endings, paintings that I'm not sure what to do with yet, and weird proxy stuff I'm not sure how to handle yet.
* Added the_galleryStar Rauchenberger2025-08-131-35/+0
|
* Converted to proto2Star Rauchenberger2025-08-121-1/+1
| | | | | | | | | | | | | | | | | This will let us use an older version of protobuf in Python, and allows us to use the Godot protobuf implementation at all. Scalar fields with custom defaults in data.proto were changed to not have a default, because Godot doesn't handle it properly. The equivalent fields in human.proto still have the defaults, and datapacker copies the default value in if necessary. The Panel message in data.proto was also renamed to PanelData because otherwise it conflicts with the native Godot class named Panel. The double field in Letter was renamed to level2, because Godot couldn't handle it well. Finally, common.proto was removed and its contents were moved into data.proto, which allows us to generate code for Python without needing to edit it. NOTE: I had to slightly modify the Godot protobuf code generator. I'll need to upload that somewhere.
* Added the_butterflyStar Rauchenberger2025-08-091-1/+5
| | | | The proto representation of letters has changed, so the C++ tools need to be updated.
* Added the_betweenStar Rauchenberger2025-08-095-0/+454
n107' href='#n107'>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




                                           
                                 
                                  












































                                                                                                       
                                 
                                  

























                                                                                           

                                 
                                  









                                                                                                            
















































                                                                                
from . import LingoTestBase


class TestRequiredRoomLogic(LingoTestBase):
    options = {
        "shuffle_doors": "doors",
        "shuffle_colors": "false",
    }

    def test_pilgrim_first(self) -> None:
        self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertFalse(self.multiworld.state.can_reach("Pilgrim Antechamber", "Region", self.player))
        self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Pilgrim Room - Sun Painting")
        self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertTrue(self.multiworld.state.can_reach("Pilgrim Antechamber", "Region", self.player))
        self.assertTrue(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Pilgrim Room - Shortcut to The Seeker")
        self.assertTrue(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertTrue(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Starting Room - Back Right Door")
        self.assertTrue(self.can_reach_location("The Seeker - Achievement"))

    def test_hidden_first(self) -> None:
        self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Starting Room - Back Right Door")
        self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Pilgrim Room - Shortcut to The Seeker")
        self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Pilgrim Room - Sun Painting")
        self.assertTrue(self.multiworld.state.can_reach("The Seeker", "Region", self.player))
        self.assertTrue(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player))
        self.assertTrue(self.can_reach_location("The Seeker - Achievement"))


class TestRequiredDoorLogic(LingoTestBase):
    options = {
        "shuffle_doors": "doors",
        "shuffle_colors": "false",
    }

    def test_through_rhyme(self) -> None:
        self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))

        self.collect_by_name("Starting Room - Rhyme Room Entrance")
        self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))

        self.collect_by_name("Rhyme Room (Looped Square) - Door to Circle")
        self.assertTrue(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))

    def test_through_hidden(self) -> None:
        self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))

        self.collect_by_name("Starting Room - Rhyme Room Entrance")
        self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))

        self.collect_by_name("Starting Room - Back Right Door")
        self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))

        self.collect_by_name("Hidden Room - Rhyme Room Entrance")
        self.assertTrue(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall"))


class TestSimpleDoors(LingoTestBase):
    options = {
        "shuffle_doors": "doors",
        "group_doors": "true",
        "shuffle_colors": "false",
    }

    def test_requirement(self):
        self.assertFalse(self.multiworld.state.can_reach("Outside The Wanderer", "Region", self.player))
        self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player))

        self.collect_by_name("Rhyme Room Doors")
        self.assertTrue(self.multiworld.state.can_reach("Outside The Wanderer", "Region", self.player))
        self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player))


class TestPanels(LingoTestBase):
    options = {
        "shuffle_doors": "panels"
    }

    def test_requirement(self):
        self.assertFalse(self.can_reach_location("Starting Room - HIDDEN"))
        self.assertFalse(self.can_reach_location("Hidden Room - OPEN"))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Starting Room - HIDDEN (Panel)")
        self.assertTrue(self.can_reach_location("Starting Room - HIDDEN"))
        self.assertFalse(self.can_reach_location("Hidden Room - OPEN"))
        self.assertFalse(self.can_reach_location("The Seeker - Achievement"))

        self.collect_by_name("Hidden Room - OPEN (Panel)")
        self.assertTrue(self.can_reach_location("Starting Room - HIDDEN"))
        self.assertTrue(self.can_reach_location("Hidden Room - OPEN"))
        self.assertTrue(self.can_reach_location("The Seeker - Achievement"))


class TestGroupedPanels(LingoTestBase):
    options = {
        "shuffle_doors": "panels",
        "group_doors": "true",
        "shuffle_colors": "false",
    }

    def test_requirement(self):
        self.assertFalse(self.can_reach_location("Hub Room - SLAUGHTER"))
        self.assertFalse(self.can_reach_location("Dread Hallway - DREAD"))
        self.assertFalse(self.can_reach_location("The Tenacious - Achievement"))

        self.collect_by_name("Tenacious Entrance Panels")
        self.assertTrue(self.can_reach_location("Hub Room - SLAUGHTER"))
        self.assertFalse(self.can_reach_location("Dread Hallway - DREAD"))
        self.assertFalse(self.can_reach_location("The Tenacious - Achievement"))

        self.collect_by_name("Outside The Agreeable - BLACK (Panel)")
        self.assertTrue(self.can_reach_location("Hub Room - SLAUGHTER"))
        self.assertTrue(self.can_reach_location("Dread Hallway - DREAD"))
        self.assertFalse(self.can_reach_location("The Tenacious - Achievement"))

        self.collect_by_name("The Tenacious - Black Palindromes (Panels)")
        self.assertTrue(self.can_reach_location("Hub Room - SLAUGHTER"))
        self.assertTrue(self.can_reach_location("Dread Hallway - DREAD"))
        self.assertTrue(self.can_reach_location("The Tenacious - Achievement"))