public static StatusData.EffectData[] GenerateEffectsData(List <Effect> effects, int level = 1) { // Create a list to generate the EffectData[] array into. var list = new List <StatusData.EffectData>(); // Iterate over the effects foreach (var effect in effects) { // Create a blank holder, in the case this effect isn't supported or doesn't serialize anything. var data = new StatusData.EffectData() { Data = new string[] { "" } }; var type = effect.GetType(); if (typeof(PunctualDamage).IsAssignableFrom(type)) { var comp = effect as PunctualDamage; // For PunctualDamage, Data[0] is the entire damage, and Data[1] is the impact. // Each damage goes "Damage : Type", and separated by a ';' char. // So we just iterate over the damage and serialize like that. var dmgString = ""; foreach (var dmg in comp.Damages) { if (dmgString != "") { dmgString += ";"; } dmgString += $"{dmg.Damage * level}:{dmg.Type}"; } // finally, set data data.Data = new string[] { dmgString, comp.Knockback.ToString() }; } else if (typeof(AffectNeed).IsAssignableFrom(type)) { var fi = At.GetFieldInfo(typeof(AffectNeed), "m_affectQuantity"); data.Data = new string[] { ((float)fi.GetValue(effect) * level).ToString() }; } // For most AffectStat components, the only thing that is serialized is the AffectQuantity. else if (At.GetFieldInfo(type, "AffectQuantity") is FieldInfo fi_AffectQuantity) { data.Data = new string[] { ((float)fi_AffectQuantity.GetValue(effect) * level).ToString() }; } // AffectMana uses "Value" instead of AffectQuantity for some reason... else if (At.GetFieldInfo(type, "Value") is FieldInfo fi_Value) { data.Data = new string[] { ((float)fi_Value.GetValue(effect) * level).ToString() }; } else // otherwise maybe I need to add support for this effect... { //SL.Log("[StatusEffect] Unsupported effect: " + type, 1); } list.Add(data); } return(list.ToArray()); }
static private Row GetFormattedItemRow(Effect effect) { switch (effect) { // Vitals case AffectHealth _: return(new Row("CharacterStat_Health".Localized(), FormatEffectValue(effect), Details.Vitals, 21, HEALTH_COLOR)); case AffectStamina _: return(new Row("CharacterStat_Stamina".Localized(), FormatEffectValue(effect), Details.Vitals, 31, STAMINA_COLOR)); case AffectMana _: return(new Row("CharacterStat_Mana".Localized(), FormatEffectValue(effect), Details.Vitals, 41, MANA_COLOR)); // Max vitals case AffectBurntHealth _: return(new Row("General_Max".Localized() + ". " + "CharacterStat_Health".Localized(), FormatEffectValue(effect), Details.MaxVitals, 23, HEALTH_COLOR)); case AffectBurntStamina _: return(new Row("General_Max".Localized() + ". " + "CharacterStat_Stamina".Localized(), FormatEffectValue(effect), Details.MaxVitals, 33, STAMINA_COLOR)); case AffectBurntMana _: return(new Row("General_Max".Localized() + ". " + "CharacterStat_Mana".Localized(), FormatEffectValue(effect), Details.MaxVitals, 43, MANA_COLOR)); // Needs case AffectFood _: return(new Row("CharacterStat_Food".Localized(), FormatEffectValue(effect, 10f, "%"), Details.Needs, 11, NEEDS_COLOR)); case AffectDrink _: return(new Row("CharacterStat_Drink".Localized(), FormatEffectValue(effect, 10f, "%"), Details.Needs, 12, NEEDS_COLOR)); case AffectFatigue _: return(new Row("CharacterStat_Sleep".Localized(), FormatEffectValue(effect, 10f, "%"), Details.Needs, 13, NEEDS_COLOR)); // Corruption case AffectCorruption _: return(new Row("CharacterStat_Corruption".Localized(), FormatEffectValue(effect, 10f, "%"), Details.Corruption, 51, CORRUPTION_COLOR)); // Cure case RemoveStatusEffect removeStatusEffect: string text = ""; switch (removeStatusEffect.CleanseType) { case RemoveStatusEffect.RemoveTypes.StatusSpecific: text = removeStatusEffect.StatusEffect.StatusName; break; case RemoveStatusEffect.RemoveTypes.StatusType: text = removeStatusEffect.StatusType.Tag.TagName; break; case RemoveStatusEffect.RemoveTypes.StatusFamily: text = removeStatusEffect.StatusFamily.Get().Name; break; case RemoveStatusEffect.RemoveTypes.NegativeStatuses: text = "All Negative Status Effects"; break; } return(new Row("", $"- {text}", Details.StatusCures, 71, STATUSCURES_COLOR)); // Status case AddStatusEffect addStatusEffect: StatusEffect statusEffect = addStatusEffect.Status; Row statusName = new Row("", $"+ {statusEffect.StatusName}", Details.StatusEffects, 61, STATUSEFFECT_COLOR); if (addStatusEffect.ChancesToContract < 100) { statusName.Prefix = $"<color=silver>({addStatusEffect.ChancesToContract}%)</color> "; } if (!statusEffect.HasEffectsAndDatas()) { return(statusName); } StatusData.EffectData firstEffectData = statusEffect.GetDatas()[0]; if (firstEffectData.Data.IsEmpty()) { return(statusName); } string firstValue = firstEffectData.Data[0]; switch (statusEffect.GetEffects()[0]) { case AffectHealth _: return(new Row("CharacterStat_Health".Localized() + " Regen", FormatStatusEffectValue(firstValue.ToFloat(), statusEffect.StartLifespan), Details.Vitals | Details.RegenRates, 22, HEALTH_COLOR)); case AffectStamina _: return(new Row("CharacterStat_Stamina".Localized() + " Regen", FormatStatusEffectValue(firstValue.ToFloat(), statusEffect.StartLifespan), Details.Vitals | Details.RegenRates, 32, STAMINA_COLOR)); case AffectMana _: return(new Row("CharacterStat_Mana".Localized() + " Regen", FormatStatusEffectValue(firstValue.ToFloat(), statusEffect.StartLifespan, 1f, "%"), Details.Vitals | Details.RegenRates, 42, MANA_COLOR)); case AffectCorruption _: return(new Row("CharacterStat_Corruption".Localized() + " Regen", FormatStatusEffectValue(firstValue.ToFloat(), statusEffect.StartLifespan, 10f, "%"), Details.Corruption | Details.RegenRates, 52, CORRUPTION_COLOR)); default: return(statusName); } default: return(null); } }