Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

namespace ElectronicObserver.Core.Types.Serialization.EquipmentUpgrade;

/// <summary>
/// This equality comparer is used to group upgrade data based on the cost of levels 0 -> 5 and 6 -> max
/// Conversion & extra costs are ignored
/// </summary>
public class UpgradeCostDataEqualityComparer : IEqualityComparer<EquipmentUpgradeImprovementModel>
{
public bool Equals(EquipmentUpgradeImprovementModel? x, EquipmentUpgradeImprovementModel? y)
{
if (ReferenceEquals(x, y))
return true;

if (x is null || y is null)
return false;

return Equals(x.Costs, y.Costs);
}

private bool Equals(EquipmentUpgradeImprovementCost? x, EquipmentUpgradeImprovementCost? y)
{
if (ReferenceEquals(x, y))
return true;

if (x is null || y is null)
return false;

if (x.Fuel != y.Fuel) return false;
if (x.Ammo != y.Ammo) return false;
if (x.Steel != y.Steel) return false;
if (x.Bauxite != y.Bauxite) return false;

if (!Equals(x.Cost0To5, y.Cost0To5)) return false;
if (!Equals(x.Cost6To9, y.Cost6To9)) return false;

return true;
}

private bool Equals(EquipmentUpgradeImprovementCostDetail? x, EquipmentUpgradeImprovementCostDetail? y)
{
if (ReferenceEquals(x, y))
return true;

if (x is null || y is null)
return false;

if (x.DevmatCost != y.DevmatCost) return false;
if (x.SliderDevmatCost != y.SliderDevmatCost) return false;
if (x.ImproveMatCost != y.ImproveMatCost) return false;
if (x.SliderImproveMatCost != y.SliderImproveMatCost) return false;

foreach (EquipmentUpgradeImprovementCostItemDetail costItem in x.ConsumableDetail)
{
EquipmentUpgradeImprovementCostItemDetail? matchingCostItem = y.ConsumableDetail.Find(c => c.Id == costItem.Id);

if (matchingCostItem is null || costItem.Count != matchingCostItem.Count)
return false;
}

foreach (EquipmentUpgradeImprovementCostItemDetail costItem in x.EquipmentDetail)
{
EquipmentUpgradeImprovementCostItemDetail? matchingCostItem = y.EquipmentDetail.Find(c => c.Id == costItem.Id);

if (matchingCostItem is null || costItem.Count != matchingCostItem.Count)
return false;
}

return true;
}

public int GetHashCode(EquipmentUpgradeImprovementModel obj) => GetHashCode(obj.Costs);

private int GetHashCode(EquipmentUpgradeImprovementCost cost)
{
HashCode hash = new();

hash.Add(cost.Fuel);
hash.Add(cost.Ammo);
hash.Add(cost.Steel);
hash.Add(cost.Bauxite);

hash.Add(GetHashCode(cost.Cost0To5));
hash.Add(GetHashCode(cost.Cost6To9));

return hash.ToHashCode();
}

private int GetHashCode(EquipmentUpgradeImprovementCostDetail cost)
{
HashCode hash = new();

hash.Add(cost.DevmatCost);
hash.Add(cost.SliderDevmatCost);
hash.Add(cost.ImproveMatCost);
hash.Add(cost.SliderImproveMatCost);

foreach (EquipmentUpgradeImprovementCostItemDetail costItem in cost.ConsumableDetail.OrderBy(c => c.Id))
{
hash.Add(costItem.Id);
hash.Add(costItem.Count);
}

foreach (EquipmentUpgradeImprovementCostItemDetail costItem in cost.EquipmentDetail.OrderBy(e => e.Id))
{
hash.Add(costItem.Id);
hash.Add(costItem.Count);
}

return hash.ToHashCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,12 @@
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<Grid Grid.Row="0" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
Expand Down Expand Up @@ -367,7 +372,7 @@
/>
</Grid>

<Grid Grid.Row="1">
<Grid Grid.Row="1" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
Expand Down Expand Up @@ -638,25 +643,25 @@
</Style>
</StackPanel.Resources>

<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.EquipmentUpgradeCost.Fuel}">
<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.Fuel}">
<common:ImageTextControl.Image>
<common1:IconContentIcon Type="ResourceFuel" />
</common:ImageTextControl.Image>
</common:ImageTextControl>

<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.EquipmentUpgradeCost.Ammo}">
<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.Ammo}">
<common:ImageTextControl.Image>
<common1:IconContentIcon Type="ResourceAmmo" />
</common:ImageTextControl.Image>
</common:ImageTextControl>

<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.EquipmentUpgradeCost.Steel}">
<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.Steel}">
<common:ImageTextControl.Image>
<common1:IconContentIcon Type="ResourceSteel" />
</common:ImageTextControl.Image>
</common:ImageTextControl>

<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.EquipmentUpgradeCost.Bauxite}">
<common:ImageTextControl Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.Bauxite}">
<common:ImageTextControl.Image>
<common1:IconContentIcon Type="ResourceBauxite" />
</common:ImageTextControl.Image>
Expand All @@ -673,9 +678,47 @@

<TextBlock Grid.Row="2" Text="{Binding SelectedEquipmentViewModel.Equipment.Message}" />

<StackPanel Grid.Row="3">
<equipmentUpgrade:AlbumMasterEquipmentUpgradeControl DataContext="{Binding SelectedEquipmentViewModel.UpgradeViewModel}" />
</StackPanel>
<Grid Grid.Row="3">
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedEquipmentViewModel.UpgradeViewModel.UpgradeViewModels.Count}" Value="0">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<Border
Padding="2"
BorderBrush="Gray"
BorderThickness="1"
Grid.Row="0"
>
<TextBlock HorizontalAlignment="Center" Text="{Binding SelectedEquipmentViewModel.UpgradeViewModel.EquipmentUpgradeTranslation.EquipmentUpgrades}" />
</Border>

<StackPanel
Grid.Row="1">
<ItemsControl ItemsSource="{Binding SelectedEquipmentViewModel.UpgradeViewModel.UpgradeViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<equipmentUpgrade:AlbumMasterEquipmentUpgradeControl DataContext="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>


</Grid>
</ScrollViewer>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
xmlns:helpers="clr-namespace:ElectronicObserver.Window.Tools.EquipmentUpgradePlanner.Helpers"
xmlns:local="clr-namespace:ElectronicObserver.Window.Tools.DialogAlbumMasterEquipment.EquipmentUpgrade"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DataContext="{d:DesignInstance local:AlbumMasterEquipmentUpgradeViewModel}"
d:DataContext="{d:DesignInstance local:AlbumMasterEquipmentUpgradeGroupViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d"
>
<Control.Resources>
<local:AlbumMasterEquipmentUpgradeViewModelProxy x:Key="Proxy" DataContext="{Binding}" />
<local:AlbumMasterEquipmentUpgradeGroupViewModelProxy x:Key="Proxy" DataContext="{Binding}" />

<DataTemplate x:Key="ItemCostTemplate" DataType="{x:Type local:EquipmentUpgradeItemCostViewModel}">
<StackPanel>
Expand Down Expand Up @@ -83,31 +83,9 @@
</Control.Resources>

<Grid HorizontalAlignment="Left">

<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding CanBeUpgraded}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>

<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Border
Grid.Row="0"
Padding="2"
BorderBrush="Gray"
BorderThickness="1"
>
<TextBlock HorizontalAlignment="Center" Text="{Binding EquipmentUpgradeTranslation.EquipmentUpgrades}" />
</Border>

<Border
Grid.Row="1"
Padding="5"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using System.Collections.Generic;
using System.Linq;
using ElectronicObserver.Core.Types;
using ElectronicObserver.Core.Types.Serialization.EquipmentUpgrade;
using ElectronicObserver.Utility.Data;
using ElectronicObserver.Window.Tools.EquipmentUpgradePlanner.Helpers;

namespace ElectronicObserver.Window.Tools.DialogAlbumMasterEquipment.EquipmentUpgrade;

public class AlbumMasterEquipmentUpgradeGroupViewModel
{
public IEquipmentDataMaster Equipment { get; }

/// <summary>
/// Equipment upgrade cost, its the first cost found for this equipment so it's accurate for fuel, ammo, ... and devmats/screws for 0 -> 9 upgrades
/// </summary>
public EquipmentUpgradeImprovementCost EquipmentUpgradeCost { get; private set; } = new();

public List<AlbumMasterEquipmentUpgradeLevelViewModel> RequiredItemsPerLevel { get; set; } = [];

public List<EquipmentUpgradeConversionViewModel> ConversionViewModel { get; private set; } = [];

public List<EquipmentUpgradeHelpersViewModel> Helpers { get; private set; } = [];

public AlbumMasterEquipmentUpgradeTranslationViewModel EquipmentUpgradeTranslation { get; }

public List<EquipmentUpgradeImprovementModel> Models { get; }

public AlbumMasterEquipmentUpgradeGroupViewModel(List<EquipmentUpgradeImprovementModel> improvements, AlbumMasterEquipmentUpgradeTranslationViewModel translations, IEquipmentDataMaster equipment)
{
Models = improvements;
EquipmentUpgradeTranslation = translations;
Equipment = equipment;

LoadUpgradeData();
}

private void LoadUpgradeData()
{
EquipmentUpgradeImprovementModel? firstImprovement = Models.FirstOrDefault();

if (firstImprovement is null) return;

EquipmentUpgradeCost = firstImprovement.Costs;

Helpers = Models
.SelectMany(improvement => improvement.Helpers)
.Select(helperGroup => new EquipmentUpgradeHelpersViewModel(helperGroup))
.ToList();

InitializeCostPerLevel();

ConversionViewModel = Models
.Where(improvement => improvement.ConversionData is not null)
.Where(improvement => improvement.Costs.CostMax is not null)
.Select(improvement => new EquipmentUpgradeConversionViewModel(improvement))
.ToList();
}

private void InitializeCostPerLevel()
{
RequiredItemsPerLevel = EquipmentUpgradeCost
.GetCostPerLevelRange()
.Where(range => range.StartLevel != UpgradeLevel.Conversion)
.Select(range => new AlbumMasterEquipmentUpgradeLevelViewModel(range))
.ToList();
}

public void UnsubscribeFromApis()
{
ConversionViewModel.ForEach(viewModel => viewModel.UnsubscribeFromApis());
Helpers.ForEach(viewModel => viewModel.UnsubscribeFromApis());
RequiredItemsPerLevel.ForEach(viewModel => viewModel.UnsubscribeFromApis());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

namespace ElectronicObserver.Window.Tools.DialogAlbumMasterEquipment.EquipmentUpgrade;

public class AlbumMasterEquipmentUpgradeViewModelProxy : BindingProxy<AlbumMasterEquipmentUpgradeViewModel>
public class AlbumMasterEquipmentUpgradeGroupViewModelProxy : BindingProxy<AlbumMasterEquipmentUpgradeGroupViewModel>
{
}
Loading
Loading