using System;
using System.Collections.Generic;
using ACE.Database.Models.World;
namespace ACE.Server.Entity
{
///
/// Represents 1 TreasureWielded set from a TreasuredWielded table
/// A roll is made for each set, from 0-TotalProbability (min. 1)
///
public class TreasureWieldedSet
{
///
/// The list of item directly in this set
/// Each item in turn can link to a subset
///
public List Items;
///
/// Returns the total nested items
/// from set items + subsets
///
public int TotalNestedItems
{
get
{
var totalItems = 0;
foreach (var item in Items)
totalItems += item.TotalNestedItems;
return totalItems;
}
}
///
/// Returns the total number of nested sets,
/// including item subsets
///
public int TotalNestedSets
{
get
{
var totalSets = 1;
foreach (var item in Items)
totalSets += item.TotalNestedSets;
return totalSets;
}
}
///
/// Returns the maximum depth of the nested sets
///
public int GetMaxDepth(int setDepth = 0)
{
var maxDepth = setDepth;
foreach (var item in Items)
{
var depth = item.GetMaxDepth(setDepth);
if (depth > maxDepth)
maxDepth = depth;
}
return maxDepth;
}
///
/// Returns the total probability of the direct items
/// minimum 100%
///
public float TotalProbability
{
get
{
var totalProbability = 0.0f;
foreach (var item in Items)
totalProbability += item.Item.Probability;
return Math.Max(totalProbability, 1.0f);
}
}
///
/// Parses 1 TreasureWielded set from a TreasuredWielded table
///
/// The list of items in the complete TreasureWielded table
/// The start index of the set to parse
public TreasureWieldedSet(List items, int startIdx, int depth = 0)
{
Items = new List();
// add set start item
var item = items[startIdx];
if (!item.SetStart)
{
Console.WriteLine($"Warning: TreasureWieldedSet constructor called with startIdx {startIdx}, and SetStart=0");
}
var node = new TreasureWieldedNode(items, startIdx);
Items.Add(node);
//Console.WriteLine($"Parsing startSet item {item.WeenieClassId} @ idx {startIdx}, depth {depth}");
// continue parsing
for (var idx = startIdx + 1; idx < items.Count; idx++)
{
var prevItem = items[idx - 1];
item = items[idx];
// handle subsets
if (prevItem.HasSubSet)
{
if (item.SetStart)
{
var subset = new TreasureWieldedSet(items, idx, depth + 1);
node.Subset = subset;
var totalItems = subset.TotalNestedItems;
idx += totalItems - 1;
}
else
Console.WriteLine($"Warning: Subset detected on line {idx - 1}, but next idx is not a set start");
}
else
{
// handle regular items
if (item.SetStart)
{
if (item.ContinuesPreviousSet)
{
// ensure subset parsed
if (node.Subset != null) // why is this here? causing bugs with 178..
{
node = new TreasureWieldedNode(items, idx);
Items.Add(node);
}
else
{
if (depth == 0)
Console.WriteLine($"Warning: continuing a previous set on line {idx}, but no subset found!");
else
break; // back to parent
}
}
else
{
// set completed
break;
}
}
else
{
// normal set continues...
node = new TreasureWieldedNode(items, idx);
Items.Add(node);
}
}
}
}
}
}