/// <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(), }); }
/// <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); }