From 873b3a937c4e80c714334790ca2a0b594edd11a9 Mon Sep 17 00:00:00 2001 From: TrippSC2 Date: Thu, 26 Mar 2020 19:27:08 -0400 Subject: [PATCH] Implemented entrance location marking on the map. Renamed "Visible item" in code to "Marking" and separated the object from items. Incremented version from 0.2.2 to 0.3.0 for release. --- OpenTracker.Models/BossSection.cs | 2 + OpenTracker.Models/EntranceSection.cs | 15 + OpenTracker.Models/Enums/MarkingType.cs | 2 +- OpenTracker.Models/Interfaces/ISection.cs | 2 + OpenTracker.Models/ItemSection.cs | 50 +-- OpenTracker.Setup/OpenTracker.Setup.vdproj | 8 +- ...ontrolVM.cs => IMarkingSelectControlVM.cs} | 2 +- OpenTracker/Interfaces/ISectionControlVM.cs | 2 +- OpenTracker/OpenTracker.csproj | 15 +- .../ViewModels/MapLocationControlVM.cs | 151 +++++++- .../ViewModels/MarkingSelectControlVM.cs | 151 ++++++++ OpenTracker/ViewModels/SectionControlVM.cs | 347 ++++++++++-------- .../ViewModels/VisibleItemSelectControlVM.cs | 114 ------ OpenTracker/Views/MapLocationControl.xaml | 19 +- ...Control.xaml => MarkingSelectControl.xaml} | 4 +- ...l.xaml.cs => MarkingSelectControl.xaml.cs} | 6 +- OpenTracker/Views/SectionControl.xaml | 18 +- OpenTracker/Views/SectionControl.xaml.cs | 2 +- 18 files changed, 591 insertions(+), 319 deletions(-) rename OpenTracker/Interfaces/{IVisibleItemSelectControlVM.cs => IMarkingSelectControlVM.cs} (61%) create mode 100644 OpenTracker/ViewModels/MarkingSelectControlVM.cs delete mode 100644 OpenTracker/ViewModels/VisibleItemSelectControlVM.cs rename OpenTracker/Views/{VisibleItemSelectControl.xaml => MarkingSelectControl.xaml} (91%) rename OpenTracker/Views/{VisibleItemSelectControl.xaml.cs => MarkingSelectControl.xaml.cs} (72%) diff --git a/OpenTracker.Models/BossSection.cs b/OpenTracker.Models/BossSection.cs index 85302221..c29503ca 100644 --- a/OpenTracker.Models/BossSection.cs +++ b/OpenTracker.Models/BossSection.cs @@ -13,7 +13,9 @@ public class BossSection : ISection private readonly Region _region; public string Name { get => "Boss"; } + public bool HasMarking { get => false; } public Mode RequiredMode { get; } + public MarkingType? Marking { get => null; set { } } public Func GetAccessibility { get; } diff --git a/OpenTracker.Models/EntranceSection.cs b/OpenTracker.Models/EntranceSection.cs index 67c3803b..2504975a 100644 --- a/OpenTracker.Models/EntranceSection.cs +++ b/OpenTracker.Models/EntranceSection.cs @@ -15,6 +15,7 @@ public class EntranceSection : ISection private readonly Item _invertedItemProvided; public string Name { get; } + public bool HasMarking { get => true; } public Mode RequiredMode { get; } public Func GetAccessibility { get; } @@ -49,6 +50,20 @@ public bool Available } } + private MarkingType? _marking; + public MarkingType? Marking + { + get => _marking; + set + { + if (_marking != value) + { + _marking = value; + OnPropertyChanged(nameof(Marking)); + } + } + } + public EntranceSection(Game game, LocationID iD) { _game = game; diff --git a/OpenTracker.Models/Enums/MarkingType.cs b/OpenTracker.Models/Enums/MarkingType.cs index d6b5909b..6a281209 100644 --- a/OpenTracker.Models/Enums/MarkingType.cs +++ b/OpenTracker.Models/Enums/MarkingType.cs @@ -40,7 +40,7 @@ public enum MarkingType Net, Book, MoonPearl, - AT, + Aga, TRBack, Bottle, CaneOfSomaria, diff --git a/OpenTracker.Models/Interfaces/ISection.cs b/OpenTracker.Models/Interfaces/ISection.cs index e40947fd..aac354eb 100644 --- a/OpenTracker.Models/Interfaces/ISection.cs +++ b/OpenTracker.Models/Interfaces/ISection.cs @@ -6,6 +6,8 @@ namespace OpenTracker.Models.Interfaces public interface ISection : INotifyPropertyChanged { string Name { get; } + bool HasMarking { get; } + MarkingType? Marking { get; set; } AccessibilityLevel Accessibility { get; } Mode RequiredMode { get; } diff --git a/OpenTracker.Models/ItemSection.cs b/OpenTracker.Models/ItemSection.cs index 14fde8e1..e28a90d2 100644 --- a/OpenTracker.Models/ItemSection.cs +++ b/OpenTracker.Models/ItemSection.cs @@ -19,7 +19,7 @@ public class ItemSection : ISection public string Name { get; } public int Total { get; private set; } - public bool HasVisibleItem { get; } + public bool HasMarking { get; } public Mode RequiredMode { get; } public event PropertyChangedEventHandler PropertyChanged; @@ -52,16 +52,16 @@ public int Available } } - private Item _visibleItem; - public Item VisibleItem + private MarkingType? _marking; + public MarkingType? Marking { - get => _visibleItem; + get => _marking; set { - if (_visibleItem != value) + if (_marking != value) { - _visibleItem = value; - OnPropertyChanged(nameof(VisibleItem)); + _marking = value; + OnPropertyChanged(nameof(Marking)); } } } @@ -83,7 +83,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Pedestal"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -115,7 +115,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Cave"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -350,7 +350,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Take This Trash"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -395,7 +395,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "On The Shelf"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -424,7 +424,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Shroom"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -638,7 +638,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Tablet"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.DarkWorldSouth]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -828,7 +828,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Ledge"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -1029,7 +1029,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Ledge"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -1358,7 +1358,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Island"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.LightWorld]; @@ -1529,7 +1529,7 @@ public ItemSection(Game game, Location location, int index = 0) Name = "Up On Top"; _standardRegion = _game.Regions[RegionID.DeathMountainWestBottom]; _invertedRegion = _game.Regions[RegionID.DeathMountainWestTop]; - HasVisibleItem = true; + HasMarking = true; GetAccessibility = () => { @@ -1552,7 +1552,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Tablet"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.DeathMountainWestTop]; _invertedRegion = _game.Regions[RegionID.DeathMountainWestTop]; @@ -1798,7 +1798,7 @@ public ItemSection(Game game, Location location, int index = 0) _baseTotal = 1; Name = "Island"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.LightWorld]; _invertedRegion = _game.Regions[RegionID.DarkWorldSouth]; @@ -1971,7 +1971,7 @@ public ItemSection(Game game, Location location, int index = 0) _bigKey = 1; _baseTotal = 2; Name = "Dungeon"; - HasVisibleItem = true; + HasMarking = true; _standardRegion = _game.Regions[RegionID.DesertPalace]; _invertedRegion = _game.Regions[RegionID.DesertPalace]; @@ -2396,10 +2396,14 @@ public void Clear() { Available = 0; - if (VisibleItem != null) + if (Marking != null) { - VisibleItem.Current = Math.Min(VisibleItem.Maximum, VisibleItem.Current + 1); - VisibleItem = null; + if (Enum.TryParse(Marking.ToString(), out ItemType itemType)) + { + Item item = _game.Items[itemType]; + item.Current = Math.Max(item.Maximum, item.Current + 1); + Marking = null; + } } } diff --git a/OpenTracker.Setup/OpenTracker.Setup.vdproj b/OpenTracker.Setup/OpenTracker.Setup.vdproj index f605c2cb..7704c21b 100644 --- a/OpenTracker.Setup/OpenTracker.Setup.vdproj +++ b/OpenTracker.Setup/OpenTracker.Setup.vdproj @@ -189,15 +189,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:OpenTracker" - "ProductCode" = "8:{FC8917F1-E0AA-4117-B09F-2CF112CEFE8B}" - "PackageCode" = "8:{AE764F26-F917-4437-A62C-D83ADC2D322B}" + "ProductCode" = "8:{A352DD4B-A96F-41D1-9AE8-8345B5BA6DD5}" + "PackageCode" = "8:{C6E5C997-E931-4488-8D94-4B76F0C6B7BB}" "UpgradeCode" = "8:{C98C2121-B4C5-473A-9B86-5407FEFFE8F1}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:0.2.2" + "ProductVersion" = "8:0.3.0" "Manufacturer" = "8:OpenTracker" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" @@ -739,7 +739,7 @@ { "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_582274CEB8A7425789CE7B6B45EFE16C" { - "SourcePath" = "8:..\\OpenTracker\\obj\\Release\\netcoreapp3.1\\OpenTracker.exe" + "SourcePath" = "8:..\\OpenTracker\\obj\\Debug\\netcoreapp3.1\\OpenTracker.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_B21EA2C01C014AC99A33B72F50C26B5D" diff --git a/OpenTracker/Interfaces/IVisibleItemSelectControlVM.cs b/OpenTracker/Interfaces/IMarkingSelectControlVM.cs similarity index 61% rename from OpenTracker/Interfaces/IVisibleItemSelectControlVM.cs rename to OpenTracker/Interfaces/IMarkingSelectControlVM.cs index b54019d4..95f62f0c 100644 --- a/OpenTracker/Interfaces/IVisibleItemSelectControlVM.cs +++ b/OpenTracker/Interfaces/IMarkingSelectControlVM.cs @@ -1,6 +1,6 @@ namespace OpenTracker.Interfaces { - public interface IVisibleItemSelectControlVM + public interface IMarkingSelectControlVM { void SelectItem(); } diff --git a/OpenTracker/Interfaces/ISectionControlVM.cs b/OpenTracker/Interfaces/ISectionControlVM.cs index 07f09afe..7f7ab5c2 100644 --- a/OpenTracker/Interfaces/ISectionControlVM.cs +++ b/OpenTracker/Interfaces/ISectionControlVM.cs @@ -2,7 +2,7 @@ { public interface ISectionControlVM { - void OpenVisibleItemSelect(); + void OpenMarkingSelect(); void ChangeAvailable(bool rightClick = false); } } diff --git a/OpenTracker/OpenTracker.csproj b/OpenTracker/OpenTracker.csproj index e04a7a03..40c6f7eb 100644 --- a/OpenTracker/OpenTracker.csproj +++ b/OpenTracker/OpenTracker.csproj @@ -4,10 +4,10 @@ netcoreapp3.1 triforce.ico - 0.2.2 + 0.3.0 Tripp - 0.2.2.0 - 0.2.2.0 + 0.3.0.0 + 0.2.0.0 @@ -24,7 +24,7 @@ - + @@ -33,9 +33,9 @@ + - @@ -70,7 +70,7 @@ - + MSBuild:Compile @@ -107,6 +107,9 @@ DungeonItemControl.xaml + + MarkingSelectControl.xaml + diff --git a/OpenTracker/ViewModels/MapLocationControlVM.cs b/OpenTracker/ViewModels/MapLocationControlVM.cs index 7f732bac..136241c4 100644 --- a/OpenTracker/ViewModels/MapLocationControlVM.cs +++ b/OpenTracker/ViewModels/MapLocationControlVM.cs @@ -64,7 +64,28 @@ public IBrush Color public bool Visible { get => _visible; - set => this.RaiseAndSetIfChanged(ref _visible, value); + private set => this.RaiseAndSetIfChanged(ref _visible, value); + } + + private bool _imageVisible; + public bool ImageVisible + { + get => _imageVisible; + private set => this.RaiseAndSetIfChanged(ref _imageVisible, value); + } + + private bool _borderVisible; + public bool BorderVisible + { + get => _borderVisible; + set => this.RaiseAndSetIfChanged(ref _borderVisible, value); + } + + private string _imageSource; + public string ImageSource + { + get => _imageSource; + private set => this.RaiseAndSetIfChanged(ref _imageSource, value); } public MapLocationControlVM(AppSettingsVM appSettings, Game game, @@ -86,6 +107,7 @@ public MapLocationControlVM(AppSettingsVM appSettings, Game game, SetSizeAndPosition(); SetColor(); SetVisibility(); + SetImageSource(); } private void CheckLocationAvailability() @@ -121,7 +143,12 @@ private void SetSizeAndPosition() if (_game.Mode.EntranceShuffle.HasValue && _game.Mode.EntranceShuffle.Value) { - Size = 40.0; + if (_mapLocation.Location.Sections[0] is EntranceSection entranceSection && + entranceSection.Marking != null) + Size = 55.0; + else + Size = 40.0; + BorderSize = new Thickness(5); } else @@ -139,11 +166,123 @@ private void SetColor() Color = _appSettings.AccessibilityColors[_mapLocation.Location.GetAccessibility(_game.Mode, _game.Items)]; } + private void SetImageSource() + { + if (_mapLocation.Location.Sections[0] is EntranceSection entranceSection) + { + if (entranceSection.Marking == null) + ImageSource = "avares://OpenTracker/Assets/Images/Items/visible-empty.png"; + else + { + int itemNumber = 0; + switch (entranceSection.Marking) + { + case MarkingType.Bow: + case MarkingType.SilverArrows: + case MarkingType.Boomerang: + case MarkingType.RedBoomerang: + case MarkingType.SmallKey: + case MarkingType.BigKey: + ImageSource = "avares://OpenTracker/Assets/Images/Items/visible-" + + entranceSection.Marking.ToString().ToLower() + ".png"; + break; + case MarkingType.Hookshot: + case MarkingType.Bomb: + case MarkingType.Powder: + case MarkingType.FireRod: + case MarkingType.IceRod: + case MarkingType.Shovel: + case MarkingType.Lamp: + case MarkingType.Hammer: + case MarkingType.Flute: + case MarkingType.Net: + case MarkingType.Book: + case MarkingType.MoonPearl: + case MarkingType.Bottle: + case MarkingType.CaneOfSomaria: + case MarkingType.CaneOfByrna: + case MarkingType.Cape: + case MarkingType.Mirror: + case MarkingType.Gloves: + case MarkingType.Boots: + case MarkingType.Flippers: + case MarkingType.HalfMagic: + case MarkingType.Sword: + case MarkingType.Shield: + case MarkingType.Mail: + case MarkingType.Aga: + Item item = _game.Items[Enum.Parse(entranceSection.Marking.ToString())]; + itemNumber = Math.Min(item.Current + 1, item.Maximum); + ImageSource = "avares://OpenTracker/Assets/Images/Items/" + + entranceSection.Marking.ToString().ToLower() + itemNumber.ToString() + ".png"; + break; + case MarkingType.Mushroom: + ImageSource = "avares://OpenTracker/Assets/Images/Items/mushroom1.png"; + break; + case MarkingType.Bombos: + case MarkingType.Ether: + case MarkingType.Quake: + Item medallionDungeons = _game.Items[Enum.Parse(entranceSection.Marking.ToString()) + 1]; + itemNumber = 1 + (medallionDungeons.Current * 2); + ImageSource = "avares://OpenTracker/Assets/Images/Items/" + + entranceSection.Marking.ToString().ToLower() + itemNumber.ToString() + ".png"; + break; + case MarkingType.HCFront: + case MarkingType.HCLeft: + case MarkingType.HCRight: + case MarkingType.EP: + case MarkingType.SP: + case MarkingType.SW: + case MarkingType.DPFront: + case MarkingType.DPLeft: + case MarkingType.DPRight: + case MarkingType.DPBack: + case MarkingType.TT: + case MarkingType.IP: + case MarkingType.MM: + case MarkingType.TRFront: + case MarkingType.TRLeft: + case MarkingType.TRRight: + case MarkingType.TRBack: + case MarkingType.GT: + ImageSource = "avares://OpenTracker/Assets/Images/" + + entranceSection.Marking.ToString().ToLower() + ".png"; + break; + case MarkingType.ToH: + ImageSource = "avares://OpenTracker/Assets/Images/th.png"; + break; + case MarkingType.PoD: + ImageSource = "avares://OpenTracker/Assets/Images/pd.png"; + break; + case MarkingType.Ganon: + ImageSource = "avares://OpenTracker/Assets/Images/ganon.png"; + break; + } + } + } + } + private void SetVisibility() { - Visible = _game.Mode.Validate(_mapLocation.VisibilityMode) && (_appSettings.DisplayAllLocations || - (_mapLocation.Location.GetAccessibility(_game.Mode, _game.Items) != AccessibilityLevel.Cleared && - _mapLocation.Location.GetAccessibility(_game.Mode, _game.Items) != AccessibilityLevel.None)); + if (_game.Mode.Validate(_mapLocation.VisibilityMode)) + { + if (_mapLocation.Location.Sections[0] is EntranceSection entranceSection && + entranceSection.Marking != null) + ImageVisible = true; + else + ImageVisible = false; + + BorderVisible = !ImageVisible && (_appSettings.DisplayAllLocations || + (_mapLocation.Location.GetAccessibility(_game.Mode, _game.Items) != AccessibilityLevel.Cleared && + _mapLocation.Location.GetAccessibility(_game.Mode, _game.Items) != AccessibilityLevel.None)); + } + else + { + ImageVisible = false; + BorderVisible = false; + } + + Visible = ImageVisible || BorderVisible; } public void ClearAvailableSections() @@ -196,9 +335,11 @@ private void OnItemRequirementChanged(object sender, EventArgs e) private void OnSectionChanged(object sender, PropertyChangedEventArgs e) { + SetSizeAndPosition(); CheckLocationAvailability(); SetColor(); SetVisibility(); + SetImageSource(); } } } diff --git a/OpenTracker/ViewModels/MarkingSelectControlVM.cs b/OpenTracker/ViewModels/MarkingSelectControlVM.cs new file mode 100644 index 00000000..76146b74 --- /dev/null +++ b/OpenTracker/ViewModels/MarkingSelectControlVM.cs @@ -0,0 +1,151 @@ +using OpenTracker.Interfaces; +using OpenTracker.Models; +using OpenTracker.Models.Enums; +using ReactiveUI; +using System; +using System.ComponentModel; + +namespace OpenTracker.ViewModels +{ + public class MarkingSelectControlVM : ViewModelBase, IMarkingSelectControlVM + { + private readonly Game _game; + private readonly SectionControlVM _section; + private readonly MarkingType? _marking; + + private string _imageSource; + public string ImageSource + { + get => _imageSource; + set => this.RaiseAndSetIfChanged(ref _imageSource, value); + } + + public MarkingSelectControlVM(Game game, SectionControlVM section, MarkingType? marking) + { + _game = game; + _section = section; + _marking = marking; + + if (_marking != null) + { + if (Enum.TryParse(_marking.ToString(), out ItemType itemType)) + { + _game.Items[itemType].PropertyChanged += OnItemChanged; + + switch (itemType) + { + case ItemType.Bombos: + case ItemType.Ether: + case ItemType.Quake: + _game.Items[itemType + 1].PropertyChanged += OnItemChanged; + break; + } + } + + Update(); + } + } + + private void OnItemChanged(object sender, PropertyChangedEventArgs e) + { + Update(); + } + + public void Update() + { + int itemNumber = 0; + if (_marking != null) + { + switch (_marking) + { + case MarkingType.Bow: + case MarkingType.SilverArrows: + case MarkingType.Boomerang: + case MarkingType.RedBoomerang: + case MarkingType.SmallKey: + case MarkingType.BigKey: + ImageSource = "avares://OpenTracker/Assets/Images/Items/visible-" + + _marking.ToString().ToLower() + ".png"; + break; + case MarkingType.Hookshot: + case MarkingType.Bomb: + case MarkingType.FireRod: + case MarkingType.IceRod: + case MarkingType.Shovel: + case MarkingType.Powder: + case MarkingType.Lamp: + case MarkingType.Hammer: + case MarkingType.Flute: + case MarkingType.Net: + case MarkingType.Book: + case MarkingType.MoonPearl: + case MarkingType.Bottle: + case MarkingType.CaneOfSomaria: + case MarkingType.CaneOfByrna: + case MarkingType.Cape: + case MarkingType.Mirror: + case MarkingType.Gloves: + case MarkingType.Boots: + case MarkingType.Flippers: + case MarkingType.HalfMagic: + case MarkingType.Sword: + case MarkingType.Shield: + case MarkingType.Mail: + case MarkingType.Aga: + Item item = _game.Items[Enum.Parse(_marking.ToString())]; + itemNumber = Math.Min(item.Current + 1, item.Maximum); + ImageSource = "avares://OpenTracker/Assets/Images/Items/" + + _marking.ToString().ToLower() + itemNumber.ToString() + ".png"; + break; + case MarkingType.Mushroom: + ImageSource = "avares://OpenTracker/Assets/Images/Items/mushroom1.png"; + break; + case MarkingType.Bombos: + case MarkingType.Ether: + case MarkingType.Quake: + Item medallionDungeons = _game.Items[Enum.Parse(_marking.ToString()) + 1]; + itemNumber = 1 + (medallionDungeons.Current * 2); + ImageSource = "avares://OpenTracker/Assets/Images/Items/" + + _marking.ToString().ToLower() + itemNumber.ToString() + ".png"; + break; + case MarkingType.HCFront: + case MarkingType.HCLeft: + case MarkingType.HCRight: + case MarkingType.EP: + case MarkingType.SP: + case MarkingType.SW: + case MarkingType.DPFront: + case MarkingType.DPLeft: + case MarkingType.DPRight: + case MarkingType.DPBack: + case MarkingType.TT: + case MarkingType.IP: + case MarkingType.MM: + case MarkingType.TRFront: + case MarkingType.TRLeft: + case MarkingType.TRRight: + case MarkingType.TRBack: + case MarkingType.GT: + ImageSource = "avares://OpenTracker/Assets/Images/" + + _marking.ToString().ToLower() + ".png"; + break; + case MarkingType.ToH: + ImageSource = "avares://OpenTracker/Assets/Images/th.png"; + break; + case MarkingType.PoD: + ImageSource = "avares://OpenTracker/Assets/Images/pd.png"; + break; + case MarkingType.Ganon: + ImageSource = "avares://OpenTracker/Assets/Images/ganon.png"; + break; + } + } + } + + public void SelectItem() + { + if (_marking != null) + _section.ChangeMarking(_marking); + } + } +} diff --git a/OpenTracker/ViewModels/SectionControlVM.cs b/OpenTracker/ViewModels/SectionControlVM.cs index 6b0001c1..7aa92e80 100644 --- a/OpenTracker/ViewModels/SectionControlVM.cs +++ b/OpenTracker/ViewModels/SectionControlVM.cs @@ -20,7 +20,9 @@ public class SectionControlVM : ViewModelBase, ISectionControlVM public string Name { get => _section.Name; } public bool VisibleItem { get; } public bool NumberBoxVisible { get; } - public ObservableCollection ItemSelect { get; } + public double MarkingPopupHeight { get; } + public double MarkingPopupWidth { get; } + public ObservableCollection ItemSelect { get; } private bool _sectionVisible; public bool SectionVisible @@ -57,11 +59,11 @@ public string NumberString set => this.RaiseAndSetIfChanged(ref _numberString, value); } - private bool _visibleItemPopupOpen; - public bool VisibleItemPopupOpen + private bool _markingPopupOpen; + public bool MarkingPopupOpen { - get => _visibleItemPopupOpen; - set => this.RaiseAndSetIfChanged(ref _visibleItemPopupOpen, value); + get => _markingPopupOpen; + set => this.RaiseAndSetIfChanged(ref _markingPopupOpen, value); } private bool _bossImageVisible; @@ -82,80 +84,100 @@ public string BossImageSource public SectionControlVM(AppSettingsVM appSettings, Game game, ISection section) { - ClearVisibleItemCommand = ReactiveCommand.Create(ClearVisibleItem); + ClearVisibleItemCommand = ReactiveCommand.Create(ClearMarking); _appSettings = appSettings; _game = game; _section = section; - ItemSelect = new ObservableCollection(); + ItemSelect = new ObservableCollection(); - for (int i = 0; i < Enum.GetValues(typeof(ItemType)).Length; i++) + if (_section.HasMarking) { - switch ((ItemType)i) + VisibleItem = true; + + if (_section is ItemSection) { - case ItemType.Bow: - case ItemType.SilverArrows: - case ItemType.Boomerang: - case ItemType.RedBoomerang: - case ItemType.Hookshot: - case ItemType.Powder: - case ItemType.Mushroom: - case ItemType.FireRod: - case ItemType.IceRod: - case ItemType.Bombos: - case ItemType.Ether: - case ItemType.Quake: - case ItemType.Lamp: - case ItemType.Hammer: - case ItemType.Flute: - case ItemType.Net: - case ItemType.Book: - case ItemType.Bottle: - case ItemType.CaneOfSomaria: - case ItemType.CaneOfByrna: - case ItemType.Cape: - case ItemType.Gloves: - case ItemType.Boots: - case ItemType.Flippers: - case ItemType.HalfMagic: - case ItemType.Sword: - case ItemType.Shield: - case ItemType.Mail: - ItemSelect.Add(new VisibleItemSelectControlVM(_game, this, _game.Items[(ItemType)i])); - break; - case ItemType.Shovel: - case ItemType.MoonPearl: - ItemSelect.Add(new VisibleItemSelectControlVM(_game, this, _game.Items[(ItemType)i])); - ItemSelect.Add(new VisibleItemSelectControlVM(_game, this, null)); - break; - case ItemType.Mirror: - ItemSelect.Add(new VisibleItemSelectControlVM(_game, this, _game.Items[(ItemType)i])); - ItemSelect.Add(new VisibleItemSelectControlVM(_game, this, _game.Items[ItemType.SmallKey])); - ItemSelect.Add(new VisibleItemSelectControlVM(_game, this, _game.Items[ItemType.BigKey])); - break; - default: - break; + for (int i = 0; i < Enum.GetValues(typeof(MarkingType)).Length; i++) + { + switch ((MarkingType)i) + { + case MarkingType.Bow: + case MarkingType.SilverArrows: + case MarkingType.Boomerang: + case MarkingType.RedBoomerang: + case MarkingType.Hookshot: + case MarkingType.Bomb: + case MarkingType.Mushroom: + case MarkingType.FireRod: + case MarkingType.IceRod: + case MarkingType.Bombos: + case MarkingType.Ether: + case MarkingType.Quake: + case MarkingType.Shovel: + case MarkingType.Powder: + case MarkingType.Lamp: + case MarkingType.Hammer: + case MarkingType.Flute: + case MarkingType.Net: + case MarkingType.Book: + case MarkingType.Bottle: + case MarkingType.CaneOfSomaria: + case MarkingType.CaneOfByrna: + case MarkingType.Cape: + case MarkingType.Gloves: + case MarkingType.Boots: + case MarkingType.Flippers: + case MarkingType.HalfMagic: + case MarkingType.Sword: + case MarkingType.Shield: + case MarkingType.Mail: + ItemSelect.Add(new MarkingSelectControlVM(_game, this, (MarkingType)i)); + break; + case MarkingType.MoonPearl: + ItemSelect.Add(new MarkingSelectControlVM(_game, this, (MarkingType)i)); + ItemSelect.Add(new MarkingSelectControlVM(_game, this, null)); + break; + case MarkingType.Mirror: + ItemSelect.Add(new MarkingSelectControlVM(_game, this, (MarkingType)i)); + ItemSelect.Add(new MarkingSelectControlVM(_game, this, MarkingType.SmallKey)); + ItemSelect.Add(new MarkingSelectControlVM(_game, this, MarkingType.BigKey)); + break; + default: + break; + } + } + } + + if (_section is EntranceSection) + { + for (int i = 0; i < Enum.GetValues(typeof(MarkingType)).Length; i++) + ItemSelect.Add(new MarkingSelectControlVM(_game, this, (MarkingType)i)); } } if (_section is ItemSection itemSection) { - if (itemSection.HasVisibleItem) - VisibleItem = true; - + MarkingPopupHeight = 200; + MarkingPopupWidth = 238; NumberBoxVisible = true; } + if (_section is EntranceSection) + { + MarkingPopupHeight = 280; + MarkingPopupWidth = 272; + } + _game.Mode.PropertyChanged += OnModeChanged; _section.PropertyChanged += OnSectionChanged; Update(); } - private void ClearVisibleItem() + private void ClearMarking() { - ((ItemSection)_section).VisibleItem = null; - VisibleItemPopupOpen = false; + _section.Marking = null; + MarkingPopupOpen = false; } private void OnModeChanged(object sender, PropertyChangedEventArgs e) @@ -182,6 +204,97 @@ private void Update() else FontColor = _appSettings.AccessibilityColors[accessibility]; + if (_section.Marking == null) + ItemImageSource = "avares://OpenTracker/Assets/Images/Items/visible-empty.png"; + else + { + int itemNumber = 0; + switch (_section.Marking) + { + case MarkingType.Bow: + case MarkingType.SilverArrows: + case MarkingType.Boomerang: + case MarkingType.RedBoomerang: + case MarkingType.SmallKey: + case MarkingType.BigKey: + ItemImageSource = "avares://OpenTracker/Assets/Images/Items/visible-" + + _section.Marking.ToString().ToLower() + ".png"; + break; + case MarkingType.Hookshot: + case MarkingType.Bomb: + case MarkingType.Powder: + case MarkingType.FireRod: + case MarkingType.IceRod: + case MarkingType.Shovel: + case MarkingType.Lamp: + case MarkingType.Hammer: + case MarkingType.Flute: + case MarkingType.Net: + case MarkingType.Book: + case MarkingType.MoonPearl: + case MarkingType.Bottle: + case MarkingType.CaneOfSomaria: + case MarkingType.CaneOfByrna: + case MarkingType.Cape: + case MarkingType.Mirror: + case MarkingType.Gloves: + case MarkingType.Boots: + case MarkingType.Flippers: + case MarkingType.HalfMagic: + case MarkingType.Sword: + case MarkingType.Shield: + case MarkingType.Mail: + case MarkingType.Aga: + Item item = _game.Items[Enum.Parse(_section.Marking.ToString())]; + itemNumber = Math.Min(item.Current + 1, item.Maximum); + ItemImageSource = "avares://OpenTracker/Assets/Images/Items/" + + _section.Marking.ToString().ToLower() + itemNumber.ToString() + ".png"; + break; + case MarkingType.Mushroom: + ItemImageSource = "avares://OpenTracker/Assets/Images/Items/mushroom1.png"; + break; + case MarkingType.Bombos: + case MarkingType.Ether: + case MarkingType.Quake: + Item medallionDungeons = _game.Items[Enum.Parse(_section.Marking.ToString()) + 1]; + itemNumber = 1 + (medallionDungeons.Current * 2); + ItemImageSource = "avares://OpenTracker/Assets/Images/Items/" + + _section.Marking.ToString().ToLower() + itemNumber.ToString() + ".png"; + break; + case MarkingType.HCFront: + case MarkingType.HCLeft: + case MarkingType.HCRight: + case MarkingType.EP: + case MarkingType.SP: + case MarkingType.SW: + case MarkingType.DPFront: + case MarkingType.DPLeft: + case MarkingType.DPRight: + case MarkingType.DPBack: + case MarkingType.TT: + case MarkingType.IP: + case MarkingType.MM: + case MarkingType.TRFront: + case MarkingType.TRLeft: + case MarkingType.TRRight: + case MarkingType.TRBack: + case MarkingType.GT: + ItemImageSource = "avares://OpenTracker/Assets/Images/" + + _section.Marking.ToString().ToLower() + ".png"; + break; + case MarkingType.ToH: + ItemImageSource = "avares://OpenTracker/Assets/Images/th.png"; + break; + case MarkingType.PoD: + ItemImageSource = "avares://OpenTracker/Assets/Images/pd.png"; + break; + case MarkingType.Ganon: + ItemImageSource = "avares://OpenTracker/Assets/Images/ganon.png"; + break; + } + } + + switch (_section) { case ItemSection itemSection: @@ -206,65 +319,6 @@ private void Update() if (!_section.IsAvailable()) ImageSource = "avares://OpenTracker/Assets/Images/chest2.png"; - if (itemSection.HasVisibleItem) - { - if (itemSection.VisibleItem == null) - ItemImageSource = "avares://OpenTracker/Assets/Images/Items/visible-empty.png"; - else - { - int itemNumber = 0; - switch (itemSection.VisibleItem.Type) - { - case ItemType.Bow: - case ItemType.SilverArrows: - case ItemType.Boomerang: - case ItemType.RedBoomerang: - case ItemType.SmallKey: - case ItemType.BigKey: - ItemImageSource = "avares://OpenTracker/Assets/Images/Items/visible-" + - itemSection.VisibleItem.Type.ToString().ToLower() + ".png"; - break; - case ItemType.Hookshot: - case ItemType.Powder: - case ItemType.FireRod: - case ItemType.IceRod: - case ItemType.Shovel: - case ItemType.Lamp: - case ItemType.Hammer: - case ItemType.Flute: - case ItemType.Net: - case ItemType.Book: - case ItemType.MoonPearl: - case ItemType.Bottle: - case ItemType.CaneOfSomaria: - case ItemType.CaneOfByrna: - case ItemType.Cape: - case ItemType.Mirror: - case ItemType.Gloves: - case ItemType.Boots: - case ItemType.Flippers: - case ItemType.HalfMagic: - case ItemType.Sword: - case ItemType.Shield: - case ItemType.Mail: - itemNumber = Math.Min(itemSection.VisibleItem.Current + 1, itemSection.VisibleItem.Maximum); - ItemImageSource = "avares://OpenTracker/Assets/Images/Items/" + - itemSection.VisibleItem.Type.ToString().ToLower() + itemNumber.ToString() + ".png"; - break; - case ItemType.Mushroom: - ItemImageSource = "avares://OpenTracker/Assets/Images/Items/mushroom1.png"; - break; - case ItemType.Bombos: - case ItemType.Ether: - case ItemType.Quake: - itemNumber = 1 + (_game.Items[itemSection.VisibleItem.Type + 1].Current * 2); - ItemImageSource = "avares://OpenTracker/Assets/Images/Items/" + - itemSection.VisibleItem.Type.ToString().ToLower() + itemNumber.ToString() + ".png"; - break; - } - } - } - NumberString = itemSection.Available.ToString(); break; @@ -313,47 +367,50 @@ private void Update() } } - public void ChangeVisibleItem(Item item) + public void ChangeMarking(MarkingType? marking) { - if (item != null) + if (marking != null) { - ItemSection itemSection = (ItemSection)_section; + if (_section.Marking != null) + { + if (Enum.TryParse(_section.Marking.ToString(), out ItemType currentItemType)) + { + _game.Items[currentItemType].PropertyChanged -= OnVisibleItemChanged; - if (itemSection.VisibleItem != null) + switch (currentItemType) + { + case ItemType.Bombos: + case ItemType.Ether: + case ItemType.Quake: + _game.Items[currentItemType + 1].PropertyChanged -= OnVisibleItemChanged; + break; + } + } + } + + _section.Marking = marking; + + if (Enum.TryParse(_section.Marking.ToString(), out ItemType newItemType)) { - itemSection.VisibleItem.PropertyChanged -= OnVisibleItemChanged; + _game.Items[newItemType].PropertyChanged += OnVisibleItemChanged; - switch (itemSection.VisibleItem.Type) + switch (newItemType) { case ItemType.Bombos: case ItemType.Ether: case ItemType.Quake: - _game.Items[itemSection.VisibleItem.Type + 1].PropertyChanged -= OnVisibleItemChanged; + _game.Items[newItemType + 1].PropertyChanged += OnVisibleItemChanged; break; } - } - itemSection.VisibleItem = item; - - item.PropertyChanged += OnVisibleItemChanged; - - switch (item.Type) - { - case ItemType.Bombos: - case ItemType.Ether: - case ItemType.Quake: - _game.Items[item.Type + 1].PropertyChanged += OnVisibleItemChanged; - break; - } - - VisibleItemPopupOpen = false; + MarkingPopupOpen = false; } } - public void OpenVisibleItemSelect() + public void OpenMarkingSelect() { - VisibleItemPopupOpen = true; + MarkingPopupOpen = true; } public void ChangeAvailable(bool rightClick = false) @@ -367,10 +424,14 @@ public void ChangeAvailable(bool rightClick = false) itemSection.Available = Math.Max(0, Math.Min(itemSection.Total, itemSection.Available + (rightClick ? 1 : -1))); - if (itemSection.VisibleItem != null && itemSection.Available == 0) + if (itemSection.Marking != null && itemSection.Available == 0) { - itemSection.VisibleItem.Current = Math.Min(itemSection.VisibleItem.Current + 1, itemSection.VisibleItem.Maximum); - itemSection.VisibleItem = null; + if (Enum.TryParse(itemSection.Marking.ToString(), out ItemType itemType)) + { + Item item = _game.Items[itemType]; + item.Current = Math.Min(item.Current + 1, item.Maximum); + itemSection.Marking = null; + } } break; diff --git a/OpenTracker/ViewModels/VisibleItemSelectControlVM.cs b/OpenTracker/ViewModels/VisibleItemSelectControlVM.cs deleted file mode 100644 index 77dd449d..00000000 --- a/OpenTracker/ViewModels/VisibleItemSelectControlVM.cs +++ /dev/null @@ -1,114 +0,0 @@ -using OpenTracker.Interfaces; -using OpenTracker.Models; -using OpenTracker.Models.Enums; -using ReactiveUI; -using System; -using System.ComponentModel; - -namespace OpenTracker.ViewModels -{ - public class VisibleItemSelectControlVM : ViewModelBase, IVisibleItemSelectControlVM - { - private readonly Game _game; - private readonly SectionControlVM _section; - private readonly Item _item; - - private string _imageSource; - public string ImageSource - { - get => _imageSource; - set => this.RaiseAndSetIfChanged(ref _imageSource, value); - } - - public VisibleItemSelectControlVM(Game game, SectionControlVM section, Item item) - { - _game = game; - _section = section; - _item = item; - - if (_item != null) - { - _item.PropertyChanged += OnItemChanged; - - switch (_item.Type) - { - case ItemType.Bombos: - case ItemType.Ether: - case ItemType.Quake: - _game.Items[_item.Type + 1].PropertyChanged += OnItemChanged; - break; - } - - Update(); - } - } - - private void OnItemChanged(object sender, PropertyChangedEventArgs e) - { - Update(); - } - - public void Update() - { - int itemNumber = 0; - if (_item != null) - { - switch (_item.Type) - { - case ItemType.Bow: - case ItemType.SilverArrows: - case ItemType.Boomerang: - case ItemType.RedBoomerang: - case ItemType.SmallKey: - case ItemType.BigKey: - ImageSource = "avares://OpenTracker/Assets/Images/Items/visible-" + - _item.Type.ToString().ToLower() + ".png"; - break; - case ItemType.Hookshot: - case ItemType.Powder: - case ItemType.FireRod: - case ItemType.IceRod: - case ItemType.Shovel: - case ItemType.Lamp: - case ItemType.Hammer: - case ItemType.Flute: - case ItemType.Net: - case ItemType.Book: - case ItemType.MoonPearl: - case ItemType.Bottle: - case ItemType.CaneOfSomaria: - case ItemType.CaneOfByrna: - case ItemType.Cape: - case ItemType.Mirror: - case ItemType.Gloves: - case ItemType.Boots: - case ItemType.Flippers: - case ItemType.HalfMagic: - case ItemType.Sword: - case ItemType.Shield: - case ItemType.Mail: - itemNumber = Math.Min(_item.Current + 1, _item.Maximum); - ImageSource = "avares://OpenTracker/Assets/Images/Items/" + - _item.Type.ToString().ToLower() + itemNumber.ToString() + ".png"; - break; - case ItemType.Mushroom: - ImageSource = "avares://OpenTracker/Assets/Images/Items/mushroom1.png"; - break; - case ItemType.Bombos: - case ItemType.Ether: - case ItemType.Quake: - itemNumber = 1 + (_game.Items[_item.Type + 1].Current * 2); - ImageSource = "avares://OpenTracker/Assets/Images/Items/" + - _item.Type.ToString().ToLower() + itemNumber.ToString() + ".png"; - break; - } - } - } - - public void SelectItem() - { - if (_item != null) - _section.ChangeVisibleItem(_item); - } - } -} diff --git a/OpenTracker/Views/MapLocationControl.xaml b/OpenTracker/Views/MapLocationControl.xaml index a3059397..1b977f95 100644 --- a/OpenTracker/Views/MapLocationControl.xaml +++ b/OpenTracker/Views/MapLocationControl.xaml @@ -2,12 +2,23 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:vc="clr-namespace:OpenTracker.ValueConverters;assembly=OpenTracker" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="OpenTracker.Views.MapLocationControl"> - + + + + + + + + diff --git a/OpenTracker/Views/VisibleItemSelectControl.xaml b/OpenTracker/Views/MarkingSelectControl.xaml similarity index 91% rename from OpenTracker/Views/VisibleItemSelectControl.xaml rename to OpenTracker/Views/MarkingSelectControl.xaml index 9fb1669f..7ca2685b 100644 --- a/OpenTracker/Views/VisibleItemSelectControl.xaml +++ b/OpenTracker/Views/MarkingSelectControl.xaml @@ -4,12 +4,10 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vc="clr-namespace:OpenTracker.ValueConverters;assembly=OpenTracker" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="OpenTracker.Views.VisibleItemSelectControl"> + x:Class="OpenTracker.Views.MarkingSelectControl"> - - DataContext as IVisibleItemSelectControlVM; - public VisibleItemSelectControl() + private IMarkingSelectControlVM _viewModel => DataContext as IMarkingSelectControlVM; + public MarkingSelectControl() { this.InitializeComponent(); } diff --git a/OpenTracker/Views/SectionControl.xaml b/OpenTracker/Views/SectionControl.xaml index 7182219d..3f50f2bb 100644 --- a/OpenTracker/Views/SectionControl.xaml +++ b/OpenTracker/Views/SectionControl.xaml @@ -8,9 +8,7 @@ x:Class="OpenTracker.Views.SectionControl"> - - - + + IsVisible="{Binding Path=VisibleItem}" Stretch="Uniform" /> - + Path=MarkingPopupTarget}" HorizontalOffset="16" VerticalOffset="16"> - + @@ -42,14 +39,15 @@ - - + diff --git a/OpenTracker/Views/SectionControl.xaml.cs b/OpenTracker/Views/SectionControl.xaml.cs index 5bbaa982..4f0668f5 100644 --- a/OpenTracker/Views/SectionControl.xaml.cs +++ b/OpenTracker/Views/SectionControl.xaml.cs @@ -25,7 +25,7 @@ private void OnClickVisibleItem(object sender, PointerReleasedEventArgs e) switch (e.InitialPressMouseButton) { case MouseButton.Left: - _viewModel.OpenVisibleItemSelect(); + _viewModel.OpenMarkingSelect(); break; } }