private float BaseNpDamage(PartyMember partyMember, EnemyMob enemy, Sval svalNp) { int npValue = svalNp.Value; int targetBonusNpDamage = 0; // Add additional NP damage if there is a special target ID if (svalNp.Target > 0) { string traitName = _traitEnumInfo.Property(svalNp.Target.ToString())?.Value.ToString() ?? ""; if (enemy.Traits.Contains(traitName)) { targetBonusNpDamage = svalNp.Correction; } } float constantAttackRate = _constantRate.GetAttackMultiplier("ATTACK_RATE"); float classModifier = _classAttackRate.GetAttackMultiplier(partyMember.ServantNiceInfo.ClassName); float npTypeModifier = _constantRate.GetAttackMultiplier($"ENEMY_ATTACK_RATE_{partyMember.NoblePhantasm.Card}"); // Base NP damage = ATTACK_RATE * Servant total attack * Class modifier * NP type modifier * (20% bonus if undead enemy) * NP damage float baseNpDamage = constantAttackRate * partyMember.TotalAttack * classModifier * npTypeModifier * (npValue / 1000.0f); if (targetBonusNpDamage != 0) { baseNpDamage *= targetBonusNpDamage / 1000.0f; } return(baseNpDamage); }
private static Packet SpawnEnemy_Data(EnemyMob _enemyMob, Packet _packet) { _packet.Write(_enemyMob.id); _packet.Write(_enemyMob.transform.position); return(_packet); }
void FixedUpdate() { var dead = new List <int>(); for (int i = 0; i < ais.Count; i++) { EnemyMob ai = ais[i]; if (ai == null) { dead.Add(i); continue; } ai.dangerDistance = dangerDistance; ai.attackDistance = attackDistance; ai.attackRate = attackRate; ai.attackRateFluctuation = attackRateFluctuation; ai.dude.moveSpeed = moveSpeed; // HACK: this is probably slow ai.GetComponentInChildren <SphereCollider>().radius = separation; } foreach (int j in dead) { ais.RemoveAt(j); } }
public static void SpawnEnemy(int _toClient, EnemyMob _enemyMob) { using (Packet packet = new Packet((int)ServerPackets.spawnEnemy)) { SendTCPData(_toClient, SpawnEnemy_Data(_enemyMob, packet)); } }
public static void SpawnEnemy(EnemyMob _enemyMob) { using (Packet packet = new Packet((int)ServerPackets.spawnEnemy)) { SendTCPDataToAll(SpawnEnemy_Data(_enemyMob, packet)); } }
private float CalculatedNpPerHit(PartyMember partyMember, EnemyMob enemyMob, float cardNpTypeUp, float npGainUp) { float specialBonusEnemyMod = enemyMob.Traits.Contains("undead") ? 1.2f : 1.0f; return(EnemyClassModifier(enemyMob.ClassName.ToString()) * partyMember.NoblePhantasm.NpGain.Np[partyMember.Servant.NpLevel - 1] * (1.0f + cardNpTypeUp) * (1.0f + npGainUp) * specialBonusEnemyMod); }
public static void EnemyHealth(EnemyMob _enemyMob) { using (Packet packet = new Packet((int)ServerPackets.enemyHealth)) { packet.Write(_enemyMob.id); packet.Write(_enemyMob.health); SendTCPDataToAll(packet); } }
public static void EnemyPosition(EnemyMob _enemyMob) { using (Packet packet = new Packet((int)ServerPackets.enemyPosition)) { packet.Write(_enemyMob.id); packet.Write(_enemyMob.transform.position); SendUDPDataToAll(packet); } }
private float AttemptToKillEnemy(EnemyMob enemyMob, float npDamageForEnemyMob) { float healthRemaining = enemyMob.Health - (npDamageForEnemyMob * 0.9f); if (healthRemaining < 0.0f) { healthRemaining = 0.0f; } return(healthRemaining); }
private bool IsPowerMod(Buff buff, EnemyMob enemy) { if (buff.Type == "upDamage" && buff.Vals.Any(f => f.Name == "buffPowerModStrUp") && buff.CkOpIndv.Any(f => f.Name == buff.Tvals.First().Name) && enemy.Traits.Contains(buff.Tvals.First().Name)) { return(true); } return(false); }
/// <summary> /// Return the chance to kill an enemy based on 90% and 110% NP damage RNG /// </summary> /// <param name="enemyMob"></param> /// <param name="npDamageForEnemyMob"></param> /// <returns></returns> private float ChancesToKill(EnemyMob enemyMob, float npDamageForEnemyMob) { if (0.9f * npDamageForEnemyMob > enemyMob.Health) { return(100.0f); // perfect clear, even with the worst RNG } else if (1.1f * npDamageForEnemyMob < enemyMob.Health) { return(0.0f); // never clear, even with the best RNG } else // show chance of success { return((1.0f - ((enemyMob.Health / npDamageForEnemyMob - 0.9f) / 0.2f)) * 100.0f); } }
public override void OnStart() { // Cache the EnemyMob to which this enemy belongs. This tells the character where he should move to circle his current attacking target. enemyMob = ((EnemyAI)character.CharacterAI).EnemyMob; // Compute an available position for the enemy to move to. This forms a better circle around the player. moveTarget = enemyMob.GetAvailablePosition(); // Move the character to his movement target. This target is an empty space that will help form a circle around the player. //character.CharacterMovement.MoveTo (moveTarget); // Perform the walking action and move to the movement target Action walk = character.CharacterControl.ActionSet.basicActions.GetBasicAction(BasicActionType.Walk); walk.targetPosition = moveTarget; character.CharacterControl.PerformAction(walk); }
/// <summary> /// Find special damage up buff versus an enemy trait /// </summary> /// <param name="partyMember"></param> /// <param name="enemy"></param> /// <returns></returns> private float SpecialAttackUp(PartyMember partyMember, EnemyMob enemy) { float powerModifier = 0.0f; const float STATUS_EFFECT_DENOMINATOR = 1000.0f; foreach (ActiveStatus activeStatus in partyMember.ActiveStatuses) { Buff buff = GetBuff(activeStatus); if (buff == null) { return(0.0f); } if (IsPowerMod(buff, enemy)) { powerModifier += activeStatus.StatusEffect.Svals[activeStatus.AppliedSkillLevel - 1].Value / STATUS_EFFECT_DENOMINATOR; } } return(powerModifier); }
/// <summary> /// Initialize the AIDirector. Called on start when the AIDirector is instantiated. /// </summary> public void Init() { // Set the epoch settings to default. epochSettings = new EpochSettings(defaultEpochSettings); // Retrieve the 'AISpawner' instance used to spawn enemies on the battlefield. enemySpawner = GetComponent <AISpawner>(); // Set the enemy spawner to spawn enemies in the GameManager's current level enemySpawner.Level = GameManager.Instance.CurrentLevel; // Find the player gameObject to control his AI settings GameObject playerObject = GameObject.FindGameObjectWithTag("Player"); // Cache the player's Character component to modify his AI settings player = playerObject.GetComponent <Character>(); // Retrieve the EnemyMob component attached to this GameObject. This component controls the enemies' behavior enemyMob = GetComponent <EnemyMob>(); // Set the enemy mob's combat settings to default. enemyMob.Settings.Set(defaultEnemyAISettings); // Make the enemies attack the player. enemyMob.AttackTarget = player; // Initialize the enemy mob. enemyMob.Init(); // Update the settings for the player's AnxietyMonitor. These settings determine the rate at which player anxiety changes. playerAnxietyMonitor.Settings = playerAnxietyMonitorSettings; // Sets the AnxietyMonitor to monitor the player's anxiety. playerAnxietyMonitor.CharacterToMonitor = player; // Populate the current level with enemies PopulateLevel(GameManager.Instance.CurrentLevel); //paused = true; // Start updating the AI in a coroutine loop, where the AI is updated every 'aiTimeStep' seconds. StartCoroutine(UpdateAI()); // Update the game's intensity value every 'aiTimeStep' seconds. StartCoroutine(UpdateGameIntensity()); }
/// <summary> /// Spawns an enemy on the battlefield. The enemy is spawned inside the given mob /// </summary> /// <returns>The spawned enemy </returns> public Character SpawnEnemy(int difficultyLevel, int maxEnemyWorth, EnemyMob enemyMob) { // Select a random enemy to spawn from the list of spawnable enemies ('enemyPrefabs:Enemy[]'). Character enemyPrefab = ChooseRandomEnemy(difficultyLevel, maxEnemyWorth); // Spawn an instance of the chosen enemy Character enemy = Instantiate(enemyPrefab) as Character; // Choose a position in which to spawn the enemy Vector2 spawnPosition = GetRandomSpawnPoint(); // Spawn the enemy in the random position computed above enemy.Transform.position = spawnPosition; // Inform the EnemyMob instance that an enemy was spawned inside it. Allows the mob to keep track of the enemies inside of it enemyMob.OnEnemySpawn(enemy); //enemies.Add (enemy.GetComponent<Character>()); // Return the spawned enemy. return(enemy); }
private float NpGainedFromEnemy(PartyMember partyMember, EnemyMob enemyMob, float npGainUp, float cardNpTypeUp, float npDamageForEnemyMob) { float effectiveHitModifier, npRefund = 0.0f; List <float> npDistributionPercentages = NpDistributionPercentages(partyMember); foreach (float npHitPerc in npDistributionPercentages) { if (0.9f * npDamageForEnemyMob * npHitPerc / 100.0f > enemyMob.Health) { effectiveHitModifier = 1.5f; // overkill (includes killing blow) } else { effectiveHitModifier = 1.0f; // regular hit } float calcNpPerHit = CalculatedNpPerHit(partyMember, enemyMob, cardNpTypeUp, npGainUp); npRefund += (float)Math.Floor(effectiveHitModifier * calcNpPerHit); } return(npRefund); }
/// <summary> /// Set necessary enemy status effects for NP damage /// </summary> /// <param name="enemy"></param> /// <param name="partyMember"></param> /// <param name="defenseDownModifier"></param> /// <param name="cardDefenseDownModifier"></param> private Tuple <float, float> SetStatusEffects(EnemyMob enemy, PartyMember partyMember, float defenseDownModifier, float cardDefenseDownModifier) { const float STATUS_EFFECT_DENOMINATOR = 1000.0f; foreach (ActiveStatus activeStatus in enemy.ActiveStatuses) { Buff buff = GetBuff(activeStatus); if (buff != null) { if (buff.Type == "downDefence") { defenseDownModifier += activeStatus.StatusEffect.Svals[activeStatus.AppliedSkillLevel - 1].Value / STATUS_EFFECT_DENOMINATOR; } else if (buff.Type == "downDefencecommandall" && buff.CkOpIndv.Any(f => f.Name == ($"card{partyMember.NoblePhantasm.Card.ToUpperFirstChar()}"))) { cardDefenseDownModifier += activeStatus.StatusEffect.Svals[activeStatus.AppliedSkillLevel - 1].Value / STATUS_EFFECT_DENOMINATOR; } } } return(new Tuple <float, float>(defenseDownModifier, cardDefenseDownModifier)); }
private static void ApplyPartyMemberStatus(Function servantFunction, int level, EnemyMob enemy) { enemy.ActiveStatuses.Add(new ActiveStatus { StatusEffect = servantFunction, AppliedSkillLevel = level, ActiveTurnCount = servantFunction.Svals[level - 1].Turn }); }
private List <EnemyMob> GetGardenMob() { #region First Wave EnemyMob ghost1 = new EnemyMob { Id = 0, Name = "Shaking Ghost", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 20845.0f, Traits = new List <string> { "demonic", "undead", "genderUnknown" } }; EnemyMob ghost2 = new EnemyMob { Id = 1, Name = "Absent-Minded Ghost", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 11026.0f, Traits = new List <string> { "demonic", "undead", "genderUnknown" } }; EnemyMob ghost3 = new EnemyMob { Id = 2, Name = "Absent-Minded Ghost", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 11026.0f, Traits = new List <string> { "demonic", "undead", "genderUnknown" } }; #endregion #region Second Wave EnemyMob ghost4 = new EnemyMob { Id = 3, Name = "Shaking Ghost", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 24788.0f, Traits = new List <string> { "demonic", "undead", "genderUnknown" } }; EnemyMob ghost5 = new EnemyMob { Id = 4, Name = "Shaking Ghost", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 24788.0f, Traits = new List <string> { "demonic", "undead", "genderUnknown" } }; EnemyMob glassesGod = new EnemyMob { Id = 5, Name = "Glasses God", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Second, Health = 65660.0f, Traits = new List <string> { "demonic", "superGiant", "genderUnknown" } }; #endregion #region Third Wave EnemyMob cardboardGlassesShine = new EnemyMob { Id = 6, Name = "Glasses Shine!", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Third, Health = 140976.0f, Traits = new List <string> { "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "riding", "king", "dragon", "brynhildsBeloved" } }; EnemyMob kaibaGlassesShine = new EnemyMob { Id = 7, Name = "Glasses...Shine...!", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Third, Health = 81360.0f, Traits = new List <string> { "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "divine", "dragon", "riding", "brynhildsBeloved" } }; EnemyMob hearingEyePopOut = new EnemyMob { Id = 8, Name = "I Heard That Having Great Insight...Can Cause Your Eye To Pop Out", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Third, Health = 76290.0f, Traits = new List <string> { "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "riding", "brynhildsBeloved" } }; #endregion return(new List <EnemyMob> { ghost1, ghost2, ghost3, // wave 1 ghost4, ghost5, glassesGod, // wave 2 cardboardGlassesShine, kaibaGlassesShine, hearingEyePopOut // wave 3 }); }
public async Task CastleSnowIceLB2ArashZerkalotJack() { _wireMockFixture.CheckIfMockServerInUse(); _wireMockUtility.AddStubs(_wireMockFixture); using (var scope = _container.BeginLifetimeScope()) { ScopedClasses resolvedClasses = AutofacUtility.ResolveScope(scope); ConstantExportJson constantExportJson = await FrequentlyUsed.GetConstantExportJsonAsync(resolvedClasses.AtlasAcademyClient); List <PartyMember> party = new List <PartyMember>(); MysticCode mysticCode = new MysticCode { MysticCodeLevel = 10, MysticCodeInfo = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.FRAGMENT_2004_ID) }; #region Craft Essence Data EquipBasicJson equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE); CraftEssence chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true); CraftEssence chaldeaMlbKscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 30, true); equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.IMAGINARY_ELEMENT_CE); CraftEssence chaldeaImaginaryElement = FrequentlyUsed.GetCraftEssence(equipBasicJson, 36, true); #endregion #region Party Data // Lancelot Berserker ServantBasicJson basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.LANCELOT_BERSERKER); PartyMember partyLancelot = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaSuperscope); party.Add(partyLancelot); // Arash basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ARASH_ARCHER); PartyMember partyArash = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaImaginaryElement); party.Add(partyArash); // Jack basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.JACK_ASSASSIN); PartyMember partyJack = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false, chaldeaMlbKscope); party.Add(partyJack); // Skadi Support basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.SKADI_CASTER); PartyMember partyMemberSupportCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false); party.Add(partyMemberSupportCaster); #endregion /* Node data */ #region First Wave EnemyMob walkure1 = new EnemyMob { Id = 0, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 9884.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure2 = new EnemyMob { Id = 1, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 10889.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure3 = new EnemyMob { Id = 2, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 10664.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; #endregion #region Second Wave EnemyMob walkure4 = new EnemyMob { Id = 3, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 30279.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure5 = new EnemyMob { Id = 4, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 24599.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure6 = new EnemyMob { Id = 5, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 33264.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; #endregion #region Third Wave EnemyMob walkure7 = new EnemyMob { Id = 6, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 41136.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure8 = new EnemyMob { Id = 7, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 49586.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure9 = new EnemyMob { Id = 8, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 180432.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; #endregion List <EnemyMob> enemyMobs = new List <EnemyMob> { walkure1, walkure2, walkure3, // 1st wave walkure4, walkure5, walkure6, // 2nd wave walkure7, walkure8, walkure9 // 3rd wave }; /* Simulate node combat */ // Fight 1/3 resolvedClasses.ServantSkillActivation.SkillActivation(partyArash, 3, party, enemyMobs, 1); // Arash NP charge resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyArash).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.First, constantExportJson); // Fight 2/3 resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party); resolvedClasses.ServantSkillActivation.SkillActivation(partyLancelot, 3, party, enemyMobs, 1); // Zerkalot NP gain up resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 1, party, enemyMobs, 1); // Skadi quick buff up resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyLancelot).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Second, constantExportJson); _output.WriteLine($"{partyLancelot.Servant.ServantBasicInfo.Name} has {partyLancelot.NpCharge}% charge after the 2nd fight"); // Fight 3/3 resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party); resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 3, party, enemyMobs, 1); // Skadi (support) NP buff resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 1, party, enemyMobs, 1); // Fragment of 2004's NP strength buff resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyLancelot).Should().BeTrue(); resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyJack).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Third, constantExportJson); _output.WriteLine($"{partyLancelot.Servant.ServantBasicInfo.Name} has {partyLancelot.NpCharge}% charge after the 3rd fight"); _output.WriteLine($"{partyJack.Servant.ServantBasicInfo.Name} has {partyJack.NpCharge}% charge after the 3rd fight"); using (new AssertionScope()) { enemyMobs.Count.Should().Be(0); partyLancelot.NpCharge.Should().Be(27); } } }
public async Task FlamingMansionLB2Dantes() { _wireMockFixture.CheckIfMockServerInUse(); _wireMockUtility.AddStubs(_wireMockFixture); using (var scope = _container.BeginLifetimeScope()) { ScopedClasses resolvedClasses = AutofacUtility.ResolveScope(scope); ConstantExportJson constantExportJson = await FrequentlyUsed.GetConstantExportJsonAsync(resolvedClasses.AtlasAcademyClient); List <PartyMember> party = new List <PartyMember>(); EquipBasicJson equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE); CraftEssence chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true); MysticCode mysticCode = new MysticCode { MysticCodeLevel = 4, MysticCodeInfo = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.ARTIC_ID) }; #region Party Data // Dantes ServantBasicJson basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.DANTES_AVENGER); PartyMember partyMemberAttacker = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, false, chaldeaSuperscope); party.Add(partyMemberAttacker); // Skadi basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.SKADI_CASTER); PartyMember partyMemberCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses); party.Add(partyMemberCaster); // Skadi Support PartyMember partyMemberSupportCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, true); party.Add(partyMemberSupportCaster); #endregion /* Enemy node data */ #region First Wave EnemyMob walkure1 = new EnemyMob { Id = 0, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 13933.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure2 = new EnemyMob { Id = 1, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 14786.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob muspell1 = new EnemyMob { Id = 2, Name = "Muspell", ClassName = ClassRelationEnum.Berserker, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.First, Health = 23456.0f, Traits = new List <string> { "giant", "humanoid", "genderMale", "superGiant" } }; #endregion #region Second Wave EnemyMob muspell2 = new EnemyMob { Id = 3, Name = "Muspell", ClassName = ClassRelationEnum.Berserker, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Second, Health = 25554.0f, Traits = new List <string> { "giant", "humanoid", "genderMale", "superGiant" } }; EnemyMob walkure3 = new EnemyMob { Id = 4, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 19047.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob muspell3 = new EnemyMob { Id = 5, Name = "Muspell", ClassName = ClassRelationEnum.Berserker, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Second, Health = 26204.0f, Traits = new List <string> { "giant", "humanoid", "genderMale", "superGiant" } }; #endregion #region Third Wave EnemyMob walkure4 = new EnemyMob { Id = 6, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 42926.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob walkure5 = new EnemyMob { Id = 7, Name = "Walkure", ClassName = ClassRelationEnum.Rider, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 180753.0f, Traits = new List <string> { "divine", "humanoid", "genderFemale" } }; EnemyMob muspell4 = new EnemyMob { Id = 8, Name = "Muspell", ClassName = ClassRelationEnum.Berserker, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Third, Health = 61289.0f, Traits = new List <string> { "giant", "humanoid", "genderMale", "superGiant" } }; #endregion List <EnemyMob> enemyMobs = new List <EnemyMob> { walkure1, walkure2, muspell1, // 1st wave muspell2, walkure3, muspell3, // 2nd wave walkure4, walkure5, muspell4 // 3rd wave }; /* Simulate node combat */ // Fight 1/3 resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 1, party, enemyMobs, 1); // Skadi quick up buff resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 1, party, enemyMobs, 1); // Skadi (support) quick up buff resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberAttacker, 2, party, enemyMobs, 1); // Dante's 2nd skill resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyMemberAttacker).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.First, constantExportJson); _output.WriteLine($"{partyMemberAttacker.Servant.ServantBasicInfo.Name} has {partyMemberAttacker.NpCharge}% charge after the 1st fight"); // Fight 2/3 resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party); resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 3, party, enemyMobs, 1); // Skadi NP buff resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyMemberAttacker).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Second, constantExportJson); _output.WriteLine($"{partyMemberAttacker.Servant.ServantBasicInfo.Name} has {partyMemberAttacker.NpCharge}% charge after the 2nd fight"); // Fight 3/3 resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party); resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 3, party, enemyMobs, 1); // Skadi (support) NP buff resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 2, party, enemyMobs, 1); // Skadi (support) enemy defense down resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberCaster, 2, party, enemyMobs, 1); // Skadi enemy defense down resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberAttacker, 1, party, enemyMobs, 1); // Dante's 1st skill resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 2, party, enemyMobs, 1); // Artic mystic code ATK and NP damage up resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyMemberAttacker).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Third, constantExportJson); foreach (EnemyMob enemyMob in enemyMobs.FindAll(e => e.Health > 0.0f)) { _output.WriteLine($"{enemyMob.Name} has {enemyMob.Health} HP left"); } _output.WriteLine($"{partyMemberAttacker.Servant.ServantBasicInfo.Name} has {partyMemberAttacker.NpCharge}% charge after the 3rd fight"); using (new AssertionScope()) { enemyMobs.Count.Should().Be(1); enemyMobs.Find(e => e.Health > 0.0f).Health.Should().Be(47025.5f); partyMemberAttacker.NpCharge.Should().Be(52); } } }
/// <summary> /// Multiply the modified NP damage passed in and the attribute and class modifiers between the party member and enemy /// </summary> /// <param name="partyMember"></param> /// <param name="enemyMob"></param> /// <param name="modifiedNpDamage"></param> /// <returns></returns> private float AverageNpDamage(PartyMember partyMember, EnemyMob enemyMob, float modifiedNpDamage) { return(modifiedNpDamage * AttributeModifier(partyMember, enemyMob) * ClassModifier(partyMember, enemyMob)); }
public async Task PlugsuitWaverAstolfoDailyDoors() { _wireMockFixture.CheckIfMockServerInUse(); _wireMockUtility.AddStubs(_wireMockFixture); using (var scope = _container.BeginLifetimeScope()) { ScopedClasses resolvedClasses = AutofacUtility.ResolveScope(scope); ConstantExportJson constantExportJson = await FrequentlyUsed.GetConstantExportJsonAsync(resolvedClasses.AtlasAcademyClient); List <PartyMember> party = new List <PartyMember>(); MysticCode mysticCode = new MysticCode { MysticCodeLevel = 10, MysticCodeInfo = await resolvedClasses.AtlasAcademyClient.GetMysticCodeInfo(WireMockUtility.PLUGSUIT_ID) }; #region Craft Essence Data EquipBasicJson equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.HOLY_NIGHT_SUPPER_CE); CraftEssence chaldeaHolyNightSupper = FrequentlyUsed.GetCraftEssence(equipBasicJson, 33, true); equipBasicJson = constantExportJson.ListEquipBasicJson.Find(c => c.Id.ToString() == WireMockUtility.KSCOPE_CE); CraftEssence chaldeaSuperscope = FrequentlyUsed.GetCraftEssence(equipBasicJson, 100, true); #endregion #region Party Data // Waver ServantBasicJson basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.WAVER_CASTER); PartyMember partyWaver = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 2); party.Add(partyWaver); // Astolfo Rider basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.ASTOLFO_RIDER); PartyMember partyAstolfo = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaHolyNightSupper); partyAstolfo.Servant.ServantLevel = 100; party.Add(partyAstolfo); // Spartacus Berserker basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.SPARTACUS_BERSERKER); PartyMember partySpartacus = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 5, false, chaldeaSuperscope); party.Add(partySpartacus); // Waver Support basicJson = constantExportJson.ListServantBasicJson.Find(s => s.Id.ToString() == WireMockUtility.WAVER_CASTER); PartyMember partyMemberSupportCaster = await FrequentlyUsed.PartyMemberAsync(basicJson, party, resolvedClasses, 1, true); party.Add(partyMemberSupportCaster); #endregion /* Node data */ #region First Wave EnemyMob doorSaint1 = new EnemyMob { Id = 0, Name = "Door of the Saint", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 14464.0f, Traits = new List <string>() }; EnemyMob doorChampion1 = new EnemyMob { Id = 1, Name = "Door of the Champion", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 23716.0f, Traits = new List <string>() }; EnemyMob doorSaint2 = new EnemyMob { Id = 2, Name = "Door of the Saint", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 14464.0f, Traits = new List <string>() }; #endregion #region Second Wave EnemyMob doorSaint3 = new EnemyMob { Id = 3, Name = "Door of the Saint", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 14464.0f, Traits = new List <string>() }; EnemyMob doorChampion2 = new EnemyMob { Id = 4, Name = "Door of the Champion", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 23716.0f, Traits = new List <string>() }; EnemyMob doorChampion3 = new EnemyMob { Id = 5, Name = "Door of the Champion", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 23716.0f, Traits = new List <string>() }; #endregion #region Third Wave EnemyMob doorChampion4 = new EnemyMob { Id = 6, Name = "Door of the Champion", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 29596.0f, Traits = new List <string>() }; EnemyMob doorChampion5 = new EnemyMob { Id = 7, Name = "Door of the Champion", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 23716.0f, Traits = new List <string>() }; EnemyMob doorChampion6 = new EnemyMob { Id = 8, Name = "Door of the Champion", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 23716.0f, Traits = new List <string>() }; #endregion List <EnemyMob> enemyMobs = new List <EnemyMob> { doorSaint1, doorChampion1, doorSaint2, // wave 1 doorSaint3, doorChampion2, doorChampion3, // wave 2 doorChampion4, doorChampion5, doorChampion6 // wave 3 }; /* Simulate node combat */ // Fight 1/3 resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partySpartacus).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.First, constantExportJson); // Fight 2/3 resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party); resolvedClasses.ServantSkillActivation.SkillActivation(partyAstolfo, 3, party, enemyMobs, 1); // Astolfo NP charge & crit stars & crit damage resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyAstolfo).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Second, constantExportJson); // Fight 3/3 resolvedClasses.ServantSkillActivation.AdjustSkillCooldowns(party); resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 1, party, enemyMobs, 2); // Waver crit damage on Astolfo with 30% charge resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 2, party, enemyMobs, 2); // Waver defense up to party with 10% charge resolvedClasses.ServantSkillActivation.SkillActivation(partyWaver, 3, party, enemyMobs, 2); // Waver attack up to party with 10% charge _output.WriteLine("--- Before party swap ---"); foreach (PartyMember partyMember in party) { _output.WriteLine(partyMember.Servant.ServantBasicInfo.Name); } resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 3, party, enemyMobs, 3, 3, 4); // Swap spartacus with Waver _output.WriteLine("\n--- After party swap ---"); foreach (PartyMember partyMember in party) { _output.WriteLine(partyMember.Servant.ServantBasicInfo.Name); } resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 1, party, enemyMobs, 2); // Waver (support) crit damage on Astolfo with 30% charge resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 2, party, enemyMobs, 2); // Waver (support) defense up to party with 10% charge resolvedClasses.ServantSkillActivation.SkillActivation(partyMemberSupportCaster, 3, party, enemyMobs, 2); // Waver (support) attack up to party with 10% charge resolvedClasses.ServantSkillActivation.SkillActivation(mysticCode, 2, party, enemyMobs, 2, 3); // Stun 3rd enemy on the field with plugsuit resolvedClasses.CombatFormula.AddPartyMemberToNpChain(party, partyAstolfo).Should().BeTrue(); resolvedClasses.CombatFormula.NoblePhantasmChainSimulator(party, enemyMobs, WaveNumberEnum.Third, constantExportJson); using (new AssertionScope()) { enemyMobs.Count.Should().Be(0); party.IndexOf(partyMemberSupportCaster).Should().Be(2); party.IndexOf(partySpartacus).Should().Be(3); } } }
private List <EnemyMob> GetGardenMob() { #region First Wave EnemyMob dweller1 = new EnemyMob { Id = 0, Name = "Fairy Tale Dweller", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.First, Health = 18801.0f, Traits = new List <string> { "genderMale", "humanoid" } }; EnemyMob dweller2 = new EnemyMob { Id = 1, Name = "Fairy Tale Dweller", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.First, Health = 14601.0f, Traits = new List <string> { "genderMale", "humanoid" } }; EnemyMob dweller3 = new EnemyMob { Id = 2, Name = "Fairy Tale Dweller", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.First, Health = 18801.0f, Traits = new List <string> { "genderMale", "humanoid" } }; #endregion #region Second Wave EnemyMob dweller4 = new EnemyMob { Id = 3, Name = "Fairy Tale Dweller", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Second, Health = 31555.0f, Traits = new List <string> { "genderMale", "humanoid" } }; EnemyMob demon = new EnemyMob { Id = 4, Name = "Fairy Tale Demon", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 55704.0f, Traits = new List <string> { "daemon", "demonic" } }; EnemyMob dweller5 = new EnemyMob { Id = 5, Name = "Fairy Tale Dweller", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Second, Health = 32450.0f, Traits = new List <string> { "genderMale", "humanoid" } }; #endregion #region Third Wave EnemyMob nightView = new EnemyMob { Id = 6, Name = "Wow, A Street with a Wonderful Night View...", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Third, Health = 88406.0f, Traits = new List <string> { "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish" } }; EnemyMob crudeNightscape = new EnemyMob { Id = 7, Name = "What a Crude Nightscape!", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Third, Health = 67872.0f, Traits = new List <string> { "genderMale", "childServant", "humanoid", "basedOnServant", "weakToEnumaElish" } }; EnemyMob glitteringTown = new EnemyMob { Id = 8, Name = "What a Glittering Town!", ClassName = ClassRelationEnum.Caster, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Third, Health = 130702.0f, Traits = new List <string> { "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish" } }; #endregion return(new List <EnemyMob> { dweller1, dweller2, dweller3, // wave 1 dweller4, demon, dweller5, // wave 2 nightView, crudeNightscape, glitteringTown // wave 3 }); }
/// <summary> /// Simulate noble phantasms against a wave of enemies /// </summary> /// <param name="party"></param> /// <param name="enemyMobs"></param> /// <param name="waveNumber">The wave the node simulation is currently on</param> /// <param name="constantExportJson">Holds the constant dataset from Atlas Academy in JSON format</param> /// <param name="enemyPosition">Set the cursor of an enemy's position from left to right (1-3)</param> public void NoblePhantasmChainSimulator(List <PartyMember> party, List <EnemyMob> enemyMobs, WaveNumberEnum waveNumber, ConstantExportJson constantExportJson, int enemyPosition = 3) { List <PartyMember> npChainList = party .FindAll(p => p.NpChainOrder != NpChainOrderEnum.None) .OrderBy(p => p.NpChainOrder) .ToList(); if (npChainList.Count == 0) { return; } ConfigureExportJson(constantExportJson); enemyPosition--; // set to zero-based int npChainPosition = 0; // used to calculate overcharge // Go through each party member's NP attack in the order of the NP chain provided foreach (PartyMember partyMember in npChainList) { // Check if any enemies are alive if (enemyMobs.Count == 0) { return; } // Determine active party member buffs float totalNpRefund = 0.0f, cardNpTypeUp = 0.0f, attackUp = 0.0f, powerModifier = 0.0f, npGainUp = 0.0f; // Grab the targets on the field (max: 3) List <EnemyMob> enemyTargets = enemyMobs.FindAll(e => e.WaveNumber == waveNumber).Take(3).ToList(); foreach (Function partyMemberFunction in partyMember.NoblePhantasm.Functions) { if (partyMemberFunction.FuncType == "damageNp" || partyMemberFunction.FuncType == "damageNpPierce") { Tuple <float, float, float, float> activePartyMemberEffects = SetStatusEffects(partyMember, cardNpTypeUp, attackUp, powerModifier, npGainUp); cardNpTypeUp = activePartyMemberEffects.Item1; attackUp = activePartyMemberEffects.Item2; powerModifier = activePartyMemberEffects.Item3 + partyMember.AdditionalDamageBonus; npGainUp = activePartyMemberEffects.Item4; if (partyMemberFunction.FuncTargetType == "enemy") // single target { // Find the next available target if the previously selected is already dead (zero-based comparison) EnemyMob enemyTarget = enemyTargets.Count - 1 >= enemyPosition ? enemyTargets[enemyPosition] : enemyTargets.Last(); totalNpRefund += DamagePhase(partyMember, enemyTarget, powerModifier, npChainPosition, attackUp, cardNpTypeUp, npGainUp, partyMemberFunction); } else { // Go through each enemy mob grouped by their wave number for (int i = 0; i < enemyTargets.Count; i++) { totalNpRefund += DamagePhase(partyMember, enemyTargets[i], powerModifier, npChainPosition, attackUp, cardNpTypeUp, npGainUp, partyMemberFunction); } } } else { NoblePhantasmSkillActivation.SkillActivation(partyMemberFunction, partyMember, party, enemyTargets, enemyPosition); } } // Replace old charge with newly refunded NP totalNpRefund /= 100.0f; if (totalNpRefund > 300.0f) { totalNpRefund = 300.0f; // set max charge } partyMember.NpCharge = (float)Math.Floor(totalNpRefund); partyMember.NpChainOrder = NpChainOrderEnum.None; enemyMobs.RemoveAll(e => e.Health <= 0.0f); // remove dead enemies in preparation for next NP npChainPosition++; } // Check if any servants that fired off their NPs have any self "force/instantDeath" debuffs (i.e. Arash & Oda Nobukatsu) List <PartyMember> martyred = npChainList .FindAll(d => d .NoblePhantasm .Functions .Any(f => (f.FuncType == "instantDeath" || f.FuncType == "forceInstantDeath") && f.FuncTargetType == "self")); foreach (PartyMember martyr in martyred) { if (party.Count - 1 >= 3) { party.Swap(martyr, party[3]); } party.Remove(martyr); } // Check if any NPs have "forceInstantDeath" and "ptSelfAnotherFirst" (i.e. Chen Gong) // TODO: Check elsewhere if there is another servant on the field prior to allowing this NP to execute PartyMember servantButcher = npChainList.Find(d => d.NoblePhantasm.Functions.Any(f => f.FuncType == "forceInstantDeath" && f.FuncTargetType == "ptSelfAnotherFirst")); if (servantButcher != null) { // remove the first (left-most) party member that isn't the butcher PartyMember scapegoat = party.Where(s => s.Id != servantButcher.Id).First(); if (party.Count - 1 >= 3) { party.Swap(scapegoat, party[3]); } party.Remove(scapegoat); } }
private List <EnemyMob> GetEnemyChristmas2018() { #region First Wave EnemyMob mafiaGhost1 = new EnemyMob { Id = 0, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 32149.0f, Traits = new List <string> { "undead", "demonic" } }; EnemyMob mafiaGhost2 = new EnemyMob { Id = 1, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 32739.0f, Traits = new List <string> { "undead", "demonic" } }; EnemyMob mafiaGhost3 = new EnemyMob { Id = 2, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 31560.0f, Traits = new List <string> { "undead", "demonic" } }; #endregion #region Second Wave EnemyMob bossPet = new EnemyMob { Id = 3, Name = "Boss' Pet", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Second, Health = 104814.0f, Traits = new List <string> { "beast" } }; EnemyMob mafiaGhost4 = new EnemyMob { Id = 4, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 38586.0f, Traits = new List <string> { "undead", "demonic" } }; EnemyMob mafiaGhost5 = new EnemyMob { Id = 5, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 37927.0f, Traits = new List <string> { "undead", "demonic" } }; #endregion #region Third Wave EnemyMob mafiaGhost6 = new EnemyMob { Id = 6, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 45511.0f, Traits = new List <string> { "undead", "demonic" } }; EnemyMob gamblingBookmaker = new EnemyMob { Id = 7, Name = "Gambling Bookmaker", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Third, Health = 180792.0f, Traits = new List <string> { "undead", "demonic" } }; EnemyMob mafiaGhost7 = new EnemyMob { Id = 8, Name = "Mafia Ghost", ClassName = ClassRelationEnum.Archer, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 44771.0f, Traits = new List <string> { "undead", "demonic" } }; #endregion return(new List <EnemyMob> { mafiaGhost1, mafiaGhost2, mafiaGhost3, // wave 1 bossPet, mafiaGhost4, mafiaGhost5, // wave 2 mafiaGhost6, gamblingBookmaker, mafiaGhost7 // wave 3 }); }
private List <EnemyMob> GetGardenMob() { #region First Wave EnemyMob driver1 = new EnemyMob { Id = 0, Name = "Limousine Driver", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 26427.0f, Traits = new List <string>() }; EnemyMob host1 = new EnemyMob { Id = 1, Name = "Limousine Host", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 17066.0f, Traits = new List <string>() }; EnemyMob host2 = new EnemyMob { Id = 2, Name = "Limousine Host", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.First, Health = 17066.0f, Traits = new List <string>() }; #endregion #region Second Wave EnemyMob violence = new EnemyMob { Id = 3, Name = "Violence Limousine", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Earth, WaveNumber = WaveNumberEnum.Second, Health = 65660.0f, Traits = new List <string> { "wildbeast", "demonic", "mechanical", "superGiant" } }; EnemyMob driver2 = new EnemyMob { Id = 4, Name = "Limousine Driver", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Second, Health = 30869.0f, Traits = new List <string>() }; #endregion #region Third Wave EnemyMob india = new EnemyMob { Id = 5, Name = "India's Holy Maiden", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Human, WaveNumber = WaveNumberEnum.Third, Health = 88469.0f, Traits = new List <string> { "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish", "divine", "saberface", "riding" } }; EnemyMob france = new EnemyMob { Id = 6, Name = "France's Holy Maiden", ClassName = ClassRelationEnum.Ruler, AttributeName = AttributeRelationEnum.Star, WaveNumber = WaveNumberEnum.Third, Health = 45279.0f, Traits = new List <string> { "genderMale", "humanoid", "basedOnServant", "weakToEnumaElish", "saberface" } }; EnemyMob bananaPrince = new EnemyMob { Id = 7, Name = "Banana Prince", ClassName = ClassRelationEnum.Saber, AttributeName = AttributeRelationEnum.Sky, WaveNumber = WaveNumberEnum.Third, Health = 131923.0f, Traits = new List <string> { "genderFemale", "humanoid", "basedOnServant", "weakToEnumaElish", "divine", "riding", "brynhildsBeloved" } }; #endregion return(new List <EnemyMob> { driver1, host1, host2, // wave 1 violence, driver2, // wave 2 india, france, bananaPrince // wave 3 }); }
private static void ApplyPartyMemberStatus(MysticCode mysticCode, Function mysticCodeFunction, EnemyMob enemy) { enemy.ActiveStatuses.Add(new ActiveStatus { StatusEffect = mysticCodeFunction, AppliedSkillLevel = mysticCode.MysticCodeLevel, ActiveTurnCount = mysticCodeFunction.Svals[mysticCode.MysticCodeLevel - 1].Turn }); }
private static void ApplyStatus(MysticCode mysticCode, Function mysticCodeFunction, EnemyMob enemy) { ApplyPartyMemberStatus(mysticCode, mysticCodeFunction, enemy); }
private static void ApplyStatus(Function servantFunction, int level, EnemyMob enemy) { ApplyPartyMemberStatus(servantFunction, level, enemy); }