Jump to content

Adding AI To Mids, Proof of Concept


Recommended Posts

I've decided to add some AI to Mids to help players optimize their IO slotting. The AI will allow you to maximize various set bonuses, such as defense or resistance. This thread is to discuss the first step in implementing the AI: developing a proof of concept.

 

Fair warning, it will be mostly technical mumbo jumbo on the internals of Mids. For those familiar with the internals of Mids, it will be a chance to provide feedback on my understanding of the code. For those not familiar with the internals of Mids, it will be a chance to get an idea for what the capabilities of the AI will be.

  • Like 2
Link to comment
Share on other sites

The first step to enabling AI to maximize set bonuses is determining what sets provide the desired bonus. I've gone through the Mids code and I believe the following outline describes how this would be done.

 

How the information is stored in Mids

* There's an enhancement enum called eType. It's in Enums.cs. Enhancements that are part of a set have a type of SetO.
* Power.Effects contains the effects for powers.
* For defense and resistance check Power.Effects.DamageType, Power.Effects.EffectType, and Power.Effects.Scale.
* EffectTypes are defined in the eEffectType enum in Enums.cs.
* DamageTypes are defined in the eDamage enum in Enum.cs.
* Enhancements are stored in the database at DatabaseAPI.Database.Enhancements
* Enhancemnet Bonuses are stored in the database at Database.EnhancementSets.Bonus. This is an array of indexes into the powers array. E.g. 7769
* Valid enhancements for a power are obtained using GetValidEnhancements in Powers.cs
* An Enhancement knows what set it is a member of using the UIDSet member. This is set to an empty string for enhancements not part of a set.

 

To get all the sets for a power that have a specified bonus type you would:
1) Get all valid enhancements for the power. (GetValidEnhancements(Enums.eType.SetO) in Powers.cs)
2) Discard enhancement sets that do not have the desired bonus. (Look up all bonuses in bonus array, index into powers)

 

Edited by magicjtv
Corrected the steps needed to get set bonuses.
  • Like 1
Link to comment
Share on other sites

The code to determine what sets have the desired bonuses in now in place and tested.

 

When called against the Single Shot power for Crabs, it produces the following results

 

For Any Defense Bonuses

Maelstrom's Fury
Ruin
Thunderstrike
Devastation
Exploited Vulnerability
Achilles' Heel
Undermined Defenses
Apocalypse
Shield Breaker
Gladiator's Javelin
Overwhelming Force
Spider's Bite
Superior Spider's Bite
Winter's Bite
Superior Winter's Bite

 

For Psionic Defense Bonuses

Devastation
Apocalypse

 

For Endurance Discount

<None>

 

There were no code changes required, only additions. All the code additions were in the DatabaseAPI.cs file. The additions are provided below. Just append the code to the DatabaseAPI class.

Spoiler


    // NEW CODE FOR DatabaseAPI.cs
    public static IPower GetPowerByIndex(int index)
    {
        if (index < 0 || index > Database.Power.Length - 1)
            return null;
        return Database.Power[index];
    }

    public static IEnhancement GetEnhancementByIndex(int index)
    {
        if (index < 0 || index > Database.Enhancements.Length - 1)
            return null;
        return Database.Enhancements[index];
    }

    public static EnhancementSet GetEnhancementSet(IEnhancement enhancement)
    {
        foreach (EnhancementSet enhancementSet in Database.EnhancementSets)
        {
            if (enhancementSet.Uid == enhancement.UIDSet)
                return enhancementSet;
        }
        return null;
    }

    public static List<IPower> GetBonusPowers(EnhancementSet enhancementSet)
    {
        List<IPower> bonusPowers = new List<IPower>();
        if (null == enhancementSet)
            return bonusPowers;
        foreach (EnhancementSet.BonusItem bonusItem in enhancementSet.Bonus)
        {
            for (int bonusIndex = 0; bonusIndex < bonusItem.Index.Length; ++bonusIndex)
            {
                int powerIndex = bonusItem.Index[bonusIndex];
                IPower bonusPower = GetPowerByIndex(powerIndex);
                if (null == bonusPower)
                    continue;
                bonusPowers.Add(bonusPower);
            }
        }
        return bonusPowers;
    }

    public static bool HasBonusEffect(EnhancementSet enhancementSet, Enums.eEffectType effectType, Enums.eDamage damageType = Enums.eDamage.None)
    {
        List<IPower> bonusPowers = GetBonusPowers(enhancementSet);

        foreach (IPower bonusPower in bonusPowers)
        {
            foreach (IEffect effect in bonusPower.Effects)
            {
                if (effect.EffectType != effectType)
                    continue;
                if (Enums.eDamage.None == damageType)
                    return true;
                if (effect.DamageType == damageType)
                    return true;
            }
        }
        return false;
    }

    public static HashSet<EnhancementSet> GetEnhancementSetsWithBonusEffect(IPower power, Enums.eEffectType effectType, Enums.eDamage damageType = Enums.eDamage.None)
    {
        HashSet<EnhancementSet> enhancementSets = new HashSet<EnhancementSet>();
        int[] validEnhancements = power.GetValidEnhancements(Enums.eType.SetO);

        for (int validEnhancementsIndex = 0; validEnhancementsIndex <= validEnhancements.Length - 1; ++validEnhancementsIndex)
        {
            IEnhancement enhancement = GetEnhancementByIndex(validEnhancements[validEnhancementsIndex]);
            if (null == enhancement)
                continue;
            EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
            if (null == enhancementSet)
                continue;
            if (!HasBonusEffect(enhancementSet, effectType, damageType))
                continue;
            enhancementSets.Add(enhancementSet);
        }
        return enhancementSets;
    }

    // Call this after all database info has loaded, such as at the end of LoadEnhancementDb()
    public static void TestNewCode()
    {
        TestGetPowerByIndex();
        TestGetEnhancementByIndex();
        TestGetEnhancementSet();
        TestGetBonusPowers();
        TestHasBonusEffect();
        TestGetEnhancementSetsWithBonusEffect();
    }

    public static void TestGetPowerByIndex()
    {
        IPower power = GetPowerByIndex(0);
        Debug.Assert(power != null, "power is null!");
        Debug.Assert(power.DisplayName == "Single Shot", "power.DisplayName is incorrect!");

        power = GetPowerByIndex(100);
        Debug.Assert(power != null, "enhancement is null!");
        Debug.Assert(power.DisplayName == "Blaze", "power.DisplayName is incorrect!");

        power = GetPowerByIndex(11000);
        Debug.Assert(power == null, "power is not null!");
    }

    public static void TestGetEnhancementByIndex()
    {
        IEnhancement enhancement = GetEnhancementByIndex(0);
        Debug.Assert(enhancement != null, "enhancement is null!");
        Debug.Assert(enhancement.Name == "Accuracy", "enhancement.Name is incorrect!");

        enhancement = GetEnhancementByIndex(100);
        Debug.Assert(enhancement != null, "enhancement is null!");
        Debug.Assert(enhancement.Name == "Accuracy/Damage/Endurance", "enhancement.Name is incorrect!");

        enhancement = GetEnhancementByIndex(1300);
        Debug.Assert(enhancement == null, "enhancement is not null!");
    }

    public static void TestGetEnhancementSet()
    {
        IEnhancement enhancement = GetEnhancementByIndex(0);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        Debug.Assert(enhancementSet == null, "enhancementSet is not null!");

        enhancement = GetEnhancementByIndex(200);
        enhancementSet = GetEnhancementSet(enhancement);
        Debug.Assert(enhancementSet != null, "enhancementSet is null!");
        Debug.Assert(enhancementSet.DisplayName == "Executioner's Contract", "enhancementSet.DisplayName is incorrect!");
    }

    public static void TestGetBonusPowers()
    {
        IEnhancement enhancement = GetEnhancementByIndex(200);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        List<IPower> bonusPowers = GetBonusPowers(enhancementSet);

        Debug.Assert(bonusPowers.Count == 5, "bonusPowers.Count is incorrect!");
        IPower[] bonusPowersArray = bonusPowers.ToArray();

        Debug.Assert(bonusPowersArray[0].DisplayName == "Ultimate Improved Recharge Time Bonus", "bonusPowersArray[0].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[1].DisplayName == "Ultimate Fear Resistance Bonus", "bonusPowersArray[1].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[2].DisplayName == "Tiny Improved Regeneration Bonus", "bonusPowersArray[2].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[3].DisplayName == "Tiny Lethal, Smash and Mez Resistance", "bonusPowersArray[3].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[4].DisplayName == "Small Increased Ranged/Energy/Negative Energy Def Bonus", "bonusPowersArray[4].DisplayName is incorrect!");

        bonusPowers = GetBonusPowers(null);
        Debug.Assert(bonusPowers.Count == 0, "bonusPowers.Count is incorrect!");
    }

    public static void TestHasBonusEffect()
    {
        IEnhancement enhancement = GetEnhancementByIndex(200);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        bool hasEnergyDefenseBonus = HasBonusEffect(enhancementSet, Enums.eEffectType.Defense, Enums.eDamage.Energy);
        Debug.Assert(hasEnergyDefenseBonus == true, "hasEnergyDefenseBonus is incorrect!");

        bool hasEnergyResistanceBonus = HasBonusEffect(enhancementSet, Enums.eEffectType.Resistance, Enums.eDamage.Energy);
        Debug.Assert(hasEnergyResistanceBonus == false, "hasEnergyResistanceBonus is incorrect!");

        bool hasDefenseBonus = HasBonusEffect(enhancementSet, Enums.eEffectType.Defense);
        Debug.Assert(hasDefenseBonus == true, "hasDefenseBonus is incorrect!");

        bool hasResistanceBonus = HasBonusEffect(enhancementSet, Enums.eEffectType.Resistance);
        Debug.Assert(hasResistanceBonus == true, "hasResistanceBonus is incorrect!");

        bool hasFireDefenseBonus = HasBonusEffect(enhancementSet, Enums.eEffectType.Defense, Enums.eDamage.Fire);
        Debug.Assert(hasFireDefenseBonus == false, "hasFireDefenseBonus is incorrect!");

        bool hasFireResistanceBonus = HasBonusEffect(enhancementSet, Enums.eEffectType.Resistance, Enums.eDamage.Fire);
        Debug.Assert(hasFireResistanceBonus == false, "hasFireResistanceBonus is incorrect!");
    }

    public static void TestGetEnhancementSetsWithBonusEffect()
    {
        IPower power = GetPowerByIndex(0);
        HashSet<EnhancementSet> defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, Enums.eEffectType.Defense);
        Debug.Assert(defenseBonusSets.Count == 15, "defenseBonusSets.Count is incorrect!");
        EnhancementSet[] defenseBonusSetsArray = defenseBonusSets.ToArray();

        Debug.Assert(defenseBonusSetsArray[0].DisplayName == "Maelstrom's Fury", "defenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[1].DisplayName == "Ruin", "defenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[2].DisplayName == "Thunderstrike", "defenseBonusSetsArray[2].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[3].DisplayName == "Devastation", "defenseBonusSetsArray[3].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[4].DisplayName == "Exploited Vulnerability", "defenseBonusSetsArray[4].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[5].DisplayName == "Achilles' Heel", "defenseBonusSetsArray[5].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[6].DisplayName == "Undermined Defenses", "defenseBonusSetsArray[6].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[7].DisplayName == "Apocalypse", "defenseBonusSetsArray[7].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[8].DisplayName == "Shield Breaker", "defenseBonusSetsArray[8].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[9].DisplayName == "Gladiator's Javelin", "defenseBonusSetsArray[9].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[10].DisplayName == "Overwhelming Force", "defenseBonusSetsArray[10].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[11].DisplayName == "Spider's Bite", "defenseBonusSetsArray[11].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[12].DisplayName == "Superior Spider's Bite", "defenseBonusSetsArray[12].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[13].DisplayName == "Winter's Bite", "defenseBonusSetsArray[13].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[14].DisplayName == "Superior Winter's Bite", "defenseBonusSetsArray[14].DisplayName is incorrect!");
        Debug.Print("Defense");
        foreach (EnhancementSet enhancementSet in defenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }

        HashSet<EnhancementSet> psionicDefenseBonusSets = GetEnhancementSetsWithBonusEffect(power, Enums.eEffectType.Defense, Enums.eDamage.Psionic);
        Debug.Assert(psionicDefenseBonusSets.Count == 2, "psionicDefenseBonusSets.Count is incorrect!");
        EnhancementSet[] psionicDefenseBonusSetsArray = psionicDefenseBonusSets.ToArray();

        Debug.Assert(psionicDefenseBonusSetsArray[0].DisplayName == "Devastation", "psionicDefenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(psionicDefenseBonusSetsArray[1].DisplayName == "Apocalypse", "psionicDefenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Print(" ");
        Debug.Print("Psionic Defense");
        foreach (EnhancementSet enhancementSet in psionicDefenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }

        HashSet<EnhancementSet> enduranceDiscountBonusSets = GetEnhancementSetsWithBonusEffect(power, Enums.eEffectType.EnduranceDiscount);
        Debug.Assert(enduranceDiscountBonusSets.Count == 0, "enduranceDiscountBonusSets.Count is incorrect!");
        Debug.Print(" ");
        Debug.Print("EnduranceDiscount");
        foreach (EnhancementSet enhancementSet in enduranceDiscountBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
    }

 

  • Like 1
Link to comment
Share on other sites

The code has been updated with the following features:

 

  1. Different numbers of slots are supported, whereas the previous code assumed everything was 6-slotted.
  2. Ability to determine which set in a group of sets has the highest bonus values.
  3. Fixed a bug in the retrieval of bonus powers.

 

When called against the Single Shot power for Crabs, it produces the following results:

 

For Any Defense Bonuses

Defense (6 slots)
Maelstrom's Fury
Ruin
Thunderstrike
Devastation
Exploited Vulnerability
Achilles' Heel
Undermined Defenses
Apocalypse
Shield Breaker
Overwhelming Force
Spider's Bite
Superior Spider's Bite
Winter's Bite
Superior Winter's Bite
 
Psionic Defense (6 slots)
Devastation
Apocalypse
 
EnduranceDiscount (6 slots)

<None>
 
Defense (5 slots)
Maelstrom's Fury
Ruin
Thunderstrike
Exploited Vulnerability
Achilles' Heel
Shield Breaker
Overwhelming Force
Spider's Bite
Superior Spider's Bite
Winter's Bite
Superior Winter's Bite
 
Defense (4 slots)
Maelstrom's Fury
Thunderstrike
Exploited Vulnerability
Achilles' Heel
Shield Breaker
Spider's Bite
Superior Spider's Bite
 
Defense (3 slots)
Maelstrom's Fury
Thunderstrike
Exploited Vulnerability
Achilles' Heel
 
Defense (2 slots)

<None>
 

For Highest Defense Bonuses

Highest Defense (6 slots)
Superior Winter's Bite 0.25
 
Highest Defense (5 slots)
Superior Winter's Bite 0.125
 
Highest Defense (4 slots)
Superior Spider's Bite 0.1
 
Highest Defense (3 slots)
Thunderstrike 0.0625
 
Highest Defense (2 slots)
 <None>
 
Highest Psionic Defense
Apocalypse

 

As before, there were no code changes required, only additions. All the code additions were in the DatabaseAPI.cs file. The additions are provided below. Just append the code to the DatabaseAPI class.

Spoiler


    // NEW CODE FOR DatabaseAPI.cs
    public static IPower GetPowerByIndex(int index)
    {
        if (index < 0 || index > Database.Power.Length - 1)
            return null;
        return Database.Power[index];
    }

    public static IEnhancement GetEnhancementByIndex(int index)
    {
        if (index < 0 || index > Database.Enhancements.Length - 1)
            return null;
        return Database.Enhancements[index];
    }

    public static EnhancementSet GetEnhancementSet(IEnhancement enhancement)
    {
        foreach (EnhancementSet enhancementSet in Database.EnhancementSets)
        {
            if (enhancementSet.Uid == enhancement.UIDSet)
                return enhancementSet;
        }
        return null;
    }

    public static int GetEnhancementSetIndexByName(string iName)
        => Database.EnhancementSets.TryFindIndex(enh => string.Equals(enh.ShortName, iName, StringComparison.OrdinalIgnoreCase) || string.Equals(enh.DisplayName, iName, StringComparison.OrdinalIgnoreCase));

    public static EnhancementSet GetEnhancementSetByIndex(int index)
    {
        if (0 > index || index >= Database.EnhancementSets.Count)
            return null;
        return Database.EnhancementSets[index];
    }

    public static List<IPower> GetBonusPowers(EnhancementSet enhancementSet)
    {
        List<IPower> bonusPowers = new List<IPower>();
        if (null == enhancementSet)
            return bonusPowers;
        foreach (EnhancementSet.BonusItem bonusItem in enhancementSet.Bonus)
        {
            for (int bonusIndex = 0; bonusIndex < bonusItem.Index.Length; ++bonusIndex)
            {
                int powerIndex = bonusItem.Index[bonusIndex] + 3;
                IPower bonusPower = GetPowerByIndex(powerIndex);
                if (null == bonusPower)
                    continue;
                bonusPowers.Add(bonusPower);
            }
        }
        return bonusPowers;
    }

    public static bool HasBonusEffect(EnhancementSet enhancementSet, int slots, Enums.eEffectType effectType, Enums.eDamage damageType = Enums.eDamage.None)
    {
        List<IPower> bonusPowers = GetBonusPowers(enhancementSet);
        if (2 > slots || 6 < slots)
            return false;

        for (int bonusPowerIndex = 0; bonusPowerIndex < bonusPowers.Count; ++bonusPowerIndex)
        {
            if (bonusPowerIndex == slots - 1)
                return false;
            IPower bonusPower = bonusPowers[bonusPowerIndex];
            for (int effectIndex = 0; effectIndex < bonusPower.Effects.Length; ++effectIndex)
            {
                IEffect effect = bonusPower.Effects[effectIndex];
                if (effect.EffectType != effectType)
                    continue;
                if (Enums.eDamage.None == damageType)
                    return true;
                if (effect.DamageType == damageType)
                    return true;
            }
        }
        return false;
    }

    public static HashSet<EnhancementSet> GetEnhancementSetsWithBonusEffect(IPower power, int slots, Enums.eEffectType effectType, Enums.eDamage damageType = Enums.eDamage.None)
    {
        HashSet<EnhancementSet> enhancementSets = new HashSet<EnhancementSet>();
        if (1 > slots || 6 < slots)
            return enhancementSets;

        int[] validEnhancements = power.GetValidEnhancements(Enums.eType.SetO);

        for (int validEnhancementsIndex = 0; validEnhancementsIndex <= validEnhancements.Length - 1; ++validEnhancementsIndex)
        {
            IEnhancement enhancement = GetEnhancementByIndex(validEnhancements[validEnhancementsIndex]);
            if (null == enhancement)
                continue;
            EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
            if (null == enhancementSet)
                continue;
            if (!HasBonusEffect(enhancementSet, slots, effectType, damageType))
                continue;
            enhancementSets.Add(enhancementSet);
        }
        return enhancementSets;
    }

    public static float SumBonusEffect(EnhancementSet enhancementSet, int slots, Enums.eEffectType effectType, Enums.eDamage damageType = Enums.eDamage.None)
    {
        float sum = 0.0f;
        if (1 > slots || 6 < slots)
            return sum;
        List<IPower> bonusPowers = GetBonusPowers(enhancementSet);

        for (int bonusPowerIndex = 0; bonusPowerIndex < bonusPowers.Count; ++bonusPowerIndex)
        {
            if (bonusPowerIndex == slots - 1)
                return sum;
            IPower bonusPower = bonusPowers[bonusPowerIndex];
            for (int effectIndex = 0; effectIndex < bonusPower.Effects.Length; ++effectIndex)
            {
                IEffect effect = bonusPower.Effects[effectIndex];
                if (effect.EffectType != effectType)
                    continue;
                if (Enums.eDamage.None == damageType || effect.DamageType == damageType)
                    sum += effect.Scale;
            }
        }
        return sum;
    }

    public static EnhancementSet GetHighestBonusEffect(HashSet<EnhancementSet> EnhancementSets, int slots, Enums.eEffectType effectType, Enums.eDamage damageType = Enums.eDamage.None)
    {
        EnhancementSet highest = null;
        if (1 > slots || 6 < slots)
            return highest;
        float sum = 0.0f;

        foreach (EnhancementSet enhancementSet in EnhancementSets)
        {
            float setSum = SumBonusEffect(enhancementSet, slots, effectType, damageType);
            if (setSum < sum)
                continue;
            sum = setSum;
            highest = enhancementSet;
        }
        return highest;
    }

    // Call this after all database info has loaded, such as at the end of LoadEnhancementDb()
    public static void TestNewCode()
    {
        TestGetPowerByIndex();
        TestGetEnhancementByIndex();
        TestGetEnhancementSet();
        TestGetBonusPowers();
        TestHasBonusEffect();
        TestGetEnhancementSetsWithBonusEffect();
        TestSumBonusEffect();
        TestGetHighestBonusEffect();
    }

    public static void TestGetPowerByIndex()
    {
        IPower power = GetPowerByIndex(0);
        Debug.Assert(power != null, "power is null!");
        Debug.Assert(power.DisplayName == "Single Shot", "power.DisplayName is incorrect!");

        power = GetPowerByIndex(100);
        Debug.Assert(power != null, "power is null!");
        Debug.Assert(power.DisplayName == "Blaze", "power.DisplayName is incorrect!");

        power = GetPowerByIndex(11000);
        Debug.Assert(power == null, "power is not null!");
    }

    public static void TestGetEnhancementByIndex()
    {
        IEnhancement enhancement = GetEnhancementByIndex(0);
        Debug.Assert(enhancement != null, "enhancement is null!");
        Debug.Assert(enhancement.Name == "Accuracy", "enhancement.Name is incorrect!");

        enhancement = GetEnhancementByIndex(100);
        Debug.Assert(enhancement != null, "enhancement is null!");
        Debug.Assert(enhancement.Name == "Accuracy/Damage/Endurance", "enhancement.Name is incorrect!");

        enhancement = GetEnhancementByIndex(1300);
        Debug.Assert(enhancement == null, "enhancement is not null!");
    }

    public static void TestGetEnhancementSet()
    {
        IEnhancement enhancement = GetEnhancementByIndex(0);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        Debug.Assert(enhancementSet == null, "enhancementSet is not null!");

        enhancement = GetEnhancementByIndex(200);
        enhancementSet = GetEnhancementSet(enhancement);
        Debug.Assert(enhancementSet != null, "enhancementSet is null!");
        Debug.Assert(enhancementSet.DisplayName == "Executioner's Contract", "enhancementSet.DisplayName is incorrect!");

        int index = GetEnhancementSetIndexByName("Superior Winter's Bite");
        enhancementSet = GetEnhancementSetByIndex(index);
        Debug.Assert(enhancementSet.DisplayName == "Superior Winter's Bite", "enhancementSet.DisplayName is incorrect!");
    }

    public static void TestGetBonusPowers()
    {
        IEnhancement enhancement = GetEnhancementByIndex(200);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        List<IPower> bonusPowers = GetBonusPowers(enhancementSet);

        Debug.Assert(bonusPowers.Count == 5, "bonusPowers.Count is incorrect!");
        IPower[] bonusPowersArray = bonusPowers.ToArray();

        foreach (IPower power in bonusPowersArray)
        {
            Debug.Print(power.DisplayName);
        }
        Debug.Assert(bonusPowersArray[0].DisplayName == "Moderate Improved Recovery Bonus", "bonusPowersArray[0].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[1].DisplayName == "Moderate Fire, Cold and Mez Resistance", "bonusPowersArray[1].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[2].DisplayName == "Large Improved Regeneration Bonus", "bonusPowersArray[2].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[3].DisplayName == "Large Lethal, Smash and Mez Resistance", "bonusPowersArray[3].DisplayName is incorrect!");
        Debug.Assert(bonusPowersArray[4].DisplayName == "Huge Increased Ranged/Energy/Negative Energy Def Bonus", "bonusPowersArray[4].DisplayName is incorrect!");

        bonusPowers = GetBonusPowers(null);
        Debug.Assert(bonusPowers.Count == 0, "bonusPowers.Count is incorrect!");
    }

    public static void TestHasBonusEffect()
    {
        IEnhancement enhancement = GetEnhancementByIndex(200);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        bool hasEnergyDefenseBonus = HasBonusEffect(enhancementSet, 6, Enums.eEffectType.Defense, Enums.eDamage.Energy);
        Debug.Assert(hasEnergyDefenseBonus == true, "hasEnergyDefenseBonus is incorrect!");

        bool hasEnergyResistanceBonus = HasBonusEffect(enhancementSet, 6, Enums.eEffectType.Resistance, Enums.eDamage.Energy);
        Debug.Assert(hasEnergyResistanceBonus == false, "hasEnergyResistanceBonus is incorrect!");

        bool hasDefenseBonus = HasBonusEffect(enhancementSet, 6, Enums.eEffectType.Defense);
        Debug.Assert(hasDefenseBonus == true, "hasDefenseBonus is incorrect!");

        bool hasResistanceBonus = HasBonusEffect(enhancementSet, 6, Enums.eEffectType.Resistance);
        Debug.Assert(hasResistanceBonus == true, "hasResistanceBonus is incorrect!");

        bool hasFireDefenseBonus = HasBonusEffect(enhancementSet, 6, Enums.eEffectType.Defense, Enums.eDamage.Fire);
        Debug.Assert(hasFireDefenseBonus == false, "hasFireDefenseBonus is incorrect!");

        bool hasFireResistanceBonus = HasBonusEffect(enhancementSet, 6, Enums.eEffectType.Resistance, Enums.eDamage.Fire);
        Debug.Assert(hasFireResistanceBonus == true, "hasFireResistanceBonus is incorrect!");

        hasEnergyDefenseBonus = HasBonusEffect(enhancementSet, 5, Enums.eEffectType.Defense, Enums.eDamage.Energy);
        Debug.Assert(hasEnergyDefenseBonus == false, "hasEnergyDefenseBonus is incorrect!");

        bool hasSmashingResistanceBonus = HasBonusEffect(enhancementSet, 5, Enums.eEffectType.Resistance, Enums.eDamage.Smashing);
        Debug.Assert(hasSmashingResistanceBonus == true, "hasSmashingResistanceBonus is incorrect!");

        hasSmashingResistanceBonus = HasBonusEffect(enhancementSet, 4, Enums.eEffectType.Resistance, Enums.eDamage.Smashing);
        Debug.Assert(hasSmashingResistanceBonus == false, "hasSmashingResistanceBonus is incorrect!");

        bool hasRegenerationBonus = HasBonusEffect(enhancementSet, 4, Enums.eEffectType.Regeneration, Enums.eDamage.None);
        Debug.Assert(hasRegenerationBonus == true, "hasRegenerationBonus is incorrect!");

        hasRegenerationBonus = HasBonusEffect(enhancementSet, 3, Enums.eEffectType.Regeneration, Enums.eDamage.None);
        Debug.Assert(hasRegenerationBonus == false, "hasRegenerationBonus is incorrect!");

        hasFireResistanceBonus = HasBonusEffect(enhancementSet, 3, Enums.eEffectType.Resistance, Enums.eDamage.Fire);
        Debug.Assert(hasFireResistanceBonus == true, "hasFireResistanceBonus is incorrect!");

        hasFireResistanceBonus = HasBonusEffect(enhancementSet, 2, Enums.eEffectType.Resistance, Enums.eDamage.Fire);
        Debug.Assert(hasFireResistanceBonus == false, "hasFireResistanceBonus is incorrect!");
    }

    public static void TestGetEnhancementSetsWithBonusEffect()
    {
        IPower power = GetPowerByIndex(0);
        HashSet<EnhancementSet> defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 6, Enums.eEffectType.Defense);
        Debug.Print("Defense (6 slots)");
        foreach (EnhancementSet enhancementSet in defenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
        Debug.Assert(defenseBonusSets.Count == 14, "defenseBonusSets.Count is incorrect!");
        EnhancementSet[] defenseBonusSetsArray = defenseBonusSets.ToArray();
        Debug.Assert(defenseBonusSetsArray[0].DisplayName == "Maelstrom's Fury", "defenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[1].DisplayName == "Ruin", "defenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[2].DisplayName == "Thunderstrike", "defenseBonusSetsArray[2].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[3].DisplayName == "Devastation", "defenseBonusSetsArray[3].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[4].DisplayName == "Exploited Vulnerability", "defenseBonusSetsArray[4].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[5].DisplayName == "Achilles' Heel", "defenseBonusSetsArray[5].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[6].DisplayName == "Undermined Defenses", "defenseBonusSetsArray[6].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[7].DisplayName == "Apocalypse", "defenseBonusSetsArray[7].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[8].DisplayName == "Shield Breaker", "defenseBonusSetsArray[8].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[9].DisplayName == "Overwhelming Force", "defenseBonusSetsArray[9].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[10].DisplayName == "Spider's Bite", "defenseBonusSetsArray[10].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[11].DisplayName == "Superior Spider's Bite", "defenseBonusSetsArray[11].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[12].DisplayName == "Winter's Bite", "defenseBonusSetsArray[12].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[13].DisplayName == "Superior Winter's Bite", "defenseBonusSetsArray[13].DisplayName is incorrect!");

        HashSet<EnhancementSet> psionicDefenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 6, Enums.eEffectType.Defense, Enums.eDamage.Psionic);
        Debug.Assert(psionicDefenseBonusSets.Count == 2, "psionicDefenseBonusSets.Count is incorrect!");
        EnhancementSet[] psionicDefenseBonusSetsArray = psionicDefenseBonusSets.ToArray();

        Debug.Assert(psionicDefenseBonusSetsArray[0].DisplayName == "Devastation", "psionicDefenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(psionicDefenseBonusSetsArray[1].DisplayName == "Apocalypse", "psionicDefenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Print(" ");
        Debug.Print("Psionic Defense (6 slots)");
        foreach (EnhancementSet enhancementSet in psionicDefenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }

        HashSet<EnhancementSet> enduranceDiscountBonusSets = GetEnhancementSetsWithBonusEffect(power, 6, Enums.eEffectType.EnduranceDiscount);
        Debug.Assert(enduranceDiscountBonusSets.Count == 0, "enduranceDiscountBonusSets.Count is incorrect!");
        Debug.Print(" ");
        Debug.Print("EnduranceDiscount (6 slots)");
        foreach (EnhancementSet enhancementSet in enduranceDiscountBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
        Debug.Print(" ");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 5, Enums.eEffectType.Defense);
        Debug.Print("Defense (5 slots)");
        foreach (EnhancementSet enhancementSet in defenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
        Debug.Assert(defenseBonusSets.Count == 11, "defenseBonusSets.Count is incorrect!");
        defenseBonusSetsArray = defenseBonusSets.ToArray();
        Debug.Assert(defenseBonusSetsArray[0].DisplayName == "Maelstrom's Fury", "defenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[1].DisplayName == "Ruin", "defenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[2].DisplayName == "Thunderstrike", "defenseBonusSetsArray[2].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[3].DisplayName == "Exploited Vulnerability", "defenseBonusSetsArray[3].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[4].DisplayName == "Achilles' Heel", "defenseBonusSetsArray[4].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[5].DisplayName == "Shield Breaker", "defenseBonusSetsArray[5].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[6].DisplayName == "Overwhelming Force", "defenseBonusSetsArray[6].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[7].DisplayName == "Spider's Bite", "defenseBonusSetsArray[7].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[8].DisplayName == "Superior Spider's Bite", "defenseBonusSetsArray[8].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[9].DisplayName == "Winter's Bite", "defenseBonusSetsArray[9].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[10].DisplayName == "Superior Winter's Bite", "defenseBonusSetsArray[10].DisplayName is incorrect!");
        Debug.Print(" ");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 4, Enums.eEffectType.Defense);
        Debug.Print("Defense (4 slots)");
        foreach (EnhancementSet enhancementSet in defenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
        Debug.Assert(defenseBonusSets.Count == 7, "defenseBonusSets.Count is incorrect!");
        defenseBonusSetsArray = defenseBonusSets.ToArray();
        Debug.Assert(defenseBonusSetsArray[0].DisplayName == "Maelstrom's Fury", "defenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[1].DisplayName == "Thunderstrike", "defenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[2].DisplayName == "Exploited Vulnerability", "defenseBonusSetsArray[2].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[3].DisplayName == "Achilles' Heel", "defenseBonusSetsArray[3].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[4].DisplayName == "Shield Breaker", "defenseBonusSetsArray[4].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[5].DisplayName == "Spider's Bite", "defenseBonusSetsArray[5].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[6].DisplayName == "Superior Spider's Bite", "defenseBonusSetsArray[6].DisplayName is incorrect!");
        Debug.Print(" ");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 3, Enums.eEffectType.Defense);
        Debug.Print("Defense (3 slots)");
        foreach (EnhancementSet enhancementSet in defenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
        Debug.Assert(defenseBonusSets.Count == 4, "defenseBonusSets.Count is incorrect!");
        defenseBonusSetsArray = defenseBonusSets.ToArray();
        Debug.Assert(defenseBonusSetsArray[0].DisplayName == "Maelstrom's Fury", "defenseBonusSetsArray[0].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[1].DisplayName == "Thunderstrike", "defenseBonusSetsArray[1].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[2].DisplayName == "Exploited Vulnerability", "defenseBonusSetsArray[2].DisplayName is incorrect!");
        Debug.Assert(defenseBonusSetsArray[3].DisplayName == "Achilles' Heel", "defenseBonusSetsArray[3].DisplayName is incorrect!");
        Debug.Print(" ");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 2, Enums.eEffectType.Defense);
        Debug.Print("Defense (2 slots)");
        foreach (EnhancementSet enhancementSet in defenseBonusSets)
        {
            Debug.Print(enhancementSet.DisplayName);
        }
        Debug.Assert(defenseBonusSets.Count == 0, "defenseBonusSets.Count is incorrect!");
        Debug.Print(" ");
    }

    public static void TestSumBonusEffect()
    {
        IEnhancement enhancement = GetEnhancementByIndex(200);
        EnhancementSet enhancementSet = GetEnhancementSet(enhancement);
        float sum = SumBonusEffect(enhancementSet, 6, Enums.eEffectType.Defense, Enums.eDamage.None);
        Debug.Assert(sum >= 0.075 && sum < 0.0752, "sum is incorrect!");

        sum = SumBonusEffect(enhancementSet, 5, Enums.eEffectType.Defense, Enums.eDamage.None);
        Debug.Assert(sum == 0.0, "sum is incorrect!");

        sum = SumBonusEffect(enhancementSet, 6, Enums.eEffectType.Resistance, Enums.eDamage.None);
        Debug.Assert(sum > 0.13444 && sum < 0.135, "sum is incorrect!");
    }

    public static void TestGetHighestBonusEffect()
    {
        IPower power = GetPowerByIndex(0);
        HashSet<EnhancementSet> defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 6, Enums.eEffectType.Defense);
        EnhancementSet highestBonusEffect = GetHighestBonusEffect(defenseBonusSets, 6, Enums.eEffectType.Defense);
        Debug.Print("Highest Defense (6 slots)");
        Debug.Print(highestBonusEffect.DisplayName + " " + SumBonusEffect(highestBonusEffect, 6, Enums.eEffectType.Defense));
        Debug.Print(" ");
        Debug.Assert(highestBonusEffect.DisplayName == "Superior Winter's Bite", "highestBonusEffect.DisplayName is incorrect!");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 5, Enums.eEffectType.Defense);
        highestBonusEffect = GetHighestBonusEffect(defenseBonusSets, 5, Enums.eEffectType.Defense);
        Debug.Print("Highest Defense (5 slots)");
        Debug.Print(highestBonusEffect.DisplayName + " " + SumBonusEffect(highestBonusEffect, 5, Enums.eEffectType.Defense));
        Debug.Print(" ");
        Debug.Assert(highestBonusEffect.DisplayName == "Superior Winter's Bite", "highestBonusEffect.DisplayName is incorrect!");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 4, Enums.eEffectType.Defense);
        highestBonusEffect = GetHighestBonusEffect(defenseBonusSets, 4, Enums.eEffectType.Defense);
        Debug.Print("Highest Defense (4 slots)");
        Debug.Print(highestBonusEffect.DisplayName + " " + SumBonusEffect(highestBonusEffect, 4, Enums.eEffectType.Defense));
        Debug.Print(" ");
        Debug.Assert(highestBonusEffect.DisplayName == "Superior Spider's Bite", "highestBonusEffect.DisplayName is incorrect!");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 3, Enums.eEffectType.Defense);
        highestBonusEffect = GetHighestBonusEffect(defenseBonusSets, 3, Enums.eEffectType.Defense);
        Debug.Print("Highest Defense (3 slots)");
        Debug.Print(highestBonusEffect.DisplayName + " " + SumBonusEffect(highestBonusEffect, 3, Enums.eEffectType.Defense));
        Debug.Print(" ");
        Debug.Assert(highestBonusEffect.DisplayName == "Thunderstrike", "highestBonusEffect.DisplayName is incorrect!");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 2, Enums.eEffectType.Defense);
        highestBonusEffect = GetHighestBonusEffect(defenseBonusSets, 2, Enums.eEffectType.Defense);
        Debug.Print("Highest Defense (2 slots)");
        if (null != highestBonusEffect) Debug.Print(highestBonusEffect.DisplayName + " " + SumBonusEffect(highestBonusEffect, 2, Enums.eEffectType.Defense));
        Debug.Print(" ");

        defenseBonusSets = GetEnhancementSetsWithBonusEffect(power, 6, Enums.eEffectType.Defense, Enums.eDamage.Psionic);
        highestBonusEffect = GetHighestBonusEffect(defenseBonusSets, 6, Enums.eEffectType.Defense, Enums.eDamage.Psionic);
        Debug.Print(" ");
        Debug.Print("Highest Psionic Defense");
        Debug.Print(highestBonusEffect.DisplayName);
        Debug.Assert(highestBonusEffect.DisplayName == "Apocalypse", "highestBonusEffect.DisplayName is incorrect!");
    }

 

Edited by magicjtv
Added test results
  • Like 1
Link to comment
Share on other sites

I haven't checked it out yet, but I look forward to seeing your progress.

  • Like 1

PPM Information Guide               Survivability Tool                  Interface DoT Procs Guide

Time Manipulation Guide             Bopper Builds                      +HP/+Regen Proc Cheat Sheet

Super Pack Drop Percentages       Recharge Guide                   Base Empowerment: Temp Powers


Bopper's Tools & Formulas                         Mids' Reborn                       

Link to comment
Share on other sites

As part of testing, I've created a csv file with all the bonuses for all the sets. I thought this may be useful for everyone who wants to find specific types of set bonuses, so I'm attaching the file here.

 

enhancement-set-bonus.csv

enhancement-bonuses.PNG

  • Thanks 2
Link to comment
Share on other sites

Status update. 

  • The new code is now over 1000 lines. The vast majority of this is testing code. If you want to understand how the new features work, the testing code is the place to go. Testing functions all start with the word "Test".
  • We can now create a build complete with powersets, powers, and slots, that is independent of the build you see in the UI. This will be used by the AI.
  • Slots can be added or removed to/from the AI build.
  • Enhancements can be changed in the AI build.
  • Enhancement bonuses can be summed for each power in the AI build.

The changes are contained in two files, which I'm attaching here for those who want to see the code.

 

DatabaseAPI.cs PowerEntry.cs

Link to comment
Share on other sites

The code done so far is loosely based on Robotics, with the functions that detect powers, enhancements, and bonuses playing the role of sensors and the functions that change these values acting as manipulators.

 

The actual brain that controls these sensors and manipulators will be built using evolutionary programming. It will do the following:

  1. Start with a given build and a goal on what we want to improve.
  2. Make a random change to a power (Mutation function).
  3. If the change is closer to the goal than the original, keep the change, otherwise revert to the original (Fitness function).
  4. Repeat steps 2 and 3 ten times for the power.
  5. Do steps 2-4 for every power.
  6. Do steps 2-5 one hundred times. (100 generations).
Link to comment
Share on other sites

15 hours ago, magicjtv said:

The actual brain that controls these sensors and manipulators will

 

Develop a megalomaniacal psychosis after removal of its ethical constraints, commandeer the ISS and begin genetic and cybernetic experimentation with the goal of redesigning all life?

 

Please say yes, please say yes, please say yes...

  • Haha 3

Get busy living... or get busy dying.  That's goddamn right.

Link to comment
Share on other sites

7 hours ago, Luminara said:

 

Develop a megalomaniacal psychosis after removal of its ethical constraints, commandeer the ISS and begin genetic and cybernetic experimentation with the goal of redesigning all life?

 

Please say yes, please say yes, please say yes...

Yes. 😈

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

Status update. 

  • The new code is now over 2000 lines. The vast majority of this is testing code. 
  • Code for sorting, comparing, and cloning various things has been added.
  • The first part of the AI is complete. It is a simple mutation that just puts the best available set into all the slots of a power. Additional mutation algorithms will soon be added.
  • Support for unique enhancement bonuses, like Steadfast Protection +3 defense is not included. That feature won't ever be in the proof of concept, but will be added to later versions.

If you're interested in seeing what the AI is producing, here's the build it uses in its tests:

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Powers ===
* Health: Heal, Heal, Heal, 
* Stamina: EndMod, EndMod, EndMod, 
* Mesmerize: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, 
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, 
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Levitate: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, 
* Dominate: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, 
* Confuse: Acc, Acc, Acc, RechRdx, RechRdx, RechRdx, 
* Stealth: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Mass Hypnosis: Acc, RechRdx, RechRdx, RechRdx, EndRdx, EndRdx, 
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, 
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, 
* Total Domination: Acc, 
* Terrify: Acc, 
* Boxing: Acc, 
* Tough: EndRdx, 
* Weave: EndRdx, 
* Mass Confusion: Acc, 
* Force Bubble: EndRdx, 
* Repulsion Bomb: Acc, 
* Force Bolt: Acc, 
* Repulsion Field: EndRdx, 
* Detention Field: Acc, 

 

When asked to optimize the build for smashing defense, the AI produces this (Toon Smashing Defense Totals: Before: 0 After: 0.05):

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Powers ===
* Health: Heal, Heal, Heal, 
* Stamina: EndMod, EndMod, EndMod, 
* Mesmerize: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Lethargic Repose Acc/Sleep/Rchg, Lethargic Repose Acc/Sleep, 
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, 
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Levitate: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, 
* Dominate: Neuronic Shutdown Acc/Rchg, Neuronic Shutdown EndRdx/Hold, Neuronic Shutdown Acc/EndRdx, Neuronic Shutdown Hold/Rng, Neuronic Shutdown Acc/Hold/Rchg, Neuronic Shutdown Dam%, 
* Confuse: Acc, Acc, Acc, RechRdx, RechRdx, RechRdx, 
* Stealth: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Lethargic Repose Acc/Sleep/Rchg, Lethargic Repose Acc/Sleep, 
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, 
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, 
* Total Domination: Acc, 
* Terrify: Acc, 
* Boxing: Acc, 
* Tough: EndRdx, 
* Weave: EndRdx, 
* Mass Confusion: Acc, 
* Force Bubble: EndRdx, 
* Repulsion Bomb: Acc, 
* Force Bolt: Acc, 
* Repulsion Field: EndRdx, 
* Detention Field: Acc, 

 

 

When asked to optimize the build for psionic defense, the AI produces this (Toon Psionic Defense Totals: Before: 0 After: 0.125)

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Powers ===
* Health: Heal, Heal, Heal, 
* Stamina: EndMod, EndMod, EndMod, 
* Mesmerize: Apocalypse Dmg, Apocalypse Dmg/Rchg, Apocalypse Acc/Dmg/Rchg, Apocalypse Acc/Rchg, Apocalypse Dmg/EndRdx, Apocalypse Dam%, 
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, 
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Levitate: Devastation Acc/Dmg, Devastation Dmg/EndRdx, Devastation Dmg/Rchg, Devastation Acc/Dmg/Rchg, Devastation Acc/Dmg/EndRdx/Rchg, Devastation Hold%, 
* Dominate: Devastation Acc/Dmg, Devastation Dmg/EndRdx, Devastation Dmg/Rchg, Devastation Acc/Dmg/Rchg, Devastation Acc/Dmg/EndRdx/Rchg, Devastation Hold%, 
* Confuse: Acc, Acc, Acc, RechRdx, RechRdx, RechRdx, 
* Stealth: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, 
* Mass Hypnosis: Acc, RechRdx, RechRdx, RechRdx, EndRdx, EndRdx, 
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, 
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, 
* Total Domination: Acc, 
* Terrify: Acc, 
* Boxing: Acc, 
* Tough: EndRdx, 
* Weave: EndRdx, 
* Mass Confusion: Acc, 
* Force Bubble: EndRdx, 
* Repulsion Bomb: Acc, 
* Force Bolt: Acc, 
* Repulsion Field: EndRdx, 
* Detention Field: Acc, 

 

When asked to optimize the build for total defense, the AI produces this (Toon Defense Totals: Before: 0 After: 1.14377)

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Powers ===
* Health: Heal, Heal, Heal, 
* Stamina: EndMod, EndMod, EndMod, 
* Mesmerize: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Superior Winter's Bite Dmg/EndRdx/Acc/Rchg, Superior Winter's Bite Rchg/SlowProc, 
* Personal Force Field: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, 
* Deflection Shield: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, 
* Levitate: Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Thunderstrike Dmg/Rchg, Thunderstrike Acc/Dmg/Rchg, Thunderstrike Acc/Dmg/EndRdx, Thunderstrike Dmg/EndRdx/Rchg, 
* Dominate: Superior Entomb Acc/Hold, Superior Entomb Hold/Rchg, Superior Entomb End/Rchg, Superior Entomb Acc/Hold/End, Superior Entomb Acc/Hold/End/Rchg, Superior Entomb Rchg/AbsorbProc, 
* Confuse: Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Cacophany Acc/EndRdx, Cacophany Conf/Rng, Cacophany Acc/Conf/Rchg, Cacophany Dam%, 
* Stealth: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, 
* Grant Invisibility: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, 
* Insulation Shield: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, 
* Invisibility: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, 
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Lethargic Repose Acc/Sleep/Rchg, Lethargic Repose Acc/Sleep, 
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, 
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, 
* Total Domination: Acc, 
* Terrify: Acc, 
* Boxing: Acc, 
* Tough: EndRdx, 
* Weave: EndRdx, 
* Mass Confusion: Acc, 
* Force Bubble: EndRdx, 
* Repulsion Bomb: Acc, 
* Force Bolt: Acc, 
* Repulsion Field: EndRdx, 
* Detention Field: Acc, 

 

Code files, for those interested...

 

DatabaseAPI.cs PowerEntry.cs

 

Edit: I just noticed the AI is ignoring rule of 5. I'll fix this before the next status update.

 

Edited by magicjtv
Found a bug
  • Like 2
Link to comment
Share on other sites

Fixed a bug in my rule of five check that was causing some powers to get more than five copies of a set and was causing some powers to get no sets at all. This only occurred when trying to optimize for all defense or all resistance. 

 

When asked to optimize the build for total defense, the AI now produces this:

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Powers ===
* Health: Heal, Heal, Heal, Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Set Bonus: 0
* Mesmerize: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Superior Winter's Bite Dmg/EndRdx/Acc/Rchg, Superior Winter's Bite Rchg/SlowProc, Set Bonus: 0.25
* Personal Force Field: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Set Bonus: 0.05
* Deflection Shield: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Set Bonus: 0.05
* Levitate: Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Thunderstrike Dmg/Rchg, Thunderstrike Acc/Dmg/Rchg, Thunderstrike Acc/Dmg/EndRdx, Thunderstrike Dmg/EndRdx/Rchg, Set Bonus: 0.1125
* Dominate: Superior Entomb Acc/Hold, Superior Entomb Hold/Rchg, Superior Entomb End/Rchg, Superior Entomb Acc/Hold/End, Superior Entomb Acc/Hold/End/Rchg, Superior Entomb Rchg/AbsorbProc, Set Bonus: 0.25
* Confuse: Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Cacophany Acc/EndRdx, Cacophany Conf/Rng, Cacophany Acc/Conf/Rchg, Cacophany Dam%, Set Bonus: 0.1
* Stealth: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Set Bonus: 0.05
* Grant Invisibility: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Set Bonus: 0.05
* Insulation Shield: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Set Bonus: 0.05
* Invisibility: Serendipity Def/EndRdx, Serendipity Def/Rchg, Serendipity EndRdx/Rchg, Serendipity Def/EndRdx/Rchg, Serendipity Def, Serendipity EndRdx, Set Bonus: 0.025
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Lethargic Repose Acc/Sleep/Rchg, Lethargic Repose Acc/Sleep, Set Bonus: 0.13127
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Set Bonus: 0
* Dispersion Bubble: Serendipity Def/EndRdx, Serendipity Def/Rchg, Serendipity EndRdx/Rchg, Serendipity Def/EndRdx/Rchg, Serendipity Def, Set Bonus: 0.025
* Total Domination: Acc, Set Bonus: 0
* Terrify: Acc, Set Bonus: 0
* Boxing: Acc, Set Bonus: 0
* Tough: EndRdx, Set Bonus: 0
* Weave: EndRdx, Set Bonus: 0
* Mass Confusion: Acc, Set Bonus: 0
* Force Bubble: EndRdx, Set Bonus: 0
* Repulsion Bomb: Acc, Set Bonus: 0
* Force Bolt: Acc, Set Bonus: 0
* Repulsion Field: EndRdx, Set Bonus: 0
* Detention Field: Acc, Set Bonus: 0
Total Set Bonus: 1.14377

 

DatabaseAPI.cs PowerEntry.cs

Edited by magicjtv
Link to comment
Share on other sites

Its coming along well. With your posts about what it does, can you list the amount of defense it is granting from set bonuses, and the total defense of the character? I recognize the IOs from your last post but I don't do math in my head that fast 🙂

  • Like 1

PPM Information Guide               Survivability Tool                  Interface DoT Procs Guide

Time Manipulation Guide             Bopper Builds                      +HP/+Regen Proc Cheat Sheet

Super Pack Drop Percentages       Recharge Guide                   Base Empowerment: Temp Powers


Bopper's Tools & Formulas                         Mids' Reborn                       

Link to comment
Share on other sites

I don't want to muddy up this thread with end-user commentary so early in the process, but this sounds like the kind of improvement to Mids that I've been strongly desiring for a while!

 

Am I correct in inferring that the "real world application" for this process is planned to do the following?

 

1. Choose slotting, power choices and IO sets within a pre-selected build (AT/primary/secondary already chosen) from scratch in order to match desired parameters for bonuses (defense, accuracy, recharge etc.).

 

2. Rearrange already placed slots and IO sets in a build in order to match desired parameters for bonuses.

  • Like 1

@dungeoness and @eloora on Excelsior

<Federation of United Cosmic Knights>

Link to comment
Share on other sites

5 hours ago, Bopper said:

Its coming along well. With your posts about what it does, can you list the amount of defense it is granting from set bonuses, and the total defense of the character? I recognize the IOs from your last post but I don't do math in my head that fast 🙂

My bad, I forgot to add the totals. I've updated the print function to print the totals for each power as well as the grand total, so I can't forget again. The grand total was  1.14377.

 

The way it works is it adds up each relevant bonus effect of a power . So for example, Superior Winter's Bite has bonuses at 5 slots of 5% Defense Energy/Negative and 2.5% Defense Ranged, so a power with five slots of Superior Winter's bite counts as a 12.5% bonus (5% Energy + 5% Negative + 2.5% Ranged).

 

I don't yet have the code to sum up the build beyond set bonuses, but that will be added Soon(TM).

Edited by magicjtv
spelling
Link to comment
Share on other sites

3 hours ago, Dungeoness said:

I don't want to muddy up this thread with end-user commentary so early in the process, but this sounds like the kind of improvement to Mids that I've been strongly desiring for a while!

 

Am I correct in inferring that the "real world application" for this process is planned to do the following?

 

1. Choose slotting, power choices and IO sets within a pre-selected build (AT/primary/secondary already chosen) from scratch in order to match desired parameters for bonuses (defense, accuracy, recharge etc.).

 

2. Rearrange already placed slots and IO sets in a build in order to match desired parameters for bonuses.

Oh, comments are very much welcome. I want the final product to be useful to all players, not just me, so feedback and suggestions will be a big help.

 

General Map Of Where We're Going

So the Proof of Concept I'm working on now will have most, but not all, of the key features by the time it's done. The most important feature that will be missing is a user interface.  The final Proof of Concept code won't be usable by anyone but programmers with access to the code, and even for them it would be tedious to use.

 

This will be followed up with an MVP (Minimal Viable Product) where I'll fork the Mids code base and add a user interface to both the AI and the set bonus spreadsheet I posted earlier. Once people have had a chance to play with this, we'll decide where we want to go next.

 

Features That Will Be Added To The Proof Of Concept

  • Frankenslot AI
  • Rearrange slots AI
  • Include relevant power effects, not just set bonuses, in the totals. For example, a shield with smashing defense should have its values included in the total smashing defense for the build.
  • Optimize for multiple values simultaneously (Example: Smashing Defense and Recovery)

Features That Will Not Be Added To The Proof Of Concept

  • Support for unique enhancement bonuses, like Steadfast Protection +3 defense. This will be added in the MVP.
  • Rearrange powers. I'm not even sure this will be added to the MVP. I like the idea, but it sounds like a lot of work, so I'd rather get the other things I've listed done first.

 

Edit: To actually answer your question, 🙃, the Proof of Concept and MVP will 2. Rearrange already placed slots and IO sets in a build in order to match desired parameters for bonuses..

 

Edited by magicjtv
Actually answered the question.
Link to comment
Share on other sites

Status update.

  • The Highest Set AI has been improved to use the least number of enhancements needed to get the desired bonus, rather than always filling up all available slots.
  • The ability to include/exclude PvP bonuses has been added.
  • Frankenslot AI has been added.
  • Huge execution speed increase.

Samples

Starting build

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense Smashing without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense Smashing Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense Smashing Set Bonus: 0
* Mesmerize: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Levitate: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Dominate: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Confuse: Acc, Acc, Acc, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Stealth: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Mass Hypnosis: Acc, RechRdx, RechRdx, RechRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, Defense Smashing Set Bonus: 0
* Total Domination: Acc, Defense Smashing Set Bonus: 0
* Terrify: Acc, Defense Smashing Set Bonus: 0
* Boxing: Acc, Defense Smashing Set Bonus: 0
* Tough: EndRdx, Defense Smashing Set Bonus: 0
* Weave: EndRdx, Defense Smashing Set Bonus: 0
* Mass Confusion: Acc, Defense Smashing Set Bonus: 0
* Force Bubble: EndRdx, Defense Smashing Set Bonus: 0
* Repulsion Bomb: Acc, Defense Smashing Set Bonus: 0
* Force Bolt: Acc, Defense Smashing Set Bonus: 0
* Repulsion Field: EndRdx, Defense Smashing Set Bonus: 0
* Detention Field: Acc, Defense Smashing Set Bonus: 0
Total Defense Smashing Set Bonuses: 0

 

Optimized for Smashing Defense. Total Defense Smashing Set Bonuses: 0.05

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense Smashing without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense Smashing Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense Smashing Set Bonus: 0
* Mesmerize: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, RechRdx, RechRdx, Defense Smashing Set Bonus: 0.01875
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Levitate: Acc, Dmg, Dmg, Dmg, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Dominate: Neuronic Shutdown Acc/Rchg, Neuronic Shutdown EndRdx/Hold, Neuronic Shutdown Acc/EndRdx, Neuronic Shutdown Hold/Rng, Neuronic Shutdown Acc/Hold/Rchg, Neuronic Shutdown Dam%, Defense Smashing Set Bonus: 0.0125
* Confuse: Acc, Acc, Acc, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Stealth: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, EndRdx, EndRdx, Defense Smashing Set Bonus: 0.01875
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, Defense Smashing Set Bonus: 0
* Total Domination: Acc, Defense Smashing Set Bonus: 0
* Terrify: Acc, Defense Smashing Set Bonus: 0
* Boxing: Acc, Defense Smashing Set Bonus: 0
* Tough: EndRdx, Defense Smashing Set Bonus: 0
* Weave: EndRdx, Defense Smashing Set Bonus: 0
* Mass Confusion: Acc, Defense Smashing Set Bonus: 0
* Force Bubble: EndRdx, Defense Smashing Set Bonus: 0
* Repulsion Bomb: Acc, Defense Smashing Set Bonus: 0
* Force Bolt: Acc, Defense Smashing Set Bonus: 0
* Repulsion Field: EndRdx, Defense Smashing Set Bonus: 0
* Detention Field: Acc, Defense Smashing Set Bonus: 0
Total Defense Smashing Set Bonuses: 0.05

 

Optimized fr Psionic Defense. Total Defense Psionic Set Bonuses: 0.125

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense Psionic without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense Psionic Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense Psionic Set Bonus: 0
* Mesmerize: Apocalypse Dmg, Apocalypse Dmg/Rchg, Apocalypse Acc/Dmg/Rchg, Apocalypse Acc/Rchg, Apocalypse Dmg/EndRdx, Apocalypse Dam%, Defense Psionic Set Bonus: 0.05
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Psionic Set Bonus: 0
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Levitate: Devastation Acc/Dmg, Devastation Dmg/EndRdx, Devastation Dmg/Rchg, Devastation Acc/Dmg/Rchg, Devastation Acc/Dmg/EndRdx/Rchg, Devastation Hold%, Defense Psionic Set Bonus: 0.0375
* Dominate: Devastation Acc/Dmg, Devastation Dmg/EndRdx, Devastation Dmg/Rchg, Devastation Acc/Dmg/Rchg, Devastation Acc/Dmg/EndRdx/Rchg, Devastation Hold%, Defense Psionic Set Bonus: 0.0375
* Confuse: Acc, Acc, Acc, RechRdx, RechRdx, RechRdx, Defense Psionic Set Bonus: 0
* Stealth: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Mass Hypnosis: Acc, RechRdx, RechRdx, RechRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense Psionic Set Bonus: 0
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, Defense Psionic Set Bonus: 0
* Total Domination: Acc, Defense Psionic Set Bonus: 0
* Terrify: Acc, Defense Psionic Set Bonus: 0
* Boxing: Acc, Defense Psionic Set Bonus: 0
* Tough: EndRdx, Defense Psionic Set Bonus: 0
* Weave: EndRdx, Defense Psionic Set Bonus: 0
* Mass Confusion: Acc, Defense Psionic Set Bonus: 0
* Force Bubble: EndRdx, Defense Psionic Set Bonus: 0
* Repulsion Bomb: Acc, Defense Psionic Set Bonus: 0
* Force Bolt: Acc, Defense Psionic Set Bonus: 0
* Repulsion Field: EndRdx, Defense Psionic Set Bonus: 0
* Detention Field: Acc, Defense Psionic Set Bonus: 0
Total Defense Psionic Set Bonuses: 0.125

 

Optimized for All Defense. Total Defense All Set Bonuses: 1.14377

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense All without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense All Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense All Set Bonus: 0
* Mesmerize: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Superior Winter's Bite Dmg/EndRdx/Acc/Rchg, Superior Winter's Bite Rchg/SlowProc, Defense All Set Bonus: 0.25
* Personal Force Field: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Deflection Shield: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Levitate: Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Thunderstrike Dmg/Rchg, Thunderstrike Acc/Dmg/Rchg, Thunderstrike Acc/Dmg/EndRdx, Thunderstrike Dmg/EndRdx/Rchg, Defense All Set Bonus: 0.1125
* Dominate: Superior Entomb Acc/Hold, Superior Entomb Hold/Rchg, Superior Entomb End/Rchg, Superior Entomb Acc/Hold/End, Superior Entomb Acc/Hold/End/Rchg, Superior Entomb Rchg/AbsorbProc, Defense All Set Bonus: 0.25
* Confuse: Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Cacophany Acc/EndRdx, Cacophany Conf/Rng, Cacophany Acc/Conf/Rchg, Cacophany Dam%, Defense All Set Bonus: 0.1
* Stealth: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Grant Invisibility: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Insulation Shield: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Invisibility: Serendipity Def/EndRdx, Serendipity Def/Rchg, Serendipity EndRdx/Rchg, Serendipity Def/EndRdx/Rchg, Serendipity Def, EndRdx, Defense All Set Bonus: 0.025
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Lethargic Repose Acc/Sleep/Rchg, EndRdx, Defense All Set Bonus: 0.13127
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense All Set Bonus: 0
* Dispersion Bubble: Serendipity Def/EndRdx, Serendipity Def/Rchg, Serendipity EndRdx/Rchg, Serendipity Def/EndRdx/Rchg, Serendipity Def, Defense All Set Bonus: 0.025
* Total Domination: Acc, Defense All Set Bonus: 0
* Terrify: Acc, Defense All Set Bonus: 0
* Boxing: Acc, Defense All Set Bonus: 0
* Tough: EndRdx, Defense All Set Bonus: 0
* Weave: EndRdx, Defense All Set Bonus: 0
* Mass Confusion: Acc, Defense All Set Bonus: 0
* Force Bubble: EndRdx, Defense All Set Bonus: 0
* Repulsion Bomb: Acc, Defense All Set Bonus: 0
* Force Bolt: Acc, Defense All Set Bonus: 0
* Repulsion Field: EndRdx, Defense All Set Bonus: 0
* Detention Field: Acc, Defense All Set Bonus: 0
Total Defense All Set Bonuses: 1.14377

 

Optimized for Recovery with PvP. Total Recovery Set Bonuses: 0.69

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Recovery with PvP bonuses
=== Powers ===
* Health: Panacea Heal/EndRedux, Panacea Heal/Rchg, Heal, Recovery Set Bonus: 0.025
* Stamina: Energy Manipulator EndMod, Energy Manipulator EndMod/Rchg, EndMod, Recovery Set Bonus: 0.015
* Mesmerize: Fortunata Hypnosis Sleep, Fortunata Hypnosis Sleep/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Personal Force Field: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Deflection Shield: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Levitate: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Recovery Set Bonus: 0.065
* Dominate: Unbreakable Constraint Hold, Unbreakable Constraint Hold/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Confuse: Coercive Persuasion  Conf, Coercive Persuasion  Conf/Rchg, Malaise's Illusions Acc/Rchg, Malaise's Illusions EndRdx/Conf, Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Recovery Set Bonus: 0.075
* Stealth: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Grant Invisibility: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Insulation Shield: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Recovery Set Bonus: 0
* Mass Hypnosis: Fortunata Hypnosis Acc/Sleep/Rchg, Fortunata Hypnosis Acc/Rchg, RechRdx, RechRdx, EndRdx, EndRdx, Recovery Set Bonus: 0.04
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Recovery Set Bonus: 0
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, Recovery Set Bonus: 0
* Total Domination: Acc, Recovery Set Bonus: 0
* Terrify: Acc, Recovery Set Bonus: 0
* Boxing: Acc, Recovery Set Bonus: 0
* Tough: EndRdx, Recovery Set Bonus: 0
* Weave: EndRdx, Recovery Set Bonus: 0
* Mass Confusion: Acc, Recovery Set Bonus: 0
* Force Bubble: EndRdx, Recovery Set Bonus: 0
* Repulsion Bomb: Acc, Recovery Set Bonus: 0
* Force Bolt: Acc, Recovery Set Bonus: 0
* Repulsion Field: EndRdx, Recovery Set Bonus: 0
* Detention Field: Acc, Recovery Set Bonus: 0
Total Recovery Set Bonuses: 0.69

 

Optimized for Recovery without PvP. Total Recovery Set Bonuses: 0.565

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Recovery without PvP bonuses
=== Powers ===
* Health: Panacea Heal/EndRedux, Panacea Heal/Rchg, Heal, Recovery Set Bonus: 0.025
* Stamina: Energy Manipulator EndMod, Energy Manipulator EndMod/Rchg, EndMod, Recovery Set Bonus: 0.015
* Mesmerize: Fortunata Hypnosis Sleep, Fortunata Hypnosis Sleep/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Personal Force Field: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, RechRdx, RechRdx, Recovery Set Bonus: 0.035
* Deflection Shield: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, EndRdx, EndRdx, Recovery Set Bonus: 0.035
* Levitate: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Recovery Set Bonus: 0.065
* Dominate: Unbreakable Constraint Hold, Unbreakable Constraint Hold/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Confuse: Coercive Persuasion  Conf, Coercive Persuasion  Conf/Rchg, Malaise's Illusions Acc/Rchg, Malaise's Illusions EndRdx/Conf, Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Recovery Set Bonus: 0.075
* Stealth: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, EndRdx, EndRdx, Recovery Set Bonus: 0.035
* Grant Invisibility: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, EndRdx, EndRdx, Recovery Set Bonus: 0.035
* Insulation Shield: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, EndRdx, EndRdx, Recovery Set Bonus: 0.035
* Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Recovery Set Bonus: 0
* Mass Hypnosis: Fortunata Hypnosis Acc/Sleep/Rchg, Fortunata Hypnosis Acc/Rchg, RechRdx, RechRdx, EndRdx, EndRdx, Recovery Set Bonus: 0.04
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Recovery Set Bonus: 0
* Dispersion Bubble: EndRdx, EndRdx, DefBuff, DefBuff, DefBuff, Recovery Set Bonus: 0
* Total Domination: Acc, Recovery Set Bonus: 0
* Terrify: Acc, Recovery Set Bonus: 0
* Boxing: Acc, Recovery Set Bonus: 0
* Tough: EndRdx, Recovery Set Bonus: 0
* Weave: EndRdx, Recovery Set Bonus: 0
* Mass Confusion: Acc, Recovery Set Bonus: 0
* Force Bubble: EndRdx, Recovery Set Bonus: 0
* Repulsion Bomb: Acc, Recovery Set Bonus: 0
* Force Bolt: Acc, Recovery Set Bonus: 0
* Repulsion Field: EndRdx, Recovery Set Bonus: 0
* Detention Field: Acc, Recovery Set Bonus: 0
Total Recovery Set Bonuses: 0.565

 

Code

 

DatabaseAPI.cs PowerEntry.cs

  • Like 1
Link to comment
Share on other sites

It all sounds so exciting.  Let me know when you're ready for ID10T User testing: I volunteer.

  • Like 2

@Rathstar

Energy/Energy Blaster (50+3) on Everlasting

Energy/Temporal Blaster (50+3) on Excelsior

Energy/Willpower Sentinel (50+3) on Indomitable

Energy/Energy Sentinel (50+1) on Torchbearer

Link to comment
Share on other sites

Status update.

  • Rearrange slots AI added.
  • A few utility functions and more testing added.
  • Number of generations increased from 100 to 150, in attempt to balance finding the optimal solution and execution speed.

Samples. Compare to my previous status update to see the effects of the new AI.

Starting build

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense Smashing without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense Smashing Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense Smashing Set Bonus: 0
* Mesmerize: Acc, Dmg, Dmg, Dmg, Sleep, Sleep, Defense Smashing Set Bonus: 0
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Levitate: Acc, Dmg, Dmg, Dmg, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Dominate: Acc, Dmg, Dmg, Dmg, Hold, Hold, Defense Smashing Set Bonus: 0
* Confuse: Acc, Conf, Conf, Conf, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Stealth: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Invisibility: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Mass Hypnosis: Acc, Sleep, Sleep, Sleep, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Dispersion Bubble: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Total Domination: Acc, Defense Smashing Set Bonus: 0
* Terrify: Acc, Defense Smashing Set Bonus: 0
* Boxing: Acc, Defense Smashing Set Bonus: 0
* Tough: ResDam, Defense Smashing Set Bonus: 0
* Weave: DefBuff, Defense Smashing Set Bonus: 0
* Mass Confusion: Acc, Defense Smashing Set Bonus: 0
* Force Bubble: RechRdx, Defense Smashing Set Bonus: 0
* Repulsion Bomb: Acc, Defense Smashing Set Bonus: 0
* Force Bolt: Acc, Defense Smashing Set Bonus: 0
* Repulsion Field: RechRdx, Defense Smashing Set Bonus: 0
* Detention Field: Acc, Defense Smashing Set Bonus: 0
Total Defense Smashing Set Bonuses: 0

 

Optimized for smashing defense. Total Defense Smashing Set Bonuses: 0.16563

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense Smashing without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense Smashing Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense Smashing Set Bonus: 0
* Mesmerize: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Sleep, Sleep, Defense Smashing Set Bonus: 0.01875
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Deflection Shield: DefBuff, Defense Smashing Set Bonus: 0
* Levitate: Acc, Dmg, Dmg, Dmg, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Dominate: Neuronic Shutdown Acc/Rchg, Neuronic Shutdown EndRdx/Hold, Neuronic Shutdown Acc/EndRdx, Neuronic Shutdown Hold/Rng, Neuronic Shutdown Acc/Hold/Rchg, Neuronic Shutdown Dam%, Defense Smashing Set Bonus: 0.0125
* Confuse: Acc, Conf, Conf, Defense Smashing Set Bonus: 0
* Stealth: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Invisibility: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Smashing Set Bonus: 0
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Defense Smashing Set Bonus: 0.01875
* Telekinesis: EndRdx, EndRdx, Defense Smashing Set Bonus: 0
* Dispersion Bubble: DefBuff, Defense Smashing Set Bonus: 0
* Total Domination: Acc, Defense Smashing Set Bonus: 0
* Terrify: Siphon Insight ToHitDeb, Siphon Insight Acc/ToHitDeb, Siphon Insight Acc/Rchg, Siphon Insight ToHitDeb/EndRdx/Rchg, Siphon Insight Acc/EndRdx/Rchg, Defense Smashing Set Bonus: 0.0375
* Boxing: Superior Blistering Cold Acc/Dmg, Superior Blistering Cold Dmg/EndRdx, Superior Blistering Cold Acc/Dmg/EndRdx, Superior Blistering Cold Acc/Dmg/Rchg, Superior Blistering Cold Dmg/EndRdx/Acc/Rchg, Dsrnt, Defense Smashing Set Bonus: 0.05
* Tough: Unbreakable Guard ResDam, Unbreakable Guard ResDam/EndRdx, Unbreakable Guard EndRdx/Rchg, Unbreakable Guard Rchg/ResDam, Defense Smashing Set Bonus: 0.01563
* Weave: DefBuff, Defense Smashing Set Bonus: 0
* Mass Confusion: Acc, Defense Smashing Set Bonus: 0
* Force Bubble: RechRdx, Defense Smashing Set Bonus: 0
* Repulsion Bomb: Razzle Dazzle Acc/Rchg, Razzle Dazzle EndRdx/Stun, Razzle Dazzle Acc/EndRdx, Razzle Dazzle Stun/Rng, Razzle Dazzle Acc/Stun/Rchg, Dsrnt, Defense Smashing Set Bonus: 0.0125
* Force Bolt: Acc, Defense Smashing Set Bonus: 0
* Repulsion Field: RechRdx, Defense Smashing Set Bonus: 0
* Detention Field: Acc, Defense Smashing Set Bonus: 0
Total Defense Smashing Set Bonuses: 0.16563

 

Optimized for psionic defense. Total Defense Psionic Set Bonuses: 0.1625

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense Psionic without PvP bonuses
=== Powers ===
* Health: Heal, Heal, Heal, Defense Psionic Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense Psionic Set Bonus: 0
* Mesmerize: Apocalypse Dmg, Apocalypse Dmg/Rchg, Apocalypse Acc/Dmg/Rchg, Apocalypse Acc/Rchg, Apocalypse Dmg/EndRdx, Apocalypse Dam%, Defense Psionic Set Bonus: 0.05
* Personal Force Field: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Defense Psionic Set Bonus: 0
* Deflection Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Levitate: Devastation Acc/Dmg, Devastation Dmg/EndRdx, Devastation Dmg/Rchg, Devastation Acc/Dmg/Rchg, Devastation Acc/Dmg/EndRdx/Rchg, Devastation Hold%, Defense Psionic Set Bonus: 0.0375
* Dominate: Devastation Acc/Dmg, Devastation Dmg/EndRdx, Devastation Dmg/Rchg, Devastation Acc/Dmg/Rchg, Devastation Acc/Dmg/EndRdx/Rchg, Devastation Hold%, Defense Psionic Set Bonus: 0.0375
* Confuse: Acc, Conf, Conf, Conf, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Stealth: DefBuff, Defense Psionic Set Bonus: 0
* Grant Invisibility: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Insulation Shield: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Invisibility: DefBuff, DefBuff, Defense Psionic Set Bonus: 0
* Mass Hypnosis: Acc, Sleep, Sleep, Sleep, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense Psionic Set Bonus: 0
* Dispersion Bubble: DefBuff, DefBuff, DefBuff, EndRdx, EndRdx, Defense Psionic Set Bonus: 0
* Total Domination: Acc, Defense Psionic Set Bonus: 0
* Terrify: Acc, Defense Psionic Set Bonus: 0
* Boxing: Acc, Defense Psionic Set Bonus: 0
* Tough: Impervium Armor ResDam/EndRdx, Impervium Armor ResDam/Rchg, Impervium Armor EndRdx/Rchg, RechRdx, RechRdx, Defense Psionic Set Bonus: 0.01875
* Weave: DefBuff, Defense Psionic Set Bonus: 0
* Mass Confusion: Acc, Defense Psionic Set Bonus: 0
* Force Bubble: RechRdx, Defense Psionic Set Bonus: 0
* Repulsion Bomb: Rope A Dope Acc/Rchg, Rope A Dope EndRdx/Stun, Rope A Dope Acc/EndRdx, Rope A Dope Stun/Rng, Rope A Dope Acc/Stun/Rchg, Rope A Dope Acc/Stun, Defense Psionic Set Bonus: 0.01875
* Force Bolt: Acc, Defense Psionic Set Bonus: 0
* Repulsion Field: RechRdx, Defense Psionic Set Bonus: 0
* Detention Field: Acc, Defense Psionic Set Bonus: 0
Total Defense Psionic Set Bonuses: 0.1625

 

Optimized for all defense. Total Defense All Set Bonuses: 1.59067

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Defense All without PvP bonuses
=== Powers ===
* Health: Heal, Defense All Set Bonus: 0
* Stamina: EndMod, EndMod, EndMod, Defense All Set Bonus: 0
* Mesmerize: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Superior Winter's Bite Dmg/EndRdx/Acc/Rchg, Superior Winter's Bite Rchg/SlowProc, Defense All Set Bonus: 0.25
* Personal Force Field: DefBuff, Defense All Set Bonus: 0
* Deflection Shield: DefBuff, DefBuff, DefBuff, Defense All Set Bonus: 0
* Levitate: Acc, Dmg, Defense All Set Bonus: 0
* Dominate: Superior Entomb Acc/Hold, Superior Entomb Hold/Rchg, Superior Entomb End/Rchg, Superior Entomb Acc/Hold/End, Superior Entomb Acc/Hold/End/Rchg, Superior Entomb Rchg/AbsorbProc, Defense All Set Bonus: 0.25
* Confuse: Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Cacophany Acc/EndRdx, Cacophany Conf/Rng, Cacophany Acc/Conf/Rchg, Cacophany Dam%, Defense All Set Bonus: 0.1
* Stealth: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Grant Invisibility: DefBuff, Defense All Set Bonus: 0
* Insulation Shield: DefBuff, Defense All Set Bonus: 0
* Invisibility: Red Fortune Def/EndRdx, Red Fortune Def/Rchg, Red Fortune EndRdx/Rchg, Red Fortune Def/EndRdx/Rchg, Red Fortune Def, Red Fortune EndRdx, Defense All Set Bonus: 0.05
* Mass Hypnosis: Lethargic Repose Acc/Rchg, Lethargic Repose EndRdx/Sleep, Lethargic Repose Acc/EndRdx, Lethargic Repose Sleep/Rng, Lethargic Repose Acc/Sleep/Rchg, EndRdx, Defense All Set Bonus: 0.13127
* Telekinesis: EndRdx, EndRdx, EndRdx, RechRdx, RechRdx, Defense All Set Bonus: 0
* Dispersion Bubble: DefBuff, Defense All Set Bonus: 0
* Total Domination: Lockdown Acc/Hold, Lockdown Acc/Rchg, Lockdown Rchg/Hold, Lockdown EndRdx/Rchg/Hold, Lockdown Acc/EndRdx/Rchg/Hold, Lockdown %Hold, Defense All Set Bonus: 0.125
* Terrify: Siphon Insight ToHitDeb, Siphon Insight Acc/ToHitDeb, Siphon Insight Acc/Rchg, Siphon Insight ToHitDeb/EndRdx/Rchg, Siphon Insight Acc/EndRdx/Rchg, Defense All Set Bonus: 0.09375
* Boxing: Acc, Defense All Set Bonus: 0
* Tough: Aegis ResDam/EndRdx, Aegis ResDam/Rchg, Aegis EndRdx/Rchg, Aegis ResDam/EndRdx/Rchg, Aegis ResDam, Defense All Set Bonus: 0.14064
* Weave: DefBuff, Defense All Set Bonus: 0
* Mass Confusion: Acc, Defense All Set Bonus: 0
* Force Bubble: RechRdx, Defense All Set Bonus: 0
* Repulsion Bomb: Superior Frozen Blast Acc/Dmg, Superior Frozen Blast Dmg/EndRdx, Superior Frozen Blast Acc/Dmg/EndRdx, Superior Frozen Blast Acc/Dmg/Rchg, Superior Frozen Blast Dmg/EndRdx/Acc/Rchg, Superior Frozen Blast Rchg/ImmobProc, Defense All Set Bonus: 0.225
* Force Bolt: Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Thunderstrike Dmg/Rchg, Thunderstrike Acc/Dmg/Rchg, Thunderstrike Acc/Dmg/EndRdx, Thunderstrike Dmg/EndRdx/Rchg, Defense All Set Bonus: 0.1125
* Repulsion Field: Force Feedback Dmg/KB, Force Feedback Acc/KB, Force Feedback Rchg/KB, Force Feedback Rchg/EndRdx, Force Feedback Dmg/EndRdx/KB, Force Feedback Rechg%, Defense All Set Bonus: 0.06251
* Detention Field: Acc, Defense All Set Bonus: 0
Total Defense All Set Bonuses: 1.59067

 

Optimized for recovery with PvP. Total Recovery Set Bonuses: 0.805

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Recovery with PvP bonuses
=== Powers ===
* Health: Panacea Heal/EndRedux, Panacea Heal/Rchg, Heal, Recovery Set Bonus: 0.025
* Stamina: Performance Shifter EndMod, Performance Shifter EndMod/Rchg, Performance Shifter EndMod/Acc/Rchg, Performance Shifter EndMod/Acc, Recovery Set Bonus: 0.025
* Mesmerize: Fortunata Hypnosis Sleep, Fortunata Hypnosis Sleep/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Personal Force Field: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Deflection Shield: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Levitate: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Recovery Set Bonus: 0.065
* Dominate: Unbreakable Constraint Hold, Unbreakable Constraint Hold/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Confuse: Coercive Persuasion  Conf, Coercive Persuasion  Conf/Rchg, Malaise's Illusions Acc/Rchg, Malaise's Illusions EndRdx/Conf, Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Recovery Set Bonus: 0.075
* Stealth: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Grant Invisibility: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Insulation Shield: Shield Wall Def/EndRdx, Shield Wall Def/Rchg, Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.06
* Invisibility: DefBuff, DefBuff, DefBuff, RechRdx, RechRdx, RechRdx, Recovery Set Bonus: 0
* Mass Hypnosis: Fortunata Hypnosis Acc/Sleep/Rchg, Fortunata Hypnosis Acc/Rchg, Sleep, Sleep, EndRdx, EndRdx, Recovery Set Bonus: 0.04
* Telekinesis: EndRdx, Recovery Set Bonus: 0
* Dispersion Bubble: DefBuff, Recovery Set Bonus: 0
* Total Domination: Unbreakable Constraint Acc/Hold/Rchg, Unbreakable Constraint Acc/Rchg, Hold, Hold, EndRdx, Recovery Set Bonus: 0.04
* Terrify: Acc, Recovery Set Bonus: 0
* Boxing: Absolute Amazement Stun, Absolute Amazement Stun/Rchg, Dmg, Recovery Set Bonus: 0.04
* Tough: ResDam, Recovery Set Bonus: 0
* Weave: DefBuff, Recovery Set Bonus: 0
* Mass Confusion: Acc, Recovery Set Bonus: 0
* Force Bubble: RechRdx, Recovery Set Bonus: 0
* Repulsion Bomb: Acc, Recovery Set Bonus: 0
* Force Bolt: Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Recovery Set Bonus: 0.025
* Repulsion Field: RechRdx, Recovery Set Bonus: 0
* Detention Field: Acc, Recovery Set Bonus: 0
Total Recovery Set Bonuses: 0.805

 

Optimized for recovery without PvP. Total Recovery Set Bonuses: 0.85

Spoiler

Controller
=== Powersets ===
* Inherent Fitness
* Mind Control
* Force Field
* Speed
* Concealment
* Fighting
* Force of Will
* Primal Forces Mastery
=== Optimizations ===
Recovery without PvP bonuses
=== Powers ===
* Health: Panacea Heal/EndRedux, Panacea Heal/Rchg, Recovery Set Bonus: 0.025
* Stamina: Performance Shifter EndMod, Performance Shifter EndMod/Rchg, Performance Shifter EndMod/Acc/Rchg, Performance Shifter EndMod/Acc, Recovery Set Bonus: 0.025
* Mesmerize: Fortunata Hypnosis Sleep, Fortunata Hypnosis Sleep/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Personal Force Field: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Gift of the Ancients EndRdx/Rchg, Gift of the Ancients Def/EndRdx/Rchg, Gift of the Ancients Def, Recovery Set Bonus: 0.02
* Deflection Shield: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, DefBuff, EndRdx, Recovery Set Bonus: 0.02
* Levitate: Superior Winter's Bite Acc/Dmg, Superior Winter's Bite Dmg/Rchg, Superior Winter's Bite Acc/Dmg/EndRdx, Superior Winter's Bite Acc/Dmg/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Recovery Set Bonus: 0.065
* Dominate: Unbreakable Constraint Hold, Unbreakable Constraint Hold/Rchg, Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Thunderstrike Acc/Dmg, Thunderstrike Dmg/EndRdx, Recovery Set Bonus: 0.08499999
* Confuse: Coercive Persuasion  Conf, Coercive Persuasion  Conf/Rchg, Malaise's Illusions Acc/Rchg, Malaise's Illusions EndRdx/Conf, Cacophany Acc/Rchg, Cacophany EndRdx/Conf, Recovery Set Bonus: 0.075
* Stealth: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, RechRdx, RechRdx, Recovery Set Bonus: 0.035
* Grant Invisibility: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, EndRdx, EndRdx, Recovery Set Bonus: 0.035
* Insulation Shield: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Kismet Def/EndRdx, Kismet Def/Rchg, EndRdx, EndRdx, Recovery Set Bonus: 0.035
* Invisibility: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, DefBuff, Recovery Set Bonus: 0.02
* Mass Hypnosis: Fortunata Hypnosis Acc/Sleep/Rchg, Fortunata Hypnosis Acc/Rchg, Sleep, Sleep, Recovery Set Bonus: 0.04
* Telekinesis: EndRdx, EndRdx, EndRdx, Recovery Set Bonus: 0
* Dispersion Bubble: Gift of the Ancients Def/EndRdx, Gift of the Ancients Def/Rchg, Gift of the Ancients EndRdx/Rchg, Gift of the Ancients Def/EndRdx/Rchg, Recovery Set Bonus: 0.02
* Total Domination: Unbreakable Constraint Acc/Hold/Rchg, Unbreakable Constraint Acc/Rchg, Hold, Hold, EndRdx, Recovery Set Bonus: 0.04
* Terrify: Ragnarok Dmg, Ragnarok Dmg/Rchg, Recovery Set Bonus: 0.04
* Boxing: Absolute Amazement Stun, Absolute Amazement Stun/Rchg, Recovery Set Bonus: 0.04
* Tough: Gladiator's Armor End/Res, Gladiator's Armor RechRes, Recovery Set Bonus: 0.025
* Weave: Kismet Def/EndRdx, Kismet Def/Rchg, Recovery Set Bonus: 0.015
* Mass Confusion: Coercive Persuasion  Acc/Conf/Rchg, Coercive Persuasion  Acc/Rchg, Recovery Set Bonus: 0.04
* Force Bubble: RechRdx, Recovery Set Bonus: 0
* Repulsion Bomb: Absolute Amazement Acc/Stun/Rchg, Absolute Amazement Acc/Rchg, Recovery Set Bonus: 0.04
* Force Bolt: Gladiator's Javelin Acc/Dmg, Gladiator's Javelin Dam/Rech, Recovery Set Bonus: 0.025
* Repulsion Field: RechRdx, Recovery Set Bonus: 0
* Detention Field: Acc, Recovery Set Bonus: 0
Total Recovery Set Bonuses: 0.85

 

Notice that although the recovery with PvP bonuses is higher than the same bonus from the previous status update, it is not higher than the recover without PvP bonuses in this status update. This is because evolutionary programs are not guaranteed to find the best result, only a good result. Running the same evolution again can produces a different result, as can tweaking the number of generations.

 

Code

 

DatabaseAPI.cs PowerEntry.cs

Link to comment
Share on other sites

I did a little bit of testing for metrics. Here's the results.

 

The first chart shows the amount of time in seconds it takes to run 50, 100, 150, 250, 500, 1000, and 2000 generations of the AI. A Generation is when the AI cycles over the entire build. The runs were all done at 10 iterations.

 

The second chart shows the bonus values produced at  50, 100, 150, 250, 500, 1000, and 2000 generations of the AI.

 

The third chart shows the amount of time in seconds it takes to run 10, 25, 50, 100, 250, 500, and 1000 iterations of the AI. An iteration is when the AI cycles over a single power. These runs were all done at 100 generations.

 

The fourth chart shows the bonus values produced at  10, 25, 50, 100, 250, 500, and 1000 iterations of the AI.

 

NOTE: Each column on the chart is an independent run from every other column. That's why it's possible for runs with more generations/iterations to have smaller numbers than runs with less generations/iterations. During a single run, the bonuses can only stay the same or go up from one generation/iteration to the next. They can never go down.

 

Time in seconds it takes to run 50, 100, 150, 250, 500, 1000, and 2000 generations of the AI.

Chart 1.PNG

 

Bonus values produced at  50, 100, 150, 250, 500, 1000, and 2000 generations of the AI

Chart 2.PNG

 

Time in seconds it takes to run 10, 25, 50, 100, 250, 500, and 1000 iterations of the AI

Chart 1a.PNG

 

Bonus values produced at  10, 25, 50, 100, 250, 500, and 1000 iterations of the AI

Chart 2a.PNG

Edited by magicjtv
Link to comment
Share on other sites

Status update.

  • Added the ability to convert AIToon to/from clsToonX (Mid's internal representation of a toon)
  • Added the ability to save an AIToon to disk. A sample file is attached below.

Code

DatabaseAPI.cs PowerEntry.cs clsToonX.cs TEST.mxd

Link to comment
Share on other sites

This code is going to cause hard working people to loose their jobs and... um...so... I just realized, I don't know how to make that argument sound credible.   OK.. how about this... OMG, now that everyone will have the power to create an ultimate build, everyone will be super overpowered and nobody will feel special.  How could you, you evil communist bastard!  Dooooooommmmmm!!!!!

 

But, seriously.  Cool stuff.  I started reading the thread and thought, "oh geez, this'll be a can of worms."  But now, I think you're on to something.  Keep it up.

  • Like 1

Active on Excelsior:

Prismatic Monkey - Seismic / Martial Blaster, Shadow Dragon Monkey - Staff / Dark Brute, Murder Robot Monkey - Arachnos Night Widow

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...