feat: tanks tree new algorithm (with some bugs)

This commit is contained in:
Mikhail Shabanov committed 2022-08-07 22:56:30 +02:00
1 parent a9453a4370
commit 66854c0aea
3 files changed
+84 -13

No files matched your search

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using WotBlitzStatisticsPro.Blazor.GraphQl;
namespace WotBlitzStatisticsPro.Blazor.Model
@@ -32,6 +33,8 @@ namespace WotBlitzStatisticsPro.Blazor.Model
public DateTimeOffset? LastBattleTime { get; set; }
public Decimal PriceCredit { get; set; }
public List<TankTreeRowMap>? NextRows { get; set; }
}
}
@@ -0,0 +1,4 @@
namespace WotBlitzStatisticsPro.Blazor.Model
{
public record TankTreeRowMap(long TankId, int Row);
}
@@ -79,20 +79,29 @@ namespace WotBlitzStatisticsPro.Blazor.Pages
{
TreeItems.Clear();
var vehiclesTree = VehiclesLibrary.Where(v => v.IsPremium == false).ToList();
// for (int tier = 1; tier < 11; tier++)
// {
// var vehiclesByTier = vehiclesTree.Where(v => v.Tier == tier).ToList();
// int row = 0;
// foreach (var vehicleFromDictionary in vehiclesByTier)
// {
// var treeItem = BuildNonPremTreeItem(vehicleFromDictionary, row);
// TreeItems.Add(treeItem);
// row++;
// }
// }
for (int tier = 1; tier < 11; tier++)
{
var vehiclesByTier = vehiclesTree.Where(v => v.Tier == tier).ToList();
int row = 0;
// TODO: Order
foreach (var vehicleFromDictionary in vehiclesByTier)
{
// Find previous map to figure out the row
int currentRow = FindRowFromPreviousTierMapping(vehicleFromDictionary, row);
var firstTank = vehiclesTree.First(v => v.Tier == 1);
TreeItems.AddRange(BuildTree(firstTank, 0, vehiclesTree));
var treeItem = BuildNonPremTreeItem(vehicleFromDictionary, currentRow);
// Map next tier tanks by rows
treeItem.NextRows = BuildNextTanksRowMapping(vehicleFromDictionary, currentRow);
TreeItems.Add(treeItem);
row++;
}
}
// var firstTank = vehiclesTree.First(v => v.Tier == 1);
// TreeItems.AddRange(BuildTree(firstTank, 0, vehiclesTree));
int maxNonPremTreeRow = GetMaxRowNumber(TreeItems);
// TODO: build matrix and connections
@@ -132,6 +141,61 @@ namespace WotBlitzStatisticsPro.Blazor.Pages
FrameHeigth = maxPremsCount * (CardHeigth + 20) + 20;
}
private List<TankTreeRowMap>? BuildNextTanksRowMapping(IDictionary_Vehicles vehicleFromDictionary, int currentRow)
{
List<TankTreeRowMap>? nextRowsMap = null;
if (vehicleFromDictionary.NexTanksInTree != null && vehicleFromDictionary.NexTanksInTree.Count > 0)
{
nextRowsMap = new List<TankTreeRowMap>();
if (vehicleFromDictionary.NexTanksInTree.Count == 1)
{
nextRowsMap.Add(new TankTreeRowMap(vehicleFromDictionary.NexTanksInTree[0], currentRow));
}
else
{
// If more than one, sort them AT first, Heavy, Middle and light
int nextRow = currentRow;
string[] tankTypes = { "AT-SPG", "heavyTank", "mediumTank", "lightTank" };
var nextTanksTypes = VehiclesLibrary
.Where(v => vehicleFromDictionary.NexTanksInTree.Contains(v.TankId))
.Select(v => new { v.TankId, TankType = v.TypeId })
.ToList();
foreach (var tankType in tankTypes)
{
foreach (var nextTierTank in nextTanksTypes.Where(t => t.TankType == tankType))
{
nextRowsMap.Add(new TankTreeRowMap(nextTierTank.TankId, nextRow));
nextRow++;
}
}
}
}
return nextRowsMap;
}
private int FindRowFromPreviousTierMapping(IDictionary_Vehicles vehicleFromDictionary, int currentRow)
{
var previousTierTanks = TreeItems.Where(t => t.Tier == vehicleFromDictionary.Tier - 1).ToList();
foreach (var previousTierTank in previousTierTanks)
{
if (previousTierTank.NextRows != null)
{
var rowMap =
previousTierTank.NextRows.FirstOrDefault(p => p.TankId == vehicleFromDictionary.TankId);
if (rowMap != null)
{
currentRow = rowMap.Row;
break;
}
}
}
return currentRow;
}
[Obsolete]
private List<TankTreeItem> BuildTree(IDictionary_Vehicles firstTank, int rowNumber, List<IDictionary_Vehicles> vehiclesTree)
{
var result = new List<TankTreeItem>();