Beispiel #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Monster"/> class.
        /// </summary>
        /// <param name="monsterType">The type of this monster.</param>
        public Monster(MonsterTypeEntity monsterType)
            : base(monsterType)
        {
            this.Type   = monsterType;
            this.Outfit = monsterType.OriginalOutfit;

            this.Stats[CreatureStat.BaseSpeed].Set(monsterType.BaseSpeed == 0 ? 0 : (uint)(2 * monsterType.BaseSpeed) + 80);

            this.BloodType = monsterType.BloodType;
            this.ChaseMode = this.AutoAttackRange > 1 ? ChaseMode.KeepDistance : ChaseMode.Chase;
            this.FightMode = FightMode.FullAttack;

            this.hostileCombatants     = new HashSet <ICombatant>();
            this.hostileCombatantsLock = new object();

            this.InitializeSkills();
        }
Beispiel #2
0
        /// <summary>
        /// Reads a <see cref="IMonsterTypeEntity"/> out of a monster file.
        /// </summary>
        /// <param name="monsterFileInfo">The information about the monster file.</param>
        /// <returns>The <see cref="IMonsterTypeEntity"/> instance.</returns>
        private IMonsterTypeEntity ReadMonsterFile(FileInfo monsterFileInfo)
        {
            monsterFileInfo.ThrowIfNull(nameof(monsterFileInfo));

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

            var monsterType = new MonsterTypeEntity();

            foreach ((string name, string value) in this.ReadInDataTuples(File.ReadLines(monsterFileInfo.FullName), monsterFileInfo.FullName))
            {
                switch (name)
                {
                case "racenumber":
                    monsterType.RaceId = Convert.ToUInt16(value);
                    break;

                case "name":
                    monsterType.Name = value;
                    break;

                case "article":
                    monsterType.Article = value;
                    break;

                case "outfit":
                    var(lookTypeId, headColor, bodyColor, legsColor, feetColor) = CipFileParser.ParseMonsterOutfit(value);

                    monsterType.Outfit = new Outfit()
                    {
                        Id   = lookTypeId,
                        Head = headColor,
                        Body = bodyColor,
                        Legs = legsColor,
                        Feet = feetColor,
                    };
                    break;

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

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

                    break;

                case "experience":
                    monsterType.BaseExperienceYield = Convert.ToUInt32(value);
                    break;

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

                case "fleethreshold":
                    monsterType.HitpointFleeThreshold = Convert.ToUInt16(value);
                    break;

                case "attack":
                    monsterType.BaseAttack = Convert.ToUInt16(value);
                    break;

                case "defend":
                    monsterType.BaseDefense = Convert.ToUInt16(value);
                    break;

                case "armor":
                    monsterType.BaseArmorRating = Convert.ToUInt16(value);
                    break;

                case "poison":
                    monsterType.SetConditionInfect(ConditionFlag.Posion, Convert.ToUInt16(value));
                    break;

                case "losetarget":
                    monsterType.LoseTargetDistance = Convert.ToByte(value);
                    break;

                case "strategy":
                    monsterType.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))
                        {
                            if (flagMatch.ToCreatureFlag() is CreatureFlag creatureFlag)
                            {
                                monsterType.SetCreatureFlag(creatureFlag);
                            }
                        }
                    }

                    break;

                case "skills":
                    var skillParsed = CipFileParser.ParseMonsterSkills(value);

                    foreach (var skill in skillParsed)
                    {
                        if (!Enum.TryParse(skill.Name, ignoreCase: true, out CipMonsterSkillType mSkill))
                        {
                            continue;
                        }

                        switch (mSkill)
                        {
                        case CipMonsterSkillType.Hitpoints:
                            monsterType.MaxHitpoints = skill.CurrentLevel < 0 ? ushort.MaxValue : (ushort)skill.DefaultLevel;
                            break;

                        case CipMonsterSkillType.GoStrength:
                            monsterType.BaseSpeed = skill.CurrentLevel < 0 ? ushort.MinValue : (ushort)skill.DefaultLevel;
                            break;

                        case CipMonsterSkillType.CarryStrength:
                            monsterType.Capacity = skill.CurrentLevel < 0 ? ushort.MinValue : (ushort)skill.DefaultLevel;
                            break;

                        case CipMonsterSkillType.FistFighting:
                            if (skill.CurrentLevel > 0)
                            {
                                monsterType.SetSkill(SkillType.NoWeapon, skill.CurrentLevel, skill.DefaultLevel, skill.MaximumLevel, skill.TargetCount, skill.CountIncreaseFactor, skill.IncreaserPerLevel);
                            }

                            break;
                        }
                    }

                    break;

                case "spells":
                    monsterType.SetSpells(CipFileParser.ParseMonsterSpells(value));
                    break;

                case "inventory":
                    monsterType.SetInventory(CipFileParser.ParseMonsterInventory(value));
                    break;

                case "talk":
                    monsterType.SetPhrases(CipFileParser.ParsePhrases(value));
                    break;
                }
            }

            monsterType.Lock();

            return(monsterType);
        }
Beispiel #3
0
        /// <summary>
        /// Reads a <see cref="MonsterTypeEntity"/> out of a monster file.
        /// </summary>
        /// <param name="monsterFileInfo">The information about the monster file.</param>
        /// <returns>The <see cref="MonsterTypeEntity"/> instance.</returns>
        private static MonsterTypeEntity ReadMonsterFile(FileInfo monsterFileInfo)
        {
            monsterFileInfo.ThrowIfNull(nameof(monsterFileInfo));

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

            var parsedMonster = CipFileParser.ParseMonsterFile(monsterFileInfo);

            var monsterType = new MonsterTypeEntity()
            {
                RaceId         = parsedMonster.RaceId.ToString(),
                Name           = parsedMonster.Name,
                Article        = parsedMonster.Article,
                OriginalOutfit = new Outfit()
                {
                    Id   = parsedMonster.Outfit.Id,
                    Head = parsedMonster.Outfit.Head,
                    Body = parsedMonster.Outfit.Body,
                    Legs = parsedMonster.Outfit.Legs,
                    Feet = parsedMonster.Outfit.Feet,
                },
                Corpse                = (ushort)parsedMonster.Corpse,
                BloodType             = parsedMonster.BloodType,
                BaseExperienceYield   = parsedMonster.Experience,
                SummonCost            = parsedMonster.SummonCost,
                HitpointFleeThreshold = parsedMonster.FleeThreshold,
                BaseAttack            = parsedMonster.Attack,
                BaseDefense           = parsedMonster.Defense,
                BaseArmorRating       = parsedMonster.Armor,
                LoseTargetDistance    = parsedMonster.LoseTarget,
                Strategy              = parsedMonster.Strategy,
            };

            foreach (var flag in parsedMonster.Flags)
            {
                if (flag.ToCreatureFlag() is CreatureFlag creatureFlag)
                {
                    monsterType.SetCreatureFlag(creatureFlag);
                }
            }

            foreach (var(skillType, defaultLevel, currentLevel, maximumLevel, targetCount, countIncreaseFactor, increaserPerLevel) in parsedMonster.Skills)
            {
                if (!Enum.TryParse(skillType, ignoreCase: true, out CipMonsterSkillType mSkill))
                {
                    continue;
                }

                switch (mSkill)
                {
                case CipMonsterSkillType.Hitpoints:
                    monsterType.MaxHitpoints = currentLevel < 0 ? ushort.MaxValue : (ushort)defaultLevel;
                    break;

                case CipMonsterSkillType.GoStrength:
                    monsterType.BaseSpeed = currentLevel < 0 ? ushort.MinValue : (ushort)defaultLevel;
                    break;

                case CipMonsterSkillType.CarryStrength:
                    monsterType.Capacity = currentLevel < 0 ? ushort.MinValue : (ushort)defaultLevel;
                    break;

                case CipMonsterSkillType.FistFighting:
                    if (currentLevel > 0)
                    {
                        monsterType.SetSkill(SkillType.NoWeapon, Convert.ToInt32(currentLevel), Convert.ToInt32(defaultLevel), Convert.ToInt32(maximumLevel), targetCount, countIncreaseFactor, increaserPerLevel);
                    }

                    break;
                }
            }

            foreach (var spellRule in parsedMonster.Spells)
            {
                // Not implemented yet.
            }

            monsterType.SetInventory(parsedMonster.Inventory);
            monsterType.SetPhrases(parsedMonster.Phrases);

            return(monsterType);
        }