Пример #1
0
        private static Ability Joker(uint cooldown)
        {
            return(new Ability
            {
                Name = string.Empty,
                Cooldown = (int)cooldown,
                Type = Ability.Types.AbilityType.Support,
                ProcessEffects = (caim, targetIndex, raidActions) =>
                {
                    if (caim.GlobalState.ContainsKey("beginning_of_joker"))
                    {
                        EndOfJoker().Cast(caim, raidActions);
                        caim.GlobalState.Remove("beginning_of_joker");
                        caim.Raid.Allies.ApplyStatusEffectsFromTemplate(
                            new StatusEffectSnapshot
                        {
                            IsBuff = true,
                            TurnDuration = 3,
                        },
                            raidActions,
                            (StatusEffectLibrary.AttackUpSummon, ModifierLibrary.AttackBoost, 30),
                            (StatusEffectLibrary.DefenseUpSummon, ModifierLibrary.FlatDefenseBoost, 30),
                            (StatusEffectLibrary.TripleAttackRateUpSummon, ModifierLibrary.FlatTripleAttackRateBoost, 20),
                            (StatusEffectLibrary.DamageCapUpSummon, ModifierLibrary.FlatDamageCapBoost, 10),
                            (StatusEffectLibrary.Uplifted, ModifierLibrary.ChargeBarSpedUp, 15));

                        caim.Raid.Allies.ApplyStatusEffects(
                            new StatusEffectSnapshot
                        {
                            Id = StatusEffectLibrary.RevitalizeSummon,
                            IsBuff = true,
                            Strength = 500,
                            TurnDuration = 3,
                            ExtraData = new Revitalize
                            {
                                BoostChargeGaugeAtFullHp = true,
                                HealingCap = 500,
                            }.ToByteString(),
                        },
                            raidActions);

                        caim.Raid.Allies.ApplyStatusEffects(
                            new StatusEffectSnapshot
                        {
                            Id = StatusEffectLibrary.Veil,
                            IsBuff = true,
                            TurnDuration = int.MaxValue,
                        },
                            raidActions);
                    }
                    else
                    {
                        var lastAbility = caim.Raid.GetLastAbilityUsed(heroIdToExclude: caim.Hero.Id);
                        lastAbility?.Cast(caim, raidActions, doNotRenderCastAbilityEffect: true);
                        caim.GlobalState["beginning_of_joker"] = TypedValue.FromBool(true);
                    }
                },
                DoNotRenderAbilityCastEffect = true,
            });
        public static Hero NewInstance()
        {
            return(new Hero
            {
                Id = ByteString.CopyFrom(Id.ToByteArray()),
                Name = "Maria Theresa",
                Races = { Race.Draph },
                Gender = Gender.Female,
                MaxAttack = 11222,
                MaxHp = 2222,
                MaxLevel = 80,
                BaseDoubleAttackRate = 6,
                BaseTripleAttackRate = 4.5,
                Element = Element.Water,
                WeaponProficiencies = { EquipmentType.Staff, EquipmentType.Sword },
                AvailablePerkIds =
                {
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.DebuffResistanceBoost,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.FireDamageReduction,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageBoost,
                    ExtendedMasteryPerks.SupportSkill,
                },
                PassiveAbilities =
                {
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                        Name = "Aurum Sword",
                        Description =
                            "Water damage to all foes when an ally casts a buff-removing skill. Inflict Status Unrighteousness (Local) 3.pngUnrighteousness.",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.BacklineEffect,
                        Name = "Justice Reversed",
                        Description =
                            "When Sub Ally: Water damage to all foes when a Water ally casts a buff-removing skill. Inflict Attack Down and Defense Down.",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.TriggerOnEnteringFrontline,
                        Name = "The Empress Upright",
                        Description =
                            "When Switching to Main Ally: All Water allies gain Status Righteous Indignation.",
                    },
                },
                ModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/npc_3040160000_02.js",
                        ConstructorName = "mc_npc_3040160000_02",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "npc_3040160000_02_a",
                                Path = "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/npc_3040160000_02_a.png",
                            },
                            new ImageAsset
                            {
                                Name = "npc_3040160000_02_b",
                                Path = "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/npc_3040160000_02_b.png",
                            },
                        },
                    },
                },
                OnHitEffectModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/phit_3040160000.js",
                        ConstructorName = "mc_phit_3040160000_effect",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "phit_3040160000",
                                Path = "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/phit_3040160000.png",
                            },
                        },
                    },
                },
                SpecialAbility = new SpecialAbility
                {
                    Name = string.Empty,

                    HitCount = { 4 },

                    ModelMetadata =
                    {
                        new ModelMetadata
                        {
                            JsAssetPath = "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/nsp_3040160000_02_s2.js",
                            ConstructorName = "mc_nsp_3040160000_02_s2_special",
                            ImageAssets =
                            {
                                new ImageAsset
                                {
                                    Name = "nsp_3040160000_02_s2_a",
                                    Path =
                                        "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/nsp_3040160000_02_s2_a.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040160000_02_s2_b",
                                    Path =
                                        "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/nsp_3040160000_02_s2_b.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040160000_02_s2_c",
                                    Path =
                                        "npc/ebbe21c2-f8ef-44e6-b947-b1323ef8c070/model/0/nsp_3040160000_02_s2_c.png",
                                },
                            },
                        },
                    },
                },
                Abilities =
                {
                    Abraxas(cooldown: 6),
                    Uguale(cooldown: 8),
                    Fedelta(cooldown: 5),
                },
                UpgradedAbilities =
                {
                    new AbilityUpgrade
                    {
                        RequiredLevel = 55,
                        Ability = Abraxas(cooldown: 5),
                        UpgradedAbilityIndex = 0,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 75,
                        Ability = Uguale(cooldown: 7),
                        UpgradedAbilityIndex = 1,
                    },
                },
                OnEnteringFrontline = (mariaTheresa, raidActions) =>
                {
                    if (mariaTheresa.GlobalState.ContainsKey("nonce"))
                    {
                        return;
                    }

                    mariaTheresa.GlobalState["nonce"] = TypedValue.FromBool(true);
                    TheEmpressUpright().Cast(mariaTheresa, raidActions);
                },
                OnAbilityEnd = (mariaTheresa, ability, raidActions) =>
                {
                    if (!mariaTheresa.IsAlive())
                    {
                        return;
                    }

                    if (ability.Effects.Where(e => e.Type == AbilityEffect.Types.AbilityEffectType.ApplyStatusEffect)
                        .Any(e => ApplyStatusEffect.ParseFrom(e.ExtraData).Id == StatusEffectLibrary.Dispel))
                    {
                        AurumSword().Cast(mariaTheresa, mariaTheresa.CurrentTargetPositionInFrontline, raidActions);
                    }
                },
                OnOtherAllyAbilityEnd = (mariaTheresa, caster, ability, raidActions) =>
                {
                    if (!mariaTheresa.IsAlive())
                    {
                        return;
                    }

                    if (ability.Effects.Where(e => e.Type == AbilityEffect.Types.AbilityEffectType.ApplyStatusEffect)
                        .Any(e => ApplyStatusEffect.ParseFrom(e.ExtraData).Id == StatusEffectLibrary.Dispel))
                    {
                        if (mariaTheresa.PositionInFrontline >= 4)
                        {
                            JusticeReversed().Cast(mariaTheresa, raidActions);
                        }
                        else
                        {
                            AurumSword().Cast(mariaTheresa, raidActions);
                        }
                    }
                },
                OnDeath = (mariaTheresa, raidActions) => { },
            });
        }
Пример #3
0
        public static Hero NewInstance()
        {
            return(new Hero
            {
                Id = ByteString.CopyFrom(Id.ToByteArray()),
                Name = "Caim",
                Races = { Race.Human },
                Gender = Gender.Male,
                MaxAttack = 10000,
                MaxHp = 1412,
                MaxLevel = 80,
                BaseDoubleAttackRate = 6,
                BaseTripleAttackRate = 4.5,
                Element = Element.Earth,
                WeaponProficiencies = { (EquipmentType[])Enum.GetValues(typeof(EquipmentType)) },
                AvailablePerkIds =
                {
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.HealingBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.HealingBoost,
                    ExtendedMasteryPerks.DebuffSuccessRateBoost,
                    ExtendedMasteryPerks.DebuffSuccessRateBoost,
                    ExtendedMasteryPerks.HostilityBoost,
                    ExtendedMasteryPerks.HostilityBoost,
                    ExtendedMasteryPerks.SupportSkill,
                },
                PassiveAbilities =
                {
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                        Name = "Wild Card",
                        Description = "Subject to all specialty weapon-, style-, and race-related weapon skills",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.BacklineEffect,
                        Name = "The Hanged Man Reversed",
                        Description = "When Sub Ally: When all equipped weapons are different, boost to Earth allies' ATK, DEF and damage cap",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.TriggerOnEnteringFrontline,
                        Name = "The Fool Upright	",
                        Description = "When Switching to Main Ally: Caim gains 1-4 ranks of Spade, Heart, Diamond, Club each.",
                    },
                },
                ModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/npc_3040164000_02.js",
                        ConstructorName = "mc_npc_3040164000_02",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "npc_3040164000_02",
                                Path = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/npc_3040164000_02.png",
                            },
                        },
                    },
                },
                OnHitEffectModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/phit_3040164000.js",
                        ConstructorName = "mc_phit_3040164000_effect",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "phit_3040164000",
                                Path = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/phit_3040164000.png",
                            },
                        },
                    },
                },
                SpecialAbility = new SpecialAbility
                {
                    Name = string.Empty,

                    HitCount = { 1 },

                    ModelMetadata =
                    {
                        new ModelMetadata
                        {
                            JsAssetPath = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/nsp_3040164000_02_s2.js",
                            ConstructorName = "mc_nsp_3040164000_02_s2_special",
                            ImageAssets =
                            {
                                new ImageAsset
                                {
                                    Name = "nsp_3040164000_02_s2_a",
                                    Path = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/nsp_3040164000_02_s2_a.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040164000_02_s2_b",
                                    Path = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/nsp_3040164000_02_s2_b.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040164000_02_s2_c",
                                    Path = "npc/411f6619-d3f5-4044-b290-34c39cbef856/model/0/nsp_3040164000_02_s2_c.png",
                                },
                            },
                        },
                    },
                },
                Abilities =
                {
                    DoubleDeal(initialCooldown: 4),
                    Joker(cooldown: 8),
                    BlankFaceTrick(),
                },
                UpgradedAbilities =
                {
                    new AbilityUpgrade
                    {
                        RequiredLevel = 55,
                        Ability = DoubleDeal(initialCooldown: 3),
                        UpgradedAbilityIndex = 0,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 75,
                        Ability = Joker(cooldown: 7),
                        UpgradedAbilityIndex = 1,
                    },
                },
                OnActionStart = (caim, raidActions) => ProcessPassiveEffects(caim),
                OnTurnEnd = (caim, raidActions) => { },
                OnSetup = (caim, allies, loadout) =>
                {
                    caim.GlobalState[TheHangedManReversedId] = TypedValue.FromBool(true);
                },
                OnEnteringFrontline = (caim, raidActions) =>
                {
                    if (caim.GlobalState.ContainsKey("nonce"))
                    {
                        return;
                    }

                    caim.GlobalState["nonce"] = TypedValue.FromBool(true);
                    TheFoolUpright().Cast(caim, raidActions);
                },
                OnAttackEnd = (caim, attackResult, raidActions) => { },
                OnAttackActionEnd = (caim, raidActions) => { },
                OnOtherAllyAbilityEnd = (caim, caster, ability, raidActions) =>
                {
                    BlankFace(caim, raidActions);
                },
                OnDeath = (caim, raidActions) => { },
            });
        }
Пример #4
0
        public static Hero NewInstance()
        {
            return(new Hero
            {
                Id = ByteString.CopyFrom(Id.ToByteArray()),
                Name = "Haaselia",
                Races = { Race.Harvin },
                Gender = Gender.Female,
                MaxAttack = 10402,
                MaxHp = 1318,
                MaxLevel = 80,
                BaseDoubleAttackRate = 6,
                BaseTripleAttackRate = 4.5,
                Element = Element.Water,
                WeaponProficiencies = { EquipmentType.Staff, EquipmentType.Melee },
                AvailablePerkIds =
                {
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.DebuffResistanceBoost,
                    ExtendedMasteryPerks.AttackBoostAgainstFoesInOverdriveMode,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.WaterAttackBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.Reflect,
                    ExtendedMasteryPerks.SupportSkill,
                },
                PassiveAbilities =
                {
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                        Name = "Lunar Raiment",
                        Description = "Boost to Water allies' DEF specs based on the moon phase",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.BacklineEffect,
                        Name = "The Moon Reversed",
                        Description =
                            "When Sub Ally: Boost to Water allies' ATK and DEF based on number of turns passed",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.TriggerOnEnteringFrontline,
                        Name = "The High Priestess Upright",
                        Description = "When Switching to Main Ally: Haaselia gains Torah",
                    },
                },
                ModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/npc_3040168000_02.js",
                        ConstructorName = "mc_npc_3040168000_02",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "npc_3040168000_02",
                                Path = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/npc_3040168000_02.png",
                            },
                        },
                    },
                },
                OnHitEffectModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/phit_3040168000.js",
                        ConstructorName = "mc_phit_3040168000_effect",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "phit_3040168000",
                                Path = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/phit_3040168000.png",
                            },
                        },
                    },
                },
                SpecialAbility = new SpecialAbility
                {
                    HitCount = { 1 },
                    ModelMetadata =
                    {
                        new ModelMetadata
                        {
                            JsAssetPath = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/nsp_3040168000_02_s2.js",
                            ConstructorName = "mc_nsp_3040168000_02_s2_special",
                            ImageAssets =
                            {
                                new ImageAsset
                                {
                                    Name = "nsp_3040168000_02_s2_a",
                                    Path = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/nsp_3040168000_02_s2_a.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040168000_02_s2_b",
                                    Path = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/nsp_3040168000_02_s2_b.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040168000_02_s2_c",
                                    Path = "npc/ec77d956-5a29-4591-ad5b-231f1d39ab6f/model/0/nsp_3040168000_02_s2_c.png",
                                },
                            },
                        },
                    },
                    ProcessEffects = (haaselia, raidActions) =>
                    {
                        foreach (var ally in haaselia.Raid.Allies)
                        {
                            if (!ally.IsAlive() || ally.PositionInFrontline >= 4 || ally.Element != Element.Water)
                            {
                                continue;
                            }

                            ally.ApplyStatusEffect(
                                new StatusEffectSnapshot
                            {
                                Id = StatusEffectLibrary.Moon,
                                TurnDuration = 6,
                                IsUndispellable = true,
                            });
                        }

                        ProcessMoonEffects(haaselia);
                    },
                },
                Abilities =
                {
                    Boaz(),
                    Jachin(),
                    PhasesOfTheMoon(),
                },
                UpgradedAbilities =
                {
                    new AbilityUpgrade
                    {
                        RequiredLevel = 55,
                        Ability = Boaz(upgradeEffect: true),
                        UpgradedAbilityIndex = 0,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 75,
                        Ability = Jachin(upgradedEffect: true),
                        UpgradedAbilityIndex = 1,
                    },
                },
                OnActionStart = (haaselia, _, raidActions) => ProcessPassiveEffects(haaselia),
                OnTurnEnd = (haaselia, raidActions) =>
                {
                    haaselia.GlobalState[TorahId + "/1"].BooleanValue = false;
                    haaselia.GlobalState[TorahId + "/2"].BooleanValue = false;
                    haaselia.GlobalState[TorahId + "/3"].BooleanValue = false;
                },
                OnSetup = (haaselia, allies, loadout) =>
                {
                    haaselia.GlobalState.Add(TorahId + "/1", TypedValue.FromBool(false));
                    haaselia.GlobalState.Add(TorahId + "/2", TypedValue.FromBool(false));
                    haaselia.GlobalState.Add(TorahId + "/3", TypedValue.FromBool(false));
                },
                OnEnteringFrontline = (haaselia, raidActions) =>
                {
                    Torah().Cast(haaselia, raidActions);
                },
                OnAbilityEnd = (haaselia, ability, raidActions) =>
                {
                    if (haaselia.GetStatusEffect(TorahId) != null)
                    {
                        for (var abilityIndex = 0; abilityIndex < 2; ++abilityIndex)
                        {
                            if (haaselia.AbilityCooldowns[abilityIndex] == ability.Cooldown && !haaselia.GlobalState[TorahId + "/" + (abilityIndex + 1)].BooleanValue)
                            {
                                haaselia.GlobalState[TorahId + "/" + (abilityIndex + 1)].BooleanValue = true;

                                // Haaselia's first and second ability cooldowns are linked
                                haaselia.AbilityCooldowns[abilityIndex] = 0;
                                if (abilityIndex == 0)
                                {
                                    haaselia.AbilityCooldowns[0] = 0;
                                    haaselia.AbilityCooldowns[1] = 0;
                                    haaselia.GlobalState[TorahId + "/1"].BooleanValue = true;
                                    haaselia.GlobalState[TorahId + "/2"].BooleanValue = true;
                                }

                                break;
                            }
                        }
                    }
                },
            });
        }
Пример #5
0
        public static Hero NewInstance()
        {
            return(new Hero
            {
                Id = ByteString.CopyFrom(Id.ToByteArray()),
                Name = "Threo",
                Races = { Race.Draph },
                Gender = Gender.Female,
                MaxAttack = 13333,
                AttackLevels = { 11333 },
                MaxHp = 1833,
                HpLevels = { 1533 },
                MaxLevel = 100,
                BaseDoubleAttackRate = 6,
                BaseTripleAttackRate = 4.5,
                Element = Element.Earth,
                WeaponProficiencies = { EquipmentType.Axe, EquipmentType.Sword },
                AvailablePerkIds =
                {
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageBoost,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.WaterDamageReduction,
                    ExtendedMasteryPerks.AttackBoostAndDefenseDown,
                    ExtendedMasteryPerks.AttackBoostAndDefenseDown,
                    ExtendedMasteryPerks.ChargeAttackDamageBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageCapBoost,
                    ExtendedMasteryPerks.SupportSkill,
                },
                PassiveAbilities =
                {
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                        Name = "Passive ability 1",
                        Description = "Passive ability 1 description",
                    },
                    new PassiveAbility
                    {
                        Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                        Name = "Passive ability 2",
                        Description = "Passive ability 2 description",
                    },
                },
                UpgradedPassiveAbilities =
                {
                    new PassiveAbilityUpgrade
                    {
                        Ability = new PassiveAbility
                        {
                            Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                            Name = "Upgraded passive ability 2",
                            Description = "Upgraded passive ability 2 description",
                        },
                        RequiredLevel = 85,
                        RequiredRank = 5,
                        UpgradedPassiveAbilityIndex = 2,
                    },
                    new PassiveAbilityUpgrade
                    {
                        Ability = new PassiveAbility
                        {
                            Type = PassiveAbility.Types.PassiveAbilityType.SupportSkill,
                            Name = "Passive ability 3",
                            Description = "Passive ability 3 description",
                        },
                        RequiredLevel = 95,
                        RequiredRank = 5,
                        UpgradedPassiveAbilityIndex = 3,
                    },
                },
                ModelMetadata =
                {
                    AxeFormModel,
                },
                OnHitEffectModelMetadata =
                {
                    AxeFormOnHitModel,
                },
                SpecialAbility = new SpecialAbility
                {
                    Name = string.Empty,
                    HitCount = { 1 },
                    ModelMetadata =
                    {
                        AxeFormChargeAttackModel,
                    },
                    ProcessEffects = (threo, raidActions) =>
                    {
                        if (threo.GlobalState["::axe_form"].BooleanValue)
                        {
                            threo.GlobalState["::axe_form"].BooleanValue = false;
                            threo.ApplyStatusEffect(
                                new StatusEffectSnapshot
                            {
                                Id = StatusEffectLibrary.EarthAttackUpNpc,
                                Strength = 20,
                                TurnDuration = 4,
                            },
                                raidActions);

                            threo.PlayAnimation("change_1", raidActions);
                            threo.ChangeForm(
                                new ModelMetadata
                            {
                                JsAssetPath = "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/model/0/npc_3040032000_03_f1.js",
                                ConstructorName = "mc_npc_3040032000_03_f1",
                                ImageAssets =
                                {
                                    new ImageAsset
                                    {
                                        Name = "npc_3040032000_03_f1",
                                        Path = "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/model/0/npc_3040032000_03_f1.png",
                                    },
                                },
                            },
                                raidActions,
                                onHitEffectModel: new ModelMetadata
                            {
                                JsAssetPath = "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/model/0/phit_3040032000_03_f1.js",
                                ConstructorName = "mc_phit_3040032000_03_f1_effect",
                                ImageAssets =
                                {
                                    new ImageAsset
                                    {
                                        Name = "phit_3040032000_03_f1",
                                        Path = "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/model/0/phit_3040032000_03_f1.png",
                                    },
                                },
                            },
                                specialAbility: new SpecialAbility
                            {
                                HitCount = { 2 },
                                ModelMetadata =
                                {
                                    new ModelMetadata
                                    {
                                        JsAssetPath = "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/model/0/nsp_3040032000_03_f1.js",
                                        ConstructorName = "mc_nsp_3040032000_03_f1_special",
                                        ImageAssets =
                                        {
                                            new ImageAsset
                                            {
                                                Name = "nsp_3040032000_03_f1",
                                                Path = "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/model/0/nsp_3040032000_03_f1.png",
                                            },
                                        },
                                    },
                                },
                                ShouldRepositionSpriteAnimationOnTarget = true,
                            });

                            threo.ChangeAbilityIcon(1, "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/abilities/1a.png");
                        }
                        else
                        {
                            threo.GlobalState["::axe_form"].BooleanValue = true;
                            var currentTarget = threo.ResolveEnemyTarget(threo.CurrentTargetPositionInFrontline);
                            if (currentTarget.IsAlive())
                            {
                                MeteorThrust().Cast(threo, currentTarget.PositionInFrontline, raidActions);
                            }

                            threo.PlayAnimation("change_2", raidActions);
                            threo.ChangeForm(
                                AxeFormModel,
                                raidActions,
                                onHitEffectModel: AxeFormOnHitModel,
                                specialAbility: new SpecialAbility
                            {
                                HitCount = { 1 },
                                ModelMetadata =
                                {
                                    AxeFormChargeAttackModel,
                                },
                                ShouldRepositionSpriteAnimationOnTarget = true,
                            });

                            threo.ChangeAbilityIcon(1, "npc/612d0c88-d7ef-43ec-bf20-7d630c7c5200/abilities/1.png");
                        }
                    },
                    ShouldRepositionSpriteAnimationOnTarget = true,
                },
                Abilities =
                {
                    VorpalRage(),
                    BerserkForge(cooldown: 7),
                    GroundZero(cooldown: 8),
                },
                UpgradedAbilities =
                {
                    new AbilityUpgrade
                    {
                        RequiredLevel = 85,
                        Ability = BerserkForge(cooldown: 6),
                        UpgradedAbilityIndex = 1,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 95,
                        Ability = GroundZero(cooldown: 7),
                        UpgradedAbilityIndex = 2,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 100,
                        Ability = ThreeTigerBlessing(0),
                        UpgradedAbilityIndex = 3,
                    },
                },
                OnAttackEnd = (threo, attackResult, raidActions) =>
                {
                    if (!threo.IsAlive() ||
                        threo.PositionInFrontline >= 4 ||
                        (attackResult != EntitySnapshot.AttackResult.Single &&
                         attackResult != EntitySnapshot.AttackResult.Double &&
                         attackResult != EntitySnapshot.AttackResult.Triple &&
                         attackResult != EntitySnapshot.AttackResult.MultiAttack))
                    {
                        return;
                    }

                    var supportSkillRank = threo.Hero.GetSupportSkillRank();
                    if (supportSkillRank > 0 && ThreadSafeRandom.NextDouble() < (1 + supportSkillRank) * 0.025)
                    {
                        threo.ApplyStatusEffect(
                            new StatusEffectSnapshot
                        {
                            Id = "threo/atk_up",
                            TurnDuration = int.MaxValue,
                            IsStackable = true,
                            Strength = 10,
                            Modifier = ModifierLibrary.FlatAttackBoost,
                            StackingCap = 30,
                        },
                            raidActions);
                    }
                },
                OnSetup = (threo, allies, loadout) =>
                {
                    threo.GlobalState.Add("::axe_form", TypedValue.FromBool(true));
                    if (threo.Hero.Level >= 95)
                    {
                        // 20% boost to damage against Water foes, non stackable with Seraphic effects from weapons
                        threo.OverrideWeaponSeraphicModifier(20);
                    }
                },
            });
        }
Пример #6
0
        public static Hero NewInstance()
        {
            return(new Hero
            {
                Id = ByteString.CopyFrom(Id.ToByteArray()),
                Name = "Narmaya",
                Races = { Race.Draph },
                Gender = Gender.Female,
                MaxAttack = 12200,
                AttackLevels = { 10240 },
                MaxHp = 1330,
                HpLevels = { 1120 },
                MaxLevel = 100,
                BaseDoubleAttackRate = 6,
                BaseTripleAttackRate = 4.5,
                Element = Element.Dark,
                WeaponProficiencies = { EquipmentType.Katana },
                AvailablePerkIds =
                {
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageBoost,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.HpBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.LightDamageReduction,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DarkAttackBoost,
                    ExtendedMasteryPerks.Reflect,
                    ExtendedMasteryPerks.HostilityReduction,
                    ExtendedMasteryPerks.SupportSkill,
                },
                ModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/npc_3040063000_03.js",
                        ConstructorName = "mc_npc_3040063000_03",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "npc_3040063000_03_a",
                                Path = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/npc_3040063000_03_a.png",
                            },
                            new ImageAsset
                            {
                                Name = "npc_3040063000_03_b",
                                Path = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/npc_3040063000_03_b.png",
                            },
                        },
                    },
                },
                OnHitEffectModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/phit_3040063000.js",
                        ConstructorName = "mc_phit_3040063000_effect",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "phit_3040063000",
                                Path = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/phit_3040063000.png",
                            },
                        },
                    },
                },
                SpecialAbility = new SpecialAbility
                {
                    Name = string.Empty,
                    HitCount = { 1 },

                    ModelMetadata =
                    {
                        new ModelMetadata
                        {
                            JsAssetPath = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/nsp_3040063000_03_s2.js",
                            ConstructorName = "mc_nsp_3040063000_03_s2_special",
                            ImageAssets =
                            {
                                new ImageAsset
                                {
                                    Name = "nsp_3040063000_03_s2",
                                    Path = "npc/4eb50ec0-501e-4a4d-9935-48f1456d6b3f/model/0/nsp_3040063000_03_s2.png",
                                },
                            },
                        },
                    },
                    ProcessEffects = (narmaya, raidActions) =>
                    {
                        if (narmaya.GlobalState[DawnflyDance].BooleanValue)
                        {
                            narmaya.ApplyStatusEffect(
                                new StatusEffectSnapshot
                            {
                                Id = StackableAttackUp,
                                Strength = 15,
                                StackingCap = 50,
                                IsStackable = true,
                                TurnDuration = int.MaxValue,
                                Modifier = ModifierLibrary.FlatAttackBoost,
                            },
                                raidActions);
                            if (narmaya.Hero.Rank == 5)
                            {
                                narmaya.ApplyStatusEffect(
                                    new StatusEffectSnapshot
                                {
                                    Id = StatusEffectLibrary.DarkAttackUpNpc,
                                    Strength = 30,
                                    TurnDuration = 4,
                                },
                                    raidActions);
                            }
                        }
                        else
                        {
                            narmaya.RemoveStatusEffect(StackableDefenseDown);
                            if (narmaya.Hero.Rank == 5)
                            {
                                narmaya.ApplyStatusEffect(
                                    new StatusEffectSnapshot
                                {
                                    Id = StatusEffectLibrary.MirrorImage,
                                    Strength = 2,
                                    TurnDuration = int.MaxValue,
                                },
                                    raidActions);
                            }
                        }
                    },
                },
                Abilities =
                {
                    ButterflyEffect(skillSealDuration: 2),
                    Transient(),
                    Kyogasuigetsu(),
                },
                UpgradedAbilities =
                {
                    new AbilityUpgrade
                    {
                        RequiredLevel = 45,
                        Ability = Kyogasuigetsu(),
                        UpgradedAbilityIndex = 2,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 55,
                        Ability = ButterflyEffect(skillSealDuration: 1),
                        UpgradedAbilityIndex = 0,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 100,
                        Ability = GlasswingWaltz(),
                        UpgradedAbilityIndex = 3,
                    },
                },
                OnActionStart = (narmaya, _, raidActions) => ProcessPassiveEffects(narmaya),
                OnSetup = (narmaya, allies, loadout) =>
                {
                    narmaya.GlobalState.Add(DawnflyDance, TypedValue.FromBool(true));
                    if (narmaya.Hero.Level >= 90)
                    {
                        narmaya.ApplyStatusEffect(
                            new StatusEffectSnapshot
                        {
                            Id = StatusEffectLibrary.Tenacity,
                            TurnDuration = int.MaxValue,
                        });
                    }
                },
                OnEnteringFrontline = (narmaya, raidActions) => ProcessPassiveEffects(narmaya),
                OnDeath = (narmaya, raidActions) =>
                {
                    foreach (var ally in narmaya.Raid.Allies)
                    {
                        if (ally.IsAlive() && ally.PositionInFrontline < 4)
                        {
                            ally.RemoveStatusEffect(FortifiedVigor);
                        }
                    }
                },
            });
        }
Пример #7
0
        public static Hero NewInstance()
        {
            return(new Hero
            {
                Id = ByteString.CopyFrom(Id.ToByteArray()),
                Name = "Nier",
                Description = "A young woman who had her existence denied at every turn, thus leading to an overwhelming desire for love and acceptance which gradually warped the very fabric of her being. As her sense of morality began to wane, she came upon the Arcarum grim reaper who grants death to all. The two now stand together like lovers, hell-bent on creating a new world that will fully acknowledge them.",
                Races = { Race.Erune },
                Gender = Gender.Female,
                MaxAttack = 8906,
                MaxHp = 1313,
                MaxLevel = 80,
                BaseDoubleAttackRate = 6,
                BaseTripleAttackRate = 4.5,
                Element = Element.Dark,
                WeaponProficiencies = { EquipmentType.Axe, EquipmentType.Dagger },
                AvailablePerkIds =
                {
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.DebuffResistanceBoost,
                    ExtendedMasteryPerks.AttackBoostAgainstFoesInOverdriveMode,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.AttackBoost,
                    ExtendedMasteryPerks.DefenseBoost,
                    ExtendedMasteryPerks.DoubleAttackRateBoost,
                    ExtendedMasteryPerks.TripleAttackRateBoost,
                    ExtendedMasteryPerks.DarkAttackBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.CriticalHitRateBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageCapBoost,
                    ExtendedMasteryPerks.ChargeAttackDamageCapBoost,
                    ExtendedMasteryPerks.SupportSkill,
                },
                ModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/npc_3040169000_02.js",
                        ConstructorName = "mc_npc_3040169000_02",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "npc_3040169000_02",
                                Path = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/npc_3040169000_02.png",
                            },
                        },
                    },
                },
                OnHitEffectModelMetadata =
                {
                    new ModelMetadata
                    {
                        JsAssetPath = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/phit_3040169000.js",
                        ConstructorName = "phit_3040169000_effect",
                        ImageAssets =
                        {
                            new ImageAsset
                            {
                                Name = "phit_3040169000",
                                Path = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/phit_3040169000.png",
                            },
                        },
                    },
                },
                SpecialAbility = new SpecialAbility
                {
                    Name = string.Empty,
                    HitCount = { 1 },
                    ModelMetadata =
                    {
                        new ModelMetadata
                        {
                            JsAssetPath = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/nsp_3040169000_02_s2.js",
                            ConstructorName = "mc_nsp_3040169000_02_s2_special",
                            ImageAssets =
                            {
                                new ImageAsset
                                {
                                    Name = "nsp_3040169000_02_s2_a",
                                    Path = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/nsp_3040169000_02_s2_a.png",
                                },
                                new ImageAsset
                                {
                                    Name = "nsp_3040169000_02_s2_b",
                                    Path = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/model/0/nsp_3040169000_02_s2_b.png",
                                },
                            },
                        },
                    },
                },
                Abilities =
                {
                    WorldOfDeathAndLove(cooldown: 7),
                    Beloved(cooldown: 6),
                    new Ability
                    {
                        Name = "Last Love",
                        Cooldown = 4,
                        Type = Ability.Types.AbilityType.Support,
                        ModelMetadata = new ModelMetadata
                        {
                            JsAssetPath = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/abilities/2/ab_3040169000_02.js",
                            ConstructorName = "mc_ab_3040169000_02_effect",
                            ImageAssets =
                            {
                                new ImageAsset
                                {
                                    Name = "ab_3040169000_02",
                                    Path = "npc/0269f30f-3c61-45ac-9c75-9290516e8985/abilities/2/ab_3040169000_02.png",
                                },
                            },
                        },
                        ShouldRepositionSpriteAnimation = true,
                        RepositionOnTarget = true,
                        AbilityTargetting = AbilityTargettingType.TargetSingleAliveFrontLineMember,
                        Effects =
                        {
                            new AbilityEffect
                            {
                                Type = AbilityEffect.Types.AbilityEffectType.ApplyStatusEffect,
                                ExtraData = new ApplyStatusEffect
                                {
                                    Id = StatusEffectLibrary.ChargeAttackReactivation,
                                    EffectTargettingType = EffectTargettingType.OnSelectedAlly,
                                    TurnDuration = int.MaxValue,
                                }.ToByteString(),
                            },
                        },
                        ProcessEffects = (nier,          target, raidActions) =>
                        {
                            IncrementLoveRedemption(nier, -1, raidActions);
                        },
                        AnimationName = "ab_motion",
                    },
                },
                UpgradedAbilities =
                {
                    new AbilityUpgrade
                    {
                        RequiredLevel = 55,
                        Ability = WorldOfDeathAndLove(cooldown: 6),
                        UpgradedAbilityIndex = 0,
                    },
                    new AbilityUpgrade
                    {
                        RequiredLevel = 75,
                        Ability = Beloved(cooldown: 5),
                        UpgradedAbilityIndex = 1,
                    },
                },
                PassiveAbilities =
                {
                    new PassiveAbility
                    {
                        Name = "Will to Love",
                        Description = "Love's Redemption lowers by 2 each turn. Nier will be knocked out when its count reaches 0. DMG taken is lowered while in effect.",
                    },
                    new PassiveAbility
                    {
                        Name = "Death Reversed",
                        Description = "When Sub Ally: When above 25% HP and Dark element, the main character can withstand lethal damage.",
                        Type = PassiveAbility.Types.PassiveAbilityType.BacklineEffect,
                    },
                    new PassiveAbility
                    {
                        Name = "The Lovers Upright",
                        Description = "When Switching to Main Ally: All Dark allies gain Thirsting.",
                        Type = PassiveAbility.Types.PassiveAbilityType.TriggerOnEnteringFrontline,
                    },
                },
                OnActionStart = (nier, _, raidActions) => ProcessLoveRedemptionEffects(nier),
                OnSetup = (nier, allies, loadout) => SetupLoveRedemptionStacks(nier),
                OnTurnEnd = (nier, raidActions) =>
                {
                    if (!nier.IsAlive() || nier.PositionInFrontline >= 4)
                    {
                        return;
                    }

                    IncrementLoveRedemption(nier, -2, raidActions);

                    if ((int)nier.GetStatusEffectStrength(LoveRedemptionId) <= 0)
                    {
                        nier.Kill(raidActions);
                    }
                },
                OnAbilityEnd = (nier, ability, raidActions) =>
                {
                    if (nier.IsAlive() && nier.PositionInFrontline < 4 && (int)nier.GetStatusEffectStrength(LoveRedemptionId) <= 0)
                    {
                        nier.Kill(raidActions);
                    }
                },
                OnDeath = (nier, raidActions) =>
                {
                    if ((int)nier.GetStatusEffectStrength(LoveRedemptionId) > 0)
                    {
                        UnfinishedBusiness().Cast(nier, raidActions);
                    }
                },
                OnEnteringFrontline = (nier, raidActions) =>
                {
                    SetupLoveRedemptionStacks(nier);

                    if (nier.GlobalState.ContainsKey("nonce"))
                    {
                        return;
                    }

                    nier.GlobalState["nonce"] = TypedValue.FromBool(true);

                    Thirsting().Cast(nier, raidActions);
                },
            });
        }