public async Task CreatePartyMemberWithCraftEssence()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

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

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses resolvedClasses = AutofacUtility.ResolveScope(scope);

                List <EquipBasicJson> equipBasicJsonList = await resolvedClasses.AtlasAcademyClient.GetListBasicEquipInfo();

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

                List <ServantBasicJson> basicJsonList = await resolvedClasses.AtlasAcademyClient.GetListBasicServantInfo();

                ServantBasicJson servantBasicJson = basicJsonList.Find(s => s.Id.ToString() == WireMockUtility.DANTES_AVENGER);
                PartyMember      partyMember      = await FrequentlyUsed.PartyMemberAsync(servantBasicJson, party, resolvedClasses, 1, false, chaldeaSuperscope);

                using (new AssertionScope())
                {
                    partyMember.Servant.ServantBasicInfo.Id.ToString().Should().Be(WireMockUtility.DANTES_AVENGER);
                    partyMember.EquippedCraftEssence.Mlb.Should().BeTrue();
                    partyMember.NpCharge.Should().Be(100.0f);
                }
            }
        }
Example #2
0
        public async Task GetGrailCostInfo()
        {
            _wiremockFixture.CheckIfMockServerInUse();

            // build mock response
            GrailCostNiceJson mockResponse = new GrailCostNiceJson
            {
                ZeroRarity  = new ZeroRarity(),
                OneRarity   = new OneRarity(),
                TwoRarity   = new TwoRarity(),
                ThreeRarity = new ThreeRarity(),
                FourRarity  = new FourRarity(),
                FiveRarity  = new FiveRarity()
            };

            _wiremockFixture.MockServer
            .Given(Request.Create().WithPath($"/export/{REGION}/NiceSvtGrailCost.json").UsingGet())
            .RespondWith(Response.Create().WithStatusCode(200).WithHeader(CONTENT_TYPE_HEADER, CONTENT_TYPE_APPLICATION_JSON).WithBodyAsJson(mockResponse));

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses     resolvedClasses = AutofacUtility.ResolveScope(scope);
                GrailCostNiceJson response        = await resolvedClasses.AtlasAcademyClient.GetGrailCostInfo();

                response.Should().BeEquivalentTo(mockResponse);
            }
        }
        public void LoadDataTest(string region)
        {
            IContainer container = ContainerBuilderInit.Create(region);

            using (var scope = container.BeginLifetimeScope())
            {
                ScopedClasses     resolvedClasses   = AutofacUtility.ResolveScope(scope);
                MasterChaldeaInfo masterChaldeaInfo = resolvedClasses.ChaldeaIO.Load();

                using (new AssertionScope())
                {
                    masterChaldeaInfo.Region.Should().Be(region);
                    masterChaldeaInfo.Username.Should().Be("simple_sandman");
                    masterChaldeaInfo.AccountLevel.Should().Be(150);
                    masterChaldeaInfo.FriendCode.Should().Be("999,999,999");
                }
            }
        }
Example #4
0
        public async Task GetMysticCodeInfo()
        {
            _wiremockFixture.CheckIfMockServerInUse();

            MysticCodeNiceJson mockResponse = new MysticCodeNiceJson
            {
                Id = 1
            };

            LoadTestData.CreateNiceWireMockStub(_wiremockFixture, REGION, "MC", "1", mockResponse);

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses      resolvedClasses = AutofacUtility.ResolveScope(scope);
                MysticCodeNiceJson response        = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo("1");

                response.Id.Should().Be(1);
            }
        }
Example #5
0
        public async Task GetClassAttackRateInfo()
        {
            _wiremockFixture.CheckIfMockServerInUse();

            ClassAttackRateNiceJson mockResponse = new ClassAttackRateNiceJson
            {
                Lancer = 105
            };

            _wiremockFixture.MockServer
            .Given(Request.Create().WithPath($"/export/{REGION}/NiceClassAttackRate.json").UsingGet())
            .RespondWith(Response.Create().WithStatusCode(200).WithHeader(CONTENT_TYPE_HEADER, CONTENT_TYPE_APPLICATION_JSON).WithBodyAsJson(mockResponse));

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses           resolvedClasses = AutofacUtility.ResolveScope(scope);
                ClassAttackRateNiceJson response        = await resolvedClasses.AtlasAcademyClient.GetClassAttackRateInfo();

                response.Lancer.Should().Be(105);
            }
        }
Example #6
0
        public async Task GetServantInfo()
        {
            _wiremockFixture.CheckIfMockServerInUse();

            // build mock response
            ServantNiceJson mockResponse = new ServantNiceJson
            {
                Id      = 1,
                AtkBase = 1000
            };

            LoadTestData.CreateNiceWireMockStub(_wiremockFixture, REGION, "servant", "1", mockResponse);

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses   resolvedClasses = AutofacUtility.ResolveScope(scope);
                ServantNiceJson response        = await resolvedClasses.AtlasAcademyClient.GetServantInfo("1");

                response.AtkBase.Should().Be(1000);
            }
        }
        public void SaveDataTest(string region)
        {
            IContainer container = ContainerBuilderInit.Create(region);

            MasterChaldeaInfo masterChaldeaInfo = new MasterChaldeaInfo
            {
                Region          = region,
                Username        = "******",
                AccountLevel    = 150,
                FriendCode      = "999,999,999",
                ChaldeaServants = new List <ChaldeaServant>(),
                CraftEssences   = new List <CraftEssence>(),
                MysticCodes     = new List <MysticCode>()
            };

            using (var scope = container.BeginLifetimeScope())
            {
                ScopedClasses resolvedClasses = AutofacUtility.ResolveScope(scope);
                resolvedClasses.ChaldeaIO.Save(masterChaldeaInfo);
            }
        }
Example #8
0
        public async Task GetTraitEnumInfo()
        {
            _wiremockFixture.CheckIfMockServerInUse();

            JObject mockResponse = new JObject
            {
                { "1", JToken.Parse(@"'genderMale'") }
            };

            // same for both NA and JP
            _wiremockFixture.MockServer
            .Given(Request.Create().WithPath($"/export/JP/nice_trait.json").UsingGet())
            .RespondWith(Response.Create().WithStatusCode(200).WithHeader(CONTENT_TYPE_HEADER, CONTENT_TYPE_APPLICATION_JSON).WithBodyAsJson(mockResponse));

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses resolvedClasses = AutofacUtility.ResolveScope(scope);
                JObject       response        = await resolvedClasses.AtlasAcademyClient.GetTraitEnumInfo();

                string traitName = response.Property("1")?.Value.ToString() ?? "";
                traitName.Should().Be("genderMale");
            }
        }
Example #9
0
        public async Task GetListBasicEquipInfo()
        {
            _wiremockFixture.CheckIfMockServerInUse();

            List <EquipBasicJson> mockResponse = new List <EquipBasicJson>();
            EquipBasicJson        json         = new EquipBasicJson
            {
                Id = 0
            };

            mockResponse.Add(json);

            _wiremockFixture.MockServer
            .Given(Request.Create().WithPath($"/export/{REGION}/basic_equip.json").UsingGet())
            .RespondWith(Response.Create().WithStatusCode(200).WithHeader(CONTENT_TYPE_HEADER, CONTENT_TYPE_APPLICATION_JSON).WithBodyAsJson(mockResponse));

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses         resolvedClasses = AutofacUtility.ResolveScope(scope);
                List <EquipBasicJson> response        = await resolvedClasses.AtlasAcademyClient.GetListBasicEquipInfo();

                response.First().Should().BeEquivalentTo(json);
            }
        }
Example #10
0
        public async Task ActivatePartyMemberSkills()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

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

            using (var scope = _container.BeginLifetimeScope())
            {
                ScopedClasses           resolvedClasses = AutofacUtility.ResolveScope(scope);
                List <ServantBasicJson> basicJsonList   = await resolvedClasses.AtlasAcademyClient.GetListBasicServantInfo();

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

                party.Add(partyMemberAttacker);

                // Skadi
                basicJson = basicJsonList.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

                // Actual enemy stats from LB2's "Ablazed Mansion" or "Flaming Mansion" free quest
                List <EnemyMob> enemyMobs = new List <EnemyMob>
                {
                    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"
                        }
                    }
                };

                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.ServantSkillActivation.AdjustSkillCooldowns(party);                                       // before next turn
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 3, party, enemyMobs, 1);        // Skadi NP buff
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);                                       // before next turn
                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

                _output.WriteLine("--- Dantes's active status effects ---");
                foreach (ActiveStatus activeStatus in partyMemberAttacker.ActiveStatuses)
                {
                    _output.WriteLine($"{activeStatus.StatusEffect.FuncPopupText.Replace("\n", " ")}");
                }

                using (new AssertionScope())
                {
                    partyMemberAttacker.SkillCooldowns.Count.Should().Be(2);      // 1st and 2nd skills used
                    partyMemberCaster.SkillCooldowns.Count.Should().Be(3);        // all 3 skills used
                    partyMemberSupportCaster.SkillCooldowns.Count.Should().Be(3); // all 3 skills used
                    partyMemberAttacker.ActiveStatuses.Count.Should().Be(8);      // Status Count = skadi 2 + skadi (support) 2
                                                                                  // + dantes (1st skill) 3 + dantes (2nd skill) 1
                    enemyMobs
                    .FindAll(d => d.ActiveStatuses.Any(f => f.StatusEffect.FuncPopupText == "DEF Down"))
                    .Count.Should().Be(1);     // find enemies with defense down
                }
            }
        }
        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 LancelotLoopDoubleSkadi()
        {
            _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 = 10,
                    MysticCodeInfo  = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.FRAGMENT_2004_ID)
                };

                #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);

                partyLancelot.Servant.SkillLevels = new int[] { 6, 8, 10 };
                party.Add(partyLancelot);

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

                party.Add(partySkadi);

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

                party.Add(partySkadiSupport);
                #endregion

                List <EnemyMob> enemyMobs = GetGardenMob();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 1);        // Fragment of 2004's NP gain buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 1, party, enemyMobs, 1); // Skadi (support) quick up buff

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

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

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 3, party, enemyMobs, 1);    // Skadi NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyLancelot, 3, party, enemyMobs, 1); // Zerkalot NP gain 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");

                partyLancelot.NpCharge.Should().Be(46);

                // NOTE: To avoid bottom line 46%, card against mecha and NP lancelot to get consistent NP
                partyLancelot.NpCharge = 49.0f;

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);        // Fragment of 2004's NP strength buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 3, party, enemyMobs, 1); // Skadi NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 2, party, enemyMobs, 1); // Skadi enemy defense down

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

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

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(0);
                    partyLancelot.NpCharge.Should().Be(36);
                }
            }
        }
        public async Task AtalanteNp1LoopDoubleSkadiArash()
        {
            _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.HOLY_NIGHT_SUPPER_CE);
                CraftEssence   chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);

                equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE);
                CraftEssence chaldeaKscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 20);

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

                #region Party Data
                // Atalante (Archer)
                ServantBasicJson basicJson     = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ATALANTE_ARCHER);
                PartyMember      partyAtalante = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false, chaldeaHolyNightSupper);

                partyAtalante.Servant.SkillLevels = new int[] { 10, 4, 10 };
                party.Add(partyAtalante);

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

                party.Add(partySkadi);

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

                party.Add(partySkadiSupport);

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

                party.Add(partyArash);
                #endregion

                List <EnemyMob> enemyMobs = GetGardenMob();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partyAtalante, 3, party, enemyMobs, 1);     // Atalante 3T NP gain up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 1, party, enemyMobs, 1); // Skadi (support) quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 3, party, enemyMobs, 1); // Skadi (support) NP charge

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

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

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4); // Swap Skadi (support) with Arash

                resolvedClasses.ServantSkillActivation.SkillActivation(partyArash, 3, party, enemyMobs);

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

                List <EnemyMob> waveSurvivors = enemyMobs.FindAll(e => e.WaveNumber == WaveNumberEnum.Second);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                waveSurvivors.Count(h => h.Health.NearlyEqual(11842.398f)).Should().Be(1);
                enemyMobs.RemoveAll(e => e.WaveNumber == WaveNumberEnum.Second);

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

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyAtalante, 1, party, enemyMobs, 1);     // Atalante party quick up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 3, party, enemyMobs, 1);        // Skadi NP charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down

                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);        // Plugsuit attack up

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

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

                FrequentlyUsed.ShowSurvivingEnemyHealth(enemyMobs, _output);

                enemyMobs.Count(h => h.Health.NearlyEqual(5291.2344f)).Should().Be(1);
            }
        }
        public async Task ArcherNodeParvatiDoubleSkadiNoCard()
        {
            _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 = 10,
                    MysticCodeInfo  = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.FRAGMENT_2004_ID)
                };

                #region Party Data
                // Parvati
                ServantBasicJson servantBasicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.PARVATI_LANCER);
                PartyMember      partyParvati     = await FrequentlyUsed.PartyMemberAsync(servantBasicJson, party, resolvedClasses, 4, false, chaldeaSuperscope);

                partyParvati.Servant.SkillLevels = new int[] { 9, 8, 10 };

                party.Add(partyParvati);

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

                party.Add(partySkadi);

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

                party.Add(partySupportSkadi);
                #endregion

                List <EnemyMob> enemyMobs = GetEnemyChristmas2018();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 1, party, enemyMobs, 1); // Skadi (support) quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 1, party, enemyMobs, 1);      // Parvati quick up buff

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

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

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 3, party, enemyMobs, 1);   // Skadi NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 2, party, enemyMobs, 1); // Parvati ATK, DEF, Star Drop Rate, & Crit Rate Up

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

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

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 3, party, enemyMobs, 1); // Skadi (support) NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);        // Fragment of 2004 NP STR up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down

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

                enemyMobs.Count.Should().Be(0);
            }
        }
        public async Task ArashOneLore100()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

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

                int servantId = 201300;
                ServantBasicJson servantBasicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id == servantId);

                /* Load servants as if they're already in a save file */
                ChaldeaServant currentServant = new ChaldeaServant
                {
                    ServantBasicInfo = servantBasicJson,
                    FouAttack        = 1000,
                    FouHealth        = 1000,
                    IsSupportServant = false,
                    NpLevel          = 1,
                    ServantLevel     = 1,
                    SkillLevels      = new int[] { 1, 1, 1 }
                };

                ChaldeaServant goalServant = new ChaldeaServant
                {
                    ServantBasicInfo = servantBasicJson,
                    FouAttack        = 1000,
                    FouHealth        = 1000,
                    IsSupportServant = false,
                    NpLevel          = 1,
                    ServantLevel     = 100,
                    SkillLevels      = new int[] { 1, 1, 10 }
                };

                RequiredItemMaterials req = resolvedClasses.MaterialCalculation.HowMuchIsNeeded(
                    currentServant,
                    goalServant,
                    constantExportJson.GrailCostNiceJson,
                    await resolvedClasses.AtlasAcademyClient.GetServantInfo(servantId.ToString()));

                Dictionary <string, int> materials = resolvedClasses.MaterialCalculation.GroupItemParents(req.Items);
                MaterialOutput(req, materials);

                using (new AssertionScope())
                {
                    RequiredItemsShouldBe(req, 32950000, 10, 753, 627, 251, 209);
                    materials.Should().Contain("Archer Monument", 6);
                    materials.Should().Contain("Archer Piece", 6);
                    materials.Should().Contain("Crystallized Lore", 1);
                    materials.Should().Contain("Gem of Archer", 6);
                    materials.Should().Contain("Homunculus Baby", 8);
                    materials.Should().Contain("Magic Gem of Archer", 6);
                    materials.Should().Contain("Octuplet Crystals", 6);
                    materials.Should().Contain("Proof of Hero", 25);
                    materials.Should().Contain("Secret Gem of Archer", 6);
                    materials.Should().Contain("Seed of Yggdrasil", 9);
                    materials.Should().Contain("Void's Dust", 24);
                }
            }
        }
Example #16
0
        /// <summary>
        /// Set up party member based on pre-defined servant and craft essence info
        /// </summary>
        /// <param name="basicJson">Basic information for a servant</param>
        /// <param name="party">List of party members</param>
        /// <param name="resolvedClasses">Dependently injected classes that are resolved using Autofac</param>
        /// <param name="npLevel">The Noble Phantasm level of a servant</param>
        /// <param name="isSupport">Declare if this is a support (friend) servant</param>
        /// <param name="craftEssence">The craft being used with the servant</param>
        /// <param name="additionalDamageBonus">Damage bonus added manually for a party member. Example would be servant damage bonus for a specific event</param>
        /// <returns></returns>
        public static async Task <PartyMember> PartyMemberAsync(ServantBasicJson basicJson, List <PartyMember> party, ScopedClasses resolvedClasses,
                                                                int npLevel = 1, bool isSupport = false, CraftEssence craftEssence = null, float additionalDamageBonus = 0.0f)
        {
            ServantNiceJson json = await resolvedClasses.AtlasAcademyClient.GetServantInfo(basicJson.Id.ToString());

            ChaldeaServant chaldeaServant = new ChaldeaServant
            {
                ServantLevel     = json.LvMax,
                NpLevel          = npLevel,
                FouHealth        = 1000,
                FouAttack        = 1000,
                SkillLevels      = new int[] { 10, 10, 10 },
                IsSupportServant = isSupport,
                ServantBasicInfo = basicJson
            };

            return(await resolvedClasses.CombatFormula.AddPartyMember(party, chaldeaServant, craftEssence, additionalDamageBonus));
        }
        public async Task ArcherNodeValkyrieSkadiWaver()
        {
            _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.HOLY_NIGHT_SUPPER_CE);
                CraftEssence   chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 85, true);

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

                #region Party Data
                // Valkyrie
                ServantBasicJson basicJson     = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.VALKYRIE_LANCER);
                PartyMember      partyValkyrie = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 2, false, chaldeaHolyNightSupper);

                party.Add(partyValkyrie);

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

                party.Add(partySkadi);

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

                party.Add(partyWaver);

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

                party.Add(partySupportSkadi);
                #endregion

                List <EnemyMob> enemyMobs = GetEnemyChristmas2018();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partyValkyrie, 1, party, enemyMobs);        // Valkyrie quick and NP STR up
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 1, party, enemyMobs, 1);        // Waver crit damage on Valkyrie with 30% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 2, party, enemyMobs, 1);        // Waver defense up to party with 10% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 3, party, enemyMobs, 1);        // Waver attack up to party with 10% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4);  // Plugsuit swap Waver for Skadi (support)
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 1, party, enemyMobs, 1); // Skadi quick up buff

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

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

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(mysticCode);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 3, party, enemyMobs, 1); // Skadi NP charge

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

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

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(mysticCode);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs);           // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 2, party, enemyMobs);    // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 3, party, enemyMobs, 1); // Skadi (support) NP charge
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);        // Plugsuit ATK up

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

                enemyMobs.Count.Should().Be(0);
            }
        }
        public async Task ArcherNodeParvatiDoubleSkadiByReference()
        {
            _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>();

                // Reference: https://www.youtube.com/watch?v=oBs_YT1ac-Y
                EquipBasicJson equipBasicJson    = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE);
                CraftEssence   chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);

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

                #region Party Data
                // Parvati
                ServantBasicJson servantBasicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.PARVATI_LANCER);
                PartyMember      partyParvati     = await FrequentlyUsed.PartyMemberAsync(servantBasicJson, party, resolvedClasses, 2, false, chaldeaSuperscope);

                partyParvati.Servant.SkillLevels = new int[] { 10, 4, 4 }; // adjust to the reference video

                party.Add(partyParvati);

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

                partySkadi.Servant.SkillLevels = new int[] { 7, 7, 8 }; // adjust to the reference video

                party.Add(partySkadi);

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

                party.Add(partySupportSkadi);
                #endregion

                List <EnemyMob> enemyMobs = GetEnemyChristmas2018();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 1, party, enemyMobs, 1); // Skadi (support) quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 1, party, enemyMobs, 1);      // Parvati quick up buff

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

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

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

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

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

                List <EnemyMob> waveSurvivors = enemyMobs.FindAll(w => w.WaveNumber == WaveNumberEnum.Second);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                waveSurvivors.Count.Should().Be(1);
                waveSurvivors.Any(h => h.Health < 30000.0f).Should().BeTrue();

                // To stay in line with the reference video
                enemyMobs.RemoveAll(w => w.WaveNumber == WaveNumberEnum.Second);
                _output.WriteLine($"Assume carding kills last monster...\n");

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 2, party, enemyMobs, 1);      // Parvati ATK, DEF, Star Drop Rate, & Crit Rate Up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 3, party, enemyMobs, 1); // Skadi (support) NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 2, party, enemyMobs, 1);        // Artic ATK & NP STR up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down

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

                waveSurvivors = enemyMobs.FindAll(w => w.WaveNumber == WaveNumberEnum.Third);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                using (new AssertionScope())
                {
                    waveSurvivors.Count.Should().Be(1);
                    waveSurvivors.Any(h => h.Health < 21000.0f).Should().BeTrue();
                }
            }
        }
        public async Task ArcherNodeArashParvatiMerlinSkadi()
        {
            _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.HOLY_NIGHT_SUPPER_CE);
                CraftEssence   chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 88, true);

                equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE);
                CraftEssence chaldeaKscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 20, false);

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

                #region Party Data
                // Arash
                ServantBasicJson basicJson  = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ARASH_ARCHER);
                PartyMember      partyArash = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaHolyNightSupper);

                partyArash.Servant.SkillLevels = new int[] { 6, 6, 10 };
                party.Add(partyArash);

                // Parvati
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.PARVATI_LANCER);
                PartyMember partyParvati = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 2, false, chaldeaKscope);

                party.Add(partyParvati);

                // Merlin
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.MERLIN_CASTER);
                PartyMember partyMerlin = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses);

                party.Add(partyMerlin);

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

                party.Add(partySkadiSupport);
                #endregion

                List <EnemyMob> enemyMobs = GetEnemyChristmas2018();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partyArash, 3, party, enemyMobs);  // Arash NP charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyMerlin, 1, party, enemyMobs); // Merlin ATK UP and 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(partySkadiSupport, 1, party, enemyMobs, 2); // Skadi (support) quick buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 1, party, enemyMobs);         // Parvati quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 2);        // Fragment NP gain buff

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

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

                List <EnemyMob> waveSurvivors = enemyMobs.FindAll(w => w.WaveNumber == WaveNumberEnum.Second);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                waveSurvivors.Count(h => h.Health.NearlyEqual(39286.863f)).Should().Be(1);

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(mysticCode);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 2, party, enemyMobs);         // Parvati ATK, DEF, Star Drop Rate, & Crit Rate Up
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 3, party, enemyMobs, 2);      // Parvati NP charge to self
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 2, party, enemyMobs);    // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 3, party, enemyMobs, 2); // Skadi NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 2);        // Fragment NP STR up

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

                waveSurvivors = enemyMobs.FindAll(w => w.WaveNumber == WaveNumberEnum.Third);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(2);
                    waveSurvivors.Count(h => h.Health.NearlyEqual(46759.25f)).Should().Be(1);
                }
            }
        }
        public async Task ArcherNodeParvatiDoubleSkadiWaver5CraftEssence()
        {
            _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.HOLY_NIGHT_SUPPER_CE);
                CraftEssence   chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);

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

                #region Party Data
                // Parvati
                ServantBasicJson basicJson    = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.PARVATI_LANCER);
                PartyMember      partyParvati = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 2, false, chaldeaHolyNightSupper);

                party.Add(partyParvati);

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

                party.Add(partySkadi);

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

                party.Add(partySupportSkadi);

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

                party.Add(partyWaver);
                #endregion

                List <EnemyMob> enemyMobs = GetEnemyChristmas2018();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 1, party, enemyMobs, 1); // Skadi (support) quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 3, party, enemyMobs, 1); // Skadi (support) NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 1, party, enemyMobs, 1);      // Parvati quick up buff

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

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

                // Fight 2/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySupportSkadi, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4);  // Plugsuit swap Skadi (support) for Waver
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 1, party, enemyMobs, 1);        // Waver crit damage on Parvati with 30% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 2, party, enemyMobs, 1);        // Waver defense up to party with 10% charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 3, party, enemyMobs, 1);        // Waver attack up to party with 10% charge

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

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

                List <EnemyMob> waveSurvivors = enemyMobs.FindAll(w => w.WaveNumber == WaveNumberEnum.Second);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(mysticCode);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);   // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 3, party, enemyMobs, 1);   // Skadi NP buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyParvati, 2, party, enemyMobs, 1); // Parvati ATK, DEF, Star Drop Rate, & Crit Rate Up
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);   // Plugsuit ATK up

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

                waveSurvivors = enemyMobs.FindAll(w => w.WaveNumber == WaveNumberEnum.Third);
                FrequentlyUsed.ShowSurvivingEnemyHealth(waveSurvivors, _output);

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(1);
                    waveSurvivors.Any(h => h.Health < 4000.0f).Should().BeTrue();
                }
            }
        }
        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);
                }
            }
        }
        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);
                }
            }
        }
        public async Task UshiwakamaruRiderSkilled100()
        {
            _wireMockFixture.CheckIfMockServerInUse();
            _wireMockUtility.AddStubs(_wireMockFixture);

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

                int servantId = 401400;
                ServantBasicJson servantBasicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id == servantId);

                /* Load servants as if they're already in a save file */
                ChaldeaServant currentServant = new ChaldeaServant
                {
                    ServantBasicInfo = servantBasicJson,
                    FouAttack        = 1000,
                    FouHealth        = 1000,
                    IsSupportServant = false,
                    NpLevel          = 1,
                    ServantLevel     = 1,
                    SkillLevels      = new int[] { 1, 1, 1 }
                };

                ChaldeaServant goalServant = new ChaldeaServant
                {
                    ServantBasicInfo = servantBasicJson,
                    FouAttack        = 1000,
                    FouHealth        = 1000,
                    IsSupportServant = false,
                    NpLevel          = 1,
                    ServantLevel     = 100,
                    SkillLevels      = new int[] { 9, 9, 9 }
                };

                RequiredItemMaterials req = resolvedClasses.MaterialCalculation.HowMuchIsNeeded(
                    currentServant,
                    goalServant,
                    constantExportJson.GrailCostNiceJson,
                    await resolvedClasses.AtlasAcademyClient.GetServantInfo(servantId.ToString()));

                Dictionary <string, int> materials = resolvedClasses.MaterialCalculation.GroupItemParents(req.Items);
                MaterialOutput(req, materials);

                using (new AssertionScope())
                {
                    RequiredItemsShouldBe(req, 72130000, 9, 753, 627, 251, 209);
                    materials.Should().Contain("Eternal Gear", 48);
                    materials.Should().Contain("Gem of Rider", 36);
                    materials.Should().Contain("Ghost Lantern", 11);
                    materials.Should().Contain("Magic Gem of Rider", 36);
                    materials.Should().Contain("Meteor Horseshoe", 40);
                    materials.Should().Contain("Octuplet Crystals", 56);
                    materials.Should().Contain("Proof of Hero", 105);
                    materials.Should().Contain("Rider Monument", 12);
                    materials.Should().Contain("Rider Piece", 12);
                    materials.Should().Contain("Secret Gem of Rider", 36);
                }
            }
        }
        public async Task FinalWaveAtalanteNp1()
        {
            _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.HOLY_NIGHT_SUPPER_CE);
                CraftEssence   chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true);

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

                #region Party Data
                // Atalante (Archer)
                ServantBasicJson basicJson     = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ATALANTE_ARCHER);
                PartyMember      partyAtalante = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false, chaldeaHolyNightSupper);

                partyAtalante.Servant.SkillLevels = new int[] { 10, 8, 10 };
                party.Add(partyAtalante);

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

                party.Add(partySkadi);

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

                party.Add(partySkadiSupport);

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

                party.Add(partyWaver);
                #endregion

                List <EnemyMob> enemyMobs = GetGardenMob();

                /* Simulate final phase */
                enemyMobs.RemoveAll(e => e.WaveNumber != WaveNumberEnum.Third);

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partyAtalante, 1, party, enemyMobs, 1);     // Atalante party quick up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 3, party, enemyMobs, 1);        // Skadi NP charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 1, party, enemyMobs, 1); // Skadi (support) quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 3, party, enemyMobs, 1); // Skadi (support) NP charge

                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4);  // Swap Skadi (support) with Waver
                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1);        // Plugsuit attack up

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

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

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

                FrequentlyUsed.ShowSurvivingEnemyHealth(enemyMobs, _output);

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

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

                int servantId = 501900;
                ServantBasicJson servantBasicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id == servantId);

                /* Load servants as if they're already in a save file */
                ChaldeaServant currentServant = new ChaldeaServant
                {
                    ServantBasicInfo = servantBasicJson,
                    FouAttack        = 1000,
                    FouHealth        = 1000,
                    IsSupportServant = false,
                    NpLevel          = 1,
                    ServantLevel     = 1,
                    SkillLevels      = new int[] { 1, 1, 1 }
                };

                ChaldeaServant goalServant = new ChaldeaServant
                {
                    ServantBasicInfo = servantBasicJson,
                    FouAttack        = 1000,
                    FouHealth        = 1000,
                    IsSupportServant = false,
                    NpLevel          = 1,
                    ServantLevel     = 100,
                    SkillLevels      = new int[] { 10, 10, 10 }
                };

                RequiredItemMaterials req = resolvedClasses.MaterialCalculation.HowMuchIsNeeded(
                    currentServant,
                    goalServant,
                    constantExportJson.GrailCostNiceJson,
                    await resolvedClasses.AtlasAcademyClient.GetServantInfo(servantId.ToString()));

                Dictionary <string, int> materials = resolvedClasses.MaterialCalculation.GroupItemParents(req.Items);
                MaterialOutput(req, materials);

                using (new AssertionScope())
                {
                    RequiredItemsShouldBe(req, 222600000, 5, 753, 627, 251, 209);
                    materials.Should().Contain("Caster Monument", 17);
                    materials.Should().Contain("Caster Piece", 17);
                    materials.Should().Contain("Crystallized Lore", 3);
                    materials.Should().Contain("Eternal Gear", 15);
                    materials.Should().Contain("Forbidden Page", 55);
                    materials.Should().Contain("Gem of Caster", 51);
                    materials.Should().Contain("Heart of the Foreign God", 33);
                    materials.Should().Contain("Magic Gem of Caster", 51);
                    materials.Should().Contain("Phoenix Feather", 70);
                    materials.Should().Contain("Secret Gem of Caster", 51);
                    materials.Should().Contain("Void's Dust", 105);
                }
            }
        }
        public async Task AtalanteNp1LoopDoubleSkadiHelena()
        {
            _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   chaldeaKscope  = FrequentlyUsed.GetCraftEssence(equipBasicJson, 20);

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

                #region Party Data
                // Atalante (Archer)
                ServantBasicJson basicJson     = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ATALANTE_ARCHER);
                PartyMember      partyAtalante = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaKscope);

                partyAtalante.Servant.SkillLevels = new int[] { 10, 4, 10 };
                party.Add(partyAtalante);

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

                party.Add(partySkadi);

                // Helena (Caster)
                basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.HELENA_CASTER);
                PartyMember partyHelena = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses);

                partyHelena.Servant.SkillLevels = new int[] { 10, 4, 10 };
                party.Add(partyHelena);

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

                party.Add(partySkadiSupport);
                #endregion

                List <EnemyMob> enemyMobs = GetGardenMob();

                /* Simulate node combat */
                // Fight 1/3
                resolvedClasses.ServantSkillActivation.SkillActivation(partyAtalante, 3, party, enemyMobs, 1);     // Atalante 3T NP gain up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 1, party, enemyMobs, 1);        // Skadi quick up buff
                resolvedClasses.ServantSkillActivation.SkillActivation(partyHelena, 1, party, enemyMobs, 1);       // Helena party 20% NP charge
                resolvedClasses.ServantSkillActivation.SkillActivation(partyHelena, 3, party, enemyMobs, 1);       // Helena 3T party QAB card type buff

                resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4);  // Swap Helena with Skadi (support)

                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 1, party, enemyMobs, 1); // Skadi (support) quick up buff

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

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

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

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

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

                // Fight 3/3
                resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party);
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadi, 2, party, enemyMobs, 1);        // Skadi enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partyAtalante, 1, party, enemyMobs, 1);     // Atalante party quick up
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down
                resolvedClasses.ServantSkillActivation.SkillActivation(partySkadiSupport, 3, party, enemyMobs, 1); // Skadi (support) NP charge

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

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

                using (new AssertionScope())
                {
                    enemyMobs.Count.Should().Be(0);
                    partyAtalante.NpCharge.Should().Be(69);
                }
            }
        }