/// <summary> /// Add a servant from the player's Chaldea to the battle party and equip the specified CE (if available) /// </summary> /// <param name="party"></param> /// <param name="chaldeaServant"></param> /// <param name="chaldeaCraftEssence"></param> /// <param name="additionalDamageBonus"></param> /// <returns></returns> public async Task <PartyMember> AddPartyMember(List <PartyMember> party, ChaldeaServant chaldeaServant, CraftEssence chaldeaCraftEssence, float additionalDamageBonus = 0.0f) { ServantNiceJson servantNiceJson = await _aaClient.GetServantInfo(chaldeaServant.ServantBasicInfo.Id.ToString()); int servantTotalAtk = servantNiceJson.AtkGrowth[chaldeaServant.ServantLevel - 1] + chaldeaServant.FouAttack; int servantTotalHp = servantNiceJson.HpGrowth[chaldeaServant.ServantLevel - 1] + chaldeaServant.FouHealth; PartyMember partyMember = new PartyMember { Id = party.Count, Servant = chaldeaServant, ServantNiceInfo = servantNiceJson, TotalAttack = servantTotalAtk, TotalHealth = servantTotalHp, NoblePhantasm = servantNiceJson // Set NP for party member at start of fight .NoblePhantasms // (assume highest upgraded NP by priority) .Aggregate((agg, next) => next.Priority >= agg.Priority ? next : agg), AdditionalDamageBonus = additionalDamageBonus }; if (chaldeaCraftEssence != null) { partyMember.EquippedCraftEssence = chaldeaCraftEssence; partyMember.EquipNiceInfo = await _aaClient.GetCraftEssenceInfo(chaldeaCraftEssence.CraftEssenceInfo.Id.ToString()); partyMember.TotalAttack += partyMember.EquipNiceInfo.AtkGrowth[chaldeaCraftEssence.CraftEssenceLevel - 1]; partyMember.TotalHealth += partyMember.EquipNiceInfo.HpGrowth[chaldeaCraftEssence.CraftEssenceLevel - 1]; ApplyCraftEssenceEffects(partyMember); } return(partyMember); }
public void ConfirmJsonDeserializationServantNA() { // Set "Copy to Output Directory" to "Copy if newer" for JSON files ServantNiceJson testServant = LoadTestData.DeserializeServantJson("NA", "Caster", "500800-Merlin.json"); testServant.Name.Should().Be("Merlin"); }
public void ConfirmJsonDeserializationServantJP() { // Set "Copy to Output Directory" to "Copy if newer" for JSON files ServantNiceJson testServant = LoadTestData.DeserializeServantJson("JP", "Caster", "500300-TamamoNoMaeEN.json"); testServant.Name.Should().Be("Tamamo-no-Mae"); }
/// <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 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); } }
/// <summary> /// Create servant game data endpoints as WireMock stubs /// </summary> private void AddServantStubs(WireMockFixture wiremockFixture) { // build mock servant responses ServantNiceJson mockResponse = LoadTestData.DeserializeServantJson(_region, "Archer", $"{ARASH_ARCHER}-Arash{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", ARASH_ARCHER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Archer", $"{ATALANTE_ARCHER}-Atalante{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", ATALANTE_ARCHER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Archer", $"{GILGAMESH_ARCHER}-Gilgamesh{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", GILGAMESH_ARCHER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Assassin", $"{JACK_ASSASSIN}-Jack{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", JACK_ASSASSIN, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Avenger", $"{DANTES_AVENGER}-EdmondDantes{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", DANTES_AVENGER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Berserker", $"{LANCELOT_BERSERKER}-Lancelot{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", LANCELOT_BERSERKER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Berserker", $"{RAIKOU_BERSERKER}-Raikou{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", RAIKOU_BERSERKER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Berserker", $"{SPARTACUS_BERSERKER}-Spartacus{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", SPARTACUS_BERSERKER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Caster", $"{HELENA_CASTER}-HelenaBlavatsky{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", HELENA_CASTER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Caster", $"{MERLIN_CASTER}-Merlin{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", MERLIN_CASTER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Caster", $"{NITOCRIS_CASTER}-Nitocris{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", NITOCRIS_CASTER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Caster", $"{SKADI_CASTER}-ScathachSkadi{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", SKADI_CASTER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Caster", $"{SHAKESPEARE_CASTER}-WilliamShakespeare{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", SHAKESPEARE_CASTER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Caster", $"{WAVER_CASTER}-ZhugeLiang{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", WAVER_CASTER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Lancer", $"{PARVATI_LANCER}-Parvati{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", PARVATI_LANCER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Lancer", $"{VALKYRIE_LANCER}-Valkyrie{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", VALKYRIE_LANCER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Rider", $"{ASTOLFO_RIDER}-Astolfo{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", ASTOLFO_RIDER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Rider", $"{SIMA_YI_RIDER}-SimaYiReines{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", SIMA_YI_RIDER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Rider", $"{USHI_RIDER}-Ushiwakamaru{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", USHI_RIDER, mockResponse); mockResponse = LoadTestData.DeserializeServantJson(_region, "Saber", $"{NERO_CLAUDIUS_BRIDE}-NeroClaudiusBride{_langSuffix}.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, _region, "servant", NERO_CLAUDIUS_BRIDE, mockResponse); mockResponse = LoadTestData.DeserializeServantJson("JP", "Saber", $"{TOMOE_GOZEN_SABER}-TomoeGozenEN.json"); LoadTestData.CreateNiceWireMockStub(wiremockFixture, "JP", "servant", TOMOE_GOZEN_SABER, mockResponse); }
public RequiredItemMaterials HowMuchIsNeeded(ChaldeaServant currentServant, ChaldeaServant goalServant, GrailCostNiceJson grailCostNiceJson, ServantNiceJson currentServantNiceJson) { // Validate the two servant objects are the same servant if (currentServant.ServantBasicInfo != goalServant.ServantBasicInfo) { return(null); } // Set up _requiredItemMaterials = new RequiredItemMaterials(); // Allows nice JSON info to be saved prior, if provided if (currentServantNiceJson != null && currentServantNiceJson.Id == currentServant.ServantBasicInfo.Id) { _currentServantNiceJson = currentServantNiceJson; } else { return(_requiredItemMaterials); } /* Calculate ascension materials, QP, and/or grails */ if (currentServant.ServantLevel < goalServant.ServantLevel) { AscensionLevel[] allAscensionLevels = AscensionLevels(currentServant.ServantBasicInfo.Rarity); // Find the required ascension levels with removing ascensions above the goal List <AscensionLevel> requiredAscensionLevels = allAscensionLevels .Where(i => currentServant.ServantLevel < i.LevelCap) .ToList(); requiredAscensionLevels.RemoveAll(c => goalServant.ServantLevel < c.LevelCap); // Ascension materials if (requiredAscensionLevels.Count > 0) { foreach (AscensionLevel ascensionLevel in requiredAscensionLevels) { ItemMaterials ascensionItemMaterials = AscensionItemMaterials(ascensionLevel); if (ascensionItemMaterials == null) { continue; } _requiredItemMaterials.Qp += ascensionItemMaterials.Qp; AddItemMaterials(ascensionItemMaterials.Items); } } // Grails if (goalServant.ServantLevel > allAscensionLevels[^ 1].LevelCap) { IEnumerable <GrailInfo> grailInfoList = GetGrailRarityInfo(goalServant.ServantBasicInfo.Rarity, grailCostNiceJson) .Where(g => g.AddLevelMax + currentServant.ServantLevel <= goalServant.ServantLevel); foreach (GrailInfo grailInfo in grailInfoList) { _requiredItemMaterials.Qp += grailInfo.Qp; _requiredItemMaterials.GrailCount++; } } // Overall ember count CalculateEmbersNeeded(currentServant, goalServant, _currentServantNiceJson.ExpGrowth); } /* Calculate skill materials and QP */ for (int i = 0; i < 3; i++) { int currentSkillLevel = currentServant.SkillLevels[i]; int goalSkillLevel = goalServant.SkillLevels[i]; if (currentSkillLevel < goalSkillLevel) { for (int j = currentSkillLevel; j < goalSkillLevel; j++) { switch (j) { case 1: AddItemMaterials(_currentServantNiceJson.SkillMaterials.FirstSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.FirstSkill.Qp; break; case 2: AddItemMaterials(_currentServantNiceJson.SkillMaterials.SecondSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.SecondSkill.Qp; break; case 3: AddItemMaterials(_currentServantNiceJson.SkillMaterials.ThirdSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.ThirdSkill.Qp; break; case 4: AddItemMaterials(_currentServantNiceJson.SkillMaterials.FourthSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.FourthSkill.Qp; break; case 5: AddItemMaterials(_currentServantNiceJson.SkillMaterials.FifthSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.FifthSkill.Qp; break; case 6: AddItemMaterials(_currentServantNiceJson.SkillMaterials.SixthSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.SixthSkill.Qp; break; case 7: AddItemMaterials(_currentServantNiceJson.SkillMaterials.SeventhSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.SeventhSkill.Qp; break; case 8: AddItemMaterials(_currentServantNiceJson.SkillMaterials.EighthSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.EighthSkill.Qp; break; case 9: AddItemMaterials(_currentServantNiceJson.SkillMaterials.NinthSkill.Items); _requiredItemMaterials.Qp += _currentServantNiceJson.SkillMaterials.NinthSkill.Qp; break; } } } } return(_requiredItemMaterials); }