From b01f9485ae4a70fd0d7e14e850de1f6684ad355f Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sun, 29 May 2016 20:59:54 +0200 Subject: [PATCH] Fixed profile saving, expanded Overwatch data model --- .../Games/Overwatch/OverwatchDataModel.cs | 31 +++++++- .../Modules/Games/Overwatch/OverwatchModel.cs | 78 +++++++++++++++++-- Artemis/Artemis/Utilities/GeneralHelpers.cs | 2 + .../Profiles/LayerConditionViewModel.cs | 16 +++- .../Profiles/ProfileEditorViewModel.cs | 1 + 5 files changed, 116 insertions(+), 12 deletions(-) diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs index 4c12adc5d..a8d866cb8 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs @@ -5,13 +5,42 @@ namespace Artemis.Modules.Games.Overwatch public class OverwatchDataModel : IGameDataModel { public OverwatchStatus Status { get; set; } + public OverwatchCharacter Character { get; set; } + public bool UltimateReady { get; set; } + public bool Ability1Ready { get; set; } + public bool Ability2Ready { get; set; } } public enum OverwatchStatus { Unkown, InMainMenu, - InCharacterSelection, InGame } + + public enum OverwatchCharacter + { + None, + Genji, + Mccree, + Pharah, + Reaper, + Soldier76, + Tracer, + Bastion, + Hanzo, + Junkrat, + Mei, + Torbjörn, + Widowmaker, + Dva, + Reinhardt, + Roadhog, + Winston, + Zarya, + Lúcio, + Mercy, + Symmetra, + Zenyatta + } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs index 8366eaa76..c874a487c 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs @@ -1,6 +1,6 @@ -using System; +using System.Collections.Generic; using System.Drawing; -using System.Linq.Dynamic; +using System.Linq; using Artemis.Events; using Artemis.Managers; using Artemis.Models; @@ -28,12 +28,51 @@ namespace Artemis.Modules.Games.Overwatch Initialized = false; MmfReader = new MmfReader("overwatchMmf"); + LoadOverwatchCharacters(); } + public List OverwatchCharacters { get; set; } + public MmfReader MmfReader { get; set; } public int Scale { get; set; } + private void LoadOverwatchCharacters() + { + OverwatchCharacters = new List + { + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Genji, Color = Color.FromRgb(13, 61, 0)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Mccree, Color = Color.FromRgb(24, 1, 1)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Pharah, Color = Color.FromRgb(0, 6, 32)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Reaper, Color = Color.FromRgb(7, 0, 0)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Soldier76, Color = Color.FromRgb(3, 5, 11)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Tracer, Color = Color.FromRgb(46, 12, 0)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Bastion, Color = Color.FromRgb(6, 10, 5)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Hanzo, Color = Color.FromRgb(28, 24, 8)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Junkrat, Color = Color.FromRgb(59, 28, 0)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Mei, Color = Color.FromRgb(3, 20, 55)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Torbjörn, Color = Color.FromRgb(31, 4, 3)}, + new CharacterColor + { + OverwatchCharacter = OverwatchCharacter.Widowmaker, + Color = Color.FromRgb(16, 3, 17) + }, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Dva, Color = Color.FromRgb(62, 12, 32)}, + new CharacterColor + { + OverwatchCharacter = OverwatchCharacter.Reinhardt, + Color = Color.FromRgb(12, 16, 16) + }, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Roadhog, Color = Color.FromRgb(26, 10, 0)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Winston, Color = Color.FromRgb(17, 18, 26)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Zarya, Color = Color.FromRgb(58, 7, 24)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Lúcio, Color = Color.FromRgb(8, 35, 0)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Mercy, Color = Color.FromRgb(60, 56, 26)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Symmetra, Color = Color.FromRgb(11, 29, 37)}, + new CharacterColor {OverwatchCharacter = OverwatchCharacter.Zenyatta, Color = Color.FromRgb(62, 54, 6)} + }; + } + public override void Dispose() { Initialized = false; @@ -59,15 +98,34 @@ namespace Artemis.Modules.Games.Overwatch { for (var x = 0; x < 22; x++) { - g.DrawRectangle(new Pen(ColorHelpers.ToDrawingColor(colors[y, x])), y, x, 1, 1 ); + g.DrawRectangle(new Pen(ColorHelpers.ToDrawingColor(colors[y, x])), y, x, 1, 1); } } } _events.PublishOnUIThread(new ChangeBitmap(bitmap)); - if (colors[0, 0].Equals(Color.FromRgb(55, 30, 0))) - gameDataModel.Status = OverwatchStatus.InMainMenu; - else if (colors[0, 0].Equals(Color.FromRgb(3, 5, 11))) - gameDataModel.Status = OverwatchStatus.InGame; + + // Determine general game state + gameDataModel.Status = colors[0, 0].Equals(Color.FromRgb(55, 30, 0)) + ? OverwatchStatus.InMainMenu + : OverwatchStatus.Unkown; + + if (gameDataModel.Status == OverwatchStatus.InMainMenu) + return; + + // If ingame, look for a character + var characterMatch = OverwatchCharacters.FirstOrDefault(c => c.Color == colors[0, 0]); + if (characterMatch.OverwatchCharacter == OverwatchCharacter.None) + return; + + gameDataModel.Status = OverwatchStatus.InGame; + gameDataModel.Character = characterMatch.OverwatchCharacter; + + // Ability1 is ready when LShift is lid + gameDataModel.Ability1Ready = colors[4, 1].Equals(Color.FromRgb(4, 141, 144)); + // Ability2 is ready when E is lid + gameDataModel.Ability2Ready = colors[2, 4].Equals(Color.FromRgb(4, 141, 144)); + // Ultimate is ready when Q is blinking + gameDataModel.UltimateReady = !characterMatch.Color.Equals(colors[2, 2]); } public override Bitmap GenerateBitmap() @@ -89,4 +147,10 @@ namespace Artemis.Modules.Games.Overwatch return Profile?.GenerateBrush(GameDataModel, LayerType.Headset, false, true); } } + + public struct CharacterColor + { + public OverwatchCharacter OverwatchCharacter { get; set; } + public Color Color { get; set; } + } } \ No newline at end of file diff --git a/Artemis/Artemis/Utilities/GeneralHelpers.cs b/Artemis/Artemis/Utilities/GeneralHelpers.cs index 3fc206095..971490560 100644 --- a/Artemis/Artemis/Utilities/GeneralHelpers.cs +++ b/Artemis/Artemis/Utilities/GeneralHelpers.cs @@ -83,6 +83,8 @@ namespace Artemis.Utilities friendlyName = "(Number)"; else if (propertyInfo.PropertyType.Name == "String") friendlyName = "(Text)"; + else if (propertyInfo.PropertyType.Name == "Boolean") + friendlyName = "(Yes/no)"; if (propertyInfo.PropertyType.BaseType?.Name == "Enum") friendlyName = "(Choice)"; diff --git a/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs index b3af86ea1..5c2ff0cd7 100644 --- a/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs @@ -10,8 +10,7 @@ namespace Artemis.ViewModels.Profiles { private readonly NamedOperator[] _boolOperators = { - new NamedOperator("True", "== True"), - new NamedOperator("False", "== False") + new NamedOperator("Equal to", "==") }; private readonly LayerEditorViewModel _conditionModel; @@ -114,7 +113,6 @@ namespace Artemis.ViewModels.Profiles get { return _selectedOperator; } set { - if (value.Equals(_selectedOperator)) return; _selectedOperator = value; NotifyOfPropertyChange(() => SelectedOperator); } @@ -142,6 +140,7 @@ namespace Artemis.ViewModels.Profiles return; Operators.Clear(); + Enums.Clear(); UserValueIsVisible = false; EnumValueIsVisible = false; @@ -153,6 +152,9 @@ namespace Artemis.ViewModels.Profiles break; case "Boolean": Operators.AddRange(_boolOperators); + Enums.Add("True"); + Enums.Add("False"); + EnumValueIsVisible = true; break; default: Operators.AddRange(_operators); @@ -193,7 +195,13 @@ namespace Artemis.ViewModels.Profiles LayerConditionModel.Field = SelectedDataModelProp.Path; LayerConditionModel.Operator = SelectedOperator.Value; LayerConditionModel.Type = SelectedDataModelProp.Type; - LayerConditionModel.Value = SelectedDataModelProp.Type == "Enum" ? SelectedEnum : UserValue; + + if (SelectedDataModelProp.Type == "Enum" || SelectedDataModelProp.Type == "Boolean") + LayerConditionModel.Value = SelectedEnum; + else + LayerConditionModel.Value = UserValue; + + UpdateForm(sender, e); } /// diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs index 94de681dd..b2ffce466 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs @@ -48,6 +48,7 @@ namespace Artemis.ViewModels.Profiles events.Subscribe(this); + ProfileViewModel.PropertyChanged += PropertyChangeHandler; PropertyChanged += PropertyChangeHandler; LoadProfiles(); }