コード例 #1
0
        public void BuildSkillString(string skill, string focus, string expected)
        {
            var skillString = SkillConstants.Build(skill, focus);

            Assert.That(skillString, Is.Not.Null);
            Assert.That(skillString, Is.EqualTo(expected));
        }
コード例 #2
0
        public void SelectSkillBonuses(string skillName1, string skillFocus1, string condition1, int bonus1, string skillName2, string skillFocus2, string condition2, int bonus2)
        {
            SetUpSkillBonus(skillName1, skillFocus1, condition1, bonus1);
            SetUpSkillBonus(skillName2, skillFocus2, condition2, bonus2);

            var bonusSelections = skillSelector.SelectBonusesFor("creature");

            Assert.That(bonusSelections.Count, Is.EqualTo(2));

            var selection = bonusSelections.First();

            Assert.That(selection.Bonus, Is.EqualTo(bonus1));
            Assert.That(selection.Condition, Is.EqualTo(condition1));

            var expected = SkillConstants.Build(skillName1, skillFocus1);

            Assert.That(selection.Target, Is.EqualTo(expected));

            selection = bonusSelections.Last();
            Assert.That(selection.Bonus, Is.EqualTo(bonus2));
            Assert.That(selection.Condition, Is.EqualTo(condition2));

            expected = SkillConstants.Build(skillName2, skillFocus2);
            Assert.That(selection.Target, Is.EqualTo(expected));
        }
コード例 #3
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var templateID = packet.Decode <int>();
            var template   = user.Service.TemplateManager.Get <SkillTemplate>(templateID);
            var skillLevel = user.Character.GetSkillLevel(templateID);

            if (template == null)
            {
                return;
            }
            if (skillLevel <= 0)
            {
                return;
            }
            if (!SkillConstants.IsKeydownSkill(templateID))
            {
                return;
            }

            using var p = new Packet(SendPacketOperations.UserSkillPrepare);
            p.Encode <int>(user.ID);
            p.Encode <int>(templateID);
            p.Encode <byte>(packet.Decode <byte>());
            p.Encode <short>(packet.Decode <short>());
            p.Encode <byte>(packet.Decode <byte>());

            await user.Field.BroadcastPacket(user, p);
        }
コード例 #4
0
        public void BuildSkillTypeAndAmountData(string skill, string focus)
        {
            var skillString = SkillConstants.Build(skill, focus);

            var typeAndAmount = TypeAndAmountHelper.Build(skillString, "9266");

            Assert.That(typeAndAmount, Is.EqualTo(skillString + "@9266"));
        }
コード例 #5
0
ファイル: FeatFociTests.cs プロジェクト: DnDGen/CreatureGen
        public void FeatFociForSkillsContainsAllFoci(string skill)
        {
            var skillGroups = collectionMapper.Map(TableNameConstants.Collection.SkillGroups);
            var skillFoci   = skillGroups[skill];

            var featFoci = skillFoci.Select(f => SkillConstants.Build(skill, f));

            Assert.That(table[GroupConstants.Skills], Is.SupersetOf(featFoci));
        }
コード例 #6
0
    //スキル入れ替え(移動カスタム)
    public void ChangeSkillCustomMoveConstant(SkillConstants _constants, int _weightFrame, List <FighterSkill.Move> _move, List <FighterSkill.GravityMove> _grav, bool _con)
    {
        FighterSkill s = Instantiate(core.Status.constantsSkills[(int)_constants]);

        s.movements    = _move;
        s.gravityMoves = _grav;
        s.isContinue   = _con;
        core.SetSkill(s, _weightFrame);
    }
コード例 #7
0
        public void ParseSkillTypeAndAmountData(string skill, string focus)
        {
            var skillString = SkillConstants.Build(skill, focus);

            var typeAndAmount = TypeAndAmountHelper.Parse(skillString + "@9266");

            Assert.That(typeAndAmount[0], Is.EqualTo(skillString));
            Assert.That(typeAndAmount[1], Is.EqualTo("9266"));
            Assert.That(typeAndAmount.Length, Is.EqualTo(2));
        }
コード例 #8
0
        private void SetUpSkillBonus(
            string skill,
            string focus     = "",
            string condition = "",
            int bonus        = 1)
        {
            var bonusSelection = new BonusSelection();

            bonusSelection.Bonus     = bonus;
            bonusSelection.Target    = SkillConstants.Build(skill, focus);
            bonusSelection.Condition = condition;

            bonusSelections.Add(bonusSelection);
        }
コード例 #9
0
ファイル: FeatsSelector.cs プロジェクト: DnDGen/CreatureGen
        private RequiredSkillSelection ParseRequiredSkillData(TypeAndAmountSelection selection)
        {
            var splitData     = SkillConstants.Parse(selection.Type);
            var requiredSkill = new RequiredSkillSelection();

            requiredSkill.Skill = splitData[0];
            requiredSkill.Ranks = selection.Amount;

            if (splitData.Length > 1)
            {
                requiredSkill.Focus = splitData[1];
            }

            return(requiredSkill);
        }
コード例 #10
0
        public static void HandleGaugeGain(MapleCharacter chr, int skillId, int gaugeInc)
        {
            LuminousSystem resource = (LuminousSystem)chr.Resource;
            LuminousState  state    = SkillConstants.GetLuminousSkillState(skillId);

            if (state == LuminousState.Light)
            {
                resource.IncreaseLightGauge(gaugeInc, chr);
            }
            else
            {
                resource.IncreaseDarkGauge(gaugeInc, chr);
            }
            chr.Client.SendPacket(resource.Update());
        }
コード例 #11
0
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            Globals.SpriteDrawer = new SpriteBatch(GraphicsDevice);
            Globals.Initialize();
            TextureCacheFactory.Initialize(GraphicsDevice);
            InputService.Initialize();
            SkillConstants.Initialize();
            XmlStorage.Initialize();
            TextureCacheFactory.Get("Entities/Zomb-King.png");
            Level.GameOverFunc = GameOverFunc;
            Globals.Map        = new Map(GraphicsDevice, MapTypes.Dungeon, Globals.ViewportBounds);
            _mainMenu          = new MainMenu(SetupGameFunc);
            _background        = new MainBackground();

            base.Initialize();
        }
コード例 #12
0
        public void SelectSkillBonus(string skillName, string skillFocus, string condition, int bonus)
        {
            SetUpSkillBonus(skillName, skillFocus, condition, bonus);

            var bonusSelections = skillSelector.SelectBonusesFor("creature");

            Assert.That(bonusSelections.Count, Is.EqualTo(1));

            var selection = bonusSelections.Single();

            Assert.That(selection.Bonus, Is.EqualTo(bonus));
            Assert.That(selection.Condition, Is.EqualTo(condition));

            var expected = SkillConstants.Build(skillName, skillFocus);

            Assert.That(selection.Target, Is.EqualTo(expected));
        }
コード例 #13
0
        private string SelectRandomAndIncludeSkills(IEnumerable <string> foci, IEnumerable <Skill> skills)
        {
            var skillFoci           = collectionsSelector.SelectFrom(TableNameConstants.Collection.FeatFoci, GroupConstants.Skills);
            var applicableSkillFoci = skillFoci.Intersect(foci);

            if (applicableSkillFoci.Any())
            {
                var potentialSkillFoci = skills.Select(s => SkillConstants.Build(s.Name, s.Focus));
                foci = applicableSkillFoci.Intersect(potentialSkillFoci);
            }

            if (!foci.Any())
            {
                return(FeatConstants.Foci.NoValidFociAvailable);
            }

            return(collectionsSelector.SelectRandomFrom(foci));
        }
コード例 #14
0
        public void SelectASingleSkillTypeAndAmount(string skill, string focus)
        {
            var skillString = SkillConstants.Build(skill, focus);

            var entries = new[]
            {
                TypeAndAmountHelper.Build(skillString, "9266"),
            };

            mockCollectionSelector.Setup(s => s.SelectFrom("table name", "name")).Returns(entries);

            SetUpRoll("9266", 42);

            var typeAndAmount = selector.SelectOne("table name", "name");

            Assert.That(typeAndAmount.Type, Is.EqualTo(skillString));
            Assert.That(typeAndAmount.Amount, Is.EqualTo(42));
        }
コード例 #15
0
        public bool RequirementMet(IEnumerable <Skill> otherSkills)
        {
            var thisSkill      = SkillConstants.Build(Skill, Focus);
            var requiredSkills = otherSkills.Where(s => s.IsEqualTo(thisSkill));

            if (!requiredSkills.Any())
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(Focus) && !requiredSkills.Any(s => s.Focus == Focus))
            {
                return(false);
            }

            var anyHaveSufficientRanks = requiredSkills.Any(s => s.EffectiveRanks >= Ranks);

            return(anyHaveSufficientRanks);
        }
コード例 #16
0
        public static void EncodeStats(this Character c, IPacket p)
        {
            p.Encode <int>(c.ID);
            p.EncodeFixedString(c.Name, 13);

            p.Encode <byte>(c.Gender);
            p.Encode <byte>(c.Skin);
            p.Encode <int>(c.Face);
            p.Encode <int>(c.Hair);

            c.Pets.ForEach(sn => p.Encode <long>(sn));

            p.Encode <byte>(c.Level);
            p.Encode(c.Job);
            p.Encode <short>(c.STR);
            p.Encode <short>(c.DEX);
            p.Encode <short>(c.INT);
            p.Encode <short>(c.LUK);
            p.Encode <int>(c.HP);
            p.Encode <int>(c.MaxHP);
            p.Encode <int>(c.MP);
            p.Encode <int>(c.MaxMP);

            p.Encode <short>(c.AP);
            if (SkillConstants.IsExtendSPJob(c.Job))
            {
                c.EncodeExtendSP(p);
            }
            else
            {
                p.Encode <short>(c.SP);
            }

            p.Encode <int>(c.EXP);
            p.Encode <short>(c.POP);

            p.Encode <int>(c.TempEXP);
            p.Encode <int>(c.FieldID);
            p.Encode <byte>(c.FieldPortal);
            p.Encode <int>(c.PlayTime);
            p.Encode <short>(c.SubJob);
        }
コード例 #17
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var templateID = packet.Decode <int>();
            var template   = user.Service.TemplateManager.Get <SkillTemplate>(templateID);

            if (template == null)
            {
                return;
            }
            if (SkillConstants.IsKeydownSkill(templateID))
            {
                using var p = new Packet(SendPacketOperations.UserSkillCancel);
                p.Encode <int>(user.ID);
                p.Encode <int>(templateID);

                await user.Field.BroadcastPacket(user, p);
            }
            else
            {
                await user.ModifyTemporaryStats(ts => ts.Reset(templateID));
            }
        }
コード例 #18
0
        public void ApplyEffect(MapleCharacter source, MapleCharacter target)
        {
            int value;

            if (SkillConstants.IsHealSkill(Parent.SkillId) && Info.TryGetValue(CharacterSkillStat.hp, out value))
            {
                int healHp = (int)((value / 100.0) * source.Stats.GetDamage());
                target.AddHP(healHp);
            }

            #region Mist
            if (SkillConstants.IsMistSkill(Parent.SkillId))
            {
                Point       sourcePos   = source.Position;
                BoundingBox boundingBox = CalculateBoundingBox(sourcePos, source.IsFacingLeft);
                source.Map.SpawnMist(Parent.SkillId, Level, source, boundingBox, sourcePos, Info[CharacterSkillStat.time] * 1000, false);
            }
            else if (Parent.SkillId == Priest.MYSTIC_DOOR)
            {
                MapleMap fromMap = source.Map;
                if (fromMap.MysticDoorLimit)
                {
                    return;
                }
                source.CancelDoor(Priest.MYSTIC_DOOR);
                int   partyId         = source.Party?.Id ?? -1;
                Point fromMapPosition = source.Map.GetDropPositionBelow(source.Position, source.Position);
                int   time            = Info[CharacterSkillStat.time] * 1000;

                MapleMap toMap = Program.GetChannelServer(source.Client.Channel).GetMap(source.Map.ReturnMap);
                if (toMap != null)
                {
                    WzMap.Portal toPortal = toMap.TownPortal;
                    if (toPortal != null)
                    {
                        Point      toMapPosition = toMap.GetDropPositionBelow(toPortal.Position, toPortal.Position);
                        MysticDoor sourceDoor    = new MysticDoor(Parent.SkillId, source, fromMapPosition, fromMap, toMap, toPortal, time, true);
                        fromMap.SpawnStaticObject(sourceDoor);
                        source.AddDoor(sourceDoor);
                    }
                }
            }
            #endregion

            #region Summons
            if (Parent.HasSummon)
            {
                source.RemoveSummon(Parent.SkillId);  //Remove old one if exists
                WzCharacterSkill.SummonAttackInfo info = Parent.SummonInfo;
                MapleSummon summon = new MapleSummon(source.Map.GetNewObjectId(), Parent.SkillId, source.Position, info.Type, info.MovementType, source, Level, (uint)Info[CharacterSkillStat.time] * 1000);
                source.AddSummon(summon);
            }
            #endregion

            //Custom handling:
            switch (Parent.SkillId)
            {
            case Hunter.QUIVER_CARTRIDGE:
                QuiverCartridgeSystem qcs = source.Resource as QuiverCartridgeSystem;
                if (qcs != null)
                {
                    qcs.SwitchCurrentArrow(source.Client);
                }
                break;

            case Priest.HOLY_MAGIC_SHELL:
            case SuperGameMaster.HEAL_DISPEL:
                target.AddHP(target.Stats.MaxHp);
                break;

            case Bishop.RESURRECTION:
            case SuperGameMaster.RESURRECTION:

                if (target.IsDead)
                {
                    target.Revive(false, false, true);
                }
                break;
            }
        }
コード例 #19
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var templateID = packet.Decode <int>();
            var template   = user.Service.TemplateManager.Get <SkillTemplate>(templateID);

            Console.WriteLine(template);

            if (template == null)
            {
                return;
            }

            var job      = template.ID / 10000;
            var jobLevel = (byte)SkillConstants.GetJobLevel(job);

            if (jobLevel == 0)
            {
                var sp = Math.Min(user.Character.Level - 1, job == 3000 ? 9 : 6);
                for (var i = 0; i < 3; i++)
                {
                    sp -= user.Character.GetSkillLevel(job * 1000 + 1000 + i);
                }
                if (sp > 0)
                {
                    await user.ModifySkills(s => s.Add(templateID), true);
                }
                return;
            }

            if (SkillConstants.IsExtendSPJob(job) && user.Character.GetExtendSP(jobLevel) <= 0)
            {
                return;
            }
            if (!SkillConstants.IsExtendSPJob(job) && user.Character.SP <= 0)
            {
                return;
            }

            var maxLevel = template.MaxLevel;

            if (SkillConstants.IsSkillNeedMasterLevel(templateID))
            {
                maxLevel = (short)user.Character.GetSkillMasterLevel(templateID);
            }

            if (user.Character.GetSkillLevel(templateID) >= maxLevel)
            {
                return;
            }

            await user.ModifyStats(s =>
            {
                if (SkillConstants.IsExtendSPJob(job))
                {
                    s.SetExtendSP(jobLevel, (byte)(s.GetExtendSP(jobLevel) - 1));
                }
                else
                {
                    s.SP--;
                }
            });

            await user.ModifySkills(s => s.Add(templateID), true);
        }
コード例 #20
0
        public void ParseSkillString(string skillString, params string[] expected)
        {
            var sections = SkillConstants.Parse(skillString);

            Assert.That(sections, Is.EqualTo(expected));
        }
コード例 #21
0
        private void Decode(IPacket packet)
        {
            packet.Decode <byte>(); // fieldKey

            packet.Decode <int>();  // pDrInfo
            packet.Decode <int>();  // pDrInfo

            var v6 = packet.Decode <byte>();

            DamagePerMob = v6 & 0xF;
            MobCount     = v6 >> 4;

            packet.Decode <int>(); // pDrInfo
            packet.Decode <int>(); // pDrInfo

            SkillID = packet.Decode <int>();
            packet.Decode <byte>(); // combatOrders

            if (_type == AttackType.Magic)
            {
                packet.Decode <int>();
                packet.Decode <int>();
                packet.Decode <int>();
                packet.Decode <int>();
                packet.Decode <int>();
                packet.Decode <int>();
            }

            packet.Decode <int>(); // rand
            packet.Decode <int>(); // crc?

            packet.Decode <int>();
            packet.Decode <int>();

            if (SkillConstants.IsKeydownSkill(SkillID))
            {
                KeyDown = packet.Decode <int>();
            }

            Option = packet.Decode <byte>();

            if (_type == AttackType.Shoot)
            {
                packet.Decode <byte>();  // m_bNextShootExJablin
            }
            var v17 = packet.Decode <short>();

            Left   = Convert.ToBoolean((v17 >> 15) & 1);
            Action = v17 & 0x7FFF;

            packet.Decode <int>();

            AttackActionType = packet.Decode <byte>();
            AttackSpeed      = packet.Decode <byte>();
            AttackTime       = packet.Decode <int>();

            packet.Decode <int>(); // phase

            if (_type == AttackType.Shoot)
            {
                packet.Decode <short>();
                packet.Decode <short>();
                packet.Decode <byte>();
                // if ( v459 && !is_shoot_skill_not_consuming_bullet(nSkillID) )
                // packet.Decode<int>();
            }

            DamageInfo = new DamageInfo[MobCount];
            for (var i = 0; i < MobCount; i++)
            {
                var info = new DamageInfo(_type, _user);

                info.Decode(packet, DamagePerMob);
                DamageInfo[i] = info;
            }
        }
コード例 #22
0
        public static IEnumerable <string> GetFeatsWithFoci()
        {
            var featsWithFoci = new List <string>();

            var simpleWeapons = WeaponConstants.GetAllSimple(false, false);

            foreach (var weapon in simpleWeapons)
            {
                featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Simple}/{weapon}");
            }

            var martialWeapons = WeaponConstants.GetAllMartial(false, false);

            foreach (var weapon in martialWeapons)
            {
                featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{weapon}");
            }

            //INFO: Adding in some exotic as martial, for weapon familiarity
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.DwarvenUrgrosh}");
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.DwarvenWaraxe}");
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.OrcDoubleAxe}");
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.GnomeHookedHammer}");

            var exoticWeapons = WeaponConstants.GetAllExotic(false, false);

            foreach (var weapon in exoticWeapons)
            {
                featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Exotic}/{weapon}");
            }

            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Appraise}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Balance}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Bluff}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Climb}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Concentration}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Craft}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Alchemy)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Armorsmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Blacksmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Bookbinding)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Bowmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Brassmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Brewing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Candlemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Cloth)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Coppersmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Dyemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Gemcutting)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Glass)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Goldsmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Hatmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Hornworking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Jewelmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Leather)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Locksmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Mapmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Milling)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Painting)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Parchmentmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Pewtermaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Potterymaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Sculpting)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Shipmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Shoemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Silversmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Skinning)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Soapmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Stonemasonry)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Tanning)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Trapmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Weaponsmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Weaving)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Wheelmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Winemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Woodworking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.DecipherScript}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Diplomacy}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.DisableDevice}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Disguise}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.EscapeArtist}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Forgery}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.GatherInformation}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.HandleAnimal}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Heal}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Hide}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Intimidate}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Jump}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Knowledge}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Arcana)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.ArchitectureAndEngineering)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Dungeoneering)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Geography)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.History)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Local)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Nature)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.NobilityAndRoyalty)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Religion)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.ThePlanes)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Listen}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.MoveSilently}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.OpenLock}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Perform}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Act)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Comedy)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Dance)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.KeyboardInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Oratory)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.PercussionInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Sing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.StringInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.WindInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Profession}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Adviser)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Alchemist)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.AnimalGroomer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.AnimalTrainer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Apothecary)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Appraiser)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Architect)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Armorer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Barrister)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Blacksmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Bookbinder)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Bowyer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Brazier)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Brewer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Butler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Carpenter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cartographer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cartwright)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Chandler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.CityGuide)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Clerk)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cobbler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coffinmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coiffeur)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cook)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coppersmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Craftsman)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Dowser)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Dyer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Embalmer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Engineer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Entertainer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.ExoticAnimalTrainer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Farmer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Fletcher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Footman)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Gemcutter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Goldsmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Governess)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Haberdasher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Healer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Horner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Hunter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Interpreter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Jeweler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Laborer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Launderer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Limner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.LocalCourier)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Locksmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Maid)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Masseuse)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Matchmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Midwife)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Miller)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Miner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Navigator)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Nursemaid)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.OutOfTownCourier)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Painter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Parchmentmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Pewterer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Polisher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Porter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Potter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Sage)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.SailorCrewmember)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.SailorMate)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Scribe)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Sculptor)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Shepherd)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Shipwright)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Silversmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Skinner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Soapmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Soothsayer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Tanner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Teacher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Teamster)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Trader)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Trapper)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Valet)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Vintner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Weaponsmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Weaver)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Wheelwright)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.WildernessGuide)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Ride}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Search}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.SenseMotive}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.SleightOfHand}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Spellcraft}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Spot}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Survival}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Swim}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Tumble}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.UseMagicDevice}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.UseRope}");

            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Boar}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Rat}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Raven}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_Hunter_Small}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_Hunter_Medium}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_WebSpinner_Small}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_WebSpinner_Medium}");

            return(featsWithFoci);
        }
コード例 #23
0
 public void ChangeSkillJump(SkillConstants _constants, int _weightFrame)
 {
     fighter.SetIsGround(false);
     fighter.SetSkill(fighter.Status.constantsSkills[(int)_constants], _weightFrame);
 }
コード例 #24
0
 //スキル入れ替え
 public void ChangeSkillConstant(SkillConstants _constants, int _weightFrame)
 {
     fighter.SetSkill(fighter.Status.constantsSkills[(int)_constants], _weightFrame);
 }
コード例 #25
0
        public async Task Handle(RecvPacketOperations operation, IPacket packet, GameSocket socket)
        {
            var characterID = packet.Decode <int>();

            try
            {
                using var store = socket.Service.DataStore.OpenSession();
                var character = store
                                .Query <Character>()
                                .First(c => c.ID == characterID);
                var data = store
                           .Query <AccountData>()
                           .First(d => d.ID == character.AccountDataID);
                var account = store
                              .Query <Account>()
                              .First(a => a.ID == data.AccountID);

                await socket.TryMigrateFrom(account, character);

                socket.Account     = account;
                socket.AccountData = data;
                socket.Character   = character;

                var field     = socket.Service.FieldManager.Get(character.FieldID);
                var fieldUser = new FieldUser(socket);
                await fieldUser.ValidateStat();

                socket.FieldUser = fieldUser;

                await field.Enter(fieldUser);

                if (socket.SocialService != null)
                {
                    await socket.Service.SendMessage(socket.SocialService, new SocialStateMessage
                    {
                        CharacterID = character.ID,
                        State       = MigrationState.LoggedIn,
                        Service     = socket.Service.Info.Name
                    });
                }

                using (var p = new Packet(SendPacketOperations.FuncKeyMappedInit))
                {
                    p.Encode <bool>(false);

                    for (var i = 0; i < 90; i++)
                    {
                        var key = character.FunctionKeys[i];

                        p.Encode <byte>(key?.Type ?? 0);
                        p.Encode <int>(key?.Action ?? 0);
                    }

                    await socket.SendPacket(p);
                }

                using (var p = new Packet(SendPacketOperations.QuickslotMappedInit))
                {
                    p.Encode <bool>(true);

                    for (var i = 0; i < 8; i++)
                    {
                        p.Encode <int>(character.QuickSlotKeys[i]);
                    }

                    await socket.SendPacket(p);
                }

                if (SkillConstants.HasEvanDragon(fieldUser.Character.Job))
                {
                    var dragon = new FieldDragon(fieldUser);

                    fieldUser.Owned.Add(dragon);
                    await fieldUser.Field.Enter(dragon);
                }
            }
            catch
            {
                await socket.Close();
            }
        }
コード例 #26
0
ファイル: FeatFociTests.cs プロジェクト: DnDGen/CreatureGen
        public void SkillsFoci()
        {
            var foci = new[]
            {
                SkillConstants.Appraise,
                SkillConstants.Balance,
                SkillConstants.Bluff,
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Alchemy),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Armorsmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Blacksmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Bookbinding),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Bowmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Brassmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Brewing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Candlemaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Cloth),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Coppersmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Dyemaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Gemcutting),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Glass),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Goldsmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Hatmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Hornworking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Jewelmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Leather),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Locksmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Mapmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Milling),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Painting),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Parchmentmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Pewtermaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Potterymaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Sculpting),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Shipmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Shoemaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Silversmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Skinning),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Soapmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Stonemasonry),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Tanning),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Trapmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Weaponsmithing),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Weaving),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Wheelmaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Winemaking),
                SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Woodworking),
                SkillConstants.Climb,
                SkillConstants.Concentration,
                SkillConstants.DecipherScript,
                SkillConstants.Diplomacy,
                SkillConstants.DisableDevice,
                SkillConstants.Disguise,
                SkillConstants.EscapeArtist,
                SkillConstants.Forgery,
                SkillConstants.GatherInformation,
                SkillConstants.HandleAnimal,
                SkillConstants.Heal,
                SkillConstants.Hide,
                SkillConstants.Intimidate,
                SkillConstants.Jump,
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Arcana),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.ArchitectureAndEngineering),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Dungeoneering),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Geography),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.History),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Local),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Nature),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.NobilityAndRoyalty),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Religion),
                SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.ThePlanes),
                SkillConstants.Listen,
                SkillConstants.MoveSilently,
                SkillConstants.OpenLock,
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Act),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Comedy),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Dance),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.KeyboardInstruments),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Oratory),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.PercussionInstruments),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Sing),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.StringInstruments),
                SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.WindInstruments),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Adviser),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Alchemist),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.AnimalGroomer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.AnimalTrainer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Apothecary),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Appraiser),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Architect),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Armorer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Barrister),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Blacksmith),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Bookbinder),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Bowyer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Brazier),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Brewer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Butler),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Carpenter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cartographer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cartwright),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Chandler),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.CityGuide),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Clerk),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cobbler),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coffinmaker),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coiffeur),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cook),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coppersmith),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Craftsman),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Dowser),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Dyer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Embalmer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Engineer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Entertainer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.ExoticAnimalTrainer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Farmer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Fletcher),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Footman),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Gemcutter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Goldsmith),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Governess),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Haberdasher),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Healer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Horner),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Hunter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Interpreter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Jeweler),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Laborer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Launderer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Limner),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.LocalCourier),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Locksmith),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Maid),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Masseuse),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Matchmaker),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Midwife),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Miller),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Miner),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Navigator),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Nursemaid),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.OutOfTownCourier),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Painter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Parchmentmaker),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Pewterer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Polisher),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Porter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Potter),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Sage),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.SailorCrewmember),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.SailorMate),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Scribe),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Sculptor),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Shepherd),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Shipwright),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Silversmith),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Skinner),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Soapmaker),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Soothsayer),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Tanner),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Teacher),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Teamster),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Trader),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Trapper),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Valet),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Vintner),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Weaponsmith),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Weaver),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Wheelwright),
                SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.WildernessGuide),
                SkillConstants.Ride,
                SkillConstants.Search,
                SkillConstants.SenseMotive,
                SkillConstants.SleightOfHand,
                SkillConstants.Spellcraft,
                SkillConstants.Spot,
                SkillConstants.Survival,
                SkillConstants.Swim,
                SkillConstants.Tumble,
                SkillConstants.UseMagicDevice,
                SkillConstants.UseRope
            };

            base.AssertDistinctCollection(GroupConstants.Skills, foci);
        }
コード例 #27
0
        public static void EncodeData(this Character c, IPacket p, DbChar flags = DbChar.All)
        {
            p.Encode <long>((long)flags);
            p.Encode <byte>(0);
            p.Encode <byte>(0);

            if (flags.HasFlag(DbChar.Character))
            {
                EncodeStats(c, p);
                p.Encode <byte>(250); // nFriendMax
                p.Encode <bool>(false);
            }

            if (flags.HasFlag(DbChar.Money))
            {
                p.Encode <int>(c.Money);
            }

            if (flags.HasFlag(DbChar.InventorySize))
            {
                if (flags.HasFlag(DbChar.ItemSlotEquip))
                {
                    p.Encode <byte>((byte)c.Inventories[ItemInventoryType.Equip].SlotMax);
                }
                if (flags.HasFlag(DbChar.ItemSlotConsume))
                {
                    p.Encode <byte>((byte)c.Inventories[ItemInventoryType.Consume].SlotMax);
                }
                if (flags.HasFlag(DbChar.ItemSlotInstall))
                {
                    p.Encode <byte>((byte)c.Inventories[ItemInventoryType.Install].SlotMax);
                }
                if (flags.HasFlag(DbChar.ItemSlotEtc))
                {
                    p.Encode <byte>((byte)c.Inventories[ItemInventoryType.Etc].SlotMax);
                }
                if (flags.HasFlag(DbChar.ItemSlotCash))
                {
                    p.Encode <byte>((byte)c.Inventories[ItemInventoryType.Cash].SlotMax);
                }
            }

            if (flags.HasFlag(DbChar.AdminShopCount))
            {
                p.Encode <int>(0);
                p.Encode <int>(0);
            }

            if (flags.HasFlag(DbChar.ItemSlotEquip))
            {
                var inventory        = c.Inventories[ItemInventoryType.Equip].Items;
                var equip            = inventory.Where(kv => kv.Key >= 0);
                var equipped         = inventory.Where(kv => kv.Key >= -100 && kv.Key < 0);
                var equipped2        = inventory.Where(kv => kv.Key >= -1000 && kv.Key < -100);
                var dragonEquipped   = inventory.Where(kv => kv.Key >= -1100 && kv.Key < -1000);
                var mechanicEquipped = inventory.Where(kv => kv.Key >= -1200 && kv.Key < -1100);

                new List <IEnumerable <KeyValuePair <short, ItemSlot> > >
                {
                    equipped, equipped2, equip, dragonEquipped, mechanicEquipped
                }
                .ForEach(e =>
                {
                    e.ForEach(kv =>
                    {
                        p.Encode <short>((short)(Math.Abs(kv.Key) % 100));
                        kv.Value.Encode(p);
                    });
                    p.Encode <short>(0);
                });
            }

            new List <(DbChar, ItemInventoryType)>
            {
                (DbChar.ItemSlotConsume, ItemInventoryType.Consume),
                (DbChar.ItemSlotInstall, ItemInventoryType.Install),
                (DbChar.ItemSlotEtc, ItemInventoryType.Etc),
                (DbChar.ItemSlotCash, ItemInventoryType.Cash)
            }
            .Where(t => flags.HasFlag(t.Item1))
            .ForEach(t =>
            {
                var inventory = c.Inventories[t.Item2].Items;

                inventory.ForEach(kv =>
                {
                    p.Encode <byte>((byte)kv.Key);
                    kv.Value.Encode(p);
                });
                p.Encode <byte>(0);
            });

            if (flags.HasFlag(DbChar.SkillRecord))
            {
                p.Encode <short>((short)c.SkillRecord.Count);
                c.SkillRecord.ForEach(kv =>
                {
                    p.Encode <int>(kv.Key);
                    p.Encode <int>(kv.Value.Level);
                    p.Encode <DateTime>(kv.Value.DateExpire ?? ItemConstants.Permanent);

                    if (SkillConstants.IsSkillNeedMasterLevel(kv.Key))
                    {
                        p.Encode <int>(kv.Value.MasterLevel);
                    }
                });
            }

            if (flags.HasFlag(DbChar.SkillCooltime))
            {
                p.Encode <short>(0);
            }

            if (flags.HasFlag(DbChar.QuestRecord))
            {
                p.Encode <short>((short)c.QuestRecord.Count);
                c.QuestRecord.ForEach(q =>
                {
                    p.Encode <short>(q.Key);
                    p.Encode <string>(q.Value);
                });
            }

            if (flags.HasFlag(DbChar.QuestComplete))
            {
                p.Encode <short>((short)c.QuestComplete.Count);
                c.QuestComplete.ForEach(q =>
                {
                    p.Encode <short>(q.Key);
                    p.Encode <DateTime>(q.Value);
                });
            }

            if (flags.HasFlag(DbChar.MinigameRecord))
            {
                p.Encode <short>(0);
            }

            if (flags.HasFlag(DbChar.CoupleRecord))
            {
                p.Encode <short>(0); // Couple
                p.Encode <short>(0); // Friend
                p.Encode <short>(0); // Marriage
            }

            if (flags.HasFlag(DbChar.MapTransfer))
            {
                for (var i = 0; i < 5; i++)
                {
                    p.Encode <int>(0);
                }
                for (var i = 0; i < 10; i++)
                {
                    p.Encode <int>(0);
                }
            }

            if (flags.HasFlag(DbChar.NewYearCard))
            {
                p.Encode <short>(0);
            }

            if (flags.HasFlag(DbChar.QuestRecordEx))
            {
                p.Encode <short>((short)c.QuestRecordEx.Count);
                c.QuestRecordEx.ForEach(q =>
                {
                    p.Encode <short>(q.Key);
                    p.Encode <string>(q.Value);
                });
            }

            if (flags.HasFlag(DbChar.WildHunterInfo))
            {
                if (c.Job / 100 == 33)
                {
                    p.Encode <byte>(0);
                    for (var i = 0; i < 5; i++)
                    {
                        p.Encode <int>(0);
                    }
                }
            }

            if (flags.HasFlag(DbChar.QuestCompleteOld))
            {
                p.Encode <short>(0);
            }

            if (flags.HasFlag(DbChar.VisitorLog))
            {
                p.Encode <short>(0);
            }
        }