예제 #1
0
 /// <summary>
 /// Converts Cip's model for a monster into the serializable model that can print to the json file.
 /// </summary>
 /// <param name="cipModel">The Cip monster model.</param>
 /// <returns>The serializable model.</returns>
 internal static MonsterModel ToSerializableModel(this CipMonster cipModel)
 {
     return(new MonsterModel()
     {
         Article = cipModel.Article,
         Name = cipModel.Name,
         Blood = cipModel.BloodType.ToString().ToLower(),
         ExperienceYield = cipModel.Experience,
         Look = cipModel.Outfit.ToMonsterLookModel(),
         Corpse = cipModel.Corpse.ToString(),
         Stats = cipModel.Skills.ToMonsterStatsModel(),
         Flags = cipModel.Flags.AsCreatureFlagStrings(),
         Combat = cipModel.ToMonsterCombatModel(cipModel.Flags),
         Inventory = cipModel.Inventory.AsMonsterInventoryModelArray(),
         Phrases = cipModel.Phrases.ToArray(),
     });
 }
예제 #2
0
        /// <summary>
        /// Reads a <see cref="CipMonster"/> model out of a monster file.
        /// </summary>
        /// <param name="monsterFileInfo">The information about the monster file.</param>
        /// <returns>The <see cref="CipMonster"/> model loaded.</returns>
        public static CipMonster ParseMonsterFile(FileInfo monsterFileInfo)
        {
            monsterFileInfo.ThrowIfNull(nameof(monsterFileInfo));

            if (!monsterFileInfo.Exists)
            {
                return(null);
            }

            var monsterModel = new CipMonster();

            foreach ((string name, string value) in BreakMonsterFileInDataTuples(File.ReadLines(monsterFileInfo.FullName)))
            {
                switch (name)
                {
                case "racenumber":
                    monsterModel.RaceId = Convert.ToUInt32(value);
                    break;

                case "name":
                    monsterModel.Name = value.Trim('"');
                    break;

                case "article":
                    monsterModel.Article = value.Trim('"');
                    break;

                case "outfit":
                    monsterModel.Outfit = CipFileParser.ParseMonsterOutfit(value);
                    break;

                case "corpse":
                    monsterModel.Corpse = Convert.ToUInt16(value);
                    break;

                case "blood":
                    if (Enum.TryParse(value, out BloodType bloodType))
                    {
                        monsterModel.BloodType = bloodType;
                    }

                    break;

                case "experience":
                    monsterModel.Experience = Convert.ToUInt32(value);
                    break;

                case "summoncost":
                    monsterModel.SummonCost = Convert.ToUInt16(value);
                    break;

                case "fleethreshold":
                    monsterModel.FleeThreshold = Convert.ToUInt16(value);
                    break;

                case "attack":
                    monsterModel.Attack = Convert.ToUInt16(value);
                    break;

                case "defend":
                    monsterModel.Defense = Convert.ToUInt16(value);
                    break;

                case "armor":
                    monsterModel.Armor = Convert.ToUInt16(value);
                    break;

                case "poison":
                    // monsterType.SetConditionInfect(ConditionType.Posioned, Convert.ToUInt16(value));
                    break;

                case "losetarget":
                    monsterModel.LoseTarget = Convert.ToByte(value);
                    break;

                case "strategy":
                    monsterModel.Strategy = CipFileParser.ParseMonsterStrategy(value);
                    break;

                case "flags":
                    var parsedElements = CipFileParser.Parse(value);

                    foreach (var element in parsedElements)
                    {
                        if (!element.IsFlag || element.Attributes == null || !element.Attributes.Any())
                        {
                            continue;
                        }

                        if (Enum.TryParse(element.Attributes.First().Name, out CipCreatureFlag flagMatch))
                        {
                            monsterModel.Flags.Add(flagMatch);
                        }
                    }

                    break;

                case "skills":
                    monsterModel.Skills = CipFileParser.ParseMonsterSkills(value).ToList();

                    break;

                case "spells":
                    monsterModel.Spells = CipFileParser.ParseMonsterSpells(value).ToList();

                    break;

                case "inventory":
                    monsterModel.Inventory = CipFileParser.ParseMonsterInventory(value).ToList();

                    break;

                case "talk":
                    monsterModel.Phrases = CipFileParser.ParsePhrases(value).ToList();

                    break;
                }
            }

            return(monsterModel);
        }