diff --git a/AideDeJeu/AideDeJeu/Tools/Converters.cs b/AideDeJeu/AideDeJeu/Tools/Converters.cs index 77151d7e..d48d6306 100644 --- a/AideDeJeu/AideDeJeu/Tools/Converters.cs +++ b/AideDeJeu/AideDeJeu/Tools/Converters.cs @@ -61,6 +61,40 @@ namespace AideDeJeu.Tools } } + public class ComparerToValueConverter : IValueConverter where C : IComparable + { + public T GreaterThan { get; set; } + public T EqualsTo { get; set; } + public T SmallerThan { get; set; } + public T Default { get; set; } + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var valueC = (C)value; + var compare = valueC.CompareTo(parameter); + if(EqualsTo != null && compare == 0) + { + return EqualsTo; + } + if (GreaterThan != null && compare > 0) + { + return GreaterThan; + } + if (SmallerThan != null && compare < 0) + { + return SmallerThan; + } + return Default; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + } + + public class IntComparerToBooleanConverter : ComparerToValueConverter { } + public class IntToValueConverter : IValueConverter { public T NullOrZeroValue { get; set; } diff --git a/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/AbilitiesViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/AbilitiesViewModel.cs index ab5d95b9..8a8eb60a 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/AbilitiesViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/AbilitiesViewModel.cs @@ -6,6 +6,163 @@ namespace AideDeJeu.ViewModels.PlayerCharacter { public class AbilitiesViewModel : BaseViewModel { + public AbilitiesViewModel() + { + Listen(); + } + + public bool _Listening = false; + public void Listen() + { + if (!_Listening) + { + _Listening = true; + Strength.PropertyChanged += Strength_PropertyChanged; + Dexterity.PropertyChanged += Dexterity_PropertyChanged; + Constitution.PropertyChanged += Constitution_PropertyChanged; + Intelligence.PropertyChanged += Intelligence_PropertyChanged; + Wisdom.PropertyChanged += Wisdom_PropertyChanged; + Charisma.PropertyChanged += Charisma_PropertyChanged; + } + } + + public void Unlisten() + { + if (_Listening) + { + _Listening = false; + Strength.PropertyChanged -= Strength_PropertyChanged; + Dexterity.PropertyChanged -= Dexterity_PropertyChanged; + Constitution.PropertyChanged -= Constitution_PropertyChanged; + Intelligence.PropertyChanged -= Intelligence_PropertyChanged; + Wisdom.PropertyChanged -= Wisdom_PropertyChanged; + Charisma.PropertyChanged -= Charisma_PropertyChanged; + } + } + + private void Charisma_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + CheckRacialDispatchedBonus(e.PropertyName, Charisma, () => + { + var list = new LinkedList(); + list.AddLast(Strength); + list.AddLast(Dexterity); + list.AddLast(Constitution); + list.AddLast(Intelligence); + list.AddLast(Wisdom); + return list; + }); + } + + private void Wisdom_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + CheckRacialDispatchedBonus(e.PropertyName, Wisdom, () => + { + var list = new LinkedList(); + list.AddLast(Charisma); + list.AddLast(Strength); + list.AddLast(Dexterity); + list.AddLast(Constitution); + list.AddLast(Intelligence); + return list; + }); + } + + private void Intelligence_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + CheckRacialDispatchedBonus(e.PropertyName, Intelligence, () => + { + var list = new LinkedList(); + list.AddLast(Wisdom); + list.AddLast(Charisma); + list.AddLast(Strength); + list.AddLast(Dexterity); + list.AddLast(Constitution); + return list; + }); + } + + private void Constitution_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + CheckRacialDispatchedBonus(e.PropertyName, Constitution, () => + { + var list = new LinkedList(); + list.AddLast(Intelligence); + list.AddLast(Wisdom); + list.AddLast(Charisma); + list.AddLast(Strength); + list.AddLast(Dexterity); + return list; + }); + } + + private void Dexterity_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + CheckRacialDispatchedBonus(e.PropertyName, Dexterity, () => + { + var list = new LinkedList(); + list.AddLast(Constitution); + list.AddLast(Intelligence); + list.AddLast(Wisdom); + list.AddLast(Charisma); + list.AddLast(Strength); + return list; + }); + } + + private void Strength_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + CheckRacialDispatchedBonus(e.PropertyName, Strength, () => + { + var list = new LinkedList(); + list.AddLast(Dexterity); + list.AddLast(Constitution); + list.AddLast(Intelligence); + list.AddLast(Wisdom); + list.AddLast(Charisma); + return list; + }); + } + + private void CheckRacialDispatchedBonus(string propertyName, AbilityViewModel ability, Func> funcList) + { + if (propertyName == nameof(AbilityViewModel.RacialDispatchedBonus)) + { + if (ability.RacialDispatchedBonus > 0 && SumRacialDispatchedBonus > MaxRacialDispatchedBonus) + { + DecrementNext(funcList()); + } + } + } + + private void DecrementNext(LinkedList list) + { + var ability = list.First; + while (ability != null) + { + if (ability.Value.RacialDispatchedBonus > 0) + { + ability.Value.RacialDispatchedBonus--; + break; + } + ability = ability.Next; + } + } + + private int SumRacialDispatchedBonus + { + get + { + return + Strength.RacialDispatchedBonus + + Dexterity.RacialDispatchedBonus + + Constitution.RacialDispatchedBonus + + Intelligence.RacialDispatchedBonus + + Wisdom.RacialDispatchedBonus + + Charisma.RacialDispatchedBonus; + } + } + private AbilityViewModel _Strength = new AbilityViewModel(); public AbilityViewModel Strength { get { return _Strength; } set { SetProperty(ref _Strength, value); } } @@ -23,6 +180,10 @@ namespace AideDeJeu.ViewModels.PlayerCharacter private AbilityViewModel _Charisma = new AbilityViewModel(); public AbilityViewModel Charisma { get { return _Charisma; } set { SetProperty(ref _Charisma, value); } } + + private int _MaxRacialDispatchedBonus = 0; + public int MaxRacialDispatchedBonus { get { return _MaxRacialDispatchedBonus; } set { SetProperty(ref _MaxRacialDispatchedBonus, value); OnPropertyChanged(nameof(HasRacialDispatchedBonus)); } } + public bool HasRacialDispatchedBonus { get { return _MaxRacialDispatchedBonus > 0; } } } public class AbilityViewModel : BaseViewModel @@ -66,6 +227,26 @@ namespace AideDeJeu.ViewModels.PlayerCharacter OnPropertyChanged(nameof(ModString)); } } + private int _MaxRacialDispatchedBonus = 0; + public int MaxRacialDispatchedBonus + { + get + { + return _MaxRacialDispatchedBonus; + } + set + { + SetProperty(ref _MaxRacialDispatchedBonus, value); + OnPropertyChanged(nameof(HasRacialDispatchedBonus)); + } + } + public bool HasRacialDispatchedBonus + { + get + { + return _MaxRacialDispatchedBonus > 0; + } + } public int? Value { get { return BaseValue != null ? BaseValue + RacialBonus + RacialDispatchedBonus : null; } } public string ValueString { get { return Value != null ? Value.ToString() : null; } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/PlayerCharacterEditorViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/PlayerCharacterEditorViewModel.cs index 5a601400..4be4e3ac 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/PlayerCharacterEditorViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/PlayerCharacter/PlayerCharacterEditorViewModel.cs @@ -56,12 +56,36 @@ namespace AideDeJeu.ViewModels.PlayerCharacter switch(e.PropertyName) { case nameof(SelectedPlayerCharacter.Race): - SelectedPlayerCharacter.Abilities.Strength.RacialBonus = int.Parse(SelectedPlayerCharacter.Race.Race.StrengthBonus ?? "0"); - SelectedPlayerCharacter.Abilities.Dexterity.RacialBonus = int.Parse(SelectedPlayerCharacter.Race.Race.DexterityBonus ?? "0"); - SelectedPlayerCharacter.Abilities.Constitution.RacialBonus = int.Parse(SelectedPlayerCharacter.Race.Race.ConstitutionBonus ?? "0"); - SelectedPlayerCharacter.Abilities.Intelligence.RacialBonus = int.Parse(SelectedPlayerCharacter.Race.Race.IntelligenceBonus ?? "0"); - SelectedPlayerCharacter.Abilities.Wisdom.RacialBonus = int.Parse(SelectedPlayerCharacter.Race.Race.WisdomBonus ?? "0"); - SelectedPlayerCharacter.Abilities.Charisma.RacialBonus = int.Parse(SelectedPlayerCharacter.Race.Race.CharismaBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Unlisten(); + + SelectedPlayerCharacter.Abilities.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.DispatchedBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Strength.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.MaxDispatchedStrengthBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Dexterity.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.MaxDispatchedDexterityBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Constitution.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.MaxDispatchedConstitutionBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Intelligence.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.MaxDispatchedIntelligenceBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Wisdom.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.MaxDispatchedWisdomBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Charisma.MaxRacialDispatchedBonus = int.Parse(SelectedPlayerCharacter.Race.Race.MaxDispatchedCharismaBonus ?? "0"); + + SelectedPlayerCharacter.Abilities.Strength.RacialBonus = + int.Parse(SelectedPlayerCharacter.Race.Race?.StrengthBonus ?? "0") + + int.Parse(SelectedPlayerCharacter.Race.SubRace?.StrengthBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Dexterity.RacialBonus = + int.Parse(SelectedPlayerCharacter.Race.Race?.DexterityBonus ?? "0") + + int.Parse(SelectedPlayerCharacter.Race.SubRace?.DexterityBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Constitution.RacialBonus = + int.Parse(SelectedPlayerCharacter.Race.Race?.ConstitutionBonus ?? "0") + + int.Parse(SelectedPlayerCharacter.Race.SubRace?.ConstitutionBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Intelligence.RacialBonus = + int.Parse(SelectedPlayerCharacter.Race.Race?.IntelligenceBonus ?? "0") + + int.Parse(SelectedPlayerCharacter.Race.SubRace?.IntelligenceBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Wisdom.RacialBonus = + int.Parse(SelectedPlayerCharacter.Race.Race?.WisdomBonus ?? "0") + + int.Parse(SelectedPlayerCharacter.Race.SubRace?.WisdomBonus ?? "0"); + SelectedPlayerCharacter.Abilities.Charisma.RacialBonus = + int.Parse(SelectedPlayerCharacter.Race.Race?.CharismaBonus ?? "0") + + int.Parse(SelectedPlayerCharacter.Race.SubRace?.CharismaBonus ?? "0"); + + SelectedPlayerCharacter.Abilities.Listen(); break; } } @@ -917,13 +941,14 @@ namespace AideDeJeu.ViewModels.PlayerCharacter maxs = null; } - + SelectedPlayerCharacter.Abilities.Unlisten(); SelectedPlayerCharacter.Abilities.Strength.BaseValue = PickAbility(random, ref mins, ref maxs, "Force"); SelectedPlayerCharacter.Abilities.Dexterity.BaseValue = PickAbility(random, ref mins, ref maxs, "Dextérité"); SelectedPlayerCharacter.Abilities.Constitution.BaseValue = PickAbility(random, ref mins, ref maxs, "Constitution"); SelectedPlayerCharacter.Abilities.Intelligence.BaseValue = PickAbility(random, ref mins, ref maxs, "Intelligence"); SelectedPlayerCharacter.Abilities.Wisdom.BaseValue = PickAbility(random, ref mins, ref maxs, "Sagesse"); SelectedPlayerCharacter.Abilities.Charisma.BaseValue = PickAbility(random, ref mins, ref maxs, "Charisme"); + SelectedPlayerCharacter.Abilities.Listen(); //await GeneratePdfAsync(); //await OpenPdfAsync(); diff --git a/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml b/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml index eec969d9..63174761 100644 --- a/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml +++ b/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml @@ -8,11 +8,24 @@ + - - + + + + + + + + + + + + + + + + + + + + 0 + + + + + + \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml.cs b/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml.cs index a343a43a..726e6736 100644 --- a/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml.cs +++ b/AideDeJeu/AideDeJeu/Views/Pickers/AbilityPickerView.xaml.cs @@ -39,26 +39,6 @@ namespace AideDeJeu.Views.Pickers typeof(AbilityViewModel), typeof(AbilityPickerView), defaultValue: default(AbilityViewModel)); - /*public int RacialBonus - { - get { return (int)GetValue(RacialBonusProperty); } - set { SetValue(RacialBonusProperty, value); } - } - public static readonly BindableProperty RacialBonusProperty = BindableProperty.Create( - nameof(RacialBonus), - typeof(int), - typeof(AbilityPickerView), - defaultValue: default(int)); - public int DispatchedRacialBonus - { - get { return (int)GetValue(DispatchedRacialBonusProperty); } - set { SetValue(DispatchedRacialBonusProperty, value); } - } - public static readonly BindableProperty DispatchedRacialBonusProperty = BindableProperty.Create( - nameof(DispatchedRacialBonus), - typeof(int), - typeof(AbilityPickerView), - defaultValue: default(int));*/ } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/PlayerCharacter/PlayerCharacterEditorPage.xaml b/AideDeJeu/AideDeJeu/Views/PlayerCharacter/PlayerCharacterEditorPage.xaml index 40806af6..9389beb8 100644 --- a/AideDeJeu/AideDeJeu/Views/PlayerCharacter/PlayerCharacterEditorPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/PlayerCharacter/PlayerCharacterEditorPage.xaml @@ -206,20 +206,60 @@ - + + + + + + + + + + + + + + + + + + + - - - +