Example #1
0
    float GetSortStat(PartyAdvantageStats a)
    {
        switch (sortBy)
        {
        case SortBy.AverageAdvantage: return(a.average);

        case SortBy.MinAdvantage: return(a.min);

        case SortBy.MaxAdvantage: return(a.max);

        case SortBy.BeatenByCount: return(a.predatorCount);

        case SortBy.BeatsCount: return(a.preyCount);

        case SortBy.FairCount: return(a.fairCount);

        default: return(0);
        }
    }
Example #2
0
    int Compare(PartyAdvantageStats a, PartyAdvantageStats b)
    {
        int result = GetSortStat(a).CompareTo(GetSortStat(b));

        return(ascending ? result : -result);
    }
Example #3
0
    private IEnumerator Start()
    {
        statusText.text = "Initializing...";
        yield return(null);

        var battlers = TestAllPartyBattles(out short[,,] winLossCounts);

        int banked = 0;

        while (battlers.Count > 0)
        {
            yield return(null);

            int progress = banked;
            for (int i = 0; i < battlers.Count; i++)
            {
                progress += battlers[i].progress;
                if (!battlers[i].thread.IsAlive)
                {
                    banked += battlers[i].progress;
                    battlers[i].thread.Join();
                    battlers[i] = null;
                }
            }
            battlers.RemoveAll(b => b == null);
            statusText.text = $"Evaluating match ups... {progress}/{_allParties.Length}";
        }

        battlers = null;

        statusText.text = "Computing advantages...";
        yield return(null);

        advantages = new float[_allParties.Length, _allParties.Length];

        float denominator = 0.5f / MATCHES_PER_PAIR;

        _stats = new List <PartyAdvantageStats>();

        for (int i = 0; i < _allParties.Length; i++)
        {
            PartyAdvantageStats stats = default;
            stats.partyID = (short)i;
            float advantage = 0f;
            for (int j = 0; j < _allParties.Length; j++)
            {
                if (i != j)
                {
                    advantage = (winLossCounts[i, j, 0]
                                 - winLossCounts[i, j, 1]
                                 + winLossCounts[j, i, 1]
                                 - winLossCounts[j, i, 0]) * denominator;
                }
                advantages[i, j] = advantage;

                stats.total += advantage;
                stats.max    = Mathf.Max(stats.max, advantage);
                stats.min    = Mathf.Min(stats.min, advantage);

                if (Mathf.Approximately(advantage, 0))
                {
                    stats.fairCount++;
                }
                else if (advantage > 0)
                {
                    stats.preyCount++;
                }
                else
                {
                    stats.predatorCount++;
                }
            }
            stats.average = stats.total / _allParties.Length;

            _stats.Add(stats);
        }

        statusText.text = "Tallying stats...";
        yield return(null);

        OnValidate();
        statusText.text = "Top sorted parties:";
    }