Esempio n. 1
0
        //this function will only create ability without storing it
        //user will need to put it inside wrapper and then call storeChannel
        public static BlueprintAbility createChannelEnergy(ChannelType channel_type, string name, string dispaly_name, string description, string guid,
                                                           ContextRankConfig rank_config, NewMechanics.ContextCalculateAbilityParamsBasedOnClasses dc_scaling,
                                                           AbilityResourceLogic resource_logic)
        {
            string original_guid = "";

            switch (channel_type)
            {
            case ChannelType.PositiveHeal:
                original_guid = "f5fc9a1a2a3c1a946a31b320d1dd31b2";
                break;

            case ChannelType.PositiveHarm:
                original_guid = "279447a6bf2d3544d93a0a39c3b8e91d";
                break;

            case ChannelType.NegativeHarm:
                original_guid = "89df18039ef22174b81052e2e419c728";
                break;

            case ChannelType.NegativeHeal:
                original_guid = "9be3aa47a13d5654cbcb8dbd40c325f2";
                break;

            default:
                throw Main.Error("Only base channel abilities can be created");
            }

            var ability = library.CopyAndAdd <BlueprintAbility>(original_guid, name, guid);

            if (dispaly_name != "")
            {
                ability.SetName(dispaly_name);
            }

            if (description != "")
            {
                ability.SetDescription(description);
            }

            ability.ReplaceComponent <ContextRankConfig>(rank_config);
            ability.ReplaceComponent <NewMechanics.ContextCalculateAbilityParamsBasedOnClasses>(dc_scaling);

            if (resource_logic != null)
            {
                ability.ReplaceComponent <AbilityResourceLogic>(resource_logic);
            }
            else
            {
                ability.RemoveComponents <AbilityResourceLogic>();
            }


            updateItemsForChannelDerivative(library.Get <BlueprintAbility>(original_guid), ability);

            return(ability);
        }
 static void Postfix(AbilityData __instance, ref int __result)
 {
     if (__result == -1 && __instance.ConvertedFrom != null)
     {
         if (__instance.Blueprint != null)
         {
             AbilityResourceLogic     abilityResourceLogic     = __instance.Blueprint.GetComponents <AbilityResourceLogic>().FirstOrDefault <AbilityResourceLogic>();
             BlueprintAbilityResource blueprintAbilityResource = (abilityResourceLogic != null && abilityResourceLogic.IsSpendResource) ? abilityResourceLogic.RequiredResource : null;
             if (blueprintAbilityResource != null)
             {
                 __result = __instance.Fact.Owner.Resources.GetResourceAmount(blueprintAbilityResource) / abilityResourceLogic.CalculateCost(__instance);
             }
         }
     }
 }
Esempio n. 3
0
        static public BlueprintFeature Create()
        {
            if (ArcaneReservoir.resource == null)
            {
                UnityModManagerNet.UnityModManager.Logger.Log("[Arcanist ConsumeSpell]Arcane Reservoir Pool must be created before ConsumeSpells::Create()");
                return(null);
            }
            if (library.BlueprintsByAssetId.ContainsKey("6e48c034817eabd99df991e0435025ed"))
            {
                return(library.Get <BlueprintFeature>("6e48c034817eabd99df991e0435025ed"));
            }
            consume_resource = Helpers.CreateAbilityResource("ArcanistClassConsumeSpellAblResource", "", "",
                                                             "56e3d1e34251f5c628ae08e78dbf0360",//MD5-32[ArcanistClass.ConsumeSpell.AblResource]
                                                             IconSet.vanish_icon);
            consume_resource.SetIncreasedByStat(3, StatType.Charisma);

            var variants = new List <BlueprintAbility>();

            for (int i = 1; i <= 9; i++)
            {
                int least_arcanist_level = (i == 1) ? 1 : 2 * i;
                AbilityRequirementClassSpellLevel comp_pre = Helpers.Create <AbilityRequirementClassSpellLevel>();
                comp_pre.characterClass     = arcanist;
                comp_pre.RequiredSpellLevel = i;

                AbilityResourceLogic comp_res = Helpers.Create <AbilityResourceLogic>();
                comp_res.Amount           = 1;
                comp_res.IsSpendResource  = true;
                comp_res.RequiredResource = consume_resource;
                comp_res.CostIsCustom     = false;

                AbilityEffectRunAction         comp_act = Helpers.Create <AbilityEffectRunAction>();
                ConsumeSpellForReservoirAction act      = Helpers.Create <ConsumeSpellForReservoirAction>();
                act.resource           = ArcaneReservoir.resource;
                act.spellLevel         = i;
                act.blueprintSpellbook = arcanist.Spellbook;
                comp_act.Actions       = new ActionList {
                    Actions = new GameAction[] { act }
                };

                BlueprintAbility abl_i = Helpers.CreateAbility($"ArcanistClassConsumeSpellLevel{i}Abl", "", "",
                                                               OtherUtils.GetMd5($"ArcanistClassConsumeSpellLevel{i}Abl"), IconSet.magus_spellrecall, AbilityType.Supernatural,
                                                               UnitCommand.CommandType.Move, AbilityRange.Personal,
                                                               "", "", comp_pre, comp_res, comp_act);
                abl_i.SetName(Helpers.CreateString($"ArcanistClass.ConsumeSpell.Level{i}.Abl.Name"));
                abl_i.SetDescription(Helpers.CreateString($"ArcanistClass.ConsumeSpell.Level{i}.Abl.Desc"));
                abl_i.LocalizedDuration    = Helpers.CreateString("ArcaneTide.Instant");
                abl_i.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave");
                variants.Add(abl_i);
                ablList.Add(abl_i);
            }

            AbilityResourceLogic comp_res0 = Helpers.Create <AbilityResourceLogic>();

            comp_res0.Amount           = 1;
            comp_res0.IsSpendResource  = true;
            comp_res0.RequiredResource = consume_resource;
            comp_res0.CostIsCustom     = false;

            abl = Helpers.CreateAbility("ArcanistClassConsumeSpellAbl", "", "",
                                        "33bec6603df0f7cfe904525e9a44432e",//MD5-32[ArcanistClass.ConsumeSpells.Abl]
                                        IconSet.magus_spellrecall,
                                        AbilityType.Supernatural,
                                        UnitCommand.CommandType.Move,
                                        AbilityRange.Personal,
                                        "",
                                        "",
                                        comp_res0);
            abl.SetName(Helpers.CreateString("ArcanistClass.ConsumeSpells.Abl.Name"));
            abl.SetDescription(Helpers.CreateString("ArcanistClass.ConsumeSpells.Abl.Desc"));
            abl.LocalizedDuration    = Helpers.CreateString("ArcaneTide.Instant");
            abl.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave");
            abl.AddComponent(abl.CreateAbilityVariants(variants.ToArray <BlueprintAbility>()));
            ablList.Add(abl);
            feat = Helpers.CreateFeature("ArcanistClassConsumeSpellsFeat", "", "",
                                         "6e48c034817eabd99df991e0435025ed",//MD5-32[ArcanistClass.ConsumeSpells.Feat]
                                         IconSet.magus_spellrecall,
                                         FeatureGroup.None,
                                         Helpers.Create <AddAbilityResources>(a => a.Resource = consume_resource),
                                         Helpers.Create <AddFacts>(a => a.Facts = new BlueprintUnitFact[] { abl }));
            feat.SetName(Helpers.CreateString("ArcanistClass.ConsumeSpells.Name"));
            feat.SetDescription(Helpers.CreateString("ArcanistClass.ConsumeSpells.Desc"));
            return(feat);
        }
Esempio n. 4
0
        public static BlueprintAbility createChannelEnergy(ChannelType channel_type, string name, string guid, BlueprintFeature parent_feature,
                                                           ContextRankConfig rank_config = null, AbilityResourceLogic resource_logic = null, bool update_items = false)
        {
            string           original_guid = "";
            BlueprintAbility prototype     = null;

            switch (channel_type)
            {
            case ChannelType.PositiveHeal:
                original_guid = "f5fc9a1a2a3c1a946a31b320d1dd31b2";
                prototype     = positive_heal[0].ability;
                break;

            case ChannelType.PositiveHarm:
                original_guid = "279447a6bf2d3544d93a0a39c3b8e91d";
                prototype     = positive_harm[0].ability;
                break;

            case ChannelType.NegativeHarm:
                original_guid = "89df18039ef22174b81052e2e419c728";
                prototype     = negative_harm[0].ability;
                break;

            case ChannelType.NegativeHeal:
                original_guid = "9be3aa47a13d5654cbcb8dbd40c325f2";
                prototype     = negative_heal[0].ability;
                break;
            }

            var ability = library.CopyAndAdd <BlueprintAbility>(original_guid, name, guid);

            if (rank_config != null)
            {
                ability.ReplaceComponent <ContextRankConfig>(rank_config);
            }

            if (resource_logic != null)
            {
                ability.ReplaceComponent <AbilityResourceLogic>(resource_logic);
            }

            if (update_items)
            {
                updateItemsForQuick(ability, prototype);
            }


            storeChannel(ability, parent_feature, channel_type);
            addToQuickChannel(ability, parent_feature, channel_type);
            addToSelectiveChannel(parent_feature);

            return(ability);
        }