private float BaseNpDamage(PartyMember partyMember, EnemyMob enemy, Sval svalNp)
        {
            int npValue             = svalNp.Value;
            int targetBonusNpDamage = 0;

            // Add additional NP damage if there is a special target ID
            if (svalNp.Target > 0)
            {
                string traitName = _traitEnumInfo.Property(svalNp.Target.ToString())?.Value.ToString() ?? "";

                if (enemy.Traits.Contains(traitName))
                {
                    targetBonusNpDamage = svalNp.Correction;
                }
            }

            float constantAttackRate = _constantRate.GetAttackMultiplier("ATTACK_RATE");
            float classModifier      = _classAttackRate.GetAttackMultiplier(partyMember.ServantNiceInfo.ClassName);
            float npTypeModifier     = _constantRate.GetAttackMultiplier($"ENEMY_ATTACK_RATE_{partyMember.NoblePhantasm.Card}");

            // Base NP damage = ATTACK_RATE * Servant total attack * Class modifier * NP type modifier * (20% bonus if undead enemy) * NP damage
            float baseNpDamage = constantAttackRate
                                 * partyMember.TotalAttack
                                 * classModifier
                                 * npTypeModifier
                                 * (npValue / 1000.0f);

            if (targetBonusNpDamage != 0)
            {
                baseNpDamage *= targetBonusNpDamage / 1000.0f;
            }

            return(baseNpDamage);
        }
Exemple #2
0
    private static Packet SpawnEnemy_Data(EnemyMob _enemyMob, Packet _packet)
    {
        _packet.Write(_enemyMob.id);
        _packet.Write(_enemyMob.transform.position);

        return(_packet);
    }
    void FixedUpdate()
    {
        var dead = new List <int>();

        for (int i = 0; i < ais.Count; i++)
        {
            EnemyMob ai = ais[i];
            if (ai == null)
            {
                dead.Add(i);
                continue;
            }

            ai.dangerDistance        = dangerDistance;
            ai.attackDistance        = attackDistance;
            ai.attackRate            = attackRate;
            ai.attackRateFluctuation = attackRateFluctuation;
            ai.dude.moveSpeed        = moveSpeed;

            // HACK: this is probably slow
            ai.GetComponentInChildren <SphereCollider>().radius = separation;
        }

        foreach (int j in dead)
        {
            ais.RemoveAt(j);
        }
    }
Exemple #4
0
 public static void SpawnEnemy(int _toClient, EnemyMob _enemyMob)
 {
     using (Packet packet = new Packet((int)ServerPackets.spawnEnemy))
     {
         SendTCPData(_toClient, SpawnEnemy_Data(_enemyMob, packet));
     }
 }
Exemple #5
0
 public static void SpawnEnemy(EnemyMob _enemyMob)
 {
     using (Packet packet = new Packet((int)ServerPackets.spawnEnemy))
     {
         SendTCPDataToAll(SpawnEnemy_Data(_enemyMob, packet));
     }
 }
        private float CalculatedNpPerHit(PartyMember partyMember, EnemyMob enemyMob, float cardNpTypeUp, float npGainUp)
        {
            float specialBonusEnemyMod = enemyMob.Traits.Contains("undead") ? 1.2f : 1.0f;

            return(EnemyClassModifier(enemyMob.ClassName.ToString())
                   * partyMember.NoblePhantasm.NpGain.Np[partyMember.Servant.NpLevel - 1]
                   * (1.0f + cardNpTypeUp)
                   * (1.0f + npGainUp)
                   * specialBonusEnemyMod);
        }
Exemple #7
0
    public static void EnemyHealth(EnemyMob _enemyMob)
    {
        using (Packet packet = new Packet((int)ServerPackets.enemyHealth))
        {
            packet.Write(_enemyMob.id);
            packet.Write(_enemyMob.health);

            SendTCPDataToAll(packet);
        }
    }
Exemple #8
0
    public static void EnemyPosition(EnemyMob _enemyMob)
    {
        using (Packet packet = new Packet((int)ServerPackets.enemyPosition))
        {
            packet.Write(_enemyMob.id);
            packet.Write(_enemyMob.transform.position);

            SendUDPDataToAll(packet);
        }
    }
        private float AttemptToKillEnemy(EnemyMob enemyMob, float npDamageForEnemyMob)
        {
            float healthRemaining = enemyMob.Health - (npDamageForEnemyMob * 0.9f);

            if (healthRemaining < 0.0f)
            {
                healthRemaining = 0.0f;
            }

            return(healthRemaining);
        }
        private bool IsPowerMod(Buff buff, EnemyMob enemy)
        {
            if (buff.Type == "upDamage" &&
                buff.Vals.Any(f => f.Name == "buffPowerModStrUp") &&
                buff.CkOpIndv.Any(f => f.Name == buff.Tvals.First().Name) &&
                enemy.Traits.Contains(buff.Tvals.First().Name))
            {
                return(true);
            }

            return(false);
        }
 /// <summary>
 /// Return the chance to kill an enemy based on 90% and 110% NP damage RNG
 /// </summary>
 /// <param name="enemyMob"></param>
 /// <param name="npDamageForEnemyMob"></param>
 /// <returns></returns>
 private float ChancesToKill(EnemyMob enemyMob, float npDamageForEnemyMob)
 {
     if (0.9f * npDamageForEnemyMob > enemyMob.Health)
     {
         return(100.0f); // perfect clear, even with the worst RNG
     }
     else if (1.1f * npDamageForEnemyMob < enemyMob.Health)
     {
         return(0.0f); // never clear, even with the best RNG
     }
     else // show chance of success
     {
         return((1.0f - ((enemyMob.Health / npDamageForEnemyMob - 0.9f) / 0.2f)) * 100.0f);
     }
 }
    public override void OnStart()
    {
        // Cache the EnemyMob to which this enemy belongs. This tells the character where he should move to circle his current attacking target.
        enemyMob = ((EnemyAI)character.CharacterAI).EnemyMob;

        // Compute an available position for the enemy to move to. This forms a better circle around the player.
        moveTarget = enemyMob.GetAvailablePosition();

        // Move the character to his movement target. This target is an empty space that will help form a circle around the player.
        //character.CharacterMovement.MoveTo (moveTarget);

        // Perform the walking action and move to the movement target
        Action walk = character.CharacterControl.ActionSet.basicActions.GetBasicAction(BasicActionType.Walk);

        walk.targetPosition = moveTarget;
        character.CharacterControl.PerformAction(walk);
    }
        /// <summary>
        /// Find special damage up buff versus an enemy trait
        /// </summary>
        /// <param name="partyMember"></param>
        /// <param name="enemy"></param>
        /// <returns></returns>
        private float SpecialAttackUp(PartyMember partyMember, EnemyMob enemy)
        {
            float       powerModifier             = 0.0f;
            const float STATUS_EFFECT_DENOMINATOR = 1000.0f;

            foreach (ActiveStatus activeStatus in partyMember.ActiveStatuses)
            {
                Buff buff = GetBuff(activeStatus);
                if (buff == null)
                {
                    return(0.0f);
                }

                if (IsPowerMod(buff, enemy))
                {
                    powerModifier += activeStatus.StatusEffect.Svals[activeStatus.AppliedSkillLevel - 1].Value / STATUS_EFFECT_DENOMINATOR;
                }
            }

            return(powerModifier);
        }
    /// <summary>
    /// Initialize the AIDirector. Called on start when the AIDirector is instantiated.
    /// </summary>
    public void Init()
    {
        // Set the epoch settings to default.
        epochSettings = new EpochSettings(defaultEpochSettings);

        // Retrieve the 'AISpawner' instance used to spawn enemies on the battlefield.
        enemySpawner = GetComponent <AISpawner>();
        // Set the enemy spawner to spawn enemies in the GameManager's current level
        enemySpawner.Level = GameManager.Instance.CurrentLevel;

        // Find the player gameObject to control his AI settings
        GameObject playerObject = GameObject.FindGameObjectWithTag("Player");

        // Cache the player's Character component to modify his AI settings
        player = playerObject.GetComponent <Character>();

        // Retrieve the EnemyMob component attached to this GameObject. This component controls the enemies' behavior
        enemyMob = GetComponent <EnemyMob>();
        // Set the enemy mob's combat settings to default.
        enemyMob.Settings.Set(defaultEnemyAISettings);
        // Make the enemies attack the player.
        enemyMob.AttackTarget = player;
        // Initialize the enemy mob.
        enemyMob.Init();

        // Update the settings for the player's AnxietyMonitor. These settings determine the rate at which player anxiety changes.
        playerAnxietyMonitor.Settings = playerAnxietyMonitorSettings;
        // Sets the AnxietyMonitor to monitor the player's anxiety.
        playerAnxietyMonitor.CharacterToMonitor = player;

        // Populate the current level with enemies
        PopulateLevel(GameManager.Instance.CurrentLevel);

        //paused = true;

        // Start updating the AI in a coroutine loop, where the AI is updated every 'aiTimeStep' seconds.
        StartCoroutine(UpdateAI());
        // Update the game's intensity value every 'aiTimeStep' seconds.
        StartCoroutine(UpdateGameIntensity());
    }
Exemple #15
0
    /// <summary>
    /// Spawns an enemy on the battlefield. The enemy is spawned inside the given mob
    /// </summary>
    /// <returns>The spawned enemy </returns>
    public Character SpawnEnemy(int difficultyLevel, int maxEnemyWorth, EnemyMob enemyMob)
    {
        // Select a random enemy to spawn from the list of spawnable enemies ('enemyPrefabs:Enemy[]').
        Character enemyPrefab = ChooseRandomEnemy(difficultyLevel, maxEnemyWorth);

        // Spawn an instance of the chosen enemy
        Character enemy = Instantiate(enemyPrefab) as Character;

        // Choose a position in which to spawn the enemy
        Vector2 spawnPosition = GetRandomSpawnPoint();

        // Spawn the enemy in the random position computed above
        enemy.Transform.position = spawnPosition;

        // Inform the EnemyMob instance that an enemy was spawned inside it. Allows the mob to keep track of the enemies inside of it
        enemyMob.OnEnemySpawn(enemy);

        //enemies.Add (enemy.GetComponent<Character>());

        // Return the spawned enemy.
        return(enemy);
    }
        private float NpGainedFromEnemy(PartyMember partyMember, EnemyMob enemyMob, float npGainUp, float cardNpTypeUp, float npDamageForEnemyMob)
        {
            float        effectiveHitModifier, npRefund = 0.0f;
            List <float> npDistributionPercentages = NpDistributionPercentages(partyMember);

            foreach (float npHitPerc in npDistributionPercentages)
            {
                if (0.9f * npDamageForEnemyMob * npHitPerc / 100.0f > enemyMob.Health)
                {
                    effectiveHitModifier = 1.5f; // overkill (includes killing blow)
                }
                else
                {
                    effectiveHitModifier = 1.0f; // regular hit
                }

                float calcNpPerHit = CalculatedNpPerHit(partyMember, enemyMob, cardNpTypeUp, npGainUp);
                npRefund += (float)Math.Floor(effectiveHitModifier * calcNpPerHit);
            }

            return(npRefund);
        }
        /// <summary>
        /// Set necessary enemy status effects for NP damage
        /// </summary>
        /// <param name="enemy"></param>
        /// <param name="partyMember"></param>
        /// <param name="defenseDownModifier"></param>
        /// <param name="cardDefenseDownModifier"></param>
        private Tuple <float, float> SetStatusEffects(EnemyMob enemy, PartyMember partyMember, float defenseDownModifier, float cardDefenseDownModifier)
        {
            const float STATUS_EFFECT_DENOMINATOR = 1000.0f;

            foreach (ActiveStatus activeStatus in enemy.ActiveStatuses)
            {
                Buff buff = GetBuff(activeStatus);
                if (buff != null)
                {
                    if (buff.Type == "downDefence")
                    {
                        defenseDownModifier += activeStatus.StatusEffect.Svals[activeStatus.AppliedSkillLevel - 1].Value / STATUS_EFFECT_DENOMINATOR;
                    }
                    else if (buff.Type == "downDefencecommandall" && buff.CkOpIndv.Any(f => f.Name == ($"card{partyMember.NoblePhantasm.Card.ToUpperFirstChar()}")))
                    {
                        cardDefenseDownModifier += activeStatus.StatusEffect.Svals[activeStatus.AppliedSkillLevel - 1].Value / STATUS_EFFECT_DENOMINATOR;
                    }
                }
            }

            return(new Tuple <float, float>(defenseDownModifier, cardDefenseDownModifier));
        }
Exemple #18
0
 private static void ApplyPartyMemberStatus(Function servantFunction, int level, EnemyMob enemy)
 {
     enemy.ActiveStatuses.Add(new ActiveStatus
     {
         StatusEffect      = servantFunction,
         AppliedSkillLevel = level,
         ActiveTurnCount   = servantFunction.Svals[level - 1].Turn
     });
 }
        private List <EnemyMob> GetGardenMob()
        {
            #region First Wave
            EnemyMob ghost1 = new EnemyMob
            {
                Id            = 0,
                Name          = "Shaking Ghost",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 20845.0f,
                Traits        = new List <string>
                {
                    "demonic", "undead", "genderUnknown"
                }
            };

            EnemyMob ghost2 = new EnemyMob
            {
                Id            = 1,
                Name          = "Absent-Minded Ghost",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 11026.0f,
                Traits        = new List <string>
                {
                    "demonic", "undead", "genderUnknown"
                }
            };

            EnemyMob ghost3 = new EnemyMob
            {
                Id            = 2,
                Name          = "Absent-Minded Ghost",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 11026.0f,
                Traits        = new List <string>
                {
                    "demonic", "undead", "genderUnknown"
                }
            };
            #endregion

            #region Second Wave
            EnemyMob ghost4 = new EnemyMob
            {
                Id            = 3,
                Name          = "Shaking Ghost",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 24788.0f,
                Traits        = new List <string>
                {
                    "demonic", "undead", "genderUnknown"
                }
            };

            EnemyMob ghost5 = new EnemyMob
            {
                Id            = 4,
                Name          = "Shaking Ghost",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 24788.0f,
                Traits        = new List <string>
                {
                    "demonic", "undead", "genderUnknown"
                }
            };

            EnemyMob glassesGod = new EnemyMob
            {
                Id            = 5,
                Name          = "Glasses God",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Earth,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 65660.0f,
                Traits        = new List <string>
                {
                    "demonic", "superGiant", "genderUnknown"
                }
            };
            #endregion

            #region Third Wave
            EnemyMob cardboardGlassesShine = new EnemyMob
            {
                Id            = 6,
                Name          = "Glasses Shine!",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Earth,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 140976.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "riding", "king", "dragon", "brynhildsBeloved"
                }
            };

            EnemyMob kaibaGlassesShine = new EnemyMob
            {
                Id            = 7,
                Name          = "Glasses...Shine...!",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Earth,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 81360.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "divine", "dragon", "riding", "brynhildsBeloved"
                }
            };

            EnemyMob hearingEyePopOut = new EnemyMob
            {
                Id            = 8,
                Name          = "I Heard That Having Great Insight...Can Cause Your Eye To Pop Out",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 76290.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "riding", "brynhildsBeloved"
                }
            };
            #endregion

            return(new List <EnemyMob>
            {
                ghost1, ghost2, ghost3,                                       // wave 1
                ghost4, ghost5, glassesGod,                                   // wave 2
                cardboardGlassesShine, kaibaGlassesShine, hearingEyePopOut    // wave 3
            });
        }
        public async Task CastleSnowIceLB2ArashZerkalotJack()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses      resolvedClasses    = AutofacUtility.ResolveScope(scope);
                ConstantExportJson constantExportJson = await FrequentlyUsed.GetConstantExportJsonAsync(resolvedClasses.AtlasAcademyClient);

                List <PartyMember> party = new List <PartyMember>();

                MysticCode mysticCode = new MysticCode
                {
                    MysticCodeLevel = 10,
                    MysticCodeInfo  = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.FRAGMENT_2004_ID)
                };

                #region Craft Essence Data
                EquipBasicJson equipBasicJson    = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE);
                CraftEssence   chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);
                CraftEssence   chaldeaMlbKscope  = FrequentlyUsed.GetCraftEssence(equipBasicJson, 30, true);

                equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.IMAGINARY_ELEMENT_CE);
                CraftEssence chaldeaImaginaryElement = FrequentlyUsed.GetCraftEssence(equipBasicJson, 36, true);
                #endregion

                #region Party Data
                // Lancelot Berserker
                ServantBasicJson basicJson     = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.LANCELOT_BERSERKER);
                PartyMember      partyLancelot = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaSuperscope);

                party.Add(partyLancelot);

                // Arash
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ARASH_ARCHER);
                PartyMember partyArash = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaImaginaryElement);

                party.Add(partyArash);

                // Jack
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.JACK_ASSASSIN);
                PartyMember partyJack = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false, chaldeaMlbKscope);

                party.Add(partyJack);

                // Skadi Support
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.SKADI_CASTER);
                PartyMember partyMemberSupportCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false);

                party.Add(partyMemberSupportCaster);
                #endregion

                /* Node data */
                #region First Wave
                EnemyMob walkure1 = new EnemyMob
                {
                    Id            = 0,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 9884.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure2 = new EnemyMob
                {
                    Id            = 1,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 10889.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure3 = new EnemyMob
                {
                    Id            = 2,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 10664.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };
                #endregion

                #region Second Wave
                EnemyMob walkure4 = new EnemyMob
                {
                    Id            = 3,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 30279.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure5 = new EnemyMob
                {
                    Id            = 4,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 24599.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure6 = new EnemyMob
                {
                    Id            = 5,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 33264.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };
                #endregion

                #region Third Wave
                EnemyMob walkure7 = new EnemyMob
                {
                    Id            = 6,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 41136.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure8 = new EnemyMob
                {
                    Id            = 7,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 49586.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure9 = new EnemyMob
                {
                    Id            = 8,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 180432.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };
                #endregion

                List <EnemyMob> enemyMobs = new List <EnemyMob>
                {
                    walkure1, walkure2, walkure3, // 1st wave
                    walkure4, walkure5, walkure6, // 2nd wave
                    walkure7, walkure8, walkure9  // 3rd wave
                };

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partyArash, 3, party, enemyMobs, 1); // Arash NP charge

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyArash).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.First, constantExportJson);

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyLancelot, 3, party, enemyMobs, 1);            // Zerkalot NP gain up
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 1, party, enemyMobs, 1); // Skadi quick buff up

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyLancelot).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Second, constantExportJson);

                _output.WriteLine($"{partyLancelot.Servant.ServantBasicInfo.Name} has {partyLancelot.NpCharge}% charge after the 2nd fight");

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 3, party, enemyMobs, 1); // Skadi (support) NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);               // Fragment of 2004's NP strength buff
                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyLancelot).Should().BeTrue();
                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyJack).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Third, constantExportJson);

                _output.WriteLine($"{partyLancelot.Servant.ServantBasicInfo.Name} has {partyLancelot.NpCharge}% charge after the 3rd fight");
                _output.WriteLine($"{partyJack.Servant.ServantBasicInfo.Name} has {partyJack.NpCharge}% charge after the 3rd fight");

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(0);
                    partyLancelot.NpCharge.Should().Be(27);
                }
            }
        }
        public async Task FlamingMansionLB2Dantes()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses      resolvedClasses    = AutofacUtility.ResolveScope(scope);
                ConstantExportJson constantExportJson = await FrequentlyUsed.GetConstantExportJsonAsync(resolvedClasses.AtlasAcademyClient);

                List <PartyMember> party = new List <PartyMember>();

                EquipBasicJson equipBasicJson    = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE);
                CraftEssence   chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);

                MysticCode mysticCode = new MysticCode
                {
                    MysticCodeLevel = 4,
                    MysticCodeInfo  = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.ARTIC_ID)
                };

                #region Party Data
                // Dantes
                ServantBasicJson basicJson           = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.DANTES_AVENGER);
                PartyMember      partyMemberAttacker = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false, chaldeaSuperscope);

                party.Add(partyMemberAttacker);

                // Skadi
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.SKADI_CASTER);
                PartyMember partyMemberCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses);

                party.Add(partyMemberCaster);

                // Skadi Support
                PartyMember partyMemberSupportCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, true);

                party.Add(partyMemberSupportCaster);
                #endregion

                /* Enemy node data */
                #region First Wave
                EnemyMob walkure1 = new EnemyMob
                {
                    Id            = 0,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 13933.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure2 = new EnemyMob
                {
                    Id            = 1,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 14786.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob muspell1 = new EnemyMob
                {
                    Id            = 2,
                    Name          = "Muspell",
                    ClassName     = ClassRelationEnum.Berserker,
                    AttributeName = AttributeRelationEnum.Earth,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 23456.0f,
                    Traits        = new List <string>
                    {
                        "giant", "humanoid", "genderMale", "superGiant"
                    }
                };
                #endregion

                #region Second Wave
                EnemyMob muspell2 = new EnemyMob
                {
                    Id            = 3,
                    Name          = "Muspell",
                    ClassName     = ClassRelationEnum.Berserker,
                    AttributeName = AttributeRelationEnum.Earth,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 25554.0f,
                    Traits        = new List <string>
                    {
                        "giant", "humanoid", "genderMale", "superGiant"
                    }
                };

                EnemyMob walkure3 = new EnemyMob
                {
                    Id            = 4,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 19047.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob muspell3 = new EnemyMob
                {
                    Id            = 5,
                    Name          = "Muspell",
                    ClassName     = ClassRelationEnum.Berserker,
                    AttributeName = AttributeRelationEnum.Earth,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 26204.0f,
                    Traits        = new List <string>
                    {
                        "giant", "humanoid", "genderMale", "superGiant"
                    }
                };
                #endregion

                #region Third Wave
                EnemyMob walkure4 = new EnemyMob
                {
                    Id            = 6,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 42926.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob walkure5 = new EnemyMob
                {
                    Id            = 7,
                    Name          = "Walkure",
                    ClassName     = ClassRelationEnum.Rider,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 180753.0f,
                    Traits        = new List <string>
                    {
                        "divine", "humanoid", "genderFemale"
                    }
                };

                EnemyMob muspell4 = new EnemyMob
                {
                    Id            = 8,
                    Name          = "Muspell",
                    ClassName     = ClassRelationEnum.Berserker,
                    AttributeName = AttributeRelationEnum.Earth,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 61289.0f,
                    Traits        = new List <string>
                    {
                        "giant", "humanoid", "genderMale", "superGiant"
                    }
                };
                #endregion

                List <EnemyMob> enemyMobs = new List <EnemyMob>
                {
                    walkure1, walkure2, muspell1, // 1st wave
                    muspell2, walkure3, muspell3, // 2nd wave
                    walkure4, walkure5, muspell4  // 3rd wave
                };

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 1, party, enemyMobs, 1); // Skadi (support) quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberAttacker, 2, party, enemyMobs, 1);      // Dante's 2nd skill

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyMemberAttacker).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.First, constantExportJson);

                _output.WriteLine($"{partyMemberAttacker.Servant.ServantBasicInfo.Name} has {partyMemberAttacker.NpCharge}% charge after the 1st fight");

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 3, party, enemyMobs, 1); // Skadi NP buff

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyMemberAttacker).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Second, constantExportJson);

                _output.WriteLine($"{partyMemberAttacker.Servant.ServantBasicInfo.Name} has {partyMemberAttacker.NpCharge}% charge after the 2nd fight");

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 3, party, enemyMobs, 1); // Skadi (support) NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberAttacker, 1, party, enemyMobs, 1);      // Dante's 1st skill
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 2, party, enemyMobs, 1);               // Artic mystic code ATK and NP damage up

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyMemberAttacker).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Third, constantExportJson);

                foreach (EnemyMob enemyMob in enemyMobs.FindAll(e => e.Health > 0.0f))
                {
                    _output.WriteLine($"{enemyMob.Name} has {enemyMob.Health} HP left");
                }

                _output.WriteLine($"{partyMemberAttacker.Servant.ServantBasicInfo.Name} has {partyMemberAttacker.NpCharge}% charge after the 3rd fight");

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(1);
                    enemyMobs.Find(e => e.Health > 0.0f).Health.Should().Be(47025.5f);
                    partyMemberAttacker.NpCharge.Should().Be(52);
                }
            }
        }
 /// <summary>
 /// Multiply the modified NP damage passed in and the attribute and class modifiers between the party member and enemy
 /// </summary>
 /// <param name="partyMember"></param>
 /// <param name="enemyMob"></param>
 /// <param name="modifiedNpDamage"></param>
 /// <returns></returns>
 private float AverageNpDamage(PartyMember partyMember, EnemyMob enemyMob, float modifiedNpDamage)
 {
     return(modifiedNpDamage
            * AttributeModifier(partyMember, enemyMob)
            * ClassModifier(partyMember, enemyMob));
 }
        public async Task PlugsuitWaverAstolfoDailyDoors()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses      resolvedClasses    = AutofacUtility.ResolveScope(scope);
                ConstantExportJson constantExportJson = await FrequentlyUsed.GetConstantExportJsonAsync(resolvedClasses.AtlasAcademyClient);

                List <PartyMember> party = new List <PartyMember>();

                MysticCode mysticCode = new MysticCode
                {
                    MysticCodeLevel = 10,
                    MysticCodeInfo  = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.PLUGSUIT_ID)
                };

                #region Craft Essence Data
                EquipBasicJson equipBasicJson         = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.HOLY_NIGHT_SUPPER_CE);
                CraftEssence   chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 33, true);

                equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE);
                CraftEssence chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);
                #endregion

                #region Party Data
                // Waver
                ServantBasicJson basicJson  = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.WAVER_CASTER);
                PartyMember      partyWaver = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 2);

                party.Add(partyWaver);

                // Astolfo Rider
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ASTOLFO_RIDER);
                PartyMember partyAstolfo = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaHolyNightSupper);

                partyAstolfo.Servant.ServantLevel = 100;

                party.Add(partyAstolfo);

                // Spartacus Berserker
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.SPARTACUS_BERSERKER);
                PartyMember partySpartacus = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaSuperscope);

                party.Add(partySpartacus);

                // Waver Support
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.WAVER_CASTER);
                PartyMember partyMemberSupportCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, true);

                party.Add(partyMemberSupportCaster);
                #endregion

                /* Node data */
                #region First Wave
                EnemyMob doorSaint1 = new EnemyMob
                {
                    Id            = 0,
                    Name          = "Door of the Saint",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 14464.0f,
                    Traits        = new List <string>()
                };

                EnemyMob doorChampion1 = new EnemyMob
                {
                    Id            = 1,
                    Name          = "Door of the Champion",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 23716.0f,
                    Traits        = new List <string>()
                };

                EnemyMob doorSaint2 = new EnemyMob
                {
                    Id            = 2,
                    Name          = "Door of the Saint",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.First,
                    Health        = 14464.0f,
                    Traits        = new List <string>()
                };
                #endregion

                #region Second Wave
                EnemyMob doorSaint3 = new EnemyMob
                {
                    Id            = 3,
                    Name          = "Door of the Saint",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 14464.0f,
                    Traits        = new List <string>()
                };

                EnemyMob doorChampion2 = new EnemyMob
                {
                    Id            = 4,
                    Name          = "Door of the Champion",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 23716.0f,
                    Traits        = new List <string>()
                };

                EnemyMob doorChampion3 = new EnemyMob
                {
                    Id            = 5,
                    Name          = "Door of the Champion",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Second,
                    Health        = 23716.0f,
                    Traits        = new List <string>()
                };
                #endregion

                #region Third Wave
                EnemyMob doorChampion4 = new EnemyMob
                {
                    Id            = 6,
                    Name          = "Door of the Champion",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 29596.0f,
                    Traits        = new List <string>()
                };

                EnemyMob doorChampion5 = new EnemyMob
                {
                    Id            = 7,
                    Name          = "Door of the Champion",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 23716.0f,
                    Traits        = new List <string>()
                };

                EnemyMob doorChampion6 = new EnemyMob
                {
                    Id            = 8,
                    Name          = "Door of the Champion",
                    ClassName     = ClassRelationEnum.Caster,
                    AttributeName = AttributeRelationEnum.Sky,
                    WaveNumber    = WaveNumberEnum.Third,
                    Health        = 23716.0f,
                    Traits        = new List <string>()
                };
                #endregion

                List <EnemyMob> enemyMobs = new List <EnemyMob>
                {
                    doorSaint1, doorChampion1, doorSaint2,       // wave 1
                    doorSaint3, doorChampion2, doorChampion3,    // wave 2
                    doorChampion4, doorChampion5, doorChampion6  // wave 3
                };

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partySpartacus).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.First, constantExportJson);

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyAstolfo, 3, party, enemyMobs, 1); // Astolfo NP charge & crit stars & crit damage

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyAstolfo).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Second, constantExportJson);

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 1, party, enemyMobs, 2); // Waver crit damage on Astolfo with 30% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 2, party, enemyMobs, 2); // Waver defense up to party with 10% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 3, party, enemyMobs, 2); // Waver attack up to party with 10% charge

                _output.WriteLine("--- Before party swap ---");
                foreach (PartyMember partyMember in party)
                {
                    _output.WriteLine(partyMember.Servant.ServantBasicInfo.Name);
                }

                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4); // Swap spartacus with Waver

                _output.WriteLine("\n--- After party swap ---");
                foreach (PartyMember partyMember in party)
                {
                    _output.WriteLine(partyMember.Servant.ServantBasicInfo.Name);
                }

                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 1, party, enemyMobs, 2); // Waver (support) crit damage on Astolfo with 30% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 2, party, enemyMobs, 2); // Waver (support) defense up to party with 10% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 3, party, enemyMobs, 2); // Waver (support) attack up to party with 10% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 2, party, enemyMobs, 2, 3);            // Stun 3rd enemy on the field with plugsuit

                resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyAstolfo).Should().BeTrue();
                resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Third, constantExportJson);

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(0);
                    party.IndexOf(partyMemberSupportCaster).Should().Be(2);
                    party.IndexOf(partySpartacus).Should().Be(3);
                }
            }
        }
        private List <EnemyMob> GetGardenMob()
        {
            #region First Wave
            EnemyMob dweller1 = new EnemyMob
            {
                Id            = 0,
                Name          = "Fairy Tale Dweller",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 18801.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid"
                }
            };

            EnemyMob dweller2 = new EnemyMob
            {
                Id            = 1,
                Name          = "Fairy Tale Dweller",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 14601.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid"
                }
            };

            EnemyMob dweller3 = new EnemyMob
            {
                Id            = 2,
                Name          = "Fairy Tale Dweller",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 18801.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid"
                }
            };
            #endregion

            #region Second Wave
            EnemyMob dweller4 = new EnemyMob
            {
                Id            = 3,
                Name          = "Fairy Tale Dweller",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 31555.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid"
                }
            };

            EnemyMob demon = new EnemyMob
            {
                Id            = 4,
                Name          = "Fairy Tale Demon",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 55704.0f,
                Traits        = new List <string>
                {
                    "daemon", "demonic"
                }
            };

            EnemyMob dweller5 = new EnemyMob
            {
                Id            = 5,
                Name          = "Fairy Tale Dweller",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 32450.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid"
                }
            };
            #endregion

            #region Third Wave
            EnemyMob nightView = new EnemyMob
            {
                Id            = 6,
                Name          = "Wow, A Street with a Wonderful Night View...",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 88406.0f,
                Traits        = new List <string>
                {
                    "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish"
                }
            };

            EnemyMob crudeNightscape = new EnemyMob
            {
                Id            = 7,
                Name          = "What a Crude Nightscape!",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 67872.0f,
                Traits        = new List <string>
                {
                    "genderMale", "childServant", "humanoid", "basedOnServant", "weakToEnumaElish"
                }
            };

            EnemyMob glitteringTown = new EnemyMob
            {
                Id            = 8,
                Name          = "What a Glittering Town!",
                ClassName     = ClassRelationEnum.Caster,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 130702.0f,
                Traits        = new List <string>
                {
                    "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish"
                }
            };
            #endregion

            return(new List <EnemyMob>
            {
                dweller1, dweller2, dweller3,                // wave 1
                dweller4, demon, dweller5,                   // wave 2
                nightView, crudeNightscape, glitteringTown   // wave 3
            });
        }
        /// <summary>
        /// Simulate noble phantasms against a wave of enemies
        /// </summary>
        /// <param name="party"></param>
        /// <param name="enemyMobs"></param>
        /// <param name="waveNumber">The wave the node simulation is currently on</param>
        /// <param name="constantExportJson">Holds the constant dataset from Atlas Academy in JSON format</param>
        /// <param name="enemyPosition">Set the cursor of an enemy's position from left to right (1-3)</param>
        public void NoblePhantasmChainSimulator(List <PartyMember> party, List <EnemyMob> enemyMobs, WaveNumberEnum waveNumber, ConstantExportJson constantExportJson,
                                                int enemyPosition = 3)
        {
            List <PartyMember> npChainList = party
                                             .FindAll(p => p.NpChainOrder != NpChainOrderEnum.None)
                                             .OrderBy(p => p.NpChainOrder)
                                             .ToList();

            if (npChainList.Count == 0)
            {
                return;
            }

            ConfigureExportJson(constantExportJson);

            enemyPosition--;         // set to zero-based
            int npChainPosition = 0; // used to calculate overcharge

            // Go through each party member's NP attack in the order of the NP chain provided
            foreach (PartyMember partyMember in npChainList)
            {
                // Check if any enemies are alive
                if (enemyMobs.Count == 0)
                {
                    return;
                }

                // Determine active party member buffs
                float totalNpRefund = 0.0f, cardNpTypeUp = 0.0f, attackUp = 0.0f, powerModifier = 0.0f, npGainUp = 0.0f;

                // Grab the targets on the field (max: 3)
                List <EnemyMob> enemyTargets = enemyMobs.FindAll(e => e.WaveNumber == waveNumber).Take(3).ToList();

                foreach (Function partyMemberFunction in partyMember.NoblePhantasm.Functions)
                {
                    if (partyMemberFunction.FuncType == "damageNp" || partyMemberFunction.FuncType == "damageNpPierce")
                    {
                        Tuple <float, float, float, float> activePartyMemberEffects = SetStatusEffects(partyMember, cardNpTypeUp, attackUp, powerModifier, npGainUp);
                        cardNpTypeUp  = activePartyMemberEffects.Item1;
                        attackUp      = activePartyMemberEffects.Item2;
                        powerModifier = activePartyMemberEffects.Item3 + partyMember.AdditionalDamageBonus;
                        npGainUp      = activePartyMemberEffects.Item4;

                        if (partyMemberFunction.FuncTargetType == "enemy") // single target
                        {
                            // Find the next available target if the previously selected is already dead (zero-based comparison)
                            EnemyMob enemyTarget = enemyTargets.Count - 1 >= enemyPosition
                                ? enemyTargets[enemyPosition]
                                : enemyTargets.Last();

                            totalNpRefund += DamagePhase(partyMember, enemyTarget, powerModifier, npChainPosition,
                                                         attackUp, cardNpTypeUp, npGainUp, partyMemberFunction);
                        }
                        else
                        {
                            // Go through each enemy mob grouped by their wave number
                            for (int i = 0; i < enemyTargets.Count; i++)
                            {
                                totalNpRefund += DamagePhase(partyMember, enemyTargets[i], powerModifier, npChainPosition,
                                                             attackUp, cardNpTypeUp, npGainUp, partyMemberFunction);
                            }
                        }
                    }
                    else
                    {
                        NoblePhantasmSkillActivation.SkillActivation(partyMemberFunction, partyMember, party, enemyTargets, enemyPosition);
                    }
                }

                // Replace old charge with newly refunded NP
                totalNpRefund /= 100.0f;
                if (totalNpRefund > 300.0f)
                {
                    totalNpRefund = 300.0f; // set max charge
                }
                partyMember.NpCharge     = (float)Math.Floor(totalNpRefund);
                partyMember.NpChainOrder = NpChainOrderEnum.None;

                enemyMobs.RemoveAll(e => e.Health <= 0.0f); // remove dead enemies in preparation for next NP
                npChainPosition++;
            }

            // Check if any servants that fired off their NPs have any self "force/instantDeath" debuffs (i.e. Arash & Oda Nobukatsu)
            List <PartyMember> martyred = npChainList
                                          .FindAll(d => d
                                                   .NoblePhantasm
                                                   .Functions
                                                   .Any(f => (f.FuncType == "instantDeath" || f.FuncType == "forceInstantDeath") && f.FuncTargetType == "self"));

            foreach (PartyMember martyr in martyred)
            {
                if (party.Count - 1 >= 3)
                {
                    party.Swap(martyr, party[3]);
                }
                party.Remove(martyr);
            }

            // Check if any NPs have "forceInstantDeath" and "ptSelfAnotherFirst" (i.e. Chen Gong)
            // TODO: Check elsewhere if there is another servant on the field prior to allowing this NP to execute
            PartyMember servantButcher = npChainList.Find(d => d.NoblePhantasm.Functions.Any(f => f.FuncType == "forceInstantDeath" && f.FuncTargetType == "ptSelfAnotherFirst"));

            if (servantButcher != null)
            {
                // remove the first (left-most) party member that isn't the butcher
                PartyMember scapegoat = party.Where(s => s.Id != servantButcher.Id).First();
                if (party.Count - 1 >= 3)
                {
                    party.Swap(scapegoat, party[3]);
                }
                party.Remove(scapegoat);
            }
        }
        private List <EnemyMob> GetEnemyChristmas2018()
        {
            #region First Wave
            EnemyMob mafiaGhost1 = new EnemyMob
            {
                Id            = 0,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 32149.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };

            EnemyMob mafiaGhost2 = new EnemyMob
            {
                Id            = 1,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 32739.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };

            EnemyMob mafiaGhost3 = new EnemyMob
            {
                Id            = 2,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 31560.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };
            #endregion

            #region Second Wave
            EnemyMob bossPet = new EnemyMob
            {
                Id            = 3,
                Name          = "Boss' Pet",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Earth,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 104814.0f,
                Traits        = new List <string>
                {
                    "beast"
                }
            };

            EnemyMob mafiaGhost4 = new EnemyMob
            {
                Id            = 4,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 38586.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };

            EnemyMob mafiaGhost5 = new EnemyMob
            {
                Id            = 5,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 37927.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };
            #endregion

            #region Third Wave
            EnemyMob mafiaGhost6 = new EnemyMob
            {
                Id            = 6,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 45511.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };

            EnemyMob gamblingBookmaker = new EnemyMob
            {
                Id            = 7,
                Name          = "Gambling Bookmaker",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 180792.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };

            EnemyMob mafiaGhost7 = new EnemyMob
            {
                Id            = 8,
                Name          = "Mafia Ghost",
                ClassName     = ClassRelationEnum.Archer,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 44771.0f,
                Traits        = new List <string>
                {
                    "undead", "demonic"
                }
            };
            #endregion

            return(new List <EnemyMob>
            {
                mafiaGhost1, mafiaGhost2, mafiaGhost3,       // wave 1
                bossPet, mafiaGhost4, mafiaGhost5,           // wave 2
                mafiaGhost6, gamblingBookmaker, mafiaGhost7  // wave 3
            });
        }
        private List <EnemyMob> GetGardenMob()
        {
            #region First Wave
            EnemyMob driver1 = new EnemyMob
            {
                Id            = 0,
                Name          = "Limousine Driver",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 26427.0f,
                Traits        = new List <string>()
            };

            EnemyMob host1 = new EnemyMob
            {
                Id            = 1,
                Name          = "Limousine Host",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 17066.0f,
                Traits        = new List <string>()
            };

            EnemyMob host2 = new EnemyMob
            {
                Id            = 2,
                Name          = "Limousine Host",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.First,
                Health        = 17066.0f,
                Traits        = new List <string>()
            };
            #endregion

            #region Second Wave
            EnemyMob violence = new EnemyMob
            {
                Id            = 3,
                Name          = "Violence Limousine",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Earth,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 65660.0f,
                Traits        = new List <string>
                {
                    "wildbeast", "demonic", "mechanical", "superGiant"
                }
            };

            EnemyMob driver2 = new EnemyMob
            {
                Id            = 4,
                Name          = "Limousine Driver",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Second,
                Health        = 30869.0f,
                Traits        = new List <string>()
            };
            #endregion

            #region Third Wave
            EnemyMob india = new EnemyMob
            {
                Id            = 5,
                Name          = "India's Holy Maiden",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Human,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 88469.0f,
                Traits        = new List <string>
                {
                    "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish", "divine", "saberface", "riding"
                }
            };

            EnemyMob france = new EnemyMob
            {
                Id            = 6,
                Name          = "France's Holy Maiden",
                ClassName     = ClassRelationEnum.Ruler,
                AttributeName = AttributeRelationEnum.Star,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 45279.0f,
                Traits        = new List <string>
                {
                    "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "saberface"
                }
            };

            EnemyMob bananaPrince = new EnemyMob
            {
                Id            = 7,
                Name          = "Banana Prince",
                ClassName     = ClassRelationEnum.Saber,
                AttributeName = AttributeRelationEnum.Sky,
                WaveNumber    = WaveNumberEnum.Third,
                Health        = 131923.0f,
                Traits        = new List <string>
                {
                    "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish", "divine", "riding", "brynhildsBeloved"
                }
            };
            #endregion

            return(new List <EnemyMob>
            {
                driver1, host1, host2,       // wave 1
                violence, driver2,           // wave 2
                india, france, bananaPrince  // wave 3
            });
        }
Exemple #28
0
 private static void ApplyPartyMemberStatus(MysticCode mysticCode, Function mysticCodeFunction, EnemyMob enemy)
 {
     enemy.ActiveStatuses.Add(new ActiveStatus
     {
         StatusEffect      = mysticCodeFunction,
         AppliedSkillLevel = mysticCode.MysticCodeLevel,
         ActiveTurnCount   = mysticCodeFunction.Svals[mysticCode.MysticCodeLevel - 1].Turn
     });
 }
Exemple #29
0
 private static void ApplyStatus(MysticCode mysticCode, Function mysticCodeFunction, EnemyMob enemy)
 {
     ApplyPartyMemberStatus(mysticCode, mysticCodeFunction, enemy);
 }
Exemple #30
0
 private static void ApplyStatus(Function servantFunction, int level, EnemyMob enemy)
 {
     ApplyPartyMemberStatus(servantFunction, level, enemy);
 }