static private void FixFactsWithContextRankConfig() { FastGetter contextRankConfig_Archetype_getter = Helpers.CreateFieldGetter <ContextRankConfig>("Archetype"); List <BlueprintUnitFact> facts = new List <BlueprintUnitFact>(); foreach (string id in config.FactWithContextRankConfig) { facts.Add(library.Get <BlueprintUnitFact>(id)); } facts.AddRange(draconicBreathAbilities); facts.AddRange(elementalRayAbilities); facts.AddRange(elementalBlastAbilities); foreach (BlueprintUnitFact fact in facts) { var comps = fact.GetComponents <ContextRankConfig>(); if (comps == null) { throw new Exception($"In BloodArcanist FixFactsWithContextRankConfig: Fact {fact.name} has null ContextRankConfig arrays."); } //ContextRankConfig has only one archetype slot, and that slot is occupied //by Eldritch Scion already. This is a very troublesome issue. //Curse you three thousands, Owlcat!!! //So here we want to use harmony patches to "Add" Blood Arcanist archetype //to the return value of ContextRankConfig.GetBaseValue(), when we are dealing with //those ContextRankConfigs that have something to do with sorcerer/eldritch scion levels. //The patch is class ContextRankConfig_GetBaseValue_Patch wantToModify_ContextRankConfig.AddRange(comps); } }
static private void FixExistingBlueprintFacts() { FastGetter classes_Getter = Helpers.CreateFieldGetter <ContextRankConfig>("m_Class"); FastSetter classes_Setter = Helpers.CreateFieldSetter <ContextRankConfig>("m_Class"); foreach (string factId in config.FactsWithContextRankConfig) { BlueprintUnitFact fact = library.Get <BlueprintUnitFact>(factId); foreach (ContextRankConfig comp in fact.GetComponents <ContextRankConfig>()) { if (comp.IsBasedOnClassLevel) { BlueprintCharacterClass[] classes = classes_Getter(comp) as BlueprintCharacterClass[]; if (classes == null) { throw new Exception($"Error! get null classes for IsBasedOnClassLevel ContextRankConfig named {fact.name}!"); } List <BlueprintCharacterClass> classesList = classes.ToList <BlueprintCharacterClass>(); if (classesList.Contains(wizard)) { classesList.Add(ArcanistClass.arcanist); } classes_Setter(comp, classesList.ToArray()); } } } }
static private void FixResources() { FastGetter Amount_Getter = Helpers.CreateFieldGetter <BlueprintAbilityResource>("m_MaxAmount"); FastSetter Amount_Setter = Helpers.CreateFieldSetter <BlueprintAbilityResource>("m_MaxAmount"); foreach (string resId in config.ResourcesIds) { var res = library.Get <BlueprintAbilityResource>(resId); var amount = Amount_Getter(res); Helpers.SetField(amount, "Class", new BlueprintCharacterClass[] { wizard, ArcanistClass.arcanist }); Amount_Setter(res, amount); } }
static public void Fix <T> (ref T x) where T : BlueprintScriptableObject { if (x as T) { FastGetter assetIdGetter = Helpers.CreateFieldGetter <T>("m_AssetGuid"); var guid = assetIdGetter(x) as string; if (guid != null) { x = library.Get <T>(guid); } else { throw new Exception("x is not a BlueprintScriptableObject"); } } }
static bool Prepare() { SellDiscountedBuildingGetter = Accessors.CreateGetter <SettlementState, BlueprintSettlementBuilding>("SellDiscountedBuilding"); SellDiscountedBuildingSetter = Accessors.CreateSetter <SettlementState, BlueprintSettlementBuilding>("SellDiscountedBuilding"); return(true); }
static public void LoadOnLibraryLoaded() { if (loaded) { return; } flagIsRisiaSpawned = Helpers.Create <BlueprintUnlockableFlag>(); flagIsRisiaBossSpawned = Helpers.Create <BlueprintUnlockableFlag>(); library.AddAsset(flagIsRisiaSpawned, "942339abe7b76dfb00324d433a0a9342"); library.AddAsset(flagIsRisiaBossSpawned, "942339abe7b76dfb00324d433a0a9343"); flagIsRisiaSpawned.Lock(); flagIsRisiaSpawned.name = "flagIsRisiaSpawned"; flagIsRisiaBossSpawned.Lock(); flagIsRisiaBossSpawned.name = "flagIsRisiaBossSpawned"; FastGetter portrait_Getter = Helpers.CreateFieldGetter <BlueprintUnit>("m_Portrait"); PortraitData risia_portraitData = CreatePortraitData("Risia"); BlueprintUnit risia_companion = library.Get <BlueprintUnit>("c2dc52c5fec84bc2a74e2cb34fdb566b"); BlueprintUnit risia_neutral = library.Get <BlueprintUnit>("d87f8e86724f46e798821d60f9d31eaf"); BlueprintUnit risia_boss = library.Get <BlueprintUnit>("95fb27a5b8ae40099bd727ea93de5b9b"); foreach (var unit in new BlueprintUnit[] { risia_companion, risia_neutral, risia_boss }) { BlueprintPortrait portraitBlue = portrait_Getter(unit) as BlueprintPortrait; portraitBlue.Data = risia_portraitData; } RisiaAddSpecialSpells.LoadSpecialSpells(); RisiaAddLevels.Load(); RisiaAddSpecialSpells.CreateFeats(); RisiaAddBrain.Load(); List <BlueprintFeature> risiaNeutralAddFacts = new List <BlueprintFeature>(); risiaNeutralAddFacts.AddRange(RisiaAddLevels.RisiaAddFacts); risiaNeutralAddFacts.Add(RisiaAddSpecialSpells.addSpecialSpellListFeat); risiaNeutralAddFacts.Add(RisiaAddSpecialSpells.addSpecialSpellFeat); List <BlueprintFeature> risiaBossAddFacts = new List <BlueprintFeature>(); risiaBossAddFacts.AddRange(RisiaAddLevels.RisiaBossAddFacts); risiaBossAddFacts.Add(RisiaAddSpecialSpells.addSpecialSpellListFeat); risiaBossAddFacts.Add(RisiaAddSpecialSpells.addSpecialSpellFeat); var risiaFeatureList = Helpers.CreateFeature("RisiaFeatureList", "", "", OtherUtils.GetMd5("Risia.FeatureList"), IconSet.elvenmagic, FeatureGroup.None, //RisiaAddLevels.compNeutral, Helpers.Create <AddFacts>(a => a.Facts = risiaNeutralAddFacts.ToArray())); var risiaBossFeatureList = Helpers.CreateFeature("RisiaBossFeatureList", "", "", OtherUtils.GetMd5("Risia.Boss.FeatureList"), IconSet.elvenmagic, FeatureGroup.None, //RisiaAddLevels.compBoss, Helpers.Create <AddFacts>(a => a.Facts = risiaBossAddFacts.ToArray())); risia_neutral.AddComponent(RisiaAddLevels.compNeutral); risia_companion.AddComponent(RisiaAddLevels.compNeutral); risia_boss.AddComponent(RisiaAddLevels.compBoss); var tmpList = risia_neutral.AddFacts.ToList(); tmpList.Add(risiaFeatureList); risia_neutral.AddFacts = tmpList.ToArray(); var tmpList2 = risia_companion.AddFacts.ToList(); tmpList2.Add(risiaFeatureList); risia_companion.AddFacts = tmpList2.ToArray(); var tmpList3 = risia_boss.AddFacts.ToList(); tmpList3.Add(risiaBossFeatureList); risia_boss.AddFacts = tmpList3.ToArray(); RisiaAddDispelAura.AddToRisia(ref risia_boss); loaded = true; }
static bool Prepare() { IsHighlightingGet = Accessors.CreateGetter <InteractionHighlightController, bool>("IsHighlighting"); IsHighlightingSet = Accessors.CreateSetter <InteractionHighlightController, bool>("IsHighlighting"); return(true); }
public void should_throw_when_instance_not_proper_type() { var setter = new FastGetter(typeof(Animal), i => ((Animal)i).Name); Assert.Throws <InvalidOperationException>(() => setter.Get("not an animal")); }
public FastProperty(PropertyInfo property) { getter = property.CreateFastGetter <TObject, TValue>(); setter = property.CreateFastSetter <TObject, TValue>(); }
public void should_throw_when_instance_not_proper_type() { var setter = new FastGetter(typeof(Animal), i => ((Animal)i).Name); Assert.Throws<InvalidOperationException>(() => setter.Get("not an animal")); }
private static void GetInfo(Type type, List <StateInfo> states, List <StateTriggerInfo> triggers, List <StateTransitionInfo> transitions) { // Recurse through all parent types as well if (type.BaseType != null) { GetInfo(type.BaseType, states, triggers, transitions); } // Get all public and private methods var members = type.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var member in members) { switch (member.MemberType) { case MemberTypes.Field: case MemberTypes.Property: { foreach (var attr in member.GetCustomAttributes <StateTriggerAttribute>()) { var trigger = new StateTriggerInfo(); trigger.From = GetState(states, attr.From); trigger.To = GetState(states, attr.To); trigger.TargetValue = attr.Value; trigger.Getter = (FastGetter <bool>)FastGetter.Create(member); if (trigger.To == null) { throw new InvalidOperationException("trigger to state must not be null"); } triggers.Add(trigger); } break; } case MemberTypes.Method: { // Get transitions foreach (var attr in member.GetCustomAttributes <StateTransitionAttribute>()) { var trans = new StateTransitionInfo(); trans.From = GetState(states, attr.From); trans.To = GetState(states, attr.To); if (((member as MethodInfo).GetParameters()).Length == 0) { trans.InvokeDelegate = (OpenDelegate)OpenDelegate.Create(member as MethodInfo); } else { throw new InvalidOperationException("state transitions must return void and take no parameter or one parameter as a float"); } if (trans.To == null) { throw new InvalidOperationException("transition to state must not be null"); } transitions.Add(trans); } #if false // Get states foreach (var attr in member.GetCustomAttributes <StateAttribute>()) { var state = GetState(states, attr.Name ?? member.Name); var parameters = (member as MethodInfo).GetParameters(); if (parameters.Length == 0) { state.InvokeDelegate = (OpenDelegate)OpenDelegate.Create(member as MethodInfo); } else if (parameters.Length == 1 && parameters[0].ParameterType == typeof(float)) { state.InvokeWithTimeDelegate = (OpenDelegate <float>)OpenDelegate.Create(member as MethodInfo); } else { throw new InvalidOperationException("states must return void and take no parameter or one parameter as a float"); } } #endif break; } } } }