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());
        }
Exemplo n.º 2
0
        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);
            }
        }