Example #1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JArray jarray = JArray.Load(reader);

            if (jarray == null)
            {
                return(null);
            }

            var output = new List <CharacterTalent>(jarray.Count);

            foreach (JToken token in jarray)
            {
                string          data   = token.ToString();
                CharacterTalent value  = (CharacterTalent)JsonConvert.DeserializeObject <CharacterTalent>(data);
                JToken          glyphs = token["glyphs"];
                data = glyphs["minor"].ToString();
                value.MinorGlyphs = (List <TalentGlyph>)JsonConvert.DeserializeObject <List <TalentGlyph> >(data);
                data = glyphs["major"].ToString();
                value.MajorGlyphs = (List <TalentGlyph>)JsonConvert.DeserializeObject <List <TalentGlyph> >(data);
                output.Add(value);
            }

            return(output.Count > 0
                ? output
                : null);
        }
        public static List <Affliction> ParseAfflictions(CharacterTalent characterTalent, XElement afflictionElements)
        {
            if (afflictionElements == null)
            {
                DebugConsole.ThrowError("Affliction list was not found in talent " + characterTalent.DebugIdentifier);
                return(null);
            }

            List <Affliction> afflictions = new List <Affliction>();

            // similar logic to affliction creation in statuseffects
            // might be worth unifying

            foreach (XElement afflictionElement in afflictionElements.Elements())
            {
                string           afflictionIdentifier = afflictionElement.GetAttributeString("identifier", "").ToLowerInvariant();
                AfflictionPrefab afflictionPrefab     = AfflictionPrefab.List.FirstOrDefault(ap => ap.Identifier.ToLowerInvariant() == afflictionIdentifier);
                if (afflictionPrefab == null)
                {
                    DebugConsole.ThrowError("Error in CharacterTalent (" + characterTalent.DebugIdentifier + ") - Affliction prefab with the identifier \"" + afflictionIdentifier + "\" not found.");
                    continue;
                }

                Affliction afflictionInstance = afflictionPrefab.Instantiate(afflictionElement.GetAttributeFloat(1.0f, "amount", "strength"));
                afflictionInstance.Probability = afflictionElement.GetAttributeFloat(1.0f, "probability");
                afflictions.Add(afflictionInstance);
            }

            return(afflictions);
        }
Example #3
0
 public CharacterAbilityGroupInterval(AbilityEffectType abilityEffectType, CharacterTalent characterTalent, XElement abilityElementGroup) :
     base(abilityEffectType, characterTalent, abilityElementGroup)
 {
     // too many overlapping intervals could cause hitching? maybe randomize a little
     interval    = abilityElementGroup.GetAttributeFloat("interval", 0f);
     effectDelay = abilityElementGroup.GetAttributeFloat("effectdelay", 0f);
 }
 public AbilityConditionHasStatusTag(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     tag = conditionElement.GetAttributeString("tag", "");
     if (string.IsNullOrEmpty(tag))
     {
         DebugConsole.AddWarning($"Error in talent \"{characterTalent.Prefab.OriginalName}\" - tag not defined in AbilityConditionHasStatusTag.");
     }
 }
 public AbilityConditionLocation(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     if (conditionElement.Attribute("hasoutpost") != null)
     {
         hasOutpost = conditionElement.GetAttributeBool("hasoutpost", false);
     }
     locationIdentifiers = conditionElement.GetAttributeStringArray("locationtype", new string[0]);
 }
Example #6
0
        public AbilityConditionHasPermanentStat(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
        {
            statIdentifier = conditionElement.GetAttributeString("statidentifier", string.Empty);
            if (string.IsNullOrEmpty(statIdentifier))
            {
                DebugConsole.ThrowError($"No stat identifier defined for {this} in talent {characterTalent.DebugIdentifier}!");
            }
            string statTypeName = conditionElement.GetAttributeString("stattype", string.Empty);

            statType = string.IsNullOrEmpty(statTypeName) ? StatTypes.None : CharacterAbilityGroup.ParseStatType(statTypeName, characterTalent.DebugIdentifier);
            min      = conditionElement.GetAttributeFloat("min", 0f);
        }
        private CharacterAbility ConstructAbility(XElement abilityElement, CharacterTalent characterTalent)
        {
            CharacterAbility newAbility = CharacterAbility.Load(abilityElement, this);

            if (newAbility == null)
            {
                DebugConsole.ThrowError($"Unable to create an ability for {characterTalent.DebugIdentifier}!");
                return(null);
            }

            return(newAbility);
        }
        public AbilityConditionIsAiming(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
        {
            hittingCountsAsAiming = conditionElement.GetAttributeBool("hittingcountsasaiming", false);
            switch (conditionElement.GetAttributeString("weapontype", ""))
            {
            case "melee":
                weapontype = WeaponType.Melee;
                break;

            case "ranged":
                weapontype = WeaponType.Ranged;
                break;
            }
        }
Example #9
0
        public AbilityConditionMission(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
        {
            string missionTypeString = conditionElement.GetAttributeString("missiontype", "None");

            if (!Enum.TryParse(missionTypeString, out missionType))
            {
                DebugConsole.ThrowError("Error in AbilityConditionMission \"" + characterTalent.DebugIdentifier + "\" - \"" + missionTypeString + "\" is not a valid mission type.");
                return;
            }
            if (missionType == MissionType.None)
            {
                DebugConsole.ThrowError("Error in AbilityConditionMission \"" + characterTalent.DebugIdentifier + "\" - mission type cannot be none.");
                return;
            }
        }
        public AbilityConditionAttackData(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
        {
            itemIdentifier = conditionElement.GetAttributeString("itemidentifier", "");
            tags           = conditionElement.GetAttributeStringArray("tags", new string[0], convertToLowerInvariant: true);
            switch (conditionElement.GetAttributeString("weapontype", ""))
            {
            case "melee":
                weapontype = WeaponType.Melee;
                break;

            case "ranged":
                weapontype = WeaponType.Ranged;
                break;
            }
        }
        // XML
        private AbilityCondition ConstructCondition(CharacterTalent characterTalent, XElement conditionElement, bool errorMessages = true)
        {
            AbilityCondition newCondition = null;

            Type   conditionType;
            string type = conditionElement.Name.ToString().ToLowerInvariant();

            try
            {
                conditionType = Type.GetType("Barotrauma.Abilities." + type + "", false, true);
                if (conditionType == null)
                {
                    if (errorMessages)
                    {
                        DebugConsole.ThrowError("Could not find the component \"" + type + "\" (" + characterTalent.DebugIdentifier + ")");
                    }
                    return(null);
                }
            }
            catch (Exception e)
            {
                if (errorMessages)
                {
                    DebugConsole.ThrowError("Could not find the component \"" + type + "\" (" + characterTalent.DebugIdentifier + ")", e);
                }
                return(null);
            }

            object[] args = { characterTalent, conditionElement };

            try
            {
                newCondition = (AbilityCondition)Activator.CreateInstance(conditionType, args);
            }
            catch (TargetInvocationException e)
            {
                DebugConsole.ThrowError("Error while creating an instance of an ability condition of the type " + conditionType + ".", e.InnerException);
                return(null);
            }

            if (newCondition == null)
            {
                DebugConsole.ThrowError("Error while creating an instance of an ability condition of the type " + conditionType + ", instance was null");
                return(null);
            }

            return(newCondition);
        }
        public static List <StatusEffect> ParseStatusEffects(CharacterTalent characterTalent, XElement statusEffectElements)
        {
            if (statusEffectElements == null)
            {
                DebugConsole.ThrowError("StatusEffect list was not found in talent " + characterTalent.DebugIdentifier);
                return(null);
            }

            List <StatusEffect> statusEffects = new List <StatusEffect>();

            foreach (XElement statusEffectElement in statusEffectElements.Elements())
            {
                var statusEffect = StatusEffect.Load(statusEffectElement, characterTalent.DebugIdentifier);
                statusEffects.Add(statusEffect);
            }

            return(statusEffects);
        }
        public CharacterAbilityGroup(AbilityEffectType abilityEffectType, CharacterTalent characterTalent, XElement abilityElementGroup)
        {
            AbilityEffectType = abilityEffectType;
            CharacterTalent   = characterTalent;
            Character         = CharacterTalent.Character;
            maxTriggerCount   = abilityElementGroup.GetAttributeInt("maxtriggercount", int.MaxValue);
            foreach (XElement subElement in abilityElementGroup.Elements())
            {
                switch (subElement.Name.ToString().ToLowerInvariant())
                {
                case "abilities":
                    LoadAbilities(subElement);
                    break;

                case "conditions":
                    LoadConditions(subElement);
                    break;
                }
            }
        }
 public AbilityConditionAttackResult(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     targetTypes = ParseTargetTypes(conditionElement.GetAttributeStringArray("targettypes", new string[0], convertToLowerInvariant: true));
     afflictions = conditionElement.GetAttributeStringArray("afflictions", new string[0], convertToLowerInvariant: true);
 }
 public AbilityConditionNoCrewDied(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
Example #16
0
 public AbilityConditionCrouched(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
 public AbilityConditionHasItem(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     tags       = conditionElement.GetAttributeStringArray("tags", new string[0], convertToLowerInvariant: true);
     requireAll = conditionElement.GetAttributeBool("requireall", false);
     //this.invSlotType = invSlotType;
 }
Example #18
0
 public AbilityConditionOnMission(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
Example #19
0
 public AbilityConditionAffliction(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     afflictions = conditionElement.GetAttributeStringArray("afflictions", new string[0], convertToLowerInvariant: true);
 }
Example #20
0
 public AbilityConditionInHull(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
Example #21
0
 public AbilityConditionAlliesAboveVitality(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     vitalityPercentage = conditionElement.GetAttributeFloat("vitalitypercentage", 0f);
 }
 public AbilityConditionDataless(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
 public AbilityConditionRagdolled(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
 public AbilityConditionHasAffliction(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     afflictionIdentifier = conditionElement.GetAttributeString("afflictionidentifier", "");
     minimumPercentage    = conditionElement.GetAttributeFloat("minimumpercentage", 0f);
 }
 public AbilityConditionReduceAffliction(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     allowedTypes = conditionElement.GetAttributeStringArray("allowedtypes", new string[0], convertToLowerInvariant: true);
     identifier   = conditionElement.GetAttributeString("identifier", "");
 }
Example #26
0
 public AbilityConditionItemOutsideSubmarine(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
Example #27
0
 public AbilityCondition(CharacterTalent characterTalent, XElement conditionElement)
 {
     this.characterTalent = characterTalent;
     character            = characterTalent.Character;
     invert = conditionElement.GetAttributeBool("invert", false);
 }
 public AbilityConditionLevelsBehindHighest(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     levelsBehind = conditionElement.GetAttributeInt("levelsbehind", 0);
 }
Example #29
0
 public AbilityConditionGeneHarvester(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
 }
Example #30
0
 public AbilityConditionHasSkill(CharacterTalent characterTalent, XElement conditionElement) : base(characterTalent, conditionElement)
 {
     skillIdentifier = conditionElement.GetAttributeString("skillidentifier", string.Empty);
     minValue        = conditionElement.GetAttributeFloat("minvalue", 0f);
 }