From ffa860a26b48320fddaed194751caa90939f40ec Mon Sep 17 00:00:00 2001 From: trippsc2 Date: Fri, 1 May 2020 16:58:55 -0400 Subject: [PATCH] Basic Implementation of Retro mode Take Any locations. --- OpenTracker.Models/EntranceSection.cs | 331 +++++------- OpenTracker.Models/Enums/LocationID.cs | 95 ++-- OpenTracker.Models/Enums/WorldState.cs | 3 +- OpenTracker.Models/Location.cs | 378 ++++++++++++-- OpenTracker.Models/Mode.cs | 20 +- OpenTracker.Models/TakeAnySection.cs | 484 ++++++++++++++++++ .../ViewModels/MapLocationControlVM.cs | 18 +- .../ViewModels/ModeSettingsControlVM.cs | 3 + OpenTracker/ViewModels/SectionControlVM.cs | 2 + OpenTracker/Views/MapLocationControl.xaml | 5 +- OpenTracker/Views/ModeSettingsControl.xaml | 36 +- 11 files changed, 1082 insertions(+), 293 deletions(-) create mode 100644 OpenTracker.Models/TakeAnySection.cs diff --git a/OpenTracker.Models/EntranceSection.cs b/OpenTracker.Models/EntranceSection.cs index b5f9b9ab..8fbd7532 100644 --- a/OpenTracker.Models/EntranceSection.cs +++ b/OpenTracker.Models/EntranceSection.cs @@ -85,7 +85,7 @@ public EntranceSection(Game game, LocationID iD) switch (iD) { - case LocationID.LumberjackHouse: + case LocationID.LumberjackHouseEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -104,7 +104,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Aga) && _game.Items.Has(ItemType.Boots)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -112,8 +112,7 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Min((byte)AccessibilityLevel.Inspect, (byte)_game.Regions[RegionID.LightWorld].Accessibility); } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Aga) && _game.Items.Has(ItemType.Boots) && _game.Items.Has(ItemType.MoonPearl)) @@ -122,8 +121,6 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Min((byte)AccessibilityLevel.Inspect, (byte)_game.Regions[RegionID.LightWorld].Accessibility); } - - return AccessibilityLevel.None; }; _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); @@ -141,13 +138,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.LightWorld].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Gloves) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -170,7 +166,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.BumperCaveAccess) && _game.Items.Has(ItemType.Mirror)) return AccessibilityLevel.Normal; @@ -183,7 +179,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.Mirror, new Mode() { WorldState = WorldState.StandardOpen }); break; - case LocationID.KakarikoFortuneTeller: + case LocationID.KakarikoFortuneTellerEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -216,7 +212,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.LeftSnitchHouse: + case LocationID.LeftSnitchHouseEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -227,7 +223,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.RightSnitchHouse: + case LocationID.RightSnitchHouseEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -271,7 +267,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.GrassHouse: + case LocationID.GrassHouseEntrance: Name = "Move your lawn"; _standardItemProvided = _game.Items[ItemType.GrassHouseAccess]; @@ -279,15 +275,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted || _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; - if (_game.Mode.WorldState == WorldState.Inverted) - { - if (_game.Items.Has(ItemType.MoonPearl)) - return _game.Regions[RegionID.LightWorld].Accessibility; - } - return AccessibilityLevel.None; }; @@ -318,7 +308,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.BombHut: + case LocationID.BombHutEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -326,15 +316,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted || _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; - if (_game.Mode.WorldState == WorldState.Inverted) - { - if (_game.Items.Has(ItemType.MoonPearl)) - return _game.Regions[RegionID.LightWorld].Accessibility; - } - return AccessibilityLevel.None; }; @@ -373,7 +357,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { AccessibilityLevel direct = AccessibilityLevel.None; AccessibilityLevel mirror = AccessibilityLevel.None; @@ -392,8 +376,7 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Max((byte)direct, (byte)mirror); } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) { @@ -415,7 +398,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.MoonPearl, new Mode()); break; - case LocationID.ChestGame: + case LocationID.ChestGameEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -434,7 +417,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Mirror)) return _game.Regions[RegionID.DarkWorldSouth].Accessibility; @@ -478,15 +461,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted || _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; - if (_game.Mode.WorldState == WorldState.Inverted) - { - if (_game.Items.Has(ItemType.MoonPearl)) - return _game.Regions[RegionID.LightWorld].Accessibility; - } - return AccessibilityLevel.None; }; @@ -495,7 +472,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.Inverted }); break; - case LocationID.ForestChestGame: + case LocationID.ForestChestGameEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -514,10 +491,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) return _game.Regions[RegionID.LightWorld].Accessibility; - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) { @@ -577,13 +553,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.CanClearAgaTowerBarrier()) return _game.Regions[RegionID.HyruleCastleSecondFloor].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.TowerCrystals)) return _game.Regions[RegionID.HyruleCastleSecondFloor].Accessibility; @@ -613,7 +588,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.CentralBonkRocks: + case LocationID.CentralBonkRocksEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -621,13 +596,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Boots)) return AccessibilityLevel.Normal; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Boots) && _game.Items.Has(ItemType.MoonPearl)) return AccessibilityLevel.Normal; @@ -650,15 +624,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted || _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; - if (_game.Mode.WorldState == WorldState.Inverted) - { - if (_game.Items.Has(ItemType.MoonPearl)) - return _game.Regions[RegionID.LightWorld].Accessibility; - } - return AccessibilityLevel.None; }; @@ -675,7 +643,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) { @@ -685,8 +653,7 @@ public EntranceSection(Game game, LocationID iD) return AccessibilityLevel.SequenceBreak; } } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl)) { @@ -720,7 +687,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.TreesFairyCave: + case LocationID.TreesFairyCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -731,7 +698,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.PegsFairyCave: + case LocationID.PegsFairyCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -761,10 +728,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) return _game.Regions[RegionID.LightWorld].Accessibility; - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) { @@ -791,7 +757,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) { @@ -801,8 +767,7 @@ public EntranceSection(Game game, LocationID iD) return AccessibilityLevel.Inspect; } } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) { @@ -830,13 +795,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Boots)) return _game.Regions[RegionID.LightWorld].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Boots) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -859,7 +823,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Boots)) { @@ -875,8 +839,7 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Max((byte)lightWorld, (byte)dWWest); } } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Gloves, 2) && _game.Items.Has(ItemType.Boots) && _game.Items.Has(ItemType.MoonPearl)) @@ -903,13 +866,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Mirror)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl)) return AccessibilityLevel.Normal; @@ -933,7 +895,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.DesertBackAccess) && _game.Items.Has(ItemType.Gloves)) return AccessibilityLevel.Normal; @@ -941,8 +903,7 @@ public EntranceSection(Game game, LocationID iD) if (_game.Items.Has(ItemType.Mirror)) return _game.Regions[RegionID.MireArea].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.DesertBackAccess) && _game.Items.Has(ItemType.Gloves) && _game.Items.Has(ItemType.MoonPearl)) @@ -968,7 +929,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.DesertLeftAccess) && _game.Items.Has(ItemType.Gloves)) return AccessibilityLevel.Normal; @@ -976,8 +937,7 @@ public EntranceSection(Game game, LocationID iD) if (_game.Items.Has(ItemType.Mirror)) return _game.Regions[RegionID.MireArea].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.DesertLeftAccess) && _game.Items.Has(ItemType.Gloves) && _game.Items.Has(ItemType.MoonPearl)) @@ -1010,7 +970,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { AccessibilityLevel direct = AccessibilityLevel.None; AccessibilityLevel mirror = AccessibilityLevel.None; @@ -1023,8 +983,7 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Max((byte)direct, (byte)mirror); } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Book)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -1052,7 +1011,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.ThiefCave: + case LocationID.ThiefCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -1063,7 +1022,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.RupeeCave: + case LocationID.RupeeCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -1071,13 +1030,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.LightWorld].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Gloves) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -1100,13 +1058,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.FireRod) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.FireRod)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; @@ -1129,13 +1086,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DarkWorldWest].Accessibility; return AccessibilityLevel.None; @@ -1165,13 +1121,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Hammer) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { AccessibilityLevel direct = AccessibilityLevel.None; AccessibilityLevel mirror = AccessibilityLevel.None; @@ -1196,7 +1151,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.Mirror, new Mode() { WorldState = WorldState.Inverted }); break; - case LocationID.DarkVillageFortuneTeller: + case LocationID.DarkVillageFortuneTellerEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.DarkWorldWestAccess]; @@ -1207,7 +1162,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldWest, new Mode()); break; - case LocationID.DarkChapel: + case LocationID.DarkChapelEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldWestAccess]; @@ -1259,13 +1214,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DarkWorldWest].Accessibility; return AccessibilityLevel.None; @@ -1284,14 +1238,13 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves, 2) && _game.Items.Has(ItemType.Hammer) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Hammer)) { @@ -1345,13 +1298,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.DarkWorldWest].Accessibility; @@ -1374,13 +1326,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldSouth].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DarkWorldSouth].Accessibility; return AccessibilityLevel.None; @@ -1403,7 +1354,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldSouth, new Mode()); break; - case LocationID.DarkCentralBonkRocks: + case LocationID.DarkCentralBonkRocksEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldSouthAccess]; @@ -1411,13 +1362,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Boots) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldSouth].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Boots)) return _game.Regions[RegionID.DarkWorldSouth].Accessibility; @@ -1440,13 +1390,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Mirror)) return _game.Regions[RegionID.DarkWorldSouth].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.LightWorld].Accessibility; return AccessibilityLevel.None; @@ -1469,7 +1418,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldSouth, new Mode()); break; - case LocationID.ArrowGame: + case LocationID.ArrowGameEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.DarkWorldSouthAccess]; @@ -1491,7 +1440,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldSouth, new Mode()); break; - case LocationID.DarkTreesFairyCave: + case LocationID.DarkTreesFairyCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldEastAccess]; @@ -1502,7 +1451,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldEast, new Mode()); break; - case LocationID.DarkSahasrahla: + case LocationID.DarkSahasrahlaEntrance: Name = "House"; _standardItemProvided = _game.Items[ItemType.DarkWorldEastAccess]; @@ -1521,13 +1470,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldEast].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DarkWorldEast].Accessibility; return AccessibilityLevel.None; @@ -1549,7 +1497,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldWitchArea, new Mode()); break; - case LocationID.DarkFluteSpotFive: + case LocationID.DarkFluteSpotFiveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldEastAccess]; @@ -1568,13 +1516,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.RedCrystal, 2)) return AccessibilityLevel.Normal; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.RedCrystal, 2)) return AccessibilityLevel.Normal; @@ -1597,13 +1544,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Aga2)) return _game.Regions[RegionID.DarkWorldEast].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Regions[RegionID.HyruleCastleSecondFloor].Accessibility >= AccessibilityLevel.SequenceBreak && _game.Items.Has(ItemType.Aga2)) @@ -1623,7 +1569,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.Aga2, new Mode()); break; - case LocationID.DarkIceRodCave: + case LocationID.DarkIceRodCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldSouthEastAccess]; @@ -1631,13 +1577,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; return AccessibilityLevel.None; @@ -1648,7 +1593,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.StandardOpen }); break; - case LocationID.DarkFakeIceRodCave: + case LocationID.DarkFakeIceRodCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldSouthEastAccess]; @@ -1659,7 +1604,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkWorldSouthEast, new Mode()); break; - case LocationID.DarkIceRodRock: + case LocationID.DarkIceRodRockEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkWorldSouthEastAccess]; @@ -1667,13 +1612,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; @@ -1688,7 +1632,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.Gloves, new Mode()); break; - case LocationID.HypeFairyCave: + case LocationID.HypeFairyCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -1696,10 +1640,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) return _game.Regions[RegionID.LightWorld].Accessibility; - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -1713,7 +1656,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.Inverted }); break; - case LocationID.FortuneTeller: + case LocationID.FortuneTellerEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -1743,7 +1686,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Regions[RegionID.LightWorld].Accessibility == AccessibilityLevel.Normal && _game.Items.Has(ItemType.Flippers)) @@ -1755,8 +1698,7 @@ public EntranceSection(Game game, LocationID iD) if (_game.Regions[RegionID.LightWorld].Accessibility >= AccessibilityLevel.SequenceBreak) return AccessibilityLevel.SequenceBreak; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if ((_game.Regions[RegionID.DarkWorldSouth].Accessibility == AccessibilityLevel.Normal || _game.Regions[RegionID.DarkWorldSouthEast].Accessibility == AccessibilityLevel.Normal) && @@ -1801,10 +1743,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) return _game.Regions[RegionID.LightWorld].Accessibility; - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -1826,10 +1767,9 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) return _game.Regions[RegionID.LightWorld].Accessibility; - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -1843,7 +1783,7 @@ public EntranceSection(Game game, LocationID iD) _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.Inverted }); break; - case LocationID.IceBeeCave: + case LocationID.IceBeeCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -1854,7 +1794,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.LightWorld, new Mode()); break; - case LocationID.IceFairyCave: + case LocationID.IceFairyCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.LightWorldAccess]; @@ -1862,13 +1802,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.LightWorld].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -1891,7 +1830,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves, 2)) { @@ -1907,8 +1846,7 @@ public EntranceSection(Game game, LocationID iD) } } } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { AccessibilityLevel dWSouth = AccessibilityLevel.None; AccessibilityLevel dWSouthEast = AccessibilityLevel.None; @@ -1968,7 +1906,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.CanUseMedallions() && ((_game.Items.Has(ItemType.Bombos) && _game.Items.Has(ItemType.Ether) && @@ -1984,8 +1922,7 @@ public EntranceSection(Game game, LocationID iD) _game.Items[ItemType.QuakeDungeons].Current == 3)))) return _game.Regions[RegionID.MireArea].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.CanUseMedallions() && ((_game.Items.Has(ItemType.Bombos) && _game.Items.Has(ItemType.Ether) && @@ -2029,7 +1966,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.MireArea, new Mode()); break; - case LocationID.MireRightShack: + case LocationID.MireRightShackEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.MireAreaAccess]; @@ -2040,7 +1977,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.MireArea, new Mode()); break; - case LocationID.MireCave: + case LocationID.MireCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.MireAreaAccess]; @@ -2059,13 +1996,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Mirror) && _game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.MireArea].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.LightWorld].Accessibility; @@ -2170,7 +2106,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DarkDeathMountainWestBottom, new Mode()); break; - case LocationID.DarkMountainFairy: + case LocationID.DarkMountainFairyEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DarkDeathMountainWestBottomAccess]; @@ -2203,7 +2139,7 @@ public EntranceSection(Game game, LocationID iD) _regionSubscriptions.Add(RegionID.DeathMountainEastBottom, new Mode()); break; - case LocationID.EDMFairyCave: + case LocationID.EDMFairyCaveEntrance: Name = "Cave"; _standardItemProvided = _game.Items[ItemType.DeathMountainEastBottomAccess]; @@ -2244,7 +2180,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { AccessibilityLevel dMEastTop = _game.Regions[RegionID.DeathMountainEastTop].Accessibility; AccessibilityLevel dMEastBottom = AccessibilityLevel.None; @@ -2266,8 +2202,7 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Max(Math.Max((byte)dMEastTop, (byte)dMEastBottom), (byte)dDMEastBottom); } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.DeathMountainEastTopConnectorAccess)) return AccessibilityLevel.Normal; @@ -2280,8 +2215,6 @@ public EntranceSection(Game game, LocationID iD) return (AccessibilityLevel)Math.Max((byte)dMEastTop, (byte)dMEastBottom); } - - return AccessibilityLevel.None; }; _regionSubscriptions.Add(RegionID.DeathMountainEastTop, new Mode()); @@ -2306,18 +2239,15 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.TurtleRockTunnelAccess) && _game.Items.Has(ItemType.Mirror)) return AccessibilityLevel.Normal; return _game.Regions[RegionID.DeathMountainEastTop].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DeathMountainEastTop].Accessibility; - - return AccessibilityLevel.None; }; _regionSubscriptions.Add(RegionID.DeathMountainEastTop, new Mode()); @@ -2334,13 +2264,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Mirror)) return _game.Regions[RegionID.TurtleRockTunnel].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DeathMountainEastTop].Accessibility; return AccessibilityLevel.None; @@ -2360,7 +2289,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.TurtleRockSafetyDoorAccess) && _game.Items.Has(ItemType.Mirror)) @@ -2368,11 +2297,8 @@ public EntranceSection(Game game, LocationID iD) return _game.Regions[RegionID.DeathMountainEastTop].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DeathMountainEastTop].Accessibility; - - return AccessibilityLevel.None; }; _regionSubscriptions.Add(RegionID.DeathMountainEastTop, new Mode()); @@ -2433,13 +2359,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.Gloves) && _game.Items.Has(ItemType.MoonPearl)) return _game.Regions[RegionID.DarkDeathMountainTop].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.Has(ItemType.Gloves)) return _game.Regions[RegionID.DarkDeathMountainTop].Accessibility; @@ -2462,7 +2387,7 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Hammer) && _game.Items.Has(ItemType.Gloves, 2) && _game.Items.CanUseMedallions() && @@ -2476,8 +2401,7 @@ public EntranceSection(Game game, LocationID iD) _game.Items[ItemType.QuakeDungeons].Current >= 2))) return _game.Regions[RegionID.DeathMountainEastTop].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else { if (_game.Items.CanUseMedallions() && ((_game.Items.Has(ItemType.Bombos) && _game.Items.Has(ItemType.Ether) && _game.Items.Has(ItemType.Quake)) || @@ -2516,13 +2440,12 @@ public EntranceSection(Game game, LocationID iD) GetAccessibility = () => { - if (_game.Mode.WorldState == WorldState.StandardOpen) + if (_game.Mode.WorldState != WorldState.Inverted) { if (_game.Items.Has(ItemType.TowerCrystals)) return _game.Regions[RegionID.DarkDeathMountainTop].Accessibility; } - - if (_game.Mode.WorldState == WorldState.Inverted) + else return _game.Regions[RegionID.DarkDeathMountainTop].Accessibility; return AccessibilityLevel.None; diff --git a/OpenTracker.Models/Enums/LocationID.cs b/OpenTracker.Models/Enums/LocationID.cs index 03423e3b..bf56d1af 100644 --- a/OpenTracker.Models/Enums/LocationID.cs +++ b/OpenTracker.Models/Enums/LocationID.cs @@ -71,43 +71,43 @@ public enum LocationID MiseryMire, TurtleRock, GanonsTower, - LumberjackHouse, + LumberjackHouseEntrance, LumberjackCaveEntrance, DeathMountainEntryCave, DeathMountainExitCave, - KakarikoFortuneTeller, + KakarikoFortuneTellerEntrance, WomanLeftDoor, WomanRightDoor, - LeftSnitchHouse, - RightSnitchHouse, + LeftSnitchHouseEntrance, + RightSnitchHouseEntrance, BlindsHouseEntrance, TheWellEntrance, ChickenHouseEntrance, - GrassHouse, + GrassHouseEntrance, TavernFront, KakarikoShop, - BombHut, + BombHutEntrance, SickKidEntrance, BlacksmithHouse, MagicBatEntrance, - ChestGame, + ChestGameEntrance, RaceHouseLeft, RaceHouseRight, LibraryEntrance, ForestHideout, - ForestChestGame, + ForestChestGameEntrance, CastleSecretEntrance, CastleMainEntrance, CastleLeftEntrance, CastleRightEntrance, CastleTowerEntrance, DamEntrance, - CentralBonkRocks, + CentralBonkRocksEntrance, WitchsHutEntrance, WaterfallFairyEntrance, SahasrahlasHutEntrance, - TreesFairyCave, - PegsFairyCave, + TreesFairyCaveEntrance, + PegsFairyCaveEntrance, EasternPalaceEntrance, HoulihanHole, SanctuaryGrave, @@ -119,14 +119,14 @@ public enum LocationID DesertRightEntrance, DesertFrontEntrance, AginahsCaveEntrance, - ThiefCave, - RupeeCave, + ThiefCaveEntrance, + RupeeCaveEntrance, SkullWoodsBack, ThievesTownEntrance, CShapedHouseEntrance, HammerHouse, - DarkVillageFortuneTeller, - DarkChapel, + DarkVillageFortuneTellerEntrance, + DarkChapelEntrance, ShieldShop, DarkLumberjack, TreasureGameEntrance, @@ -136,34 +136,34 @@ public enum LocationID BumperCaveEntrance, HypeCaveEntrance, SwampPalaceEntrance, - DarkCentralBonkRocks, + DarkCentralBonkRocksEntrance, SouthOfGroveEntrance, BombShop, - ArrowGame, + ArrowGameEntrance, DarkHyliaFortuneTeller, - DarkTreesFairyCave, - DarkSahasrahla, + DarkTreesFairyCaveEntrance, + DarkSahasrahlaEntrance, PalaceOfDarknessEntrance, DarkWitchsHut, - DarkFluteSpotFive, + DarkFluteSpotFiveEntrance, FatFairyEntrance, GanonHole, - DarkIceRodCave, - DarkFakeIceRodCave, - DarkIceRodRock, - HypeFairyCave, - FortuneTeller, + DarkIceRodCaveEntrance, + DarkFakeIceRodCaveEntrance, + DarkIceRodRockEntrance, + HypeFairyCaveEntrance, + FortuneTellerEntrance, LakeShop, UpgradeFairy, MiniMoldormCaveEntrance, IceRodCaveEntrance, - IceBeeCave, - IceFairyCave, + IceBeeCaveEntrance, + IceFairyCaveEntrance, IcePalaceEntrance, MiseryMireEntrance, MireShackEntrance, - MireRightShack, - MireCave, + MireRightShackEntrance, + MireCaveEntrance, CheckerboardCaveEntrance, DeathMountainEntranceBack, OldManResidence, @@ -173,10 +173,10 @@ public enum LocationID SpectacleRockRight, SpectacleRockTop, SpikeCaveEntrance, - DarkMountainFairy, + DarkMountainFairyEntrance, TowerOfHeraEntrance, SpiralCaveBottom, - EDMFairyCave, + EDMFairyCaveEntrance, ParadoxCaveMiddle, ParadoxCaveBottom, EDMConnectorBottom, @@ -194,6 +194,37 @@ public enum LocationID TRLedgeRight, TRSafetyDoor, HookshotCaveTop, - LinksHouseEntrance + LinksHouseEntrance, + TreesFairyCaveTakeAny, + PegsFairyCaveTakeAny, + KakarikoFortuneTellerTakeAny, + GrassHouseTakeAny, + ForestChestGameTakeAny, + LumberjackHouseTakeAny, + LeftSnitchHouseTakeAny, + RightSnitchHouseTakeAny, + BombHutTakeAny, + IceFairyCaveTakeAny, + RupeeCaveTakeAny, + CentralBonkRocksTakeAny, + ThiefCaveTakeAny, + IceBeeCaveTakeAny, + FortuneTellerTakeAny, + HypeFairyCaveTakeAny, + ChestGameTakeAny, + EDMFairyCaveTakeAny, + DarkChapelTakeAny, + DarkVillageFortuneTellerTakeAny, + DarkTreesFairyCaveTakeAny, + DarkSahasrahlaTakeAny, + DarkFluteSpotFiveTakeAny, + ArrowGameTakeAny, + DarkCentralBonkRocksTakeAny, + DarkIceRodCaveTakeAny, + DarkFakeIceRodCaveTakeAny, + DarkIceRodRockTakeAny, + DarkMountainFairyTakeAny, + MireRightShackTakeAny, + MireCaveTakeAny } } diff --git a/OpenTracker.Models/Enums/WorldState.cs b/OpenTracker.Models/Enums/WorldState.cs index b5666af6..890950d6 100644 --- a/OpenTracker.Models/Enums/WorldState.cs +++ b/OpenTracker.Models/Enums/WorldState.cs @@ -3,6 +3,7 @@ public enum WorldState { StandardOpen, - Inverted + Inverted, + Retro } } diff --git a/OpenTracker.Models/Location.cs b/OpenTracker.Models/Location.cs index efc37bc5..37d12f2a 100644 --- a/OpenTracker.Models/Location.cs +++ b/OpenTracker.Models/Location.cs @@ -86,6 +86,7 @@ public Location(Game game, LocationID iD) int itemSections = 0; bool entranceSection = false; + bool takeAnySection = false; switch (iD) { @@ -807,7 +808,7 @@ public Location(Game game, LocationID iD) itemSections = 1; BossSection = new BossSection(game, iD); break; - case LocationID.LumberjackHouse: + case LocationID.LumberjackHouseEntrance: Name = "Lumber House"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 675, 120, new Mode() @@ -843,7 +844,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.KakarikoFortuneTeller: + case LocationID.KakarikoFortuneTellerEntrance: Name = "Kak Fortune"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 375, 645, new Mode() @@ -870,7 +871,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.LeftSnitchHouse: + case LocationID.LeftSnitchHouseEntrance: Name = "Left Snitch"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 100, 940, new Mode() @@ -879,7 +880,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.RightSnitchHouse: + case LocationID.RightSnitchHouseEntrance: Name = "Right Snitch"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 415, 965, new Mode() @@ -915,7 +916,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.GrassHouse: + case LocationID.GrassHouseEntrance: Name = "Grass House"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 410, 1075, new Mode() @@ -942,7 +943,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.BombHut: + case LocationID.BombHutEntrance: Name = "Bomb Hut"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 55, 1195, new Mode() @@ -978,7 +979,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.ChestGame: + case LocationID.ChestGameEntrance: Name = "Chest Game"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 425, 1410, new Mode() @@ -1023,7 +1024,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.ForestChestGame: + case LocationID.ForestChestGameEntrance: Name = "Forest Chest Game"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 370, 40, new Mode() @@ -1086,7 +1087,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.CentralBonkRocks: + case LocationID.CentralBonkRocksEntrance: Name = "Central Bonk Rocks"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 945, 1310, new Mode() @@ -1122,7 +1123,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.TreesFairyCave: + case LocationID.TreesFairyCaveEntrance: Name = "Trees Fairy Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1650, 1295, new Mode() @@ -1131,7 +1132,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.PegsFairyCave: + case LocationID.PegsFairyCaveEntrance: Name = "Pegs Fairy Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1970, 1405, new Mode() @@ -1239,7 +1240,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.ThiefCave: + case LocationID.ThiefCaveEntrance: Name = "Thief Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 555, 1790, new Mode() @@ -1248,7 +1249,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.RupeeCave: + case LocationID.RupeeCaveEntrance: Name = "Rupee Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 625, 1920, new Mode() @@ -1293,7 +1294,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkVillageFortuneTeller: + case LocationID.DarkVillageFortuneTellerEntrance: Name = "Dark Village Fortune Teller"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 377, 647, new Mode() @@ -1302,7 +1303,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkChapel: + case LocationID.DarkChapelEntrance: Name = "Dark Chapel"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 924, 551, new Mode() @@ -1392,7 +1393,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkCentralBonkRocks: + case LocationID.DarkCentralBonkRocksEntrance: Name = "Bonk Rocks"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 945, 1310, new Mode() @@ -1419,7 +1420,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.ArrowGame: + case LocationID.ArrowGameEntrance: Name = "Arrow Game"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 431, 1409, new Mode() @@ -1437,7 +1438,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkTreesFairyCave: + case LocationID.DarkTreesFairyCaveEntrance: Name = "Dark Trees Fairy Cave"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1656, 1296, new Mode() @@ -1446,7 +1447,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkSahasrahla: + case LocationID.DarkSahasrahlaEntrance: Name = "Dark Saha"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1706, 1008, new Mode() @@ -1473,7 +1474,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkFluteSpotFive: + case LocationID.DarkFluteSpotFiveEntrance: Name = "Dark Flute Spot 5"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1968, 1405, new Mode() @@ -1507,7 +1508,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkIceRodCave: + case LocationID.DarkIceRodCaveEntrance: Name = "Dark Ice Rod Cave"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1795, 1545, new Mode() @@ -1516,7 +1517,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkFakeIceRodCave: + case LocationID.DarkFakeIceRodCaveEntrance: Name = "Dark Fake Ice Rod Cave"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1835, 1545, new Mode() @@ -1525,7 +1526,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkIceRodRock: + case LocationID.DarkIceRodRockEntrance: Name = "Dark Ice Rod Rock"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1810, 1585, new Mode() @@ -1534,7 +1535,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.HypeFairyCave: + case LocationID.HypeFairyCaveEntrance: Name = "Hype Fairy Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1200, 1565, new Mode() @@ -1543,7 +1544,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.FortuneTeller: + case LocationID.FortuneTellerEntrance: Name = "Fortune Teller"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1300, 1615, new Mode() @@ -1588,7 +1589,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.IceBeeCave: + case LocationID.IceBeeCaveEntrance: Name = "Ice Bee Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1835, 1545, new Mode() @@ -1597,7 +1598,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.IceFairyCave: + case LocationID.IceFairyCaveEntrance: Name = "Ice Fairy Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1810, 1585, new Mode() @@ -1633,7 +1634,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.MireRightShack: + case LocationID.MireRightShackEntrance: Name = "Mire Right Shack"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 220, 1610, new Mode() @@ -1642,7 +1643,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.MireCave: + case LocationID.MireCaveEntrance: Name = "Mire Cave"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 400, 1655, new Mode() @@ -1732,7 +1733,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.DarkMountainFairy: + case LocationID.DarkMountainFairyEntrance: Name = "Dark Mountain Fairy"; MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 815, 376, new Mode() @@ -1759,7 +1760,7 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; - case LocationID.EDMFairyCave: + case LocationID.EDMFairyCaveEntrance: Name = "EDM Fairy Cave"; MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1695, 290, new Mode() @@ -1931,6 +1932,316 @@ public Location(Game game, LocationID iD) })); entranceSection = true; break; + case LocationID.TreesFairyCaveTakeAny: + Name = "Trees Fairy Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1650, 1295, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.PegsFairyCaveTakeAny: + Name = "Pegs Fairy Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1970, 1405, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.KakarikoFortuneTellerTakeAny: + Name = "Kak Fortune"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 375, 645, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.GrassHouseTakeAny: + Name = "Grass House"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 410, 1075, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.ForestChestGameTakeAny: + Name = "Forest Chest Game"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 370, 40, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.LumberjackHouseTakeAny: + Name = "Lumber House"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 688, 120, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.LeftSnitchHouseTakeAny: + Name = "Left Snitch"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 100, 940, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.RightSnitchHouseTakeAny: + Name = "Right Snitch"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 415, 965, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.BombHutTakeAny: + Name = "Bomb Hut"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 55, 1195, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.IceFairyCaveTakeAny: + Name = "Ice Fairy Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1810, 1602, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.RupeeCaveTakeAny: + Name = "Rupee Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 625, 1920, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.CentralBonkRocksTakeAny: + Name = "Central Bonk Rocks"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 945, 1310, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.ThiefCaveTakeAny: + Name = "Thief Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 555, 1790, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.IceBeeCaveTakeAny: + Name = "Ice Bee Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1850, 1545, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.FortuneTellerTakeAny: + Name = "Fortune Teller"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1300, 1615, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.HypeFairyCaveTakeAny: + Name = "Hype Fairy Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1200, 1565, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.ChestGameTakeAny: + Name = "Chest Game"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 425, 1410, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.EDMFairyCaveTakeAny: + Name = "EDM Fairy Cave"; + MapLocations.Add(new MapLocation(this, MapID.LightWorld, 1695, 290, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkChapelTakeAny: + Name = "Dark Chapel"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 924, 551, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkVillageFortuneTellerTakeAny: + Name = "Dark Village Fortune Teller"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 377, 647, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkTreesFairyCaveTakeAny: + Name = "Dark Trees Fairy Cave"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1656, 1296, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkSahasrahlaTakeAny: + Name = "Dark Saha"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1706, 1008, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkFluteSpotFiveTakeAny: + Name = "Dark Flute Spot 5"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1968, 1405, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.ArrowGameTakeAny: + Name = "Arrow Game"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 431, 1409, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkCentralBonkRocksTakeAny: + Name = "Bonk Rocks"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 945, 1310, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkIceRodCaveTakeAny: + Name = "Dark Ice Rod Cave"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1795, 1545, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkFakeIceRodCaveTakeAny: + Name = "Dark Fake Ice Rod Cave"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1835, 1545, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkIceRodRockTakeAny: + Name = "Dark Ice Rod Rock"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 1810, 1585, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.DarkMountainFairyTakeAny: + Name = "Dark Mountain Fairy"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 815, 376, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.MireRightShackTakeAny: + Name = "Mire Right Shack"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 220, 1610, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; + case LocationID.MireCaveTakeAny: + Name = "Mire Cave"; + MapLocations.Add(new MapLocation(this, MapID.DarkWorld, 400, 1655, + new Mode() + { + WorldState = WorldState.Retro, + EntranceShuffle = false + })); + takeAnySection = true; + break; } for (int i = 0; i < itemSections; i++) @@ -1939,6 +2250,9 @@ public Location(Game game, LocationID iD) if (entranceSection) Sections.Add(new EntranceSection(game, ID)); + if (takeAnySection) + Sections.Add(new TakeAnySection(game, ID)); + if (BossSection != null) Sections.Add(BossSection); @@ -1955,7 +2269,7 @@ public Location(Game game, LocationID iD) UpdateAvailable(); UpdateTotal(); } - + private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); diff --git a/OpenTracker.Models/Mode.cs b/OpenTracker.Models/Mode.cs index 61e10de2..fa63539e 100644 --- a/OpenTracker.Models/Mode.cs +++ b/OpenTracker.Models/Mode.cs @@ -152,10 +152,22 @@ public bool Validate(Mode gameMode) } } - if (gameMode.WorldState != null && - WorldState != null && - WorldState != gameMode.WorldState) - return false; + if (gameMode.WorldState != null && WorldState != null) + { + switch (gameMode.WorldState.Value) + { + case Enums.WorldState.StandardOpen: + if (WorldState.Value != Enums.WorldState.StandardOpen && + WorldState.Value != Enums.WorldState.Retro) + return false; + break; + case Enums.WorldState.Inverted: + case Enums.WorldState.Retro: + if (WorldState.Value != gameMode.WorldState.Value) + return false; + break; + } + } if (gameMode.EntranceShuffle != null && EntranceShuffle != null && diff --git a/OpenTracker.Models/TakeAnySection.cs b/OpenTracker.Models/TakeAnySection.cs new file mode 100644 index 00000000..5d96c805 --- /dev/null +++ b/OpenTracker.Models/TakeAnySection.cs @@ -0,0 +1,484 @@ +using OpenTracker.Models.Enums; +using OpenTracker.Models.Interfaces; +using System; +using System.Collections.Generic; +using System.ComponentModel; + +namespace OpenTracker.Models +{ + public class TakeAnySection : ISection + { + private readonly Game _game; + private readonly Dictionary _regionSubscriptions; + private readonly Dictionary _regionIsSubscribed; + private readonly Dictionary _itemSubscriptions; + private readonly Dictionary _itemIsSubscribed; + + public bool HasMarking => false; + public string Name => "Take Any"; + public Mode RequiredMode { get; } + public bool UserManipulated { get; set; } + + public Func GetAccessibility { get; } + + public event PropertyChangingEventHandler PropertyChanging; + public event PropertyChangedEventHandler PropertyChanged; + + private AccessibilityLevel _accessibility; + public AccessibilityLevel Accessibility + { + get => _accessibility; + private set + { + if (_accessibility != value) + { + _accessibility = value; + OnPropertyChanged(nameof(Accessibility)); + } + } + } + + private int _available; + public int Available + { + get => _available; + set + { + if (_available != value) + { + _available = value; + OnPropertyChanged(nameof(Available)); + } + } + } + + private MarkingType? _marking; + public MarkingType? Marking + { + get => _marking; + set + { + if (_marking != value) + { + OnPropertyChanging(nameof(Marking)); + _marking = value; + OnPropertyChanged(nameof(Marking)); + } + } + } + + public TakeAnySection(Game game, LocationID iD) + { + _game = game; + + _regionSubscriptions = new Dictionary(); + _regionIsSubscribed = new Dictionary(); + _itemSubscriptions = new Dictionary(); + _itemIsSubscribed = new Dictionary(); + + RequiredMode = new Mode(); + Available = 1; + + List itemReqs = new List(); + + switch (iD) + { + case LocationID.TreesFairyCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.PegsFairyCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.KakarikoFortuneTellerTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.GrassHouseTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.ForestChestGameTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.LumberjackHouseTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.LeftSnitchHouseTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.RightSnitchHouseTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.BombHutTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.IceFairyCaveTakeAny: + + GetAccessibility = () => + { + if (_game.Items.Has(ItemType.Gloves)) + return _game.Regions[RegionID.LightWorld].Accessibility; + + return AccessibilityLevel.None; + }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + _itemSubscriptions.Add(ItemType.Gloves, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.RupeeCaveTakeAny: + + GetAccessibility = () => + { + if (_game.Items.Has(ItemType.Gloves)) + return _game.Regions[RegionID.LightWorld].Accessibility; + + return AccessibilityLevel.None; + }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + _itemSubscriptions.Add(ItemType.Gloves, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.CentralBonkRocksTakeAny: + + GetAccessibility = () => + { + if (_game.Items.Has(ItemType.Boots)) + return AccessibilityLevel.Normal; + + return AccessibilityLevel.None; + }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + _itemSubscriptions.Add(ItemType.Boots, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.ThiefCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.IceBeeCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.FortuneTellerTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.HypeFairyCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.ChestGameTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.LightWorld].Accessibility; }; + + _regionSubscriptions.Add(RegionID.LightWorld, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.EDMFairyCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DeathMountainEastBottom].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DeathMountainEastBottom, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkChapelTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldWest].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldWest, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkVillageFortuneTellerTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldWest].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldWest, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkTreesFairyCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldEast].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldEast, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkSahasrahlaTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldEast].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldEast, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkFluteSpotFiveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldEast].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldEast, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.ArrowGameTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldSouth].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldSouth, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkCentralBonkRocksTakeAny: + + GetAccessibility = () => + { + if (_game.Items.Has(ItemType.Boots) && _game.Items.Has(ItemType.MoonPearl)) + return _game.Regions[RegionID.DarkWorldSouth].Accessibility; + + return AccessibilityLevel.None; + }; + + _regionSubscriptions.Add(RegionID.DarkWorldSouth, new Mode() { WorldState = WorldState.Retro }); + + _itemSubscriptions.Add(ItemType.Boots, new Mode() { WorldState = WorldState.Retro }); + _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkIceRodCaveTakeAny: + + GetAccessibility = () => + { + if (_game.Items.Has(ItemType.MoonPearl)) + return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; + + return AccessibilityLevel.None; + }; + + _regionSubscriptions.Add(RegionID.DarkWorldSouthEast, new Mode() { WorldState = WorldState.Retro }); + + _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkFakeIceRodCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkWorldSouthEast, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkIceRodRockTakeAny: + + GetAccessibility = () => + { + if (_game.Items.Has(ItemType.MoonPearl) && _game.Items.Has(ItemType.Gloves)) + return _game.Regions[RegionID.DarkWorldSouthEast].Accessibility; + + return AccessibilityLevel.None; + }; + + _regionSubscriptions.Add(RegionID.DarkWorldSouthEast, new Mode() { WorldState = WorldState.Retro }); + + _itemSubscriptions.Add(ItemType.MoonPearl, new Mode() { WorldState = WorldState.Retro }); + _itemSubscriptions.Add(ItemType.Gloves, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.DarkMountainFairyTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.DarkDeathMountainWestBottom].Accessibility; }; + + _regionSubscriptions.Add(RegionID.DarkDeathMountainWestBottom, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.MireRightShackTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.MireArea].Accessibility; }; + + _regionSubscriptions.Add(RegionID.MireArea, new Mode() { WorldState = WorldState.Retro }); + + break; + case LocationID.MireCaveTakeAny: + + GetAccessibility = () => { return _game.Regions[RegionID.MireArea].Accessibility; }; + + _regionSubscriptions.Add(RegionID.MireArea, new Mode() { WorldState = WorldState.Retro }); + + break; + } + + _game.Mode.PropertyChanged += OnModeChanged; + + UpdateRegionSubscriptions(); + UpdateItemSubscriptions(); + UpdateAccessibility(); + } + + private void OnPropertyChanging(string propertyName) + { + PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName)); + } + + private void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + private void OnModeChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(_game.Mode.WorldState)) + { + UpdateRegionSubscriptions(); + UpdateItemSubscriptions(); + UpdateAccessibility(); + } + + if (e.PropertyName == nameof(_game.Mode.EntranceShuffle)) + UpdateAccessibility(); + } + + private void OnRequirementChanged(object sender, PropertyChangedEventArgs e) + { + UpdateAccessibility(); + } + + private void UpdateRegionSubscriptions() + { + foreach (RegionID region in _regionSubscriptions.Keys) + { + if (_game.Mode.Validate(_regionSubscriptions[region])) + { + if (_regionIsSubscribed.ContainsKey(region)) + { + if (!_regionIsSubscribed[region]) + { + _regionIsSubscribed[region] = true; + _game.Regions[region].PropertyChanged += OnRequirementChanged; + } + } + else + { + _regionIsSubscribed.Add(region, true); + _game.Regions[region].PropertyChanged += OnRequirementChanged; + } + } + else + { + if (_regionIsSubscribed.ContainsKey(region)) + { + if (_regionIsSubscribed[region]) + { + _regionIsSubscribed[region] = false; + _game.Regions[region].PropertyChanged -= OnRequirementChanged; + } + } + else + _regionIsSubscribed.Add(region, false); + } + } + } + + private void UpdateItemSubscriptions() + { + foreach (ItemType item in _itemSubscriptions.Keys) + { + if (_game.Mode.Validate(_itemSubscriptions[item])) + { + if (_itemIsSubscribed.ContainsKey(item)) + { + if (!_itemIsSubscribed[item]) + { + _itemIsSubscribed[item] = true; + _game.Items[item].PropertyChanged += OnRequirementChanged; + } + } + else + { + _itemIsSubscribed.Add(item, true); + _game.Items[item].PropertyChanged += OnRequirementChanged; + } + } + else + { + if (_itemIsSubscribed.ContainsKey(item)) + { + if (_itemIsSubscribed[item]) + { + _itemIsSubscribed[item] = false; + _game.Items[item].PropertyChanged -= OnRequirementChanged; + } + } + else + _itemIsSubscribed.Add(item, false); + } + } + } + + private void UpdateAccessibility() + { + if (_game.Mode.WorldState.Value == WorldState.Retro) + Accessibility = GetAccessibility(); + } + + public void Clear() + { + Available = 0; + } + + public bool IsAvailable() + { + return Available > 0; + } + + public void Reset() + { + Marking = null; + Available = 1; + } + } +} diff --git a/OpenTracker/ViewModels/MapLocationControlVM.cs b/OpenTracker/ViewModels/MapLocationControlVM.cs index 0b09dd38..679be8e2 100644 --- a/OpenTracker/ViewModels/MapLocationControlVM.cs +++ b/OpenTracker/ViewModels/MapLocationControlVM.cs @@ -35,6 +35,8 @@ public double Size else return 40.0; } + else if (_mapLocation.Location.Sections[0] is TakeAnySection) + return 40.0; else { if (_mapLocation.Location.Total > 1) @@ -68,8 +70,9 @@ public Thickness BorderSize { get { - if (_game.Mode.EntranceShuffle.HasValue && - _game.Mode.EntranceShuffle.Value) + if ((_game.Mode.EntranceShuffle.HasValue && + _game.Mode.EntranceShuffle.Value) || + _mapLocation.Location.Sections[0] is TakeAnySection) return new Thickness(5); else return new Thickness(9); @@ -258,6 +261,17 @@ public string Text } } + public CornerRadius CornerRadius + { + get + { + if (_mapLocation.Location.Sections[0] is TakeAnySection) + return new CornerRadius(40); + else + return new CornerRadius(0); + } + } + public MapLocationControlVM(UndoRedoManager undoRedoManager, AppSettings appSettings, Game game, MainWindowVM mainWindow, MapLocation mapLocation) { diff --git a/OpenTracker/ViewModels/ModeSettingsControlVM.cs b/OpenTracker/ViewModels/ModeSettingsControlVM.cs index 0a8d844f..f13a3cba 100644 --- a/OpenTracker/ViewModels/ModeSettingsControlVM.cs +++ b/OpenTracker/ViewModels/ModeSettingsControlVM.cs @@ -36,6 +36,8 @@ public class ModeSettingsControlVM : ViewModelBase _mode.WorldState == WorldState.StandardOpen; public bool InvertedWorldState => _mode.WorldState == WorldState.Inverted; + public bool RetroWorldState => + _mode.WorldState == WorldState.Retro; public bool EntranceShuffle => _mode.EntranceShuffle.Value; public bool BossShuffle => _mode.BossShuffle.Value; @@ -102,6 +104,7 @@ private void UpdateWorldState() { this.RaisePropertyChanged(nameof(StandardOpenRetroWorldState)); this.RaisePropertyChanged(nameof(InvertedWorldState)); + this.RaisePropertyChanged(nameof(RetroWorldState)); } private void SetItemPlacement(string itemPlacementString) diff --git a/OpenTracker/ViewModels/SectionControlVM.cs b/OpenTracker/ViewModels/SectionControlVM.cs index 2313b1c0..83b109b8 100644 --- a/OpenTracker/ViewModels/SectionControlVM.cs +++ b/OpenTracker/ViewModels/SectionControlVM.cs @@ -165,6 +165,7 @@ public string ImageSource { switch (_section) { + case TakeAnySection _: case ItemSection _: if (_section.IsAvailable()) @@ -541,6 +542,7 @@ public void OnRightClick() { case BossSection _: case EntranceSection _: + case TakeAnySection _: if (!_section.IsAvailable()) UncollectSection(); break; diff --git a/OpenTracker/Views/MapLocationControl.xaml b/OpenTracker/Views/MapLocationControl.xaml index 8a407dd9..03c6c849 100644 --- a/OpenTracker/Views/MapLocationControl.xaml +++ b/OpenTracker/Views/MapLocationControl.xaml @@ -15,8 +15,9 @@ PointerReleased="OnClick"> + Background="{Binding Path=Color, Mode=OneWay}" IsVisible="{Binding Path=BorderVisible}" + IsHitTestVisible="{Binding Path=BorderVisible}" BorderThickness="{Binding Path=BorderSize}" + CornerRadius="{Binding Path=CornerRadius}"> diff --git a/OpenTracker/Views/ModeSettingsControl.xaml b/OpenTracker/Views/ModeSettingsControl.xaml index 9f431e23..d74e6d3c 100644 --- a/OpenTracker/Views/ModeSettingsControl.xaml +++ b/OpenTracker/Views/ModeSettingsControl.xaml @@ -9,53 +9,57 @@ Mode=TwoWay}" StaysOpen="False" PlacementMode="Top" PlacementTarget="{Binding RelativeSource={RelativeSource AncestorType=Panel}}" HorizontalOffset="8" VerticalOffset="8"> - - - Basic - Advanced - - Standard - Maps/Compasses - Maps/Compasses/Small Keys - Keysanity - - Standard/Open/Retro - Inverted - - Retro + + Entrance Shuffle - Boss Shuffle - Enemy Shuffle