From b8fb7ad060557158fd961b67b2656f29659bdd77 Mon Sep 17 00:00:00 2001 From: thezerothcat Date: Sat, 26 Jan 2019 20:00:40 -0700 Subject: [PATCH] Misc fixes --- README.txt | 4 + pom.xml | 2 +- src/main/java/lmr/randomizer/FileUtils.java | 2 +- src/main/java/lmr/randomizer/Main.java | 1 + .../lmr/randomizer/node/MoneyChecker.java | 115 ++++--- .../java/lmr/randomizer/rcd/RcdReader.java | 12 + .../randomizer/update/GameDataTracker.java | 295 +++++++++--------- .../randomizer/requirement/location_reqs.txt | 3 +- 8 files changed, 255 insertions(+), 179 deletions(-) diff --git a/README.txt b/README.txt index 37218ca0..1441aabc 100644 --- a/README.txt +++ b/README.txt @@ -2,6 +2,10 @@ Please see the wiki page on github for information on how to use the randomizer, https://github.com/thezerothcat/LaMulanaRandomizer/wiki +2.11 +----------------------------- +Added screen mash to supported glitches. Assorted bugfixes and logic updates. + 2.10 ----------------------------- Generation performance improvements by N-eil. Progress dialog improvements by Worse Than You. Bugfix for random removed items when all subweapons are removed. Backside door plando added. Assorted logic adjustments. diff --git a/pom.xml b/pom.xml index d9737a0b..cba36650 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 lmr.randomizer randomizer - 2.10.0 + 2.11.0 La-Mulana Remake Randomizer La-Mulana Remake Randomizer jar diff --git a/src/main/java/lmr/randomizer/FileUtils.java b/src/main/java/lmr/randomizer/FileUtils.java index 1b76a706..d8569684 100644 --- a/src/main/java/lmr/randomizer/FileUtils.java +++ b/src/main/java/lmr/randomizer/FileUtils.java @@ -18,7 +18,7 @@ * Created by thezerothcat on 7/10/2017. */ public class FileUtils { - public static final String VERSION = "2.10.0"; + public static final String VERSION = "2.11.0"; private static final int CUSTOM_IMAGE_HEIGHT = 80; private static BufferedWriter logWriter; diff --git a/src/main/java/lmr/randomizer/Main.java b/src/main/java/lmr/randomizer/Main.java index 10a6c51d..7767577a 100644 --- a/src/main/java/lmr/randomizer/Main.java +++ b/src/main/java/lmr/randomizer/Main.java @@ -1166,6 +1166,7 @@ public ProgressUpdate(long time, int attempt) { FileUtils.logDetail("Placed pipe transitions", attempt); moneyChecker = new MoneyChecker(itemRandomizer, shopRandomizer, transitionGateRandomizer); + moneyChecker.computeStartingLocationAccess(attempt); for (String startingNode : startingNodes) { moneyChecker.computeAccessibleNodes(startingNode, attempt); } diff --git a/src/main/java/lmr/randomizer/node/MoneyChecker.java b/src/main/java/lmr/randomizer/node/MoneyChecker.java index be172f29..dbcf9056 100644 --- a/src/main/java/lmr/randomizer/node/MoneyChecker.java +++ b/src/main/java/lmr/randomizer/node/MoneyChecker.java @@ -48,6 +48,12 @@ public List getQueuedUpdates() { return queuedUpdates; } + public void computeStartingLocationAccess(Integer attemptNumber) { + computeAccessibleNodes("Location: Surface [Main]", attemptNumber); + computeAccessibleNodes("Exit: Surface [Main]", attemptNumber); + queuedUpdates.addAll(transitionGateRandomizer.getTransitionExits("Exit: Surface [Main]", attemptNumber)); + } + public void computeAccessibleNodes(String newState, Integer attemptNumber) { String stateToUpdate = newState; FileUtils.logDetail("Checking progress for node " + newState, attemptNumber); @@ -100,46 +106,83 @@ private String checkState(String stateToUpdate) { } public Integer getShopPrice(String itemName, String shopName) { - if(!accessedNodes.contains("State: Fairy") && availableShops.contains(shopName) && accessedAreas.size() <= 3) { - if(accessedMoney <= 80) { - if("Plane Model".equals(itemName) - && accessedAreas.contains("Tower of the Goddess")) { + if(!accessedNodes.contains("State: Fairy") && !accessedNodes.contains("Location: Dimensional Corridor") + && availableShops.contains(shopName) && accessedAreas.size() <= 3) { + if("Plane Model".equals(itemName) + && accessedAreas.contains("Tower of the Goddess")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Ankh Jewel".equals(itemName) && accessedAreas.contains("Mausoleum of the Giants")) { + return accessedMoney < 40 ? accessedMoney : 40; + } + if("Bronze Mirror".equals(itemName) + && (accessedAreas.contains("Gate of Guidance") || accessedAreas.contains("Mausoleum of the Giants")) + || accessedAreas.contains("Temple of the Sun")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Helmet".equals(itemName) && accessedAreas.contains("Spring in the Sky")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Feather".equals(itemName)) { + if(accessedAreas.contains("Graveyard of the Giants")) { return accessedMoney < 50 ? accessedMoney : 50; } - if("Ankh Jewel".equals(itemName) && accessedAreas.contains("Mausoleum of the Giants")) { - return accessedMoney < 40 ? accessedMoney : 40; - } - if("Bronze Mirror".equals(itemName) && accessedAreas.contains("Mausoleum of the Giants")) { + if(accessedAreas.contains("Shrine of the Mother")) { return accessedMoney < 50 ? accessedMoney : 50; } - if("Feather".equals(itemName)) { - if(accessedAreas.contains("Graveyard of the Giants")) { - return accessedMoney < 50 ? accessedMoney : 50; - } - if(accessedAreas.contains("Tower of the Goddess")) { - return accessedMoney < 80 ? accessedMoney : 80; - } - if(accessedAreas.contains("Chamber of Birth")) { - return accessedMoney < 30 ? accessedMoney : 30; - } + if(accessedAreas.contains("Tower of the Goddess")) { + return accessedMoney < 80 ? accessedMoney : 80; } - if("Bomb".equals(itemName) && accessedAreas.contains("Graveyard of the Giants")) { - return accessedMoney < 50 ? accessedMoney : 50; + if(accessedAreas.contains("Chamber of Birth")) { + return accessedMoney < 30 ? accessedMoney : 30; } - if(accessedAreas.contains("Temple of Moonlight") - && ("Shuriken".equals(itemName) || "Rolling Shuriken".equals(itemName) - || "Caltrops".equals(itemName) || "Bomb".equals(itemName) - || "Chakram".equals(itemName) || "Pistol".equals(itemName))) { - if(!accessedNodes.contains("Attack: Shuriken") && !accessedNodes.contains("Attack: Rolling Shuriken") - && !accessedNodes.contains("Attack: Caltrops") && !accessedNodes.contains("Attack: Bomb") - && !accessedNodes.contains("Attack: Chakram") && !accessedNodes.contains("Attack: Pistol")) { - return accessedMoney < 50 ? accessedMoney : 50; - } + if(accessedAreas.contains("Dimensional Corridor")) { + return accessedMoney < 80 ? accessedMoney : 80; + } + if(accessedAreas.contains("Tower of Ruin")) { + return accessedMoney < 80 ? accessedMoney : 80; } - if("Flare Gun".equals(itemName) && accessedAreas.contains("Chamber of Extinction")) { + } + if("Fruit of Eden".equals(itemName) && accessedNodes.contains("Location: Gate of Illusion [Eden]")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Hand Scanner".equals(itemName) && accessedAreas.contains("Gate of Illusion")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Bomb".equals(itemName) && accessedAreas.contains("Graveyard of the Giants")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Bomb".equals(itemName) && accessedAreas.contains("Dimensional Corridor") && Settings.getEnabledDamageBoosts().contains("Item")) { + return accessedMoney < 20 ? accessedMoney : 20; // Extra cheap because ammo is also needed + } + if("Ring".equals(itemName) && accessedAreas.contains("Graveyard of the Giants")) { + return accessedMoney < 80 ? accessedMoney : 80; + } + if("Grapple Claw".equals(itemName) + && ((accessedAreas.contains("Graveyard of the Giants") && Settings.getEnabledGlitches().contains("Ice Raindrop")) + || (Settings.getEnabledGlitches().contains("Raindrop")))) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Hermes' Boots".equals(itemName) + && (Settings.getEnabledGlitches().contains("Raindrop") || Settings.getEnabledGlitches().contains("Object Zip"))) { + return accessedMoney < 80 ? accessedMoney : 80; + } + if(accessedAreas.contains("Temple of Moonlight") + && ("Shuriken".equals(itemName) || "Rolling Shuriken".equals(itemName) + || "Caltrops".equals(itemName) || "Bomb".equals(itemName) + || "Chakram".equals(itemName) || "Pistol".equals(itemName))) { + if(!accessedNodes.contains("Attack: Shuriken") && !accessedNodes.contains("Attack: Rolling Shuriken") + && !accessedNodes.contains("Attack: Caltrops") && !accessedNodes.contains("Attack: Bomb") + && !accessedNodes.contains("Attack: Chakram") && !accessedNodes.contains("Attack: Pistol")) { return accessedMoney < 50 ? accessedMoney : 50; } } + if("Flare Gun".equals(itemName) && accessedAreas.contains("Chamber of Extinction")) { + return accessedMoney < 50 ? accessedMoney : 50; + } + if("Key of Eternity".equals(itemName) && accessedAreas.contains("Endless Corridor")) { + return accessedMoney < 50 ? accessedMoney : 50; + } } return null; } @@ -186,17 +229,17 @@ private void handleNodeAccess(String nodeName, NodeType nodeType, Integer attemp queuedUpdates.addAll(transitionGateRandomizer.getTransitionExits(nodeName, attemptNumber)); break; case SHOP: - for (String shopItem : shopRandomizer.getShopItems(nodeName)) { - availableShops.add(nodeName); - if (shopItem == null) { - throw new RuntimeException("Unable to find item at " + nodeName + " location of type " + nodeType.toString()); - } + availableShops.add(nodeName); +// for (String shopItem : shopRandomizer.getShopItems(nodeName)) { +// if (shopItem == null) { +// throw new RuntimeException("Unable to find item at " + nodeName + " location of type " + nodeType.toString()); +// } // if (!accessedNodes.contains(shopItem) && !queuedUpdates.contains(shopItem) // && !Settings.getRemovedItems().contains(shopItem) // && !Settings.getCurrentRemovedItems().contains(shopItem)) { // availableShopItems.add(shopItem); // } - } +// } break; case TRANSITION: queuedUpdates.add(nodeName); diff --git a/src/main/java/lmr/randomizer/rcd/RcdReader.java b/src/main/java/lmr/randomizer/rcd/RcdReader.java index d6a6e04a..b369a7d1 100644 --- a/src/main/java/lmr/randomizer/rcd/RcdReader.java +++ b/src/main/java/lmr/randomizer/rcd/RcdReader.java @@ -234,6 +234,7 @@ else if(obj.getId() == 0x0e) { Screen screen = (Screen)objectContainer; if(screen.getZoneIndex() == 0 && screen.getRoomIndex() == 0 && screen.getScreenIndex() == 0) { if(Settings.isRandomizeTransitionGates()) { + // Guidance to Surface escape blockage for (TestByteOperation flagTest : obj.getTestByteOperations()) { if(flagTest.getIndex() == 0x0fe && flagTest.getValue() == 3) { keepObject = false; @@ -250,6 +251,17 @@ else if(screen.getZoneIndex() == 3 && screen.getRoomIndex() == 0 && screen.getSc testByteOperation.setValue((byte)0); obj.getTestByteOperations().add(testByteOperation); } + else if(screen.getZoneIndex() == 4 && screen.getRoomIndex() == 3 && screen.getScreenIndex() == 1) { + if(Settings.isRandomizeTransitionGates()) { + // Spring to Surface escape blockage + for (TestByteOperation flagTest : obj.getTestByteOperations()) { + if (flagTest.getIndex() == 0x0fe && flagTest.getValue() == 3) { + keepObject = false; + break; + } + } + } + } else if(screen.getZoneIndex() == 6) { if(screen.getRoomIndex() == 1 && screen.getScreenIndex() == 1) { if (Settings.isRandomizeTransitionGates()) { diff --git a/src/main/java/lmr/randomizer/update/GameDataTracker.java b/src/main/java/lmr/randomizer/update/GameDataTracker.java index db808462..3f7bc5e5 100644 --- a/src/main/java/lmr/randomizer/update/GameDataTracker.java +++ b/src/main/java/lmr/randomizer/update/GameDataTracker.java @@ -775,7 +775,7 @@ else if(flagTest.getValue() != 4) { } } else if(flagTest.getIndex() == 0x14c) { - if(Settings.isRandomizeBacksideDoors()) { + if(Settings.isRandomizeBacksideDoors() || Settings.isRandomizeTransitionGates()) { gameObject.getArgs().set(4, (short)2); } } @@ -848,172 +848,187 @@ else if(flagTest.getValue() != 4) { } } else if (gameObject.getId() == 0x98) { - if(Settings.isRandomizeBacksideDoors() && gameObject.getArgs().get(0) == 0) { - Screen screen = (Screen)gameObject.getObjectContainer(); - String doorName = null; - int zone = screen.getZoneIndex(); - if(zone == 0) { - // Gate of Guidance => Gate of Illusion - if(screen.getRoomIndex() != 1) { - doorName = "Door: F1"; - } - } - else if(zone == 1) { - // Surface => Tower of the Goddess - doorName = "Door: F5"; - - GameObject added = AddObject.addMissingBacksideDoorCover(gameObject, 0x153); - List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); - } - backsideDoors.add(added); - } - else if(zone == 2) { - // Mausoleum of the Giants => Graveyard of the Giants - doorName = "Door: F2"; - } - else if(zone == 3) { - // Temple of the Sun => Temple of Moonlight - doorName = "Door: F3"; - } - else if(zone == 5) { - if(screen.getRoomIndex() == 8) { - // Inferno Cavern [Viy] => Tower of Ruin [Southwest] - doorName = "Door: F4"; - } - else { - // Inferno Cavern [Spikes] => Tower of Ruin [Top] - doorName = "Door: F7"; - } - } - else if(zone == 6) { - if(screen.getRoomIndex() == 7) { - if(Settings.isRandomizeTransitionGates()) { - Integer flagIndexToRemove = null; - for(int i = 0; i < gameObject.getTestByteOperations().size(); i++) { - TestByteOperation testByteOperation = gameObject.getTestByteOperations().get(i); - if(testByteOperation.getIndex() == 0x382) { - flagIndexToRemove = i; - break; - } - } - if(flagIndexToRemove != null) { - gameObject.getTestByteOperations().remove((int)flagIndexToRemove); - } + if(gameObject.getArgs().get(0) == 0) { + if(Settings.isRandomizeBacksideDoors()) { + Screen screen = (Screen)gameObject.getObjectContainer(); + String doorName = null; + int zone = screen.getZoneIndex(); + if(zone == 0) { + // Gate of Guidance => Gate of Illusion + if(screen.getRoomIndex() != 1) { + doorName = "Door: F1"; } } - else { - // Chamber of Extinction [Magatama Left] => Chamber of Birth [Northeast] - doorName = "Door: F6"; - replaceBacksideDoorFlags(gameObject, 0x0fb, 0x1d0, false); + else if(zone == 1) { + // Surface => Tower of the Goddess + doorName = "Door: F5"; - GameObject added = AddObject.addMissingBacksideDoorTimerAndSound(screen, 0x0fb, 0x1d0); + GameObject added = AddObject.addMissingBacksideDoorCover(gameObject, 0x153); List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); if(backsideDoors == null) { backsideDoors = new ArrayList<>(); mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); } backsideDoors.add(added); - - added = AddObject.addMissingBacksideDoorCover(gameObject, 0x1d0); - backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + else if(zone == 2) { + // Mausoleum of the Giants => Graveyard of the Giants + doorName = "Door: F2"; + } + else if(zone == 3) { + // Temple of the Sun => Temple of Moonlight + doorName = "Door: F3"; + } + else if(zone == 5) { + if(screen.getRoomIndex() == 8) { + // Inferno Cavern [Viy] => Tower of Ruin [Southwest] + doorName = "Door: F4"; } - backsideDoors.add(added); - - added = AddObject.addMissingBacksideMirrorTimerAndSound(gameObject.getObjectContainer(), 0x2b9); - backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + else { + // Inferno Cavern [Spikes] => Tower of Ruin [Top] + doorName = "Door: F7"; } - backsideDoors.add(added); + } + else if(zone == 6) { + if(screen.getRoomIndex() == 7) { + if(Settings.isRandomizeTransitionGates()) { + Integer flagIndexToRemove = null; + for(int i = 0; i < gameObject.getTestByteOperations().size(); i++) { + TestByteOperation testByteOperation = gameObject.getTestByteOperations().get(i); + if(testByteOperation.getIndex() == 0x382) { + flagIndexToRemove = i; + break; + } + } + if(flagIndexToRemove != null) { + gameObject.getTestByteOperations().remove((int)flagIndexToRemove); + } + } + } + else { + // Chamber of Extinction [Magatama Left] => Chamber of Birth [Northeast] + doorName = "Door: F6"; + replaceBacksideDoorFlags(gameObject, 0x0fb, 0x1d0, false); + + GameObject added = AddObject.addMissingBacksideDoorTimerAndSound(screen, 0x0fb, 0x1d0); + List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); - added = AddObject.addMissingBacksideDoorMirrorCoverGraphic(gameObject, 0x2b9, true); - backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + added = AddObject.addMissingBacksideDoorCover(gameObject, 0x1d0); + backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); + + added = AddObject.addMissingBacksideMirrorTimerAndSound(gameObject.getObjectContainer(), 0x2b9); + backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); + + added = AddObject.addMissingBacksideDoorMirrorCoverGraphic(gameObject, 0x2b9, true); + backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); } - backsideDoors.add(added); } - } - else if(zone == 10) { - // Gate of Illusion [Grail] => Gate of Guidance - doorName = "Door: B1"; - } - else if(zone == 11) { - // Graveyard of the Giants [West] => Mausoleum of the Giants - doorName = "Door: B2"; - } - else if(zone == 12) { - // Temple of Moonlight [Lower] => Temple of the Sun [Main] - doorName = "Door: B3"; - } - else if(zone == 13) { - // Tower of the Goddess [Lower] => Surface [Main] - if(screen.getRoomIndex() == 0) { - doorName = "Door: B5"; + else if(zone == 10) { + // Gate of Illusion [Grail] => Gate of Guidance + doorName = "Door: B1"; } - } - else if(zone == 14) { - if(screen.getRoomIndex() == 2) { - // Tower of Ruin [Southwest] => Inferno Cavern [Viy] - doorName = "Door: B4"; + else if(zone == 11) { + // Graveyard of the Giants [West] => Mausoleum of the Giants + doorName = "Door: B2"; } - else { - // Tower of Ruin [Top] => Inferno Cavern [Spikes] - doorName = "Door: B7"; - replaceBacksideDoorFlags(gameObject, 0x0fc, 0x1c0, false); - - GameObject added = AddObject.addMissingBacksideDoorTimerAndSound(screen, 0x0fc, 0x1c0); - List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + else if(zone == 12) { + // Temple of Moonlight [Lower] => Temple of the Sun [Main] + doorName = "Door: B3"; + } + else if(zone == 13) { + // Tower of the Goddess [Lower] => Surface [Main] + if(screen.getRoomIndex() == 0) { + doorName = "Door: B5"; } - backsideDoors.add(added); - - added = AddObject.addMissingBacksideDoorCover(gameObject, 0x1c0); - backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + else if(zone == 14) { + if(screen.getRoomIndex() == 2) { + // Tower of Ruin [Southwest] => Inferno Cavern [Viy] + doorName = "Door: B4"; } - backsideDoors.add(added); + else { + // Tower of Ruin [Top] => Inferno Cavern [Spikes] + doorName = "Door: B7"; + replaceBacksideDoorFlags(gameObject, 0x0fc, 0x1c0, false); + + GameObject added = AddObject.addMissingBacksideDoorTimerAndSound(screen, 0x0fc, 0x1c0); + List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); - added = AddObject.addMissingBacksideMirrorTimerAndSound(gameObject.getObjectContainer(), 0x3b7); - backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); - } - backsideDoors.add(added); + added = AddObject.addMissingBacksideDoorCover(gameObject, 0x1c0); + backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); - added = AddObject.addMissingBacksideDoorMirrorCoverGraphic(gameObject, 0x3b7, false); - backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + added = AddObject.addMissingBacksideMirrorTimerAndSound(gameObject.getObjectContainer(), 0x3b7); + backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); + + added = AddObject.addMissingBacksideDoorMirrorCoverGraphic(gameObject, 0x3b7, false); + backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); + if(backsideDoors == null) { + backsideDoors = new ArrayList<>(); + mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + } + backsideDoors.add(added); + } + } + else if(zone == 15) { + // Chamber of Birth [Northeast] => Chamber of Extinction [Magatama Left] + doorName = "Door: B6"; + } + if(doorName != null) { + List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); if(backsideDoors == null) { backsideDoors = new ArrayList<>(); mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); } - backsideDoors.add(added); + backsideDoors.add(gameObject); } } - else if(zone == 15) { - // Chamber of Birth [Northeast] => Chamber of Extinction [Magatama Left] - doorName = "Door: B6"; - } - if(doorName != null) { - List backsideDoors = mapOfDoorNameToBacksideDoor.get(doorName); - if(backsideDoors == null) { - backsideDoors = new ArrayList<>(); - mapOfDoorNameToBacksideDoor.put(doorName, backsideDoors); + else if(Settings.isRandomizeTransitionGates()) { + // Re-enable backside door during the escape + Integer flagTestToRemove = null; + for (int i = 0; i < gameObject.getTestByteOperations().size(); i++) { + if (gameObject.getTestByteOperations().get(i).getIndex() == 0x0fe) { + flagTestToRemove = i; + break; + } + } + if(flagTestToRemove != null) { + gameObject.getTestByteOperations().remove((int)flagTestToRemove); } - backsideDoors.add(gameObject); } } } diff --git a/src/main/resources/lmr/randomizer/requirement/location_reqs.txt b/src/main/resources/lmr/randomizer/requirement/location_reqs.txt index 3f6dc1a2..5f35f1fd 100644 --- a/src/main/resources/lmr/randomizer/requirement/location_reqs.txt +++ b/src/main/resources/lmr/randomizer/requirement/location_reqs.txt @@ -211,7 +211,8 @@ Location: Endless Corridor [4F] => Location: Endless Corridor [5F], Attack: S-Ab Location: Endless Corridor [4F] => Location: Endless Corridor [5F], Attack: Forward, Exit: Endless Corridor [4F] Location: Endless Corridor [5F] => Location: Endless Corridor [4F], Key of Eternity Location: Endless Corridor [5F] => Transition: Endless D1, Exit: Endless Corridor [5F] -Location: Dimensional Corridor => Transition: Dimensional D1, Exit: Dimensional Corridor +Location: Dimensional Corridor => Transition: Dimensional D1, Feather, Exit: Dimensional Corridor +Location: Dimensional Corridor => Transition: Dimensional D1, Boost: Item, Attack: Bomb, Exit: Dimensional Corridor Location: Shrine of the Mother [Main] => Transition: Shrine U1 Location: Shrine of the Mother [Main] => Location: True Shrine of the Mother Location: Shrine of the Mother [Main] => Location: Shrine of the Mother [Lower], Feather, Glitch: Screen Mash, Setting: Nonrandom Transitions