Example #1
0
 private static void RenameDaisy()
 {
     //It's a lily, not a daisy.
     LanguageAPI.Add("ITEM_TPHEALINGNOVA_NAME", "Lepton Lily");
 }
Example #2
0
        private static void SetupSkills()
        {
            var skillLocator = myCharacter.GetComponent <SkillLocator>();

            #region primary

            /*
             * LanguageAPI.Add("DC_LOADER_PRIMARY_KNUCKLEBOOM_NAME", "Knuckleboom");
             * LanguageAPI.Add("DC_LOADER_PRIMARY_KNUCKLEBOOM_DESCRIPTION", "Batter nearby enemies for <style=cIsDamage>120%</style>. Every third hit deals <style=cIsDamage>240% and knocks up enemies</style>.");
             *
             * var oldDef = Resources.Load<SteppedSkillDef>("skilldefs/loaderbody/SwingFist");
             * KnuckleBoomSkillDef = ScriptableObject.CreateInstance<SteppedSkillDef>();
             * KnuckleBoomSkillDef.activationState = new SerializableEntityStateType(typeof(SwingComboFistAlt));
             * KnuckleBoomSkillDef.activationStateMachineName = oldDef.activationStateMachineName;
             * KnuckleBoomSkillDef.baseMaxStock = oldDef.baseMaxStock;
             * KnuckleBoomSkillDef.baseRechargeInterval = oldDef.baseRechargeInterval;
             * KnuckleBoomSkillDef.beginSkillCooldownOnSkillEnd = oldDef.beginSkillCooldownOnSkillEnd;
             * KnuckleBoomSkillDef.canceledFromSprinting = oldDef.canceledFromSprinting;
             * KnuckleBoomSkillDef.fullRestockOnAssign = oldDef.fullRestockOnAssign;
             * KnuckleBoomSkillDef.interruptPriority = oldDef.interruptPriority;
             * KnuckleBoomSkillDef.isCombatSkill = oldDef.isCombatSkill;
             * KnuckleBoomSkillDef.mustKeyPress = oldDef.mustKeyPress;
             * KnuckleBoomSkillDef.rechargeStock = oldDef.rechargeStock;
             * KnuckleBoomSkillDef.requiredStock = oldDef.requiredStock;
             * KnuckleBoomSkillDef.stockToConsume = oldDef.stockToConsume;
             * KnuckleBoomSkillDef.icon = oldDef.icon;
             * KnuckleBoomSkillDef.skillDescriptionToken = "DC_LOADER_PRIMARY_KNUCKLEBOOM_DESCRIPTION";
             * KnuckleBoomSkillDef.skillName = "DC_LOADER_PRIMARY_KNUCKLEBOOM_NAME";
             * KnuckleBoomSkillDef.skillNameToken = KnuckleBoomSkillDef.skillName;
             * KnuckleBoomSkillDef.stepCount = 3;
             * KnuckleBoomSkillDef.resetStepsOnIdle = oldDef.resetStepsOnIdle;
             *
             * LoadoutAPI.AddSkillDef(KnuckleBoomSkillDef);
             *
             *
             * var skillFamily = skillLocator.primary.skillFamily;
             *
             * Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
             * skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
             * {
             *  skillDef = KnuckleBoomSkillDef,
             *  unlockableDef = null,
             *  viewableNode = new ViewablesCatalog.Node(KnuckleBoomSkillDef.skillNameToken, false, null)
             * };
             */
            #endregion

            LanguageAPI.Add("DC_LOADER_SECONDARY_SHIELD_NAME", "Debris Shield");
            string desc = (DebrisShieldAffectsDrones.Value ? "You and your drones gain" : "Gain");
            desc += " <style=cIsHealing>100% health</style> as ";
            switch (DebrisShieldSelectedMode.Value)
            {
            case DebrisShieldMode.Immunity:
                desc += $"<style=cIsDamage>damage immunity";
                break;

            case DebrisShieldMode.Barrier:
                desc += $"<style=cIsDamage>barrier";
                break;

            case DebrisShieldMode.Shield:
                desc += $"<style=cIsUtility>shield";
                break;
            }
            desc += $"</style> and become <style=cIsUtility>electrified</style>, causing your attacks to <style=cIsUtility>zap up to {pylonPowerMaxBounces} times</style> within <style=cIsDamage>{pylonPowerRange}m</style> for <style=cIsDamage>{pylonPowerDamageCoefficient * 100f}% damage</style>.";
            LanguageAPI.Add("DC_LOADER_SECONDARY_SHIELD_DESCRIPTION", desc);

            DebrisShieldSkillDef = ScriptableObject.CreateInstance <SkillDef>();
            DebrisShieldSkillDef.activationState            = new SerializableEntityStateType(typeof(ActivateShield));
            DebrisShieldSkillDef.activationStateMachineName = "DebrisShield";
            DebrisShieldSkillDef.baseMaxStock                 = 1;
            DebrisShieldSkillDef.baseRechargeInterval         = DebrisShieldCooldown.Value;
            DebrisShieldSkillDef.cancelSprintingOnActivation  = false;
            DebrisShieldSkillDef.beginSkillCooldownOnSkillEnd = false;
            DebrisShieldSkillDef.canceledFromSprinting        = false;
            DebrisShieldSkillDef.fullRestockOnAssign          = true;
            DebrisShieldSkillDef.interruptPriority            = InterruptPriority.Any;
            DebrisShieldSkillDef.isCombatSkill                = false;
            DebrisShieldSkillDef.mustKeyPress                 = false;
            DebrisShieldSkillDef.rechargeStock                = 1;
            DebrisShieldSkillDef.requiredStock                = 1;
            DebrisShieldSkillDef.stockToConsume               = 1;
            DebrisShieldSkillDef.icon = RoR2Content.Items.PersonalShield.pickupIconSprite;
            DebrisShieldSkillDef.skillDescriptionToken = "DC_LOADER_SECONDARY_SHIELD_DESCRIPTION";
            DebrisShieldSkillDef.skillName             = "DC_LOADER_SECONDARY_SHIELD_NAME";
            DebrisShieldSkillDef.skillNameToken        = DebrisShieldSkillDef.skillName;
            DebrisShieldSkillDef.keywordTokens         = new string[]
            {
                OriginalSkillsPlugin.modkeyword,
            };

            LoadoutAPI.AddSkillDef(DebrisShieldSkillDef);

            var skillFamily = skillLocator.secondary.skillFamily;

            Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
            skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
            {
                skillDef      = DebrisShieldSkillDef,
                unlockableDef = null,
                viewableNode  = new ViewablesCatalog.Node(DebrisShieldSkillDef.skillNameToken, false, null)
            };

            //not a typo
            //this is to give the option of keeping the respective skill slot
            skillFamily = skillLocator.utility.skillFamily;

            Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
            skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
            {
                skillDef      = DebrisShieldSkillDef,
                unlockableDef = null,
                viewableNode  = new ViewablesCatalog.Node(DebrisShieldSkillDef.skillNameToken, false, null)
            };
            #region utility

            /* this is the most demonic skillstate ive seen
             *
             * LanguageAPI.Add("DC_LOADER_UTILITY_HOOK_NAME", "Hydraulic Gauntlet");
             * LanguageAPI.Add("DC_LOADER_UTILITY_HOOK_DESCRIPTION", "Fire your gauntlet forward. If it hits an <style=cIsDamage>enemy or wall you pull yourself</style> towards them, <style=cIsDamage>stunning and hurting enemies for 210%.</style>");
             *
             * UtilitySkillDef = ScriptableObject.CreateInstance<SkillDef>();
             * UtilitySkillDef.activationState = new SerializableEntityStateType(typeof(FireStraightHook));
             * UtilitySkillDef.activationStateMachineName = "Weapon";
             * UtilitySkillDef.baseMaxStock = 1;
             * UtilitySkillDef.baseRechargeInterval = 3f;
             * UtilitySkillDef.beginSkillCooldownOnSkillEnd = true;
             * UtilitySkillDef.canceledFromSprinting = false;
             * UtilitySkillDef.fullRestockOnAssign = true;
             * UtilitySkillDef.interruptPriority = InterruptPriority.Any;
             * UtilitySkillDef.isCombatSkill = false;
             * UtilitySkillDef.mustKeyPress = false;
             * UtilitySkillDef.rechargeStock = 1;
             * UtilitySkillDef.requiredStock = 1;
             * UtilitySkillDef.stockToConsume = 1;
             * UtilitySkillDef.icon = Resources.Load<Sprite>("textures/bufficons/texBuffLunarShellIcon");
             * UtilitySkillDef.skillDescriptionToken = "DC_LOADER_UTILITY_HOOK_DESCRIPTION";
             * UtilitySkillDef.skillName = "DC_LOADER_UTILITY_HOOK_NAME";
             * UtilitySkillDef.skillNameToken = UtilitySkillDef.skillName;
             *
             * LoadoutAPI.AddSkillDef(UtilitySkillDef);
             *
             * skillFamily = skillLocator.utility.skillFamily;
             *
             * Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
             * skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
             * {
             *  skillDef = UtilitySkillDef,
             *  unlockableDef = null,
             *  viewableNode = new ViewablesCatalog.Node(UtilitySkillDef.skillNameToken, false, null)
             * };*/
            #endregion

            #region special

            /*
             * LanguageAPI.Add("DC_LOADER_SPECIAL_CONDUIT_NAME", "Place Conduit");
             * LanguageAPI.Add("DC_LOADER_SPECIAL_CONDUIT_DESCRIPTION", "Place two conduits to f**k off.");
             *
             * var mySkillDefSpecial = ScriptableObject.CreateInstance<SkillDef>();
             * mySkillDefSpecial.activationState = new SerializableEntityStateType(typeof(PlaceConduit1));
             * mySkillDefSpecial.activationStateMachineName = "Pylon";
             * mySkillDefSpecial.baseMaxStock = 1;
             * mySkillDefSpecial.baseRechargeInterval = 5f;
             * mySkillDefSpecial.cancelSprintingOnActivation = false;
             * mySkillDefSpecial.beginSkillCooldownOnSkillEnd = true;
             * mySkillDefSpecial.canceledFromSprinting = false;
             * mySkillDefSpecial.fullRestockOnAssign = true;
             * mySkillDefSpecial.interruptPriority = InterruptPriority.Any;
             * mySkillDefSpecial.isCombatSkill = false;
             * mySkillDefSpecial.mustKeyPress = false;
             * mySkillDefSpecial.rechargeStock = 1;
             * mySkillDefSpecial.requiredStock = 1;
             * mySkillDefSpecial.stockToConsume = 1;
             * mySkillDefSpecial.icon = RoR2Content.Items.ShockNearby.pickupIconSprite;
             * mySkillDefSpecial.skillDescriptionToken = "DC_LOADER_SPECIAL_CONDUIT_DESCRIPTION";
             * mySkillDefSpecial.skillName = "DC_LOADER_SPECIAL_CONDUIT_NAME";
             * mySkillDefSpecial.skillNameToken = mySkillDefSpecial.skillName;
             *
             *
             *
             * skillFamily = skillLocator.special.skillFamily;
             *
             * Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
             * skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
             * {
             *  skillDef = mySkillDefSpecial,
             *  unlockableDef = null,
             *  viewableNode = new ViewablesCatalog.Node(mySkillDefSpecial.skillNameToken, false, null)
             * };
             */
            #endregion
        }
Example #3
0
        public static void AddTokens()
        {
            string desc = "Saxton Hale is a heavy hitting tank that can uses his superior biology to kill enemies (hippies).<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;

            desc = desc + "< ! > (NOT IMPL) You can choose loadout depending on closely you want the game to feel like VSH: Standard and Classic." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Use superjump to quickly get to normally unreachable areas." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Perform a weighdown midair to quickly reach the ground after being airborne." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Use your rage in a tough spot to stun all enemies." + Environment.NewLine + Environment.NewLine;

            LanguageAPI.Add("SAXTONHALE_NAME", "Saxton Hale");
            LanguageAPI.Add("SAXTONHALE_DESCRIPTION", desc);
            LanguageAPI.Add("SAXTONHALE_SUBTITLE", "President & CEO of Mann. Co");
            LanguageAPI.Add("SAXTONHALE_LORE", "SAXTON HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALE");
            LanguageAPI.Add("SAXTONHALE_OUTRO_FLAVOR", "..and so he left, ready to take back Mann. Co.");

            LanguageAPI.Add("SAXTONHALEBODY_DEFAULT_SKIN_NAME", "Default");
            LanguageAPI.Add("SAXTONHALEBODY_NUDE_SKIN_NAME", "Ring of Fired");

            LanguageAPI.Add("SAXTONHALE_PASSIVE_CLASSIC_NAME", "Classic Passive");
            LanguageAPI.Add("SAXTONHALE_PASSIVE_CLASSIC_DESCRIPTION", "Saxton Hale receives 60% reduced knockback from all attacks. Hale instantly kill enemies he lands on if traveling fast enough. Hale has fall damage immunity.");

            LanguageAPI.Add("SAXTONHALE_PASSIVE_AUSTRALIUM_NAME", "Australium Empowered");
            LanguageAPI.Add("SAXTONHALE_PASSIVE_AUSTRALIUM_DESCRIPTION", "Saxton Hale receives 60% reduced knockback from all attacks. Hale deals 500% damage to enemies he lands on if traveling fast enough. Hale has fall damage immunity.");

            desc = "Hale swings his dangerous fists for <style=cIsDamage>200% damage</style>.";

            LanguageAPI.Add("SAXTONHALE_PRIMARY_FISTS_NAME", "<color=#CF6A32>Hale's Own Fists</color>");
            LanguageAPI.Add("SAXTONHALE_PRIMARY_FISTS_DESCRIPTION", desc);

            desc = "Hold down to charge your jump, and let go to <style=cIsUtility>launch yourself</style>. You are temporarily immune to knockback at the start.";

            LanguageAPI.Add("SAXTONHALE_SECONDARY_SUPERJUMP_NAME", "Brave Jump");
            LanguageAPI.Add("SAXTONHALE_SECONDARY_SUPERJUMP_DESCRIPTION", desc);

            desc = "<style=cIsUtility>Crouch</style> on the ground for knockback immunity.";

            LanguageAPI.Add("SAXTONHALE_UTILITY_CROUCH_NAME", "Crouch");
            LanguageAPI.Add("SAXTONHALE_UTILITY_CROUCH_DESCRIPTION", desc);

            desc = "Activate to quickly <style=cIsUtility>plummet</style> towards the ground.";

            LanguageAPI.Add("SAXTONHALE_UTILITY_WEIGHDOWN_NAME", "Weighdown");
            LanguageAPI.Add("SAXTONHALE_UTILITY_WEIGHDOWN_DESCRIPTION", desc);

            desc = "Saxton lunges forward for 250% damage, stunning and knocking enemies back. Deals +50% increased damage to buildings.";

            LanguageAPI.Add("SAXTONHALE_UTILITY_LUNGE_NAME", "Brave Lunge");
            LanguageAPI.Add("SAXTONHALE_UTILITY_LUNGE_DESCRIPTION", desc);

            desc = "<style=cIsUtility>Scares</style> all enemies for 8 seconds.";

            LanguageAPI.Add("SAXTONHALE_SPECIAL_CLASSIC_NAME", "Classic Rage");
            LanguageAPI.Add("SAXTONHALE_SPECIAL_CLASSIC_DESCRIPTION", desc);

            desc = "+75% attack speed, -50% damage, and attacks have a 75% chance to ignite enemies for 8 seconds.";

            LanguageAPI.Add("SAXTONHALE_SPECIAL_BRAWL_NAME", "Brawl Rage");
            LanguageAPI.Add("SAXTONHALE_SPECIAL_BRAWL_DESCRIPTION", desc);

            LanguageAPI.Add("KEYWORD_SCARED", "Slows movement speed and prevents attacking for a duration.");

            LanguageAPI.Add("SAXTONHALE_SCARED_NAME", "SCARED!");
            LanguageAPI.Add("SAXTONHALE_SCARED_DESCRIPTION", "You're too scared to attack!");
        }
Example #4
0
 protected internal override void SetupAttributes()
 {
     base.SetupAttributes();
     LanguageAPI.Add(descriptionAppendToken, "\n<style=cStack>Beating Embryo: Double buff duration.</style>");
 }
Example #5
0
 protected internal override void SetupAttributes() {
     base.SetupAttributes();
     LanguageAPI.Add(descriptionAppendToken, "\n<style=cStack>Beating Embryo: Recycle twice. Cannot multiproc.</style>"); //todo: recycle into an option with 1 item per proc
 }
Example #6
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();
            equipmentDef.canDrop          = false;
            equipmentDef.enigmaCompatible = false;
            equipmentDef.cooldown         = 60;

            var buffDef = new RoR2.BuffDef
            {
                name      = EliteBuffName,
                buffColor = new Color32(255, 255, 255, byte.MaxValue),
                iconPath  = EliteBuffIconPath,
                canStack  = false,
            };

            buffDef.eliteIndex = EliteIndex;
            var buffIndex = new CustomBuff(buffDef);

            EliteBuffIndex           = BuffAPI.Add(buffIndex);
            equipmentDef.passiveBuff = EliteBuffIndex;

            var eliteDef = new RoR2.EliteDef
            {
                name          = ElitePrefixName,
                modifierToken = EliteModifierString,
                color         = buffDef.buffColor,
            };

            eliteDef.eliteEquipmentIndex = equipmentDef.equipmentIndex;
            var eliteIndex = new CustomElite(eliteDef, EliteTier);

            EliteIndex = EliteAPI.Add(eliteIndex);

            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 30.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.5f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };

            EsoLib.Cards.Add(card);
            EliteCard = card;

            LanguageAPI.Add(eliteDef.modifierToken, ElitePrefixName + " {0}");

            //If we want to load a base game material, then we use this.

            /*GameObject worm = Resources.Load<GameObject>("Prefabs/characterbodies/ElectricWormBody");
             * Debug.Log($"WORM: {worm}");
             * var modelLocator = worm.GetComponent<ModelLocator>();
             * Debug.Log($"MODEL LOCATOR: {modelLocator}");
             * var model = modelLocator.modelTransform.GetComponent<CharacterModel>();
             * Debug.Log($"MODEL: {model}");
             * if (model)
             * {
             *  var rendererInfos = model.baseRendererInfos;
             *  foreach (CharacterModel.RendererInfo renderer in rendererInfos)
             *  {
             *      if (renderer.defaultMaterial.name == "matElectricWorm")
             *      {
             *          HyperchargedMaterial = renderer.defaultMaterial;
             *      }
             *  }
             * }*/

            //If we want to load our own, uncomment the one below.
            EliteMaterial = Resources.Load <Material>("@Aetherium:Assets/Textures/Materials/TheirReminder.mat");
        }
Example #7
0
 public static void Register()
 {
     LanguageAPI.Add(OptionRebindDialogTitle, "Rebind Control...");
     LanguageAPI.Add(LeftPageButton, "<");
     LanguageAPI.Add(RightPageButton, ">");
 }
Example #8
0
 public static void Add(string file)
 {
     LanguageAPI.Add(file);
 }
Example #9
0
 public static void AddToken(string key, string value)
 {
     LanguageAPI.Add(key, value);
 }
Example #10
0
        private static void SetupSkills()
        {
            LanguageAPI.Add("COMMANDO_SECONDARY_BACKUPSHIV_NAME", "Backup Shiv");
            LanguageAPI.Add("COMMANDO_SECONDARY_BACKUPSHIV_DESCRIPTION", "Slice for <style=cIsDamage>220% damage</style>. <style=cIsHealing>Recover 7% health</style> on kill.");

            var mySkillDef = ScriptableObject.CreateInstance <SkillDef>();

            mySkillDef.activationState            = new SerializableEntityStateType(typeof(Commando.BackupShiv));
            mySkillDef.activationStateMachineName = "Weapon";
            mySkillDef.baseMaxStock                 = 1;
            mySkillDef.baseRechargeInterval         = 7f;
            mySkillDef.beginSkillCooldownOnSkillEnd = true;
            mySkillDef.canceledFromSprinting        = false;
            mySkillDef.fullRestockOnAssign          = true;
            mySkillDef.interruptPriority            = InterruptPriority.Any;
            mySkillDef.isCombatSkill                = true;
            mySkillDef.mustKeyPress                 = true;
            mySkillDef.rechargeStock                = 1;
            mySkillDef.requiredStock                = 1;
            mySkillDef.stockToConsume               = 1;
            mySkillDef.icon = Resources.Load <Sprite>("textures/achievementicons/texAttackSpeedIcon");
            mySkillDef.skillDescriptionToken = "COMMANDO_SECONDARY_BACKUPSHIV_DESCRIPTION";
            mySkillDef.skillName             = "COMMANDO_SECONDARY_BACKUPSHIV_NAME";
            mySkillDef.skillNameToken        = "COMMANDO_SECONDARY_BACKUPSHIV_NAME";

            LoadoutAPI.AddSkillDef(mySkillDef);

            var skillLocator = myCharacter.GetComponent <SkillLocator>();

            var skillFamily = skillLocator.secondary.skillFamily;

            Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
            skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
            {
                skillDef      = mySkillDef,
                unlockableDef = null,
                viewableNode  = new ViewablesCatalog.Node(mySkillDef.skillNameToken, false, null)
            };

            LanguageAPI.Add("COMMANDO_UTILITY_RUN_NAME", "Run");
            LanguageAPI.Add("COMMANDO_UTILITY_RUN_DESCRIPTION", "Hold to <style=cIsUtility>run for 25% increased movement speed<style>. Grants a chance to dodge.");

            mySkillDef = ScriptableObject.CreateInstance <SkillDef>();
            mySkillDef.activationState            = new SerializableEntityStateType(typeof(Commando.RunSkill));
            mySkillDef.activationStateMachineName = "Weapon";
            mySkillDef.baseMaxStock                 = 1;
            mySkillDef.baseRechargeInterval         = 0f;
            mySkillDef.beginSkillCooldownOnSkillEnd = true;
            mySkillDef.canceledFromSprinting        = false;
            mySkillDef.fullRestockOnAssign          = true;
            mySkillDef.interruptPriority            = InterruptPriority.Any;
            mySkillDef.isCombatSkill                = false;
            mySkillDef.mustKeyPress                 = false;
            mySkillDef.rechargeStock                = 1;
            mySkillDef.requiredStock                = 1;
            mySkillDef.stockToConsume               = 1;
            mySkillDef.forceSprintDuringState       = true;
            mySkillDef.icon = Resources.Load <Sprite>("textures/bufficons/texBuffCloakIcon");
            mySkillDef.skillDescriptionToken = "COMMANDO_UTILITY_RUN_DESCRIPTION";
            mySkillDef.skillName             = "COMMANDO_UTILITY_RUN_NAME";
            mySkillDef.skillNameToken        = "COMMANDO_UTILITY_RUN_NAME";

            LoadoutAPI.AddSkillDef(mySkillDef);

            skillLocator = myCharacter.GetComponent <SkillLocator>();

            skillFamily = skillLocator.utility.skillFamily;

            Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
            skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
            {
                skillDef      = mySkillDef,
                unlockableDef = null,
                viewableNode  = new ViewablesCatalog.Node(mySkillDef.skillNameToken, false, null)
            };


            LanguageAPI.Add("COMMANDO_SPECIAL_PROMOTE_NAME", "Promote");
            LanguageAPI.Add("COMMANDO_SPECIAL_PROMOTE_DESCRIPTION", "Promote an ally, grants +50% attack speed, +25% damage, +20 armor, and +100% health regen for 8 seconds.");

            mySkillDef = ScriptableObject.CreateInstance <SkillDef>();
            mySkillDef.activationState            = new SerializableEntityStateType(typeof(Commando.Promote));
            mySkillDef.activationStateMachineName = "Weapon";
            mySkillDef.baseMaxStock                 = 1;
            mySkillDef.baseRechargeInterval         = 60f;
            mySkillDef.beginSkillCooldownOnSkillEnd = true;
            mySkillDef.canceledFromSprinting        = false;
            mySkillDef.fullRestockOnAssign          = true;
            mySkillDef.interruptPriority            = InterruptPriority.Any;
            mySkillDef.isCombatSkill                = false;
            mySkillDef.mustKeyPress                 = true;
            mySkillDef.rechargeStock                = 1;
            mySkillDef.requiredStock                = 1;
            mySkillDef.stockToConsume               = 1;
            mySkillDef.icon = Resources.Load <Sprite>("textures/bufficons/texBuffWarbannerIcon");
            mySkillDef.skillDescriptionToken = "COMMANDO_SPECIAL_PROMOTE_DESCRIPTION";
            mySkillDef.skillName             = "COMMANDO_SPECIAL_PROMOTE_NAME";
            mySkillDef.skillNameToken        = "COMMANDO_SPECIAL_PROMOTE_NAME";

            LoadoutAPI.AddSkillDef(mySkillDef);

            skillLocator = myCharacter.GetComponent <SkillLocator>();

            skillFamily = skillLocator.special.skillFamily;

            Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
            skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
            {
                skillDef      = mySkillDef,
                unlockableDef = null,
                viewableNode  = new ViewablesCatalog.Node(mySkillDef.skillNameToken, false, null)
            };
        }
Example #11
0
        internal static void AddTokens()
        {
            #region Henry
            string prefix = HenryPlugin.developerPrefix + "_HENRY_BODY_";

            string desc = "Henry is a skilled fighter who makes use of a wide arsenal of weaponry to take down his foes.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sword is a good all-rounder while Boxing Gloves are better for laying a beatdown on more powerful foes." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Pistol is a powerful anti air, with its low cooldown and high damage." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Roll has a lingering armor buff that helps to use it aggressively." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Bomb can be used to wipe crowds with ease." + Environment.NewLine + Environment.NewLine;

            string outro        = "..and so he left, searching for a new identity.";
            string outroFailure = "..and so he vanished, forever a blank slate.";

            LanguageAPI.Add(prefix + "NAME", "Henry");
            LanguageAPI.Add(prefix + "DESCRIPTION", desc);
            LanguageAPI.Add(prefix + "SUBTITLE", "The Chosen One");
            LanguageAPI.Add(prefix + "LORE", "sample lore");
            LanguageAPI.Add(prefix + "OUTRO_FLAVOR", outro);
            LanguageAPI.Add(prefix + "OUTRO_FAILURE", outroFailure);

            #region Skins
            LanguageAPI.Add(prefix + "DEFAULT_SKIN_NAME", "Default");
            LanguageAPI.Add(prefix + "MASTERY_SKIN_NAME", "Alternate");
            LanguageAPI.Add(prefix + "TYPHOON_SKIN_NAME", "V1");
            LanguageAPI.Add(prefix + "DANTE_SKIN_NAME", "Dante");
            LanguageAPI.Add(prefix + "VERGIL_SKIN_NAME", "Vergil");
            #endregion

            #region Passive
            LanguageAPI.Add(prefix + "PASSIVE_NAME", "Henry passive");
            LanguageAPI.Add(prefix + "PASSIVE_DESCRIPTION", "Sample text.");
            #endregion

            #region Primary
            LanguageAPI.Add(prefix + "PRIMARY_SLASH_NAME", "Sword");
            LanguageAPI.Add(prefix + "PRIMARY_SLASH_DESCRIPTION", Helpers.agilePrefix + $"Swing forward for <style=cIsDamage>{100f * StaticValues.swordDamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_NAME", "Boxing Gloves");
            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_DESCRIPTION", Helpers.agilePrefix + $"Punch rapidly for <style=cIsDamage>{100f * StaticValues.boxingGlovesDamageCoefficient}% damage</style>. <style=cIsUtility>Ignores armor.</style>");

            LanguageAPI.Add(prefix + "PRIMARY_GUN_NAME", "Pistol");
            LanguageAPI.Add(prefix + "PRIMARY_GUN_DESCRIPTION", Helpers.agilePrefix + $"Fire a small pistol for <style=cIsDamage>{100f * StaticValues.pistolDamageCoefficient}% damage</style>.");
            #endregion

            #region Secondary
            LanguageAPI.Add(prefix + "SECONDARY_GUN_NAME", "Handgun");
            LanguageAPI.Add(prefix + "SECONDARY_GUN_DESCRIPTION", Helpers.agilePrefix + $"Fire a handgun for <style=cIsDamage>{100f * StaticValues.gunDamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "SECONDARY_STINGER_NAME", "Stinger");
            LanguageAPI.Add(prefix + "SECONDARY_STINGER_DESCRIPTION", Helpers.agilePrefix + $"Lunge at an enemy for <style=cIsDamage>{100f * StaticValues.stingerDamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "SECONDARY_UZI_NAME", "Uzi");
            LanguageAPI.Add(prefix + "SECONDARY_UZI_DESCRIPTION", $"Fire an uzi for <style=cIsDamage>{100f * StaticValues.uziDamageCoefficient}% damage</style>.");
            #endregion

            #region Utility
            LanguageAPI.Add(prefix + "UTILITY_ROLL_NAME", "Roll");
            LanguageAPI.Add(prefix + "UTILITY_ROLL_DESCRIPTION", "Roll a short distance, gaining <style=cIsUtility>300 armor</style>. <style=cIsUtility>You cannot be hit during the roll.</style>");

            LanguageAPI.Add(prefix + "UTILITY_SHOTGUN_NAME", "Shotgun");
            LanguageAPI.Add(prefix + "UTILITY_SHOTGUN_DESCRIPTION", $"Fire a <style=cIsUtility>shotgun</style> for <style=cIsDamage>{StaticValues.shotgunBulletCount}x{100f * StaticValues.shotgunDamageCoefficient}% damage</style>, launching yourself with the recoil.");
            #endregion

            #region Special
            LanguageAPI.Add(prefix + "SPECIAL_BOMB_NAME", "Bomb");
            LanguageAPI.Add(prefix + "SPECIAL_BOMB_DESCRIPTION", $"Throw a bomb for <style=cIsDamage>{100f * StaticValues.bombDamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "SPECIAL_SCEPBOMB_NAME", "More Bombs!");
            LanguageAPI.Add(prefix + "SPECIAL_SCEPBOMB_DESCRIPTION", $"Throw a bomb for <style=cIsDamage>{100f * StaticValues.bombDamageCoefficient}% damage</style>." + Helpers.ScepterDescription("Hold up to 4 bombs. Cooldown is halved."));

            LanguageAPI.Add(prefix + "SPECIAL_BAZOOKA_NAME", "Bazooka");
            LanguageAPI.Add(prefix + "SPECIAL_BAZOOKA_DESCRIPTION", $"Charge and fire rockets for <style=cIsDamage>{100f * StaticValues.bazookaMinDamageCoefficient}%-{100f * StaticValues.bazookaMaxDamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "PRIMARY_BAZOOKA_NAME", "Fire");
            LanguageAPI.Add(prefix + "PRIMARY_BAZOOKA_DESCRIPTION", $"Charge and fire a rocket for <style=cIsDamage>{100f * StaticValues.bazookaMinDamageCoefficient}%-{100f * StaticValues.bazookaMaxDamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "PRIMARY_BAZOOKAOUT_NAME", "Cancel");
            LanguageAPI.Add(prefix + "PRIMARY_BAZOOKAOUT_DESCRIPTION", "Put your <style=cIsDamage>bazooka</style> away.");

            LanguageAPI.Add(prefix + "SPECIAL_SCEPBAZOOKA_NAME", "Armageddon");
            LanguageAPI.Add(prefix + "SPECIAL_SCEPBAZOOKA_DESCRIPTION", $"Charge and fire rockets for <style=cIsDamage>{100f * StaticValues.bazookaMinDamageCoefficient}%-{100f * StaticValues.bazookaMaxDamageCoefficient}% damage</style>." + Helpers.ScepterDescription("Hold two Bazookas at once."));

            LanguageAPI.Add(prefix + "PRIMARY_SCEPBAZOOKA_NAME", "Fire");
            LanguageAPI.Add(prefix + "PRIMARY_SCEPBAZOOKA_DESCRIPTION", $"Charge and fire a rocket for <style=cIsDamage>{100f * StaticValues.bazookaMinDamageCoefficient}%-{100f * StaticValues.bazookaMaxDamageCoefficient}% damage</style>." + Helpers.ScepterDescription("Hold two Bazookas at once."));
            #endregion

            #region Achievements
            LanguageAPI.Add(prefix + "UNLOCKABLE_ACHIEVEMENT_NAME", "Prelude");
            LanguageAPI.Add(prefix + "UNLOCKABLE_ACHIEVEMENT_DESC", "Enter Titanic Plains.");
            LanguageAPI.Add(prefix + "UNLOCKABLE_UNLOCKABLE_NAME", "Prelude");

            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: Mastery");
            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, beat the game or obliterate on Monsoon.");
            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_UNLOCKABLE_NAME", "Henry: Mastery");

            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: Grand Mastery");
            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, beat the game or obliterate on Typhoon.");
            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_UNLOCKABLE_NAME", "Henry: Grand Mastery");

            LanguageAPI.Add(prefix + "DANTEUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: Jackpot");
            LanguageAPI.Add(prefix + "DANTEUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, defeat a Twisted Scavenger on Monsoon.");
            LanguageAPI.Add(prefix + "DANTEUNLOCKABLE_UNLOCKABLE_NAME", "Henry: Jackpot");

            LanguageAPI.Add(prefix + "VERGILUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: 200% Motivated");
            LanguageAPI.Add(prefix + "VERGILUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, defeat the King of Nothing with no items.");
            LanguageAPI.Add(prefix + "VERGILUNLOCKABLE_UNLOCKABLE_NAME", "Henry: 200% Motivated");
            #endregion
            #endregion

            #region MrGreen
            prefix = HenryPlugin.developerPrefix + "_MRGREEN_BODY_";

            desc = "Mr. Green<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sword is a good all-rounder while Boxing Gloves are better for laying a beatdown on more powerful foes." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Pistol is a powerful anti air, with its low cooldown and high damage." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Roll has a lingering armor buff that helps to use it aggressively." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Bomb can be used to wipe crowds with ease." + Environment.NewLine + Environment.NewLine;

            outro = "..and so he left, bottom text.";

            LanguageAPI.Add(prefix + "NAME", "Mr. Green");
            LanguageAPI.Add(prefix + "DESCRIPTION", desc);
            LanguageAPI.Add(prefix + "SUBTITLE", "The");
            LanguageAPI.Add(prefix + "LORE", "sample lore part 2");
            LanguageAPI.Add(prefix + "OUTRO_FLAVOR", outro);

            #region Skins
            LanguageAPI.Add(prefix + "DEFAULT_SKIN_NAME", "Default");
            #endregion

            #region Passive
            LanguageAPI.Add(prefix + "PASSIVE_NAME", "Mr. Green passive");
            LanguageAPI.Add(prefix + "PASSIVE_DESCRIPTION", "Sample text.");
            #endregion

            #region Primary
            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_NAME", "Martial Arts");
            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_DESCRIPTION", $"Perform a swift combo of punches and kicks for <style=cIsDamage>{100f * 0.9f}% damage</style>.");
            #endregion

            #region Secondary
            LanguageAPI.Add(prefix + "SECONDARY_CLONETHROW_NAME", "Clone Throw");
            LanguageAPI.Add(prefix + "SECONDARY_CLONETHROW_DESCRIPTION", $"Summon a clone and throw it forward, grabbing nearby enemies and slamming them into the ground for <style=cIsDamage>{100f * SkillStates.Shoot.damageCoefficient}% damage</style>.");
            #endregion

            #region Utility
            LanguageAPI.Add(prefix + "UTILITY_DASH_NAME", "People's Elbow");
            LanguageAPI.Add(prefix + "UTILITY_DASH_DESCRIPTION", "Dash a short distance. Upon contact with a <style=cIsUtility>clone</style>, leap into the air and descend with a powerful <style=cIsUtility>elbow drop</style> for <style=cIsDamage>800% damage</style>.");
            #endregion

            #region Special
            LanguageAPI.Add(prefix + "SPECIAL_RES_NAME", "Resurrection");
            LanguageAPI.Add(prefix + "SPECIAL_RES_DESCRIPTION", $"Resurrect all fallen clones.");
            #endregion
            #endregion

            #region Nemry
            prefix = HenryPlugin.developerPrefix + "_NEMRY_BODY_";

            desc  = "Nemesis Henry is a volatile swordsman who wields a special blade that stores energy to boost its attacks. He has no cooldowns, but must manage his energy well.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;
            desc += "< ! > Sword is a good all-rounder while Boxing Gloves are better for laying a beatdown on more powerful foes." + Environment.NewLine + Environment.NewLine;
            desc += "< ! > Pistol is a powerful anti air, with its low cooldown and high damage." + Environment.NewLine + Environment.NewLine;
            desc += "< ! > Roll has a lingering armor buff that helps to use it aggressively." + Environment.NewLine + Environment.NewLine;
            desc += "< ! > Bomb can be used to wipe crowds with ease." + Environment.NewLine + Environment.NewLine;

            outro        = "..and so he left, bottom text.";
            outroFailure = "..and so he left, bottom text.";

            LanguageAPI.Add(prefix + "NAME", "Nemesis Henry");
            LanguageAPI.Add(prefix + "DESCRIPTION", desc);
            LanguageAPI.Add(prefix + "SUBTITLE", "The Fallen One");
            LanguageAPI.Add(prefix + "LORE", "sample lore");
            LanguageAPI.Add(prefix + "OUTRO_FLAVOR", outro);
            LanguageAPI.Add(prefix + "OUTRO_FAILURE", outroFailure);

            #region Skins
            LanguageAPI.Add(prefix + "DEFAULT_SKIN_NAME", "Nemesis");
            LanguageAPI.Add(prefix + "MASTERY_SKIN_NAME", "Captive #001");
            LanguageAPI.Add(prefix + "TYPHOON_SKIN_NAME", "FLLFFL");
            #endregion

            #region Passive
            LanguageAPI.Add(prefix + "PASSIVE_NAME", "Acidic Gunblade");
            LanguageAPI.Add(prefix + "PASSIVE_DESCRIPTION", "Nemesis Henry wields a special weapon that can swap between Sword Mode and Gun Mode. Also, his skills don't have regular cooldowns, but instead rely on his sword's <style=cIsHealing>Energy</style> system.");
            #endregion

            #region Primary
            LanguageAPI.Add(prefix + "PRIMARY_SPEAR_NAME", "Skewer");
            LanguageAPI.Add(prefix + "PRIMARY_SPEAR_DESCRIPTION", Helpers.agilePrefix + $"Stab forward for <style=cIsDamage>{100f * 1.6f}% damage</style>. <style=cIsDamage>Deals double damage and heals for <style=cIsHealing>50%</style> of damage dealt at the tip</style>.");

            LanguageAPI.Add(HenryPlugin.developerPrefix + "_WEAPON_SWAP_SKILL", "Weapon Swap");

            desc = $"Swing your blade forward for <style=cIsDamage>{100f * 2.8f}% damage</style>. Generate <style=cIsHealing>20% Energy</style> on hit.";
            LanguageAPI.Add(prefix + "PRIMARY_SWORD_NAME", "Sword Mode");
            LanguageAPI.Add(prefix + "PRIMARY_SWORD_DESCRIPTION", desc);

            desc = $"<style=cIsHealing>5% Energy.</style> Fire a piercing <style=cIsHealing>Energy</style> shot for <style=cIsDamage>{100f * SkillStates.Nemry.ShootGun.boostedDamageCoefficient}% damage</style>.";
            LanguageAPI.Add(prefix + "PRIMARY_GUN_NAME", "Gun Mode");
            LanguageAPI.Add(prefix + "PRIMARY_GUN_DESCRIPTION", desc);

            desc  = $"Swing your blade for <style=cIsDamage>{100f * 2.8f}% damage</style>. Generate <style=cIsHealing>20% Energy</style> on hit.";
            desc += $"\n<style=cIsHealing>5% Energy.</style> Fire a piercing <style=cIsHealing>Energy</style> shot for <style=cIsDamage>{100f * SkillStates.Nemry.ShootGun.boostedDamageCoefficient}% damage</style>.";
            LanguageAPI.Add(prefix + "PRIMARY_SWORDCSS_NAME", "Sword Mode / Gun Mode");
            LanguageAPI.Add(prefix + "PRIMARY_SWORDCSS_DESCRIPTION", desc);
            #endregion

            #region Secondary
            LanguageAPI.Add(prefix + "SECONDARY_BLAST_NAME", "Null Blast");
            LanguageAPI.Add(prefix + "SECONDARY_BLAST_DESCRIPTION", Helpers.agilePrefix + $"Throw a blob of <style=cIsHealth>mysterious energy</style> for <style=cIsDamage>{100f * SkillStates.Nemry.VoidBlast.damageCoefficient}% damage</style>.");

            desc = $"<style=cIsHealing>25% Energy.</style> Lunge at a nearby enemy for <style=cIsDamage>{100f * SkillStates.Nemry.ChargeSlash.Lunge.minDamageCoefficient}% damage</style>. Perform a combo attack instead if within melee range.";
            LanguageAPI.Add(prefix + "SECONDARY_CHARGE_NAME", "Swordmaster");
            LanguageAPI.Add(prefix + "SECONDARY_CHARGE_DESCRIPTION", desc);

            desc = $"<style=cIsHealing>10% Energy.</style> Fire a barrage of <style=cIsHealing>Energy</style> shots. Hold to continue firing, consuming more <style=cIsHealing>Energy</style> per shot.";
            LanguageAPI.Add(prefix + "SECONDARY_TORRENT_NAME", "Gunslinger");
            LanguageAPI.Add(prefix + "SECONDARY_TORRENT_DESCRIPTION", desc);

            desc  = $"<style=cIsHealing>25% Energy.</style> Lunge at a nearby enemy for <style=cIsDamage>{100f * SkillStates.Nemry.ChargeSlash.Lunge.minDamageCoefficient}% damage</style>.";
            desc += $"\n<style=cIsHealing>10% Energy.</style> Fire a barrage of <style=cIsHealing>Energy</style> shots.";
            LanguageAPI.Add(prefix + "SECONDARY_CHARGECSS_NAME", "Swordmaster / Gunslinger");
            LanguageAPI.Add(prefix + "SECONDARY_CHARGECSS_DESCRIPTION", desc);
            #endregion

            #region Utility
            LanguageAPI.Add(prefix + "UTILITY_DODGESLASH_NAME", "Swift Slash");
            LanguageAPI.Add(prefix + "UTILITY_DODGESLASH_DESCRIPTION", "Backflip, slashing nearby enemies for <style=cIsDamage>300% damage</style>. <style=cIsUtility>You cannot be hit during the flip.</style>");

            desc = "<style=cIsHealing>10% Energy.</style> <style=cIsUtility>Instantly blink</style> to a nearby enemy.";
            LanguageAPI.Add(prefix + "UTILITY_BLINK_NAME", "Flash Step");
            LanguageAPI.Add(prefix + "UTILITY_BLINK_DESCRIPTION", desc);

            desc = "<style=cIsHealing>20% Energy.</style> Discharge a burst of <style=cIsHealing>Energy</style> for <style=cIsDamage>400% damage</style>, <style=cIsUtility>launching yourself with the recoil</style>.";
            LanguageAPI.Add(prefix + "UTILITY_BURST_NAME", "Energy Burst");
            LanguageAPI.Add(prefix + "UTILITY_BURST_DESCRIPTION", desc);

            desc  = "<style=cIsHealing>10% Energy.</style> <style=cIsUtility>Instantly blink</style> to a nearby enemy.";
            desc += "\n<style=cIsHealing>20% Energy.</style> Discharge a burst of <style=cIsHealing>Energy</style> for <style=cIsDamage>400% damage</style>.";
            LanguageAPI.Add(prefix + "UTILITY_BLINKCSS_NAME", "Flash Step / Energy Burst");
            LanguageAPI.Add(prefix + "UTILITY_BLINKCSS_DESCRIPTION", desc);
            #endregion

            #region Special
            desc = $"<style=cIsHealing>100% Energy.</style> Plunge your blade into an enemy for <style=cIsDamage>2800% damage</style>, inflicting a potent debuff. <style=cIsHealing>Heal for 50% of damage dealt.</style>";
            LanguageAPI.Add(prefix + "SPECIAL_STAB_NAME", "Hydra Bite");
            LanguageAPI.Add(prefix + "SPECIAL_STAB_DESCRIPTION", desc);

            desc = $"<style=cIsHealing>100% Energy.</style> Charge up a powerful beam that deals <style=cIsDamage>8x400% damage</style>.";
            LanguageAPI.Add(prefix + "SPECIAL_BEAM_NAME", "Hyper Beam");
            LanguageAPI.Add(prefix + "SPECIAL_BEAM_DESCRIPTION", desc);

            desc  = $"<style=cIsHealing>100% Energy.</style> Plunge your blade into an enemy for <style=cIsDamage>2800% damage</style>, inflicting a potent debuff. <style=cIsHealing>Heal for 50% of damage dealt.</style>";
            desc += $"\n<style=cIsHealing>100% Energy.</style> Charge up a powerful beam that deals <style=cIsDamage>a lot of damage</style>.";
            LanguageAPI.Add(prefix + "SPECIAL_STABCSS_NAME", "Hydra Bite / Hyper Beam");
            LanguageAPI.Add(prefix + "SPECIAL_STABCSS_DESCRIPTION", desc);
            #endregion

            #region Achievements
            LanguageAPI.Add(prefix + "UNLOCKABLE_ACHIEVEMENT_NAME", "???");
            LanguageAPI.Add(prefix + "UNLOCKABLE_ACHIEVEMENT_DESC", "Defeat Henry's Vestige.");
            LanguageAPI.Add(prefix + "UNLOCKABLE_UNLOCKABLE_NAME", "???");

            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_ACHIEVEMENT_NAME", "Nemesis Henry: Mastery");
            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_ACHIEVEMENT_DESC", "As Nemesis Henry, beat the game or obliterate on Monsoon.");
            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_UNLOCKABLE_NAME", "Nemesis Henry: Mastery");

            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_ACHIEVEMENT_NAME", "Nemesis Henry: Grand Mastery");
            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_ACHIEVEMENT_DESC", "As Nemesis Henry, beat the game or obliterate on Typhoon.");
            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_UNLOCKABLE_NAME", "Nemesis Henry: Grand Mastery");
            #endregion
            #endregion
        }
Example #12
0
        private void RegisterCharacter()
        {
            // now that the body prefab's set up, clone it here to make the display prefab
            characterDisplay = PrefabAPI.InstantiateClone(characterPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject, "ZukoDisplay", true, "D:\\Ror2Mod\\Zuko-RoR2-Mod\\ZukoProject\\Zuko.cs", "RegisterCharacter", 165);
            characterDisplay.AddComponent <NetworkIdentity>();

            // clone artificers firebolt projectile prefab here to use as our own projectile
            fireBallProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/MageFirebolt"), "Prefabs/Projectiles/ZukoFireBall", true, "D:\\Ror2Mod\\Zuko-RoR2-Mod\\ZukoProject\\Zuko.cs", "RegisterCharacter", 155);

            // just setting the numbers to 1 as the entitystate will take care of those
            fireBallProjectile.GetComponent <ProjectileController>().procCoefficient = 1f;
            fireBallProjectile.GetComponent <ProjectileDamage>().damage     = 1f;
            fireBallProjectile.GetComponent <ProjectileDamage>().damageType = DamageType.IgniteOnHit;

            // register it for networking
            if (fireBallProjectile)
            {
                PrefabAPI.RegisterNetworkPrefab(fireBallProjectile);
            }

            // add it to the projectile catalog or it won't work in multiplayer
            ProjectileCatalog.getAdditionalEntries += list =>
            {
                list.Add(fireBallProjectile);
            };


            // write a clean survivor description here!
            string desc = "Example Survivor something something.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;

            desc = desc + "< ! > Sample text 1." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sample text 2." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sample Text 3." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sample Text 4.</color>" + Environment.NewLine + Environment.NewLine;

            // add the language tokens
            LanguageAPI.Add("ZUKO_NAME", "Zuko");
            LanguageAPI.Add("ZUKO_DESCRIPTION", desc);
            LanguageAPI.Add("ZUKO_SUBTITLE", "Zuko from Avatar: The Last Airbender");

            // add our new survivor to the game~
            SurvivorDef survivorDef = new SurvivorDef
            {
                name             = "ZUKO_NAME",
                unlockableName   = "",
                descriptionToken = "ZUKO_DESCRIPTION",
                primaryColor     = characterColor,
                bodyPrefab       = characterPrefab,
                displayPrefab    = characterDisplay
            };


            SurvivorAPI.AddSurvivor(survivorDef);

            // set up the survivor's skills here
            SkillSetup();

            // gotta add it to the body catalog too
            BodyCatalog.getAdditionalEntries += delegate(List <GameObject> list)
            {
                list.Add(characterPrefab);
            };
        }
Example #13
0
        private void CreatePrefab() //internal static
        {
            characterPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/BeetleBody"), "DogBody", true);

            //CharacterMotor characterMotor = characterPrefab.GetComponent<CharacterMotor>();

            //string name = names[UnityEngine.Random.Range(0, names.Length)];

            for (int i = 0; i < names.Length; i++)
            {
                LanguageAPI.Add("DOG_NAME_" + i.ToString(), names[i]);
                Debug.Log("Added Token: " + "DOG_NAME_" + i.ToString() + " : " + names[i]);
            }
            LanguageAPI.Add("DOG_NAME", "Junior");
            LanguageAPI.Add("DOG_SUBTITLE", "The Petted");
            LanguageAPI.Add("DOG_INTERACT", "Pet the beetle");
            CharacterBody bodyComponent = characterPrefab.GetComponent <CharacterBody>();

            bodyComponent.bodyIndex         = -1;             //def: 19
            bodyComponent.baseNameToken     = "DOG_NAME";     // name token
            bodyComponent.subtitleNameToken = "DOG_SUBTITLE"; // subtitle token- used for umbras
            bodyComponent.bodyFlags         = CharacterBody.BodyFlags.SprintAnyDirection;
            //bodyComponent.mainRootSpeed = 0;
            bodyComponent.baseMaxHealth  = 10000;
            bodyComponent.levelMaxHealth = 10000;
            bodyComponent.baseRegen      = 1000f;
            bodyComponent.levelRegen     = 1000f;
            bodyComponent.baseMaxShield  = 0;
            bodyComponent.levelMaxShield = 0;
            //bodyComponent.baseMoveSpeed = 12;
            bodyComponent.levelMoveSpeed = 0;
            //bodyComponent.baseAcceleration = 80;
            //bodyComponent.baseJumpPower = 0;
            bodyComponent.levelJumpPower = 0;
            //bodyComponent.baseDamage = 15;
            //bodyComponent.levelDamage = 1.5f;
            bodyComponent.baseAttackSpeed  = 1;
            bodyComponent.levelAttackSpeed = 0;
            bodyComponent.baseCrit         = 0;
            //bodyComponent.levelCrit = 0;
            bodyComponent.baseArmor                = 10000; // 0.0099 damage multiplier
            bodyComponent.levelArmor               = 0;
            bodyComponent.baseJumpCount            = 0;
            bodyComponent.sprintingSpeedMultiplier = 1.45f;

            HealthComponent healthComponent = characterPrefab.GetComponent <HealthComponent>();

            healthComponent.dontShowHealthbar = true;

            Highlight highlight = characterPrefab.AddComponent <Highlight>() as Highlight;

            highlight.pickupIndex = PickupCatalog.FindPickupIndex(ItemIndex.Syringe);
            //highlight.targetRenderer = Sphere(UnityEngine.MeshRenderer);
            GameObject artibodyprefab = BodyCatalog.FindBodyPrefab("ArtifactShellBody");

            highlight.targetRenderer = artibodyprefab.GetComponent <Highlight>().targetRenderer;
            highlight.strength       = 1;
            highlight.highlightColor = Highlight.HighlightColor.interactive;
            highlight.isOn           = true; //false

            PurchaseInteraction purchaseInteraction = characterPrefab.AddComponent <PurchaseInteraction>();

            purchaseInteraction.displayNameToken = "DOG_NAME";
            purchaseInteraction.contextToken     = "DOG_INTERACT";
            purchaseInteraction.costType         = CostTypeIndex.None;
            purchaseInteraction.available        = true;
            purchaseInteraction.cost             = 0;
            purchaseInteraction.automaticallyScaleCostWithDifficulty = false;

            DeathRewards deathRewards = characterPrefab.GetComponent <DeathRewards>();

            if (deathRewards)
            {
                deathRewards.expReward  = 0;
                deathRewards.goldReward = 0;
            }

            characterPrefab.AddComponent <IsBeetle>();
        }
Example #14
0
        internal static void AddTokens()
        {
            string prefix = TTGL_SurvivorPlugin.developerPrefix;

            //Lagann
            string lagannDesc = "Lagann (ē¾…é””) is Simon's personal Gunman and one of the components of Gurren Lagann (Gunmen) along with Gurren.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;

            lagannDesc = lagannDesc + "< ! > Lagann can harness the power of the spiral which its amount is displayed in a gauge." + Environment.NewLine +
                         "The more spiral power Lagann has, the more dammage, health regen and movement speed is gained." + Environment.NewLine +
                         "The gauge can be filled 3 times before reaching maximum power, which trigger spiral power overflow giving an armor buff." + Environment.NewLine +
                         "Spiral power rate goes up the more damage Lagann receives and the more enemies are around." + Environment.NewLine +
                         "However, to keep the rate uptime, Lagann must deal or receive damage in the last 6 seconds." + Environment.NewLine + Environment.NewLine;
            lagannDesc = lagannDesc + "< ! > Lagann's can expand drills from its hands which can deal strong armor piercing melee attacks." + Environment.NewLine + Environment.NewLine;
            lagannDesc = lagannDesc + "< ! > Yoko can use her rifle to attack enemies at a distance." + Environment.NewLine +
                         "Using the regular rounds can rebound to an enemy on crit," + Environment.NewLine +
                         "while using the explosive rounds deal more damage and will explode dealing AOE damage." + Environment.NewLine + Environment.NewLine;
            lagannDesc = lagannDesc + "< ! > You can use Lagann's spiral burst for extra mobility and iFrames or use its canopy for extra armor and CC immunity." + Environment.NewLine + Environment.NewLine;
            lagannDesc = lagannDesc + "< ! > Lagann can turn into Drill mode to deal massive damage in its path and can be used for massive mobility." + Environment.NewLine + Environment.NewLine;
            lagannDesc = lagannDesc + "< ! > If you start a run as Lagann, you may find and empty Gurren laying around somewhere on the map." + Environment.NewLine +
                         "Upon activating Gurren, Kamina will jump in and fight alongside you." + Environment.NewLine +
                         "At this point, if you have at least 1 gauge of spiral energy, Lagann can combine with Gurren to turn into Gurren Lagann." + Environment.NewLine +
                         "When you combine into Gurren Lagann, you will be restored to full health." + Environment.NewLine +
                         "If Gurren dies at any point, Kamina will return to Lagann and it will be possible to find another Gurren in a later map." + Environment.NewLine + Environment.NewLine;

            LanguageAPI.Add(prefix + "_LAGANN_BODY_NAME", "Lagann");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_DESCRIPTION", lagannDesc);
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SUBTITLE", "Gunman");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_OUTRO_FLAVOR", "Later, Buddy");


            LanguageAPI.Add(prefix + "_LAGANN_BODY_DEFAULT_SKIN_NAME", "Default");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_WOOPS_SKIN_NAME", "Woops");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_PASSIVE_NAME", "Spiral Power");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_PASSIVE_DESCRIPTION", "When in a pinch, spiral power increases, also increasing Lagann's <style=cIsDamage>damage</style>, <style=cIsUtility>movement speed</style> and <style=cIsHealing>health regen</style>");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_PRIMARY_DRILLSPIKE_NAME", "Drill Spike");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_PRIMARY_DRILLSPIKE_DESCRIPTION", $"Lagann punches with his drills into the ground poking out at aimed location dealing <style=cIsDamage>{100f * SkillStates.LagannDrillSpike.damageCoefficient}% damage</style>. If used while in mid-air, Lagann will slam down into the ground, increasing the size of the drill. <style=cIsUtility>Ignores armor.</style>");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_PRIMARY_DRILL_NAME", "Drill Rush");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_PRIMARY_DRILL_DESCRIPTION", $"Lagann punches with his drills rapidly for <style=cIsDamage>{100f * SkillStates.LagannDrillRush.damageCoefficient}% damage</style>. <style=cIsUtility>Ignores armor.</style>");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_RIFLE_NAME", "Yoko's Rifle");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_PRIMARY_DRILL_DESCRIPTION", $"Lagann punches with his drills rapidly for <style=cIsDamage>{100f * SkillStates.LagannDrillRush.damageCoefficient}% damage</style>. <style=cIsUtility>Ignores armor.</style>");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_RIFLE_DESCRIPTION", $"Yoko fires her rifle for <style=cIsDamage>{100f * SkillStates.YokoShootRifle.damageCoefficient}% damage</style>. Critical hits ricochet to other enemies up to { SkillStates.YokoShootRifle.maxRicochetCount } times.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_EXPLOSION_NAME", "Yoko's Rifle - Explosive rounds");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_EXPLOSION_DESCRIPTION", $"Yoko fires an explosive round dealing <style=cIsDamage>{100f * SkillStates.YokoExplosiveRifle.damageCoefficient}% damage</style> in a 20 unit radius.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_SCEPTER_RIFLE_NAME", "Yoko's Rifle - Ancient Scepter Version");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_SCEPTER_RIFLE_DESCRIPTION", $"Yoko fires an explosive round dealing <style=cIsDamage>{100f * SkillStates.YokoScepterRifle.damageCoefficient}% damage</style> in a 20 unit radius. Critical hits ricochet to other enemies.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_PIERCING_NAME", "Yoko's Rifle - Charging pierce rounds");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SECONDARY_PIERCING_DESCRIPTION", $"Yoko can charge up and fire a piercing round dealing <style=cIsDamage>{100f * SkillStates.YokoPiercingRifle.damageCoefficient}% damage</style>. Charging will consume more ammo but will deal more damage and make the shot larger.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_SPIRALBURST_NAME", "Spiral Burst");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_SPIRALBURST_DESCRIPTION", $"Lagann launches itself upward or in any inputed direction, dealing <style=cIsDamage>{100f * SkillStates.LagannSpiralBurst.damageCoefficient}% damage</style> on its path. <style=cIsUtility>Lagann cannot be hit during this.</style>");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_TOGGLECANOPY_NAME", "Toggle Canopy");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_TOGGLECANOPY_DESCRIPTION", $"Toggle on/off Lagann's canopy. When the canopy is on, you gain <style=cIsUtility>150 Armor</style> and <style=cIsUtility>is immune to movement impairing effects</style>. However, in this state, Yoko cannot use her rifle.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_DISABLERIFLE_NAME", "Blocked Rifle");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_DISABLERIFLE_DESCRIPTION", $"Yoko cannot use her rifle due to the canopy.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_SPIRALCONVERSION_NAME", "Spiral conversion");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_UTILITY_SPIRALCONVERSION_DESCRIPTION", $"Lagann can converts shield/barrier energy into spiral energy. <style=cIsUtility>During converting process, Lagann is invulnerable.</style>.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_SPECIAL_IMPACT_NAME", "Lagann Impact (Bounce mode)");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SPECIAL_IMPACT_DESCRIPTION", $"Lagann goes into drill mode and shoots itself in a line dealing <style=cIsDamage>{100f * SkillStates.LagannImpact.damageCoefficient}% damage</style> in its path. Lagann can bounce off walls up to {SkillStates.AimLagannImpact.maxRebound - 1} times.");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_SPECIAL_BURROWER_NAME", "Lagann Impact (Burrow mode)");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_SPECIAL_BURROWER_DESCRIPTION", $"Lagann goes into drill mode and burrows into the ground to then pop out at an aimed location dealing <style=cIsDamage>3 x {100f * SkillStates.LagannBurrowerStrike.damageCoefficient}% damage</style> in its path.<style=cIsUtility>Lagann cannot be hit while burrowed.</style>");

            LanguageAPI.Add(prefix + "_LAGANN_BODY_COMBINE_NAME", "Brotherly Combining! Gurren Lagann!");
            LanguageAPI.Add(prefix + "_LAGANN_BODY_COMBINE_DESCRIPTION", $"Combine into Gurren Lagann! Requires <style=cIsUtility>at least 1 spiral gauge</style> and <style=cIsUtility>Gurren must have been found on a stage</style>.");

            //Gurren
            string gurrenDesc = "Gurren (ć‚°ćƒ¬ćƒ³), a modified Gunzar, is a Gunmen captured and piloted by Kamina.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;

            gurrenDesc = gurrenDesc + "< ! > Kamina fueled by fighting spirit gains extra damage for each allies close to him." + Environment.NewLine +
                         "Repairing as much drones as possible or having friends to play with is a good way to take advantage of it." + Environment.NewLine +
                         "Also, if any other allies close to Gurren are capable of spiral power, their spiral power rate is doubled." + Environment.NewLine + Environment.NewLine;
            gurrenDesc = gurrenDesc + "< ! > Gurren can use its shades as a melee weapon." + Environment.NewLine +
                         "Due to its massive size, enemies near can get pulled from the slipstream." + Environment.NewLine + Environment.NewLine;
            gurrenDesc = gurrenDesc + "< ! > Gurren can also shoot from its wrists, blasting streams of bullets to deal damage to enemies at long range." + Environment.NewLine + Environment.NewLine;
            gurrenDesc = gurrenDesc + "< ! > If you want to close a gap to get into melee range or extend the gap to attack at range" + Environment.NewLine +
                         "or if you want to simply dodge a big attack or retreat, simply roll." + Environment.NewLine + Environment.NewLine;
            gurrenDesc = gurrenDesc + "< ! > Use Gurren's ultimate to throw a huge boulder at a group of enemies, stunning them in the process." + Environment.NewLine +
                         "Good to use if you are starting to get overwhelmed by too many enemies. Can only be used while on the ground." + Environment.NewLine + Environment.NewLine;

            LanguageAPI.Add(prefix + "_GURREN_BODY_NAME", "Gurren");
            LanguageAPI.Add(prefix + "_GURREN_BODY_DESCRIPTION", gurrenDesc);
            LanguageAPI.Add(prefix + "_GURREN_BODY_SUBTITLE", "Gunman");
            LanguageAPI.Add(prefix + "_GURREN_BODY_OUTRO_FLAVOR", "Later, Buddy");

            LanguageAPI.Add(prefix + "_GURREN_BODY_DEFAULT_SKIN_NAME", "Default");

            LanguageAPI.Add(prefix + "_GURREN_BODY_PASSIVE_NAME", "Kamina's Spirit");
            LanguageAPI.Add(prefix + "_GURREN_BODY_PASSIVE_DESCRIPTION", "For each allies near Gurren, gain an additional <style=cIsDamage>25% damage</style>. Any allies capable of spiral power near Gurren gain <style=cIsUtility>double their spiral power rate</style>.");

            LanguageAPI.Add(prefix + "_GURREN_BODY_TRIPLESLASH_NAME", "Triple Slash");
            LanguageAPI.Add(prefix + "_GURREN_BODY_TRIPLESLASH_DESCRIPTION", $"Gurren deals 3 slashing attacks for <style=cIsDamage>3x {SkillStates.GurrenTripleSlash.c_DamageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "_GURREN_BODY_DRILLBLASTER_NAME", "Drill Blaster");
            LanguageAPI.Add(prefix + "_GURREN_BODY_DRILLBLASTER_DESCRIPTION", $"Gurren shoots piercing bullets from his wrists, dealing <style=cIsDamage>{100f * SkillStates.GurrenDrillBlaster.damageCoefficient}% damage</style> per bullets");

            LanguageAPI.Add(prefix + "_GURREN_BODY_ROLL_NAME", "Tactical Roll");
            LanguageAPI.Add(prefix + "_GURREN_BODY_ROLL_DESCRIPTION", $"Gurren does a diving roll. <style=cIsUtility>Cannot be hit during this.</style>");

            LanguageAPI.Add(prefix + "_GURREN_BODY_BOULDERTHROW_NAME", "Boulder Throw");
            LanguageAPI.Add(prefix + "_GURREN_BODY_BOULDERTHROW_DESCRIPTION", $"Gurren digs up a huge boulder from the ground and throws it, dealing <style=cIsDamage>{100f * SkillStates.GurrenThrowBoulder.damageCoefficient}% damage</style>, <style=cIsUtility> stunning enemies.</style>");

            LanguageAPI.Add(prefix + "_GURRENFOUND_ACHIEVEMENT_NAME", "I Said I'm Gonna Pilot That Thing!");
            LanguageAPI.Add(prefix + "_GURRENFOUND_UNLOCKABLE_NAME", "I Said I'm Gonna Pilot That Thing!");
            LanguageAPI.Add(prefix + "_GURRENFOUND_ACHIEVEMENT_DESC", "Find and pilot Gurren.");

            //Gurren Lagann
            string gurrenLagannDesc = "Gurren Lagann (ć‚°ćƒ¬ćƒ³ćƒ©ć‚¬ćƒ³) is a combined Gunmen made out of Lagann and Gurren. The head, Lagann, is piloted by Simon, while the body, Gurren, is piloted by Kamina <color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;

            gurrenLagannDesc = gurrenLagannDesc + "< ! > Just like Lagann, Gurren Lagann can harness the power of the spiral. However, its spiral power rate is doubled." + Environment.NewLine + Environment.NewLine;
            gurrenLagannDesc = gurrenLagannDesc + "< ! > Gurren Lagann's spiraling combo can deal a varieties of melee moves." + Environment.NewLine +
                               "Like Gurren, due to its massive size, enemies near can get pulled from the slipstream." + Environment.NewLine + Environment.NewLine;
            gurrenLagannDesc = gurrenLagannDesc + "< ! > For enemies that are at range, Gurren Langann can throw its shades like a boomerang which also does ticking damage on its path." + Environment.NewLine +
                               "If you throw its shades at a boss, the boss will be contricted allowing Gurren Lagann to use its final move GIGA DRILL BREAK dealing MASSIVE damage." + Environment.NewLine +
                               "However, upon using the final move, Gurren Lagann will split back to Lagann and Gurren." + Environment.NewLine + Environment.NewLine;
            gurrenLagannDesc = gurrenLagannDesc + "< ! > You can use Gurren Lagann's tornado kick the same way as you'd use Lagann's spiral burst." + Environment.NewLine +
                               "But can deal 3x the amount of hits on the same targets on its path." + Environment.NewLine + Environment.NewLine;
            gurrenLagannDesc = gurrenLagannDesc + "< ! > Gurren Lagann can expend drills from all over its body to deal damage in a large radius at the cost of spiral power." + Environment.NewLine +
                               "Can come handy when needing to clear up the cannon fodders." + Environment.NewLine + Environment.NewLine;
            gurrenLagannDesc = gurrenLagannDesc + "< ! > If you find yourself in a bind or need a more zoomed view or the mobility of Lagann," + Environment.NewLine +
                               "you can do an emergency exit to slit back into Lagann and Gurren." + Environment.NewLine +
                               "However it comes at the cost of losing your remaining spiral power." + Environment.NewLine +
                               "But just like when you combine, you will regain your health when spliting up." + Environment.NewLine + Environment.NewLine;

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_NAME", "Gurren Lagann");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_DESCRIPTION", gurrenLagannDesc);
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SUBTITLE", "Gunman");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_OUTRO_FLAVOR", "Later, Buddy");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_DEFAULT_SKIN_NAME", "Default");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_PASSIVE_NAME", "Spiral Power");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_PASSIVE_DESCRIPTION", "When in a pinch, spiral power increases, also increasing Lagann's <style=cIsDamage>damage</style>, <style=cIsUtility>movement speed</style> and <style=cIsHealing>health regen</style>");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_NAME", "Spiraling Combo");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_DESCRIPTION", $"Gurren Lagann deals a series of melee attacks for around <style=cIsDamage>{230f}-{540}% damage</style>. <style=cIsUtility>Drills ignores armor.</style>");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_LEGSWEEP_NAME", "Leg sweep");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_INSIDECRESCENTKICK_NAME", "Crescent kick");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_UPPERCUT_NAME", "Uppercut");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_HOOKPUNCH_NAME", "Hook punch");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_STABBINGRIGHT_NAME", "Right stab");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_MMAKICK_NAME", "MMA kick");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_UPWARDTHRUST_NAME", "Upward thrust");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_STABBINGLEFT_NAME", "Left stab");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_MARTELO_NAME", "Martelo");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPIRALINGCOMBO_THRUSTSLASH_NAME", "Thrust slash");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_THROWINGSHADES_NAME", "Throwin' Shades");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_THROWINGSHADES_DESCRIPTION", $"Gurren Lagann throws his shades like a boomerang, dealing <style=cIsDamage>{100f * SkillStates.GurrenLagannThrowingShades.damageCoefficient}% damage</style>");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_TORNADOKICK_NAME", "Tornado Kick");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_TORNADOKICK_DESCRIPTION", $"Gurren Lagann does a tornado kick, dealing <style=cIsDamage>3 x {100f * SkillStates.GurrenLagannTornadoKick.damageCoefficient}% damage</style> on its path. <style=cIsUtility>Cannot be hit during this.</style>");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_UTILITY_SPIRALCONVERSION_NAME", "Spiral conversion");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_UTILITY_SPIRALCONVERSION_DESCRIPTION", $"Gurren Lagann can converts shield/barrier energy into spiral energy. <style=cIsUtility>During converting process, Gurren Lagann is invulnerable.</style>.");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_GIGADRILLMAXIMUM_NAME", "Giga Drill Maximum");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_GIGADRILLMAXIMUM_DESCRIPTION", $"Gurren Lagann expands numerous drills from its body, dealing <style=cIsDamage>{100f * SkillStates.GurrenLagannGigaDrillMaximum.c_DamageCoefficient}% damage</style> in a large radius,<style=cIsUtility> stunning enemies.</style> Costs <style=cIsUtility>half a spiral gauge.</style>");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_GIGADRILLBREAK_NAME", "Giga Drill Break");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_GIGADRILLBREAK_DESCRIPTION", $"Gurren Lagann throws his shades like a boomerang. Upon binding a boss, press again to pierce the boss dealing <style=cIsDamage>{100f * SkillStates.GurrenLagannGigaDrillBreak.damageCoefficient}% damage.</style> <style=cIsUtility>Consumes all spiral energy and reverts to Lagann upon use.</style> Can only bind bosses.");

            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPLIT_NAME", "Emergency Extraction");
            LanguageAPI.Add(prefix + "_GURRENLAGANN_BODY_SPLIT_DESCRIPTION", $"Splits back into Gurren and Lagann, taking back control of Lagann. Doing so depletes all your spiral energy.");

            //Achievements
            LanguageAPI.Add("ACHIEVEMENT_" + prefix + "_LAGANNCOMBINE_ACHIEVEMENT_ID_NAME", "To Hell with Your Combi!");
            LanguageAPI.Add("ACHIEVEMENT_" + prefix + "_LAGANNCOMBINE_ACHIEVEMENT_ID_DESCRIPTION", "Combine into Gurren Lagann.");

            //Interactables
            LanguageAPI.Add(prefix + "_GURREN_INTERACTABLE_NAME", "Gurren");
            LanguageAPI.Add(prefix + "_GURREN_INTERACTABLE_CONTEXT", "Pilot the gunman");
            LanguageAPI.Add(prefix + "_GURREN_SPAWNER_USE_MESSAGE", "<style=cShrine>{0} has mounted Gurren.</color>");
            LanguageAPI.Add(prefix + "_GURREN_SPAWNER_USE_MESSAGE_2P", "<style=cShrine>You have mounted Gurren.</color>");

            //Buffs
            LanguageAPI.Add(prefix + "_MAXSPIRALPOWER_BUFF_NAME", "Spiral power overflow");
            LanguageAPI.Add(prefix + "_MAXSPIRALPOWER_BUFF_DESCRIPTION", "+300 armor and spiral energy rate is hugely increased");
            LanguageAPI.Add(prefix + "_MAXSPIRALPOWER_DEBUFF_NAME", "Spiral power fatigue");
            LanguageAPI.Add(prefix + "_MAXSPIRALPOWER_DEBUFF_DESCRIPTION", "Spiral energy rate is decreased");
            LanguageAPI.Add(prefix + "_CANOPY_BUFF_NAME", "Canopy activated");
            LanguageAPI.Add(prefix + "_CANOPY_BUFF_DESCRIPTION", "+150 armor and is immune to movement impairing effects");


            //Skill++
            LanguageAPI.Add("LAGANNDRILLRUSH_UPGRADE_DESCRIPTION",
                            "Increase damage by 10% every level (Linear)" + Environment.NewLine +
                            "Increase drill size by 50% every level (Linear)" + Environment.NewLine +
                            "Can gain extra spiral power on hit at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("YOKOSHOOTRIFLE_UPGRADE_DESCRIPTION",
                            "Increase ammo by 1 every level" + Environment.NewLine +
                            "Increase max ricochet count by 3 every level" + Environment.NewLine +
                            "Ricochet can hit back previously hit enemies at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("YOKOEXPLOSIVERIFLE_UPGRADE_DESCRIPTION",
                            "Increase ammo by 1 every level" + Environment.NewLine +
                            "Increase explosion size by 10% every level (Linear)" + Environment.NewLine +
                            "Explosion spawns a cluster of smaller explosions at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("YOKOSCEPTERRIFLE_UPGRADE_DESCRIPTION",
                            "Increase ammo by 2 every level" + Environment.NewLine +
                            "Increase max ricochet count by 2 every level" + Environment.NewLine +
                            "Increase explosion size by 15% every level (Linear)" + Environment.NewLine +
                            "Ricochet can hit back previously hit enemies at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("LAGANNSPIRALBURST_UPGRADE_DESCRIPTION",
                            "Increase damage by 30% every level (Linear)" + Environment.NewLine +
                            "Increase jump velocity by 10% every level (Linear)" + Environment.NewLine +
                            "Get a 5 second armor buff on use at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("LAGANNTOGGLECANOPY_UPGRADE_DESCRIPTION",
                            "Increase armor from buff by 10% every level (Linear)" + Environment.NewLine +
                            "Restock yoko's rifle on use at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("LAGANNIMPACT_UPGRADE_DESCRIPTION",
                            "Increase maximum number of rebound by 1 every level" + Environment.NewLine +
                            "Increase shooting distance by 25% every level (Linear)" + Environment.NewLine +
                            "Increase damage by 10% every level (Linear)" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("LAGANNCOMBINE_UPGRADE_DESCRIPTION",
                            "Decrease energy requirement by 10% every level (Exponential)" + Environment.NewLine +
                            "Level cap: 25");


            LanguageAPI.Add("GURRENLAGANNSPIRALINGCOMBO_UPGRADE_DESCRIPTION",
                            "Increase damage by 15% every level (Linear)" + Environment.NewLine +
                            "Increase pull radius by 5% every level (Linear)" + Environment.NewLine +
                            "Increase pull force by 5% every level (Linear)" + Environment.NewLine +
                            "All spiraling combo moves bypass armor at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("GURRENLAGANNTHROWINGSHADES_UPGRADE_DESCRIPTION",
                            "Increase Dot damage by 20% every level (Linear)" + Environment.NewLine +
                            "Increase shades size by 15% every level (Linear)" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("GURRENLAGANNTORNADOKICK_UPGRADE_DESCRIPTION",
                            "Increase damage by 20% every level (Linear)" + Environment.NewLine +
                            "Increase jump velocity by 30% every level (Linear)" + Environment.NewLine +
                            "Can control the direction mid move at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("GURRENLAGANNGIGADRILLMAXIMUM_UPGRADE_DESCRIPTION",
                            "Decrease spiral energy cost by 10% every level (Exponential)" + Environment.NewLine +
                            "Increase damage by 10% every level (Linear)" + Environment.NewLine +
                            "Can bypass armor at level 4" + Environment.NewLine +
                            "Level cap: 25");

            LanguageAPI.Add("GURRENLAGANNSPLIT_UPGRADE_DESCRIPTION",
                            "Increase spiral energy that can be carried over by 10% every level (Exponential)" + Environment.NewLine +
                            "Level cap: 25");

            //Keywords
            LanguageAPI.Add("KEYWORD_BOSSONLY", "<style=cKeywordName>Boss only</style><style=cSub>Only affect bosses.</style>");
        }
Example #15
0
        public static void PerroGrande()
        {
            GameObject fatAcridPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/CrocoBody"), "DireseekerBody");

            CharacterBody bodyComponent = fatAcridPrefab.GetComponent <CharacterBody>();

            LanguageAPI.Add("FATACRID_BODY_NAME", "Perro Grande");
            LanguageAPI.Add("FATACRID_BODY_SUBTITLE", "(Forma Gigante)");

            bodyComponent.name              = "FatAcridBody";
            bodyComponent.baseNameToken     = "FATACRID_BODY_NAME";
            bodyComponent.subtitleNameToken = "FATACRID_BODY_SUBTITLE";
            bodyComponent.baseMoveSpeed     = 3f;
            bodyComponent.baseMaxHealth     = 3800f;
            bodyComponent.levelMaxHealth    = 1140f;
            bodyComponent.baseDamage        = 4f;
            bodyComponent.levelDamage       = 0.8f;
            bodyComponent.isChampion        = true;

            //resize

            fatAcridPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject.transform.localScale *= 6f;
            //fatAcridPrefab.GetComponent<ModelLocator>().modelBaseTransform.gameObject.transform.Translate(new Vector3(0f, 5.6f, 0f));

            foreach (KinematicCharacterMotor kinematicCharacterMotor in fatAcridPrefab.GetComponentsInChildren <KinematicCharacterMotor>())
            {
                kinematicCharacterMotor.SetCapsuleDimensions(kinematicCharacterMotor.Capsule.radius * 6f, kinematicCharacterMotor.Capsule.height * 6f, 6f);
            }

            //

            CharacterModel model = fatAcridPrefab.GetComponentInChildren <CharacterModel>();

            Material newMat = UnityEngine.Object.Instantiate <Material>(model.baseRendererInfos[0].defaultMaterial);

            newMat.SetTexture("_MainTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_MainTex"));
            newMat.SetTexture("_EmTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_EmissionMap"));
            newMat.SetFloat("_EmPower", 80f);

            model.baseRendererInfos[0].defaultMaterial = newMat;

            GameObject acridMasterPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterMasters/LemurianBruiserMaster"), "FatAcridMaster");

            CharacterMaster master = acridMasterPrefab.GetComponent <CharacterMaster>();

            master.bodyPrefab = fatAcridPrefab;
            master.isBoss     = true;

            DiggerPlugin.bodyPrefabs.Add(fatAcridPrefab);
            DiggerPlugin.masterPrefabs.Add(acridMasterPrefab);

            CharacterSpawnCard characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            characterSpawnCard.name               = "cscFatAcrid";
            characterSpawnCard.prefab             = acridMasterPrefab;
            characterSpawnCard.sendOverNetwork    = true;
            characterSpawnCard.hullSize           = HullClassification.BeetleQueen;
            characterSpawnCard.nodeGraphType      = MapNodeGroup.GraphType.Ground;
            characterSpawnCard.requiredFlags      = NodeFlags.None;
            characterSpawnCard.forbiddenFlags     = NodeFlags.TeleporterOK;
            characterSpawnCard.directorCreditCost = 2000;
            characterSpawnCard.occupyPosition     = false;
            characterSpawnCard.loadout            = new SerializableLoadout();
            characterSpawnCard.noElites           = true;
            characterSpawnCard.forbiddenAsBoss    = false;

            DirectorCard card = new DirectorCard
            {
                spawnCard               = characterSpawnCard,
                selectionWeight         = 1,
                allowAmbushSpawn        = false,
                preventOverhead         = false,
                minimumStageCompletions = 5,
                spawnDistance           = DirectorCore.MonsterSpawnDistance.Close
            };

            DirectorAPI.DirectorCardHolder fatAcridCard = new DirectorAPI.DirectorCardHolder
            {
                Card                 = card,
                MonsterCategory      = DirectorAPI.MonsterCategory.Champions,
                InteractableCategory = DirectorAPI.InteractableCategory.None
            };

            DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
            {
                if (stage.stage == DirectorAPI.Stage.AbandonedAqueduct || stage.stage == DirectorAPI.Stage.DistantRoost || stage.stage == DirectorAPI.Stage.RallypointDelta || stage.stage == DirectorAPI.Stage.SkyMeadow || stage.stage == DirectorAPI.Stage.VoidCell || stage.stage == DirectorAPI.Stage.WetlandAspect)
                {
                    if (!list.Contains(fatAcridCard))
                    {
                        list.Add(fatAcridCard);
                    }
                }
            };
        }
Example #16
0
 public static void AddToken(string key, string value, string language, bool reload = true)
 {
     LanguageAPI.Add(key, value, language);
 }
 private void AddLanguageTokens()
 {
     LanguageAPI.Add("PSI_BIT_NAME", "Psy Drone");
     LanguageAPI.Add("PSI_BIT_CONTEXT", "Repair Psy Drones");
     LanguageAPI.Add("PSI_BIT_INTERACTABLE_NAME", "Broken Psy Drones");
 }
Example #18
0
 public static void AddToken(Dictionary <string, Dictionary <string, string> > languageDictionary)
 {
     LanguageAPI.Add(languageDictionary);
 }
Example #19
0
        private void RegisterCharacter()
        {
            // now that the body prefab's set up, clone it here to make the display prefab
            characterDisplay = PrefabAPI.InstantiateClone(characterPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject, "ExampleSurvivorDisplay", true, "C:\\Users\\test\\Documents\\ror2mods\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor.cs", "RegisterCharacter", 153);
            characterDisplay.AddComponent <NetworkIdentity>();

            // clone rex's syringe projectile prefab here to use as our own projectile
            arrowProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SyringeProjectile"), "Prefabs/Projectiles/ExampleArrowProjectile", true, "C:\\Users\\test\\Documents\\ror2mods\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor\\ExampleSurvivor.cs", "RegisterCharacter", 155);

            // just setting the numbers to 1 as the entitystate will take care of those
            arrowProjectile.GetComponent <ProjectileController>().procCoefficient = 1f;
            arrowProjectile.GetComponent <ProjectileDamage>().damage     = 1f;
            arrowProjectile.GetComponent <ProjectileDamage>().damageType = DamageType.Generic;

            // register it for networking
            if (arrowProjectile)
            {
                PrefabAPI.RegisterNetworkPrefab(arrowProjectile);
            }

            // add it to the projectile catalog or it won't work in multiplayer
            ProjectileCatalog.getAdditionalEntries += list =>
            {
                list.Add(arrowProjectile);
            };


            // write a clean survivor description here!
            string desc = "Example Survivor something something.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;

            desc = desc + "< ! > Sample text 1." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sample text 2." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sample Text 3." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sample Text 4.</color>" + Environment.NewLine + Environment.NewLine;

            // add the language tokens
            LanguageAPI.Add("EXAMPLESURVIVOR_NAME", "Example Survivor");
            LanguageAPI.Add("EXAMPLESURVIVOR_DESCRIPTION", desc);
            LanguageAPI.Add("EXAMPLESURVIVOR_SUBTITLE", "Template for Custom Survivors");

            // add our new survivor to the game~
            SurvivorDef survivorDef = new SurvivorDef
            {
                name             = "EXAMPLESURVIVOR_NAME",
                unlockableName   = "",
                descriptionToken = "EXAMPLESURVIVOR_DESCRIPTION",
                primaryColor     = characterColor,
                bodyPrefab       = characterPrefab,
                displayPrefab    = characterDisplay
            };


            SurvivorAPI.AddSurvivor(survivorDef);

            // set up the survivor's skills here
            SkillSetup();

            // gotta add it to the body catalog too
            BodyCatalog.getAdditionalEntries += delegate(List <GameObject> list)
            {
                list.Add(characterPrefab);
            };
        }
Example #20
0
 public static void AddToken(Dictionary <string, Dictionary <string, string> > languageDictionary, bool reload = true)
 {
     LanguageAPI.Add(languageDictionary);
 }
Example #21
0
        private static void SetupSkills()
        {
            LanguageAPI.Add("CAPTAINSCEPTER_NAME", "");
            LanguageAPI.Add("CAPTAINSCEPTER_DESCRIPTION", ".");

            var mySkillDef = ScriptableObject.CreateInstance <SkillDef>();

            mySkillDef.activationState            = new SerializableEntityStateType(typeof(Captain.SetupNukeAlt));
            mySkillDef.activationStateMachineName = "Weapon";
            mySkillDef.baseMaxStock                 = 1;
            mySkillDef.baseRechargeInterval         = 20f;
            mySkillDef.beginSkillCooldownOnSkillEnd = true;
            mySkillDef.canceledFromSprinting        = false;
            mySkillDef.fullRestockOnAssign          = true;
            mySkillDef.interruptPriority            = InterruptPriority.Any;
            mySkillDef.isCombatSkill                = true;
            mySkillDef.mustKeyPress                 = true;
            mySkillDef.rechargeStock                = 1;
            mySkillDef.requiredStock                = 1;
            mySkillDef.stockToConsume               = 1;
            mySkillDef.icon = Resources.Load <Sprite>("textures/bufficons/texBuffLunarShellIcon");
            mySkillDef.skillDescriptionToken = "CAPTAINSCEPTER_DESCRIPTION";
            mySkillDef.skillName             = "CAPTAINSCEPTER_NAME";
            mySkillDef.skillNameToken        = mySkillDef.skillName;

            mySkillDef.cancelSprintingOnActivation = false;
            mySkillDef.dontAllowPastMaxStocks      = false;
            mySkillDef.forceSprintDuringState      = false;
            mySkillDef.keywordTokens           = new string[] { };
            mySkillDef.resetCooldownTimerOnUse = false;

            LoadoutAPI.AddSkillDef(mySkillDef);

            var skillLocator = myCharacter.GetComponent <SkillLocator>();
            var skillFamily  = skillLocator.utility.skillFamily;

            Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
            skillFamily.variants[skillFamily.variants.Length - 1] = new SkillFamily.Variant
            {
                skillDef      = mySkillDef,
                unlockableDef = null,
                viewableNode  = new ViewablesCatalog.Node(mySkillDef.skillNameToken, false, null)
            };



            callNuke = ScriptableObject.CreateInstance <SkillDef>();
            callNuke.activationState            = new SerializableEntityStateType(typeof(Captain.CallNukeAltEnter));
            callNuke.activationStateMachineName = "Weapon";
            callNuke.baseMaxStock                 = 1;
            callNuke.baseRechargeInterval         = 0f;
            callNuke.beginSkillCooldownOnSkillEnd = true;
            callNuke.canceledFromSprinting        = true;
            callNuke.fullRestockOnAssign          = true;
            callNuke.interruptPriority            = InterruptPriority.Any;
            callNuke.isCombatSkill                = true;
            callNuke.mustKeyPress                 = true;
            callNuke.rechargeStock                = 1;
            callNuke.requiredStock                = 1;
            callNuke.stockToConsume               = 1;
            callNuke.icon = Resources.Load <Sprite>("textures/bufficons/texBuffLunarShellIcon");
            callNuke.skillDescriptionToken = "CAPTAINSCEPTER_DESCRIPTION";
            callNuke.skillName             = "CAPTAINSCEPTER_NAME";
            callNuke.skillNameToken        = callNuke.skillName;

            callNuke.cancelSprintingOnActivation = false;
            callNuke.dontAllowPastMaxStocks      = false;
            callNuke.forceSprintDuringState      = false;
            callNuke.keywordTokens           = new string[] { };
            callNuke.resetCooldownTimerOnUse = false;
        }
Example #22
0
 public static void AddToken(Dictionary <string, string> tokenDictionary, string language)
 {
     LanguageAPI.Add(tokenDictionary, language);
 }
Example #23
0
        internal static void AddTokens()
        {
            #region Henry
            string prefix = HenryPlugin.developerPrefix + "_HENRY_BODY_";

            string desc = "Henry is a skilled fighter who makes use of a wide arsenal of weaponry to take down his foes.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sword is a good all-rounder while Boxing Gloves are better for laying a beatdown on more powerful foes." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Pistol is a powerful anti air, with its low cooldown and high damage." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Roll has a lingering armor buff that helps to use it aggressively." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Bomb can be used to wipe crowds with ease." + Environment.NewLine + Environment.NewLine;

            string outro = "..and so he left, bottom text.";

            LanguageAPI.Add(prefix + "NAME", "Henry");
            LanguageAPI.Add(prefix + "DESCRIPTION", desc);
            LanguageAPI.Add(prefix + "SUBTITLE", "The Chosen One");
            LanguageAPI.Add(prefix + "LORE", "sample lore");
            LanguageAPI.Add(prefix + "OUTRO_FLAVOR", outro);

            #region Skins
            LanguageAPI.Add(prefix + "DEFAULT_SKIN_NAME", "Default");
            LanguageAPI.Add(prefix + "MASTERY_SKIN_NAME", "Alternate");
            LanguageAPI.Add(prefix + "DANTE_SKIN_NAME", "Dante");
            LanguageAPI.Add(prefix + "TYPHOON_SKIN_NAME", "Vergil");
            #endregion

            #region Passive
            LanguageAPI.Add(prefix + "PASSIVE_NAME", "Henry passive");
            LanguageAPI.Add(prefix + "PASSIVE_DESCRIPTION", "Sample text.");
            #endregion

            #region Primary
            LanguageAPI.Add(prefix + "PRIMARY_SLASH_NAME", "Sword");
            LanguageAPI.Add(prefix + "PRIMARY_SLASH_DESCRIPTION", Helpers.agilePrefix + $"Swing forward for <style=cIsDamage>{100f * 3.5f}% damage</style>.");

            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_NAME", "Boxing Gloves");
            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_DESCRIPTION", Helpers.agilePrefix + $"Punch rapidly for <style=cIsDamage>{100f * 2.8f}% damage</style>. <style=cIsUtility>Ignores armor.</style>");
            #endregion

            #region Secondary
            LanguageAPI.Add(prefix + "SECONDARY_GUN_NAME", "Pistol");
            LanguageAPI.Add(prefix + "SECONDARY_GUN_DESCRIPTION", Helpers.agilePrefix + $"Fire your handgun for <style=cIsDamage>{100f * SkillStates.Shoot.damageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "SECONDARY_STINGER_NAME", "Stinger");
            LanguageAPI.Add(prefix + "SECONDARY_STINGER_DESCRIPTION", Helpers.agilePrefix + $"Lunge at en enemy for <style=cIsDamage>{100f * SkillStates.Stinger.Stinger.damageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "SECONDARY_UZI_NAME", "Uzi");
            LanguageAPI.Add(prefix + "SECONDARY_UZI_DESCRIPTION", $"Fire an uzi for <style=cIsDamage>{100f * SkillStates.ShootUzi.damageCoefficient}% damage</style>.");
            #endregion

            #region Utility
            LanguageAPI.Add(prefix + "UTILITY_ROLL_NAME", "Roll");
            LanguageAPI.Add(prefix + "UTILITY_ROLL_DESCRIPTION", "Roll a short distance, gaining <style=cIsUtility>300 armor</style>. <style=cIsUtility>You cannot be hit during the roll.</style>");
            #endregion

            #region Special
            LanguageAPI.Add(prefix + "SPECIAL_BOMB_NAME", "Bomb");
            LanguageAPI.Add(prefix + "SPECIAL_BOMB_DESCRIPTION", $"Throw a bomb for <style=cIsDamage>{100f * SkillStates.ThrowBomb.damageCoefficient}% damage</style>.");

            LanguageAPI.Add(prefix + "SPECIAL_SCEPBOMB_NAME", "More Bombs!");
            LanguageAPI.Add(prefix + "SPECIAL_SCEPBOMB_DESCRIPTION", $"Throw a bomb for <style=cIsDamage>{100f * SkillStates.ThrowBomb.damageCoefficient}% damage</style>." + Helpers.ScepterDescription("Hold up to 4 bombs. Cooldown is halved."));
            #endregion

            #region Achievements
            LanguageAPI.Add(prefix + "UNLOCKABLE_ACHIEVEMENT_NAME", "Prelude");
            LanguageAPI.Add(prefix + "UNLOCKABLE_ACHIEVEMENT_DESC", "Enter Titanic Plains.");
            LanguageAPI.Add(prefix + "UNLOCKABLE_UNLOCKABLE_NAME", "Prelude");

            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: Mastery");
            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, beat the game or obliterate on Monsoon.");
            LanguageAPI.Add(prefix + "MASTERYUNLOCKABLE_UNLOCKABLE_NAME", "Henry: Mastery");

            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: Grand Mastery");
            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, beat the game or obliterate on Typhoon.");
            LanguageAPI.Add(prefix + "TYPHOONUNLOCKABLE_UNLOCKABLE_NAME", "Henry: Grand Mastery");

            LanguageAPI.Add(prefix + "DANTEUNLOCKABLE_ACHIEVEMENT_NAME", "Henry: Jackpot");
            LanguageAPI.Add(prefix + "DANTEUNLOCKABLE_ACHIEVEMENT_DESC", "As Henry, defeat a Twisted Scavenger on Monsoon.");
            LanguageAPI.Add(prefix + "DANTEUNLOCKABLE_UNLOCKABLE_NAME", "Henry: Jackpot");
            #endregion
            #endregion

            #region MrGreen
            prefix = HenryPlugin.developerPrefix + "_MRGREEN_BODY_";

            desc = "Mr. Green<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Sword is a good all-rounder while Boxing Gloves are better for laying a beatdown on more powerful foes." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Pistol is a powerful anti air, with its low cooldown and high damage." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Roll has a lingering armor buff that helps to use it aggressively." + Environment.NewLine + Environment.NewLine;
            desc = desc + "< ! > Bomb can be used to wipe crowds with ease." + Environment.NewLine + Environment.NewLine;

            outro = "..and so he left, bottom text.";

            LanguageAPI.Add(prefix + "NAME", "Mr. Green");
            LanguageAPI.Add(prefix + "DESCRIPTION", desc);
            LanguageAPI.Add(prefix + "SUBTITLE", "The");
            LanguageAPI.Add(prefix + "LORE", "sample lore part 2");
            LanguageAPI.Add(prefix + "OUTRO_FLAVOR", outro);

            #region Skins
            LanguageAPI.Add(prefix + "DEFAULT_SKIN_NAME", "Default");
            #endregion

            #region Passive
            LanguageAPI.Add(prefix + "PASSIVE_NAME", "Mr. Green passive");
            LanguageAPI.Add(prefix + "PASSIVE_DESCRIPTION", "Sample text.");
            #endregion

            #region Primary
            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_NAME", "Martial Arts");
            LanguageAPI.Add(prefix + "PRIMARY_PUNCH_DESCRIPTION", $"Perform a swift combo of punches and kicks for <style=cIsDamage>{100f * 0.9f}% damage</style>.");
            #endregion

            #region Secondary
            LanguageAPI.Add(prefix + "SECONDARY_CLONETHROW_NAME", "Clone Throw");
            LanguageAPI.Add(prefix + "SECONDARY_CLONETHROW_DESCRIPTION", $"Summon a clone and throw it forward, grabbing nearby enemies and slamming them into the ground for <style=cIsDamage>{100f * SkillStates.Shoot.damageCoefficient}% damage</style>.");
            #endregion

            #region Utility
            LanguageAPI.Add(prefix + "UTILITY_DASH_NAME", "People's Elbow");
            LanguageAPI.Add(prefix + "UTILITY_DASH_DESCRIPTION", "Dash a short distance. Upon contact with a <style=cIsUtility>clone</style>, leap into the air and descend with a powerful <style=cIsUtility>elbow drop</style> for <style=cIsDamage>800% damage</style>.");
            #endregion

            #region Special
            LanguageAPI.Add(prefix + "SPECIAL_RES_NAME", "Resurrection");
            LanguageAPI.Add(prefix + "SPECIAL_RES_DESCRIPTION", $"Resurrect all fallen clones.");
            #endregion
            #endregion
        }
        public static bool Init()
        {
            On.RoR2.GlobalEventManager.OnCharacterDeath += GlobalEventManager_OnCharacterDeath;

            var equipDef = new EquipmentDef
            {
                name             = EquipName,
                cooldown         = 10f,
                pickupModelPath  = "",
                pickupIconPath   = "",
                nameToken        = EquipName,
                pickupToken      = "Pickup_Tarborne",
                descriptionToken = "Description_Tarborne",
                canDrop          = false,
                enigmaCompatible = false
            };

            On.RoR2.CharacterBody.OnEquipmentLost   += CharacterBody_OnEquipmentLost;
            On.RoR2.CharacterBody.OnEquipmentGained += CharacterBody_OnEquipmentGained;
            var equip = new CustomEquipment(equipDef, new ItemDisplayRule[0]);

            var buffDef = new BuffDef
            {
                name      = BuffName,
                buffColor = new Color32(41, 41, 41, 255),
                iconPath  = "",
                canStack  = false
            };
            var buff = new CustomBuff(buffDef);

            var eliteDef = new EliteDef
            {
                name                = EliteName,
                modifierToken       = "ELITE_MODIFIER_TARBORNE",
                color               = buffDef.buffColor,
                eliteEquipmentIndex = _equipIndex
            };

            var elite = new CustomElite(eliteDef, 1);

            _eliteIndex = EliteAPI.Add(elite);
            _buffIndex  = BuffAPI.Add(buff);
            _equipIndex = ItemAPI.Add(equip);
            eliteDef.eliteEquipmentIndex = _equipIndex;
            equipDef.passiveBuff         = _buffIndex;
            buffDef.eliteIndex           = _eliteIndex;


            var card = new EliteAffixCard
            {
                spawnWeight      = 1f,
                costMultiplier   = 6f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.0f,
                eliteOnlyScaling = 1f,
                eliteType        = _eliteIndex,
                onSpawned        = OnSpawned,
                isAvailable      = new Func <bool>(() => true)
            };

            //Register the card for spawning if ESO is enabled
            EsoLib.Cards.Add(card);
            Card = card;

            //Description of elite in UI when boss
            LanguageAPI.Add(eliteDef.modifierToken, "Tarborne {0}");
            LanguageAPI.Add(equipDef.pickupToken, "Dunestrider's Dominion");
            LanguageAPI.Add(equipDef.descriptionToken, "Become an aspect of Tar");

            return(true);
        }
Example #25
0
 private static void SetupLanguage()
 {
     LanguageAPI.Add("RISKOFBULLETSTORM_MASTERROUND_START", "<color=#c9ab14>[MR] Each player can take a max of {0} hits!</color>", "en");
     LanguageAPI.Add("RISKOFBULLETSTORM_MASTERROUND_HIT", "<color=#ba3f0f>[MR] {0} has been hit {1} out of {2} times by {3}!</color>", "en");
     LanguageAPI.Add("RISKOFBULLETSTORM_MASTERROUND_FAIL", "<color=#ba3f0f>[MR] {0} failed by getting hit {1} out of {2} times by {3}!</color>", "en");
 }
        public static bool Init()
        {
            On.RoR2.GlobalEventManager.ServerDamageDealt += GlobalEventManager_ServerDamageDealt;

            var equipDef = new EquipmentDef
            {
                name             = EquipName,
                cooldown         = 10f,
                pickupModelPath  = "",
                pickupIconPath   = "",
                nameToken        = EquipName,
                pickupToken      = "Pickup_Blightborne",
                descriptionToken = "Description_Blightborne",
                canDrop          = false,
                enigmaCompatible = false
            };

            var equip = new CustomEquipment(equipDef, new ItemDisplayRule[0]);

            var buffDef = new BuffDef
            {
                name      = BuffName,
                buffColor = new Color32(141, 51, 19, 255),
                iconPath  = "",
                canStack  = false
            };
            var buff = new CustomBuff(buffDef);

            var eliteDef = new EliteDef
            {
                name                = EliteName,
                modifierToken       = "ELITE_MODIFIER_BLIGHTBORNE",
                color               = buffDef.buffColor,
                eliteEquipmentIndex = _equipIndex
            };

            var elite = new CustomElite(eliteDef, 1);

            _eliteIndex = EliteAPI.Add(elite);
            _buffIndex  = BuffAPI.Add(buff);
            _equipIndex = ItemAPI.Add(equip);
            eliteDef.eliteEquipmentIndex = _equipIndex;
            equipDef.passiveBuff         = _buffIndex;
            buffDef.eliteIndex           = _eliteIndex;

            On.RoR2.CharacterBody.OnEquipmentLost   += CharacterBody_OnEquipmentLost;
            On.RoR2.CharacterBody.OnEquipmentGained += CharacterBody_OnEquipmentGained;
            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 16f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 8.0f,
                eliteOnlyScaling = 1f,
                eliteType        = _eliteIndex,
                onSpawned        = OnSpawned,
                isAvailable      = new Func <bool>(() => Run.instance.stageClearCount > 3 && Run.instance.selectedDifficulty != DifficultyIndex.Easy)
            };

            //Register the card for spawning if ESO is enabled
            EsoLib.Cards.Add(card);
            Card = card;

            //Description of elite in UI when boss
            LanguageAPI.Add(eliteDef.modifierToken, "Blightborne {0}");
            LanguageAPI.Add(equipDef.pickupToken, "Blight's Embrace");
            LanguageAPI.Add(equipDef.descriptionToken, "Become an aspect of Blight");

            return(true);
        }
Example #27
0
        internal override void SetupAttributes()
        {
            myDef = CloneSkillDef(targetVariantDef);

            var nametoken = "CLASSICITEMS_SCEPMAGE_FLAMETHROWERNAME";

            newDescToken = "CLASSICITEMS_SCEPMAGE_FLAMETHROWERDESC";
            oldDescToken = targetVariantDef.skillDescriptionToken;
            var namestr = "Dragon's Breath";

            LanguageAPI.Add(nametoken, namestr);

            myDef.skillName             = namestr;
            myDef.skillNameToken        = nametoken;
            myDef.skillDescriptionToken = newDescToken;
            myDef.icon = ClassicItemsPlugin.resources.LoadAsset <Sprite>("Assets/ClassicItems/Textures/ScepterSkillIcons/mage_flamethrowericon.png");

            ContentAddition.AddSkillDef(myDef);

            projCloud = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/BeetleQueenAcid").InstantiateClone("CIScepMageFlamethrowerCloud", true);
            var pdz = projCloud.GetComponent <ProjectileDotZone>();

            pdz.lifetime      = 10f;
            pdz.impactEffect  = null;
            pdz.fireFrequency = 2f;
            var fxObj = projCloud.transform.Find("FX");

            fxObj.Find("Spittle").gameObject.SetActive(false);
            fxObj.Find("Decal").gameObject.SetActive(false);
            fxObj.Find("Gas").gameObject.SetActive(false);
            foreach (var x in fxObj.GetComponents <AnimateShaderAlpha>())
            {
                x.enabled = false;
            }
            var fxcloud = UnityEngine.Object.Instantiate(LegacyResourcesAPI.Load <GameObject>("prefabs/FireTrail").GetComponent <DamageTrail>().segmentPrefab, fxObj.transform);
            var psmain  = fxcloud.GetComponent <ParticleSystem>().main;

            psmain.duration        = 10f;
            psmain.gravityModifier = -0.05f;
            var pstartx = psmain.startSizeX;

            pstartx.constantMin *= 0.75f;
            pstartx.constantMax *= 0.75f;
            var pstarty = psmain.startSizeY;

            pstarty.constantMin *= 0.75f;
            pstarty.constantMax *= 0.75f;
            var pstartz = psmain.startSizeZ;

            pstartz.constantMin *= 0.75f;
            pstartz.constantMax *= 0.75f;
            var pslife = psmain.startLifetime;

            pslife.constantMin = 0.75f;
            pslife.constantMax = 1.5f;
            fxcloud.GetComponent <DestroyOnTimer>().enabled = false;
            fxcloud.transform.localPosition = Vector3.zero;
            fxcloud.transform.localScale    = Vector3.one;
            var psshape = fxcloud.GetComponent <ParticleSystem>().shape;

            psshape.shapeType = ParticleSystemShapeType.Sphere;
            psshape.scale     = Vector3.one * 1.5f;
            var psemit = fxcloud.GetComponent <ParticleSystem>().emission;

            psemit.rateOverTime = Scepter.instance.artiFlamePerformanceMode ? 4f : 20f;
            var lightObj = fxObj.Find("Point Light").gameObject;

            if (Scepter.instance.artiFlamePerformanceMode)
            {
                UnityEngine.Object.Destroy(lightObj);
            }
            else
            {
                var lightCpt = lightObj.GetComponent <Light>();
                lightCpt.color     = new Color(1f, 0.5f, 0.2f);
                lightCpt.intensity = 3.5f;
                lightCpt.range     = 5f;
            }

            ContentAddition.AddProjectile(projCloud);
        }
Example #28
0
        public static void CreateDireseeker()
        {
            if (DiggerPlugin.direseekerInstalled)
            {
                AddUnlockComponent();
            }

            if (DiggerPlugin.fatAcrid.Value)
            {
                PerroGrande();
            }

            CreateProjectiles();

            LanguageAPI.Add("DIRESEEKER_BODY_NAME", "Direseeker");
            LanguageAPI.Add("DIRESEEKER_BODY_SUBTITLE", "Track and Kill");
            //LanguageAPI.Add("DIRESEEKER_BODY_LORE", "Direseeker\n\nDireseeker is a giant Elder Lemurian that acts as a boss in the Stage 4 area Magma Barracks. Upon defeating it, the player will unlock the Miner character for future playthroughs. The path leading to Direseeker's location only appears in one of the three variants of the level, and even then Direseeker may or may not spawn with random chance. Completing the teleporter event will also prevent it from spawning.\nNote that in online co-op the boss may spawn for the Host, but not others, although they can still damage it.\nActivating the Artifact of Kin does not prevent it from appearing.\n\nCategories: Enemies | Bosses | Unlisted Enemies\n\nLanguages: EspaƱol");
            LanguageAPI.Add("DIRESEEKER_BODY_LORE", "Legends tell of a monstrous beast that once roamed the underground barracks of Petrichor V.\n\nFeared by the bravest of survivors and the nastiest of monsters, the massive beast was unrivaled. It donned blood-red scales, tempered by hellfire. It had burning yellow eyes, with a glare so intense it made the largest of creatures stop dead in their tracks. It had smoldering breath, hot enough to melt metal in an instant.\n\nOnly once stopped by a survivor strong enough to slay Providence himself, it was believed that the beast had finally met its match.\n\n<style=cIsHealth>Until it showed its terrifying face once again.</style>");
            LanguageAPI.Add("DIRESEEKER_BODY_OUTRO_FLAVOR", "..and so it left, in search of new prey.");

            //skills and states
            LoadoutAPI.AddSkill(typeof(EntityStates.Direseeker.SpawnState));
            LoadoutAPI.AddSkill(typeof(EntityStates.Direseeker.ChargeUltraFireball));
            LoadoutAPI.AddSkill(typeof(EntityStates.Direseeker.FireUltraFireball));

            if (!DiggerPlugin.direseekerInstalled)
            {
                bodyPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/LemurianBruiserBody"), "DireseekerBody");

                CharacterBody bodyComponent = bodyPrefab.GetComponent <CharacterBody>();

                bodyComponent.name              = "DireseekerBody";
                bodyComponent.baseNameToken     = "DIRESEEKER_BODY_NAME";
                bodyComponent.subtitleNameToken = "DIRESEEKER_BODY_SUBTITLE";
                bodyComponent.baseMoveSpeed     = 11f;
                bodyComponent.baseMaxHealth     = 2800f;
                bodyComponent.levelMaxHealth    = 840f;
                bodyComponent.baseDamage        = 20f;
                bodyComponent.levelDamage       = 4f;
                bodyComponent.isChampion        = true;
                bodyComponent.portraitIcon      = Assets.mainAssetBundle.LoadAsset <Sprite>("texDireseekerIcon").texture;

                SkillSetup(bodyPrefab);

                var stateMachine = bodyComponent.GetComponentInChildren <EntityStateMachine>();
                if (stateMachine)
                {
                    stateMachine.initialStateType = new SerializableEntityStateType(typeof(EntityStates.Direseeker.SpawnState));
                }

                //resize

                bodyPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject.transform.localScale *= 1.5f;
                //bodyPrefab.GetComponent<ModelLocator>().modelBaseTransform.gameObject.transform.Translate(new Vector3(0f, 5.6f, 0f));

                foreach (KinematicCharacterMotor kinematicCharacterMotor in bodyPrefab.GetComponentsInChildren <KinematicCharacterMotor>())
                {
                    kinematicCharacterMotor.SetCapsuleDimensions(kinematicCharacterMotor.Capsule.radius * 1.5f, kinematicCharacterMotor.Capsule.height * 1.5f, 1.5f);
                }

                //

                CharacterModel model = bodyPrefab.GetComponentInChildren <CharacterModel>();

                Material newMat = UnityEngine.Object.Instantiate <Material>(model.baseRendererInfos[0].defaultMaterial);
                newMat.SetTexture("_MainTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_MainTex"));
                newMat.SetTexture("_EmTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_EmissionMap"));
                newMat.SetFloat("_EmPower", 50f);

                model.baseRendererInfos[0].defaultMaterial = newMat;

                GameObject horn1 = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHorn").InstantiateClone("DireseekerHorn", false);
                GameObject horn2 = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHornBroken").InstantiateClone("DireseekerHornBroken", false);
                //GameObject rageFlame = Assets.mainAssetBundle.LoadAsset<GameObject>("DireseekerRageFlame").InstantiateClone("DireseekerRageFlame", false);
                GameObject burstFlame = Assets.mainAssetBundle.LoadAsset <GameObject>("DireseekerBurstFlame").InstantiateClone("DireseekerBurstFlame", false);

                ChildLocator childLocator = bodyPrefab.GetComponentInChildren <ChildLocator>();

                horn1.transform.SetParent(childLocator.FindChild("Head"));
                horn1.transform.localPosition = new Vector3(-2.5f, 1, -0.5f);
                horn1.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn1.transform.localScale    = new Vector3(100, 100, 100);

                horn2.transform.SetParent(childLocator.FindChild("Head"));
                horn2.transform.localPosition = new Vector3(2.5f, 1, -0.5f);
                horn2.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn2.transform.localScale    = new Vector3(100, -100, 100);

                /*rageFlame.transform.SetParent(childLocator.FindChild("Head"));
                 * rageFlame.transform.localPosition = new Vector3(0, 1, 0);
                 * rageFlame.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                 * rageFlame.transform.localScale = new Vector3(5, 5, 5);*/

                burstFlame.transform.SetParent(childLocator.FindChild("Head"));
                burstFlame.transform.localPosition = new Vector3(0, 1, 0);
                burstFlame.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                burstFlame.transform.localScale    = new Vector3(5, 5, 5);

                bodyPrefab.AddComponent <DireseekerController>().burstFlame = burstFlame.GetComponent <ParticleSystem>();

                Shader hotpoo = Resources.Load <Shader>("Shaders/Deferred/hgstandard");

                Material hornMat = horn1.GetComponentInChildren <MeshRenderer>().material;
                hornMat.shader = hotpoo;

                //add horns

                CharacterModel.RendererInfo[] infos    = model.baseRendererInfos;
                CharacterModel.RendererInfo[] newInfos = new CharacterModel.RendererInfo[]
                {
                    infos[0],
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn1.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    },
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn2.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    }
                };

                model.baseRendererInfos = newInfos;

                masterPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterMasters/LemurianBruiserMaster"), "DireseekerMaster");

                CharacterMaster master = masterPrefab.GetComponent <CharacterMaster>();

                master.bodyPrefab = bodyPrefab;
                master.isBoss     = false;

                DiggerPlugin.bodyPrefabs.Add(bodyPrefab);
                DiggerPlugin.masterPrefabs.Add(masterPrefab);

                if (DiggerPlugin.enableDireseeker.Value && !DiggerPlugin.direseekerInstalled)
                {
                    CharacterSpawnCard characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();
                    characterSpawnCard.name               = "cscDireseeker";
                    characterSpawnCard.prefab             = masterPrefab;
                    characterSpawnCard.sendOverNetwork    = true;
                    characterSpawnCard.hullSize           = HullClassification.BeetleQueen;
                    characterSpawnCard.nodeGraphType      = MapNodeGroup.GraphType.Ground;
                    characterSpawnCard.requiredFlags      = NodeFlags.None;
                    characterSpawnCard.forbiddenFlags     = NodeFlags.TeleporterOK;
                    characterSpawnCard.directorCreditCost = 800;
                    characterSpawnCard.occupyPosition     = false;
                    characterSpawnCard.loadout            = new SerializableLoadout();
                    characterSpawnCard.noElites           = true;
                    characterSpawnCard.forbiddenAsBoss    = false;

                    DirectorCard card = new DirectorCard
                    {
                        spawnCard               = characterSpawnCard,
                        selectionWeight         = 1,
                        allowAmbushSpawn        = false,
                        preventOverhead         = false,
                        minimumStageCompletions = 2,
                        spawnDistance           = DirectorCore.MonsterSpawnDistance.Close
                    };

                    DirectorAPI.DirectorCardHolder direseekerCard = new DirectorAPI.DirectorCardHolder
                    {
                        Card                 = card,
                        MonsterCategory      = DirectorAPI.MonsterCategory.Champions,
                        InteractableCategory = DirectorAPI.InteractableCategory.None
                    };

                    DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
                    {
                        if (stage.stage == DirectorAPI.Stage.AbyssalDepths)
                        {
                            if (!list.Contains(direseekerCard))
                            {
                                list.Add(direseekerCard);
                            }
                        }
                    };
                }
            }

            if (DiggerPlugin.enableDireseekerSurvivor.Value)
            {
                survivorPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/LemurianBruiserBody"), "DireseekerPlayerBody");

                CharacterBody bodyComponent2 = survivorPrefab.GetComponent <CharacterBody>();

                bodyComponent2.name              = "DireseekerPlayerBody";
                bodyComponent2.baseNameToken     = "DIRESEEKER_BODY_NAME";
                bodyComponent2.subtitleNameToken = "DIRESEEKER_BODY_SUBTITLE";
                bodyComponent2.baseMoveSpeed     = 11f;
                bodyComponent2.baseMaxHealth     = 2200f;
                bodyComponent2.levelMaxHealth    = 800f;
                bodyComponent2.baseRegen         = 0.5f;
                bodyComponent2.levelRegen        = 0.2f;
                bodyComponent2.baseDamage        = 20f;
                bodyComponent2.levelDamage       = 4f;
                bodyComponent2.isChampion        = false;
                bodyComponent2.portraitIcon      = Assets.mainAssetBundle.LoadAsset <Sprite>("texDireseekerPlayerIcon").texture;
                bodyComponent2.hideCrosshair     = true;

                SkillSetup(survivorPrefab);

                var stateMachine = survivorPrefab.GetComponentInChildren <EntityStateMachine>();
                if (stateMachine)
                {
                    stateMachine.initialStateType = new SerializableEntityStateType(typeof(EntityStates.Direseeker.SpawnState));
                }

                //resize

                survivorPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject.transform.localScale *= 0.75f;
                survivorPrefab.transform.GetChild(0).localPosition = new Vector3(0, -2.75f, 0);
                survivorPrefab.transform.GetChild(2).localPosition = new Vector3(0, 0.8f, 1.5f);

                foreach (KinematicCharacterMotor kinematicCharacterMotor in survivorPrefab.GetComponentsInChildren <KinematicCharacterMotor>())
                {
                    kinematicCharacterMotor.SetCapsuleDimensions(kinematicCharacterMotor.Capsule.radius * 0.75f, kinematicCharacterMotor.Capsule.height * 0.75f, 0.75f);
                }

                //

                CharacterModel model2 = survivorPrefab.GetComponentInChildren <CharacterModel>();

                Material newMat = UnityEngine.Object.Instantiate <Material>(model2.baseRendererInfos[0].defaultMaterial);
                newMat.SetTexture("_MainTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_MainTex"));
                newMat.SetTexture("_EmTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_EmissionMap"));
                newMat.SetFloat("_EmPower", 50f);

                model2.baseRendererInfos[0].defaultMaterial = newMat;

                GameObject horn1b = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHorn").InstantiateClone("DireseekerHorn", false);
                GameObject horn2b = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHornBroken").InstantiateClone("DireseekerHornBroken", false);
                //GameObject rageFlame = Assets.mainAssetBundle.LoadAsset<GameObject>("DireseekerRageFlame").InstantiateClone("DireseekerRageFlame", false);
                GameObject burstFlame2 = Assets.mainAssetBundle.LoadAsset <GameObject>("DireseekerBurstFlame").InstantiateClone("DireseekerBurstFlame", false);

                ChildLocator childLocator2 = survivorPrefab.GetComponentInChildren <ChildLocator>();

                horn1b.transform.SetParent(childLocator2.FindChild("Head"));
                horn1b.transform.localPosition = new Vector3(-2.5f, 1, -0.5f);
                horn1b.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn1b.transform.localScale    = new Vector3(100, 100, 100);

                horn2b.transform.SetParent(childLocator2.FindChild("Head"));
                horn2b.transform.localPosition = new Vector3(2.5f, 1, -0.5f);
                horn2b.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn2b.transform.localScale    = new Vector3(100, -100, 100);

                /*rageFlame.transform.SetParent(childLocator.FindChild("Head"));
                 * rageFlame.transform.localPosition = new Vector3(0, 1, 0);
                 * rageFlame.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                 * rageFlame.transform.localScale = new Vector3(5, 5, 5);*/

                burstFlame2.transform.SetParent(childLocator2.FindChild("Head"));
                burstFlame2.transform.localPosition = new Vector3(0, 1, 0);
                burstFlame2.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                burstFlame2.transform.localScale    = new Vector3(5, 5, 5);

                survivorPrefab.AddComponent <DireseekerController>().burstFlame = burstFlame2.GetComponent <ParticleSystem>();

                Shader hotpoo = Resources.Load <Shader>("Shaders/Deferred/hgstandard");

                Material hornMat = horn1b.GetComponentInChildren <MeshRenderer>().material;
                hornMat.shader = hotpoo;

                //add horns

                CharacterModel.RendererInfo[] infos2    = model2.baseRendererInfos;
                CharacterModel.RendererInfo[] newInfos2 = new CharacterModel.RendererInfo[]
                {
                    infos2[0],
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn1b.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    },
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn2b.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    }
                };

                model2.baseRendererInfos = newInfos2;

                survivorPrefab.GetComponent <DeathRewards>().logUnlockableDef     = null;
                survivorPrefab.GetComponent <Interactor>().maxInteractionDistance = 5f;

                survivorPrefab.tag = "Player";

                SkinSetup();

                DiggerPlugin.bodyPrefabs.Add(survivorPrefab);

                GameObject displayPrefab = PrefabAPI.InstantiateClone(survivorPrefab.GetComponent <ModelLocator>().modelTransform.gameObject, "DireseekerDisplay", true);
                displayPrefab.AddComponent <NetworkIdentity>();
                displayPrefab.transform.localScale *= 0.5f;

                SurvivorDef survivorDef = new SurvivorDef
                {
                    displayNameToken = "DIRESEEKER_BODY_NAME",
                    descriptionToken = "MINER_DESCRIPTION",
                    primaryColor     = Color.red,
                    bodyPrefab       = survivorPrefab,
                    displayPrefab    = displayPrefab,
                    outroFlavorToken = "DIRESEEKER_BODY_OUTRO_FLAVOR"
                };

                SurvivorAPI.AddSurvivor(survivorDef);
            }
        }
Example #29
0
 private void Language_onCurrentLanguageChanged()
 {
     LanguageAPI.Add("QOL_SHRINE_BOSS_USE_MESSAGE", Language.GetString("SHRINE_BOSS_USE_MESSAGE", Language.currentLanguage.name) + " (x{1})", Language.currentLanguage.name);
     LanguageAPI.Add("QOL_SHRINE_BOSS_USE_MESSAGE_2P", Language.GetString("SHRINE_BOSS_USE_MESSAGE_2P", Language.currentLanguage.name) + " (x{1})", Language.currentLanguage.name);
 }
Example #30
0
 public override void InstallLanguage()
 {
     base.InstallLanguage();
     LanguageAPI.Add(OrangeConsumedDef.nameToken, "Oranges (Consumed)");
     LanguageAPI.Add(OrangeConsumedDef.descriptionToken, "Per stack, grants <style=cIsHealing>+" + Pct(PercentMaxHealthAdd) + " maximum health</style> and <style=cIsUtility>+" + Pct(PercentEquipmentRecharge) + " reduced equipment recharge rate</style>.");
 }