1
0
Fork 0
mirror of https://github.com/Nioux/AideDeJeu.git synced 2025-10-30 15:06:06 +00:00

Abilities

This commit is contained in:
Yan Maniez 2019-05-06 23:52:29 +02:00
parent 80e6ebad44
commit 42f3fa0604
6 changed files with 361 additions and 44 deletions

View file

@ -61,6 +61,40 @@ namespace AideDeJeu.Tools
}
}
public class ComparerToValueConverter<C, T> : 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<int, bool> { }
public class IntToValueConverter<T> : IValueConverter
{
public T NullOrZeroValue { get; set; }

View file

@ -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<AbilityViewModel>();
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<AbilityViewModel>();
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<AbilityViewModel>();
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<AbilityViewModel>();
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<AbilityViewModel>();
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<AbilityViewModel>();
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<LinkedList<AbilityViewModel>> funcList)
{
if (propertyName == nameof(AbilityViewModel.RacialDispatchedBonus))
{
if (ability.RacialDispatchedBonus > 0 && SumRacialDispatchedBonus > MaxRacialDispatchedBonus)
{
DecrementNext(funcList());
}
}
}
private void DecrementNext(LinkedList<AbilityViewModel> 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; } }

View file

@ -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();

View file

@ -8,11 +8,24 @@
<ResourceDictionary>
<tools:MonsterMarkdownTheme x:Key="MonsterMarkdownTheme" />
<tools:NullToFalseConverter x:Key="NullToFalseConverter" />
<tools:IntComparerToBooleanConverter
x:Key="GreaterToTrueConverter"
GreaterThan="True"
Default="False"
/>
</ResourceDictionary>
</ContentView.Resources>
<ContentView.Content>
<StackLayout Orientation="Horizontal">
<Picker Title="{Binding Title, Source={x:Reference this}}" SelectedItem="{Binding Ability.BaseValue, Source={x:Reference this}, Mode=TwoWay}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text="{Binding Title, Source={x:Reference this}}" />
<Picker Grid.Column="1" SelectedItem="{Binding Ability.BaseValue, Source={x:Reference this}, Mode=TwoWay}">
<Picker.ItemsSource>
<x:Array Type="{x:Type x:Int32}">
<x:Int32>3</x:Int32>
@ -34,11 +47,55 @@
</x:Array>
</Picker.ItemsSource>
</Picker>
<Label Text="{Binding Ability.RacialBonus, Source={x:Reference this}, StringFormat='Bonus : {0}', FallbackValue=''}" />
<Label Text="{Binding Ability.DispatchedRacialBonus, Source={x:Reference this}, StringFormat='Bonus : {0}', FallbackValue=''}" />
<Stepper Minimum="0" Maximum="1" Value="{Binding Ability.DispatchedRacialBonus, Source={x:Reference this}, Mode=TwoWay}" />
<Label Text="{Binding Ability.Value, Source={x:Reference this}, StringFormat='Value : {0}', FallbackValue=''}" />
<Label Text="{Binding Ability.Mod, Source={x:Reference this}, StringFormat='Mod : {0}', FallbackValue=''}" />
</StackLayout>
<Label Grid.Column="2" Text="{Binding Ability.RacialBonus, Source={x:Reference this}, StringFormat='{}{0:+0;-#}', FallbackValue=''}">
<Label.IsVisible>
<Binding Source="{x:Reference this}" Path="Ability.RacialBonus">
<Binding.Converter>
<tools:IntComparerToBooleanConverter
GreaterThan="True"
Default="False"
/>
</Binding.Converter>
<Binding.ConverterParameter>
<x:Int32>0</x:Int32>
</Binding.ConverterParameter>
</Binding>
</Label.IsVisible>
</Label>
<Grid Grid.Column="2" IsVisible="{Binding Ability.HasRacialDispatchedBonus, Source={x:Reference this}}">
<Label Grid.Column="0" Text="{Binding Ability.RacialDispatchedBonus, Source={x:Reference this}, StringFormat='{}{0:+0;-#}', FallbackValue=''}">
<Label.IsVisible>
<Binding Source="{x:Reference this}" Path="Ability.RacialBonus">
<Binding.Converter>
<tools:IntComparerToBooleanConverter
EqualsTo="True"
Default="False"
/>
</Binding.Converter>
<Binding.ConverterParameter>
<x:Int32>0</x:Int32>
</Binding.ConverterParameter>
</Binding>
</Label.IsVisible>
</Label>
<Stepper Grid.Column="1" Minimum="0" Maximum="1" Value="{Binding Ability.RacialDispatchedBonus, Source={x:Reference this}, Mode=TwoWay}">
<Stepper.IsVisible>
<Binding Source="{x:Reference this}" Path="Ability.RacialBonus">
<Binding.Converter>
<tools:IntComparerToBooleanConverter
EqualsTo="True"
Default="False"
/>
</Binding.Converter>
<Binding.ConverterParameter>
<x:Int32>0</x:Int32>
</Binding.ConverterParameter>
</Binding>
</Stepper.IsVisible>
</Stepper>
</Grid>
<Label Grid.Column="3" Text="{Binding Ability.Value, Source={x:Reference this}, FallbackValue=''}" />
<Label Grid.Column="4" Text="{Binding Ability.Mod, Source={x:Reference this}, StringFormat='{}{0:+0;-#}', FallbackValue=''}" />
</Grid>
</ContentView.Content>
</ContentView>

View file

@ -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));*/
}
}

View file

@ -206,20 +206,60 @@
<Frame BorderColor="Black" Padding="2" Margin="10">
<ImageButton Source="rolling_dice_cup.png" Command="{Binding RollDicesCommand}" />
</Frame>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Force"
Ability="{Binding SelectedPlayerCharacter.Abilities.Strength}"
/>
<Frame BorderColor="Black" Padding="2" Margin="10">
<StackLayout>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" Text="Base" />
<Label Grid.Column="2" Text="Bonus" />
<Label Grid.Column="3" Text="Valeur" />
<Label Grid.Column="4" Text="Mod" />
</Grid>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Force"
Ability="{Binding SelectedPlayerCharacter.Abilities.Strength}"
/>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Dextérité"
Ability="{Binding SelectedPlayerCharacter.Abilities.Dexterity}"
/>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Constitution"
Ability="{Binding SelectedPlayerCharacter.Abilities.Constitution}"
/>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Intelligence"
Ability="{Binding SelectedPlayerCharacter.Abilities.Intelligence}"
/>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Sagesse"
Ability="{Binding SelectedPlayerCharacter.Abilities.Wisdom}"
/>
<pickers:AbilityPickerView
BindingContext="{Binding}"
Title="Charisme"
Ability="{Binding SelectedPlayerCharacter.Abilities.Charisma}"
/>
</StackLayout>
</Frame>
<pickers:StringPickerView BindingContext="{Binding}" Title="Force" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Strength.BaseValue, Mode=TwoWay}" />
<Stepper></Stepper>
<!--<pickers:StringPickerView BindingContext="{Binding}" Title="Force" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Strength.BaseValue, Mode=TwoWay}" />
<pickers:StringPickerView BindingContext="{Binding}" Title="Dextérité" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Dexterity.BaseValue, Mode=TwoWay}" />
<pickers:StringPickerView BindingContext="{Binding}" Title="Constitution" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Constitution.BaseValue, Mode=TwoWay}" />
<pickers:StringPickerView BindingContext="{Binding}" Title="Intelligence" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Intelligence.BaseValue, Mode=TwoWay}" />
<pickers:StringPickerView BindingContext="{Binding}" Title="Sagesse" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Wisdom.BaseValue, Mode=TwoWay}" />
<pickers:StringPickerView BindingContext="{Binding}" Title="Charisme" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Charisma.BaseValue, Mode=TwoWay}" />
<pickers:StringPickerView BindingContext="{Binding}" Title="Charisme" ItemsSource="{Binding Abilities}" SelectedItem="{Binding SelectedPlayerCharacter.Abilities.Charisma.BaseValue, Mode=TwoWay}" />-->
</StackLayout>
</ScrollView>
</ContentPage>