using Dominion.NET_WPF.Caching;
using Dominion.NET_WPF.Controls;
using DominionBase.Cards;
using DominionBase.Enums;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Dominion.NET_WPF
{
///
/// Interaction logic for wSettings.xaml
///
public partial class wSettings : Window
{
private readonly Settings _masterSettings;
public DisplayObjects CardObjects;
public DisplayObjects LandscapeCardObjects;
public Settings Settings { get; private set; }
public wSettings(ref Settings settings)
{
_masterSettings = settings;
Settings = new Settings(settings);
CardObjects = new DisplayObjects(c => c.Location == Location.Kingdom, settings.EditionUsage);
LandscapeCardObjects = new DisplayObjects(c => c.Location == Location.LandscapeCard, settings.EditionUsage);
//this.DataContext = this.Settings;
InitializeComponent();
#region Tab #1 -- Players
slidNumPlayers.Value = Settings.NumberOfPlayers;
slidHumanPlayers.Value = Settings.NumberOfHumanPlayers;
var aiTypes = DominionBase.Players.PlayerCollection.GetAllAIs().ToList();
var playerSettings = spPlayers.Children.OfType().ToList();
for (var count = 0; count < Settings.PlayerSettings.Count; count++)
{
playerSettings.ElementAt(count).AITypes = aiTypes;
playerSettings.ElementAt(count).PlayerSettings = Settings.PlayerSettings[count];
}
// For now, limit the number of human players to 1
slidHumanPlayers.Maximum = 1;
slidNumPlayers_ValueChanged(slidNumPlayers, null);
slidHumanPlayers_ValueChanged(slidHumanPlayers, null);
lbAISelection.DataContext = new ViewModel.AIListViewModel(aiTypes.Where(t => t != typeof(DominionBase.Players.AI.RandomAI)), settings.RandomAIAllowedAIs);
lbAISelection.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("AIs"));
cbAISpeed.SelectedValue = Settings.AISpeed;
#endregion
#region Tab #2 -- Automation
if (Settings.AutoPlayTreasuresLoanFirst)
rbChooser_AutomaticallyPlayTreasuresLoanBeforeVenture.IsChecked = true;
else
rbChooser_AutomaticallyPlayTreasuresVentureBeforeLoan.IsChecked = true;
if (Settings.AutoPlayTreasuresHornOfPlentyFirst)
rbChooser_AutomaticallyPlayTreasuresHornOfPlentyBeforeBank.IsChecked = true;
else
rbChooser_AutomaticallyPlayTreasuresBankBeforeHornOfPlenty.IsChecked = true;
#endregion
#region Tab #3 -- Interface
cbLayoutStyle.SelectedValue = Settings.LayoutStyle;
cbGameLogLocation.SelectedValue = Settings.GameLogLocation;
slidToolTipDuration_ValueChanged(slidToolTipDuration, null);
sbpBackground.Clear();
if (!DesignerProperties.GetIsInDesignMode(this))
{
var iRepo = ImageRepository.Acquire();
var path = iRepo.GetImagePath("background");
if (Directory.Exists(path))
{
foreach (var filename in Directory.EnumerateFiles(path))
{
try
{
var bgImage = iRepo.GetBitmapImage(filename, "background");
if (bgImage == null)
continue;
var bg = new ImageBrush(bgImage)
{
Stretch = Stretch.Fill,
TileMode = TileMode.Tile,
ViewportUnits = BrushMappingMode.Absolute
};
bg.Viewport = new Rect(0, 0, bg.ImageSource.Height / 2, bg.ImageSource.Width / 2);
sbpBackground.AddBrush(bg);
}
catch { }
}
}
ImageRepository.Release();
}
string brushLocation = null;
if ((Settings.BackgroundBrush as ImageBrush)?.ImageSource is BitmapImage image)
brushLocation = image.SourcePath();
Brush bgBrush = null;
if (brushLocation != null)
{
bgBrush = sbpBackground.AvailableBrushes.FirstOrDefault(b => (b as ImageBrush)?.ImageSource is BitmapImage im && im.SourcePath() == brushLocation);
if (bgBrush != null)
sbpBackground.SelectedItem = bgBrush;
}
if (bgBrush == null && sbpBackground.AvailableBrushes.Any())
sbpBackground.SelectedItem = sbpBackground.AvailableBrushes.First();
#endregion
#region Tab #4 -- Kingdom Card Setup
cbUsePreset.IsChecked = Settings.UsePreset;
cbShowPresetCards.IsChecked = Settings.SettingsShowPresetCards;
cbUsePreset_Checked(cbUsePreset, null);
cbShowPresetCards_Checked(cbShowPresetCards, null);
cbPresets.ItemsSource = Settings.Presets;
cbPresets.SelectedItem = Settings.Presets.SingleOrDefault(p => p.Name == Settings.PresetName);
#endregion
#region Tab #5 -- Landscape Card Setup
ucccLandscapeCardConstraints.DisplayObjects = LandscapeCardObjects;
ucccLandscapeCardConstraints.ConstraintCollection = Settings.LandscapeCardConstraints;
#endregion
#region Tab #6 -- Kingdom Card Constraints
ucccConstraints.DisplayObjects = CardObjects;
ucccConstraints.ConstraintCollection = Settings.Constraints;
#endregion
#region Tab #7 -- Card Settings
foreach (var cardsSettings in Settings.CardSettings)
icCardSettings.Items.Add(new ucCardSettings { CardsSettings = cardsSettings, DisplayObjects = CardObjects });
#endregion
#region Tab #8 -- Set & Trait Information
var sets = Enum.GetValues(typeof(Source)).Cast();
cbSet.ItemsSource = sets.Where(s => s != Source.All);
var categories = Enum.GetValues(typeof(Categories)).Cast();
cbCategory.ItemsSource = categories.Where(c =>
c != Categories.Unknown && c != Categories.Card
&& (CardObjects.Cards.Any(card => card.Category.HasFlag(c))
|| LandscapeCardObjects.Cards.Any(card => card.Category.HasFlag(c))
)
);
cbTrait.ItemsSource = CardObjects.Trait.OrderBy(kvp => (int)kvp.Key);
#endregion
}
private void slidNumPlayers_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
var slider = sender as Slider;
if (tbPlayersNum != null)
tbPlayersNum.Text = slider?.Value.ToString();
if (Settings != null)
{
if (slidHumanPlayers != null)
{
if (slider != null)
{
Settings.NumberOfPlayers = (int)slider.Value;
if (textBox1 != null)
{
if (Math.Abs(slider.Value - 1) < 0.001 && textBox1.Text.EndsWith("s"))
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
if (Math.Abs(slider.Value - 1) > 0.001 && !textBox1.Text.EndsWith("s"))
textBox1.Text += "s";
}
}
slidHumanPlayers.Value = Settings.NumberOfHumanPlayers;
slidHumanPlayers.Maximum = Settings.NumberOfPlayers;
// For now, limit the number of human players to 1
slidHumanPlayers.Maximum = 1;
}
}
}
private void slidHumanPlayers_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
var slider = sender as Slider;
if (tbPlayersHuman != null)
tbPlayersHuman.Text = slider?.Value.ToString();
if (Settings != null)
{
if (textBox2 != null)
{
if (slider != null)
{
Settings.NumberOfHumanPlayers = (int)slider.Value;
if (Math.Abs(slider.Value - 1) < 0.001 && textBox2.Text.EndsWith("s"))
textBox2.Text = textBox2.Text.Remove(textBox2.Text.Length - 1);
if (Math.Abs(slider.Value - 1) > 0.001 && !textBox2.Text.EndsWith("s"))
textBox2.Text += "s";
}
}
if (spPlayers != null)
{
for (var count = 0; count < Settings.PlayerSettings.Count; count++)
{
var pt = DominionBase.Players.PlayerType.Computer;
if (Settings.NumberOfHumanPlayers > count)
pt = DominionBase.Players.PlayerType.Human;
spPlayers.Children.OfType().ElementAt(count).PlayerType = pt;
}
}
}
}
private void bOk_Click(object sender, RoutedEventArgs e)
{
var ucPSs = spPlayers.Children.OfType().ToList();
for (var count = 0; count < Settings.PlayerSettings.Count; count++)
{
Settings.PlayerSettings[count] = ucPSs.ElementAt(count).PlayerSettings;
}
Settings.RandomAIAllowedAIs.Clear();
Settings.RandomAIAllowedAIs.AddRange((lbAISelection.DataContext as ViewModel.AIListViewModel)?.AIs.Where(avm => avm.IsChecked).Select(avm => avm.AI.FullName));
Settings.AISpeed = (DominionBase.AISpeed)cbAISpeed.SelectedValue;
Settings.LayoutStyle = (LayoutStyle)cbLayoutStyle.SelectedValue;
Settings.GameLogLocation = (GameLogLocation)cbGameLogLocation.SelectedValue;
_masterSettings.CopyFrom(Settings);
DialogResult = true;
Close();
}
private void cbUsePreset_Checked(object sender, RoutedEventArgs e)
{
Settings.UsePreset = cbUsePreset.IsChecked == true;
if (Settings.UsePreset)
{
gbCardConstraints.IsEnabled = gbLandscapeCardConstraints.IsEnabled = false;
gbCardConstraints.ToolTip = gbLandscapeCardConstraints.ToolTip = "This section is disabled if you're using a preset";
}
else
{
gbCardConstraints.IsEnabled = gbLandscapeCardConstraints.IsEnabled = true;
gbCardConstraints.ToolTip = null;
}
}
private void cbShowPresetCards_Checked(object sender, RoutedEventArgs e)
{
Settings.SettingsShowPresetCards = cbShowPresetCards.IsChecked == true;
cbPresets_SelectionChanged(cbPresets, null);
}
private void slidToolTipDuration_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
if (tbToolTipDuration != null)
{
tbToolTipDuration.Text = ((int)Settings.ToolTipShowDuration / 1000).ToString();
tbToolTipExtra.Text = Settings.ToolTipShowDuration == ToolTipShowDuration.Off ? "(Off)" : string.Empty;
}
}
private void cbToolTipClick_Checked(object sender, RoutedEventArgs e)
{
if ((sender as CheckBox)?.IsChecked == true)
slidToolTipDuration.Value = 1;
}
private void cbPresets_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selectedPreset = (sender as ComboBox)?.SelectedItem as Preset;
if (selectedPreset != null)
Settings.PresetName = selectedPreset.Name;
if (selectedPreset == null || !Settings.SettingsShowPresetCards)
{
olCardsUsed.Objects = null;
olCardsUsed.Visibility = Visibility.Collapsed;
}
else
{
var cardTokenObjects = new List