public IEnumerable <ItemEffect> LoadEffects()
        {
            var dto         = Deserialize <ItemEffectDto>("xml/item_effect.x7");
            var stringTable = Deserialize <StringTableDto>("language/xml/item_effect_string_table.x7");

            foreach (var itemEffectDto in dto.item.Where(itemEffect => itemEffect.id != 0))
            {
                var itemEffect = new ItemEffect
                {
                    Id = itemEffectDto.id
                };

                foreach (var attributeDto in itemEffectDto.attribute)
                {
                    itemEffect.Attributes.Add(new ItemEffectAttribute
                    {
                        Attribute = (Attribute)Enum.Parse(typeof(Attribute), attributeDto.effect.Replace("_", ""),
                                                          true),
                        Value = attributeDto.value,
                        Rate  = float.Parse(attributeDto.rate, CultureInfo.InvariantCulture)
                    });
                }

                var name = [email protected](s =>
                                                              s.key.Equals(itemEffectDto.text_key, StringComparison.InvariantCultureIgnoreCase));

                if (name == null)
                {
                    name = new StringTableStringDto();
                }

                if (string.IsNullOrWhiteSpace(name.eng))
                {
                    name.eng = itemEffectDto.NAME;
                }

                itemEffect.Name = name.eng;
                yield return(itemEffect);
            }
        }
        public IEnumerable <MapInfo> LoadMaps()
        {
            var stringTable = Deserialize <StringTableDto>("language/xml/gameinfo_string_table.xml");
            var dto         = Deserialize <MapInfoDto>("xml/map.x7");

            //Logger.Information($"LoadMaps() called ({dto.map.Length})");
            var MapList = new List <int>();

            foreach (var mapDto in dto.map)
            {
                if (MapList.Contains(mapDto.id) || mapDto.id > 255)
                {
                    //Logger.Warning("Map {mapid} couldnt be loaded!", mapDto.id);
                }
                else
                {
                    MapList.Add(mapDto.id);
                    //Logger.Information($"Loading map {mapDto.id}, {mapDto.resource.bginfo_path}");
                    mapDto.resource.bginfo_path = mapDto.resource.bginfo_path.ToLower();
                    var mapPath = mapDto.resource.bginfo_path;
                    var map     = new MapInfo
                    {
                        Id          = (byte)mapDto.id,
                        MinLevel    = 0,
                        ServerId    = 0,
                        ChannelId   = 0,
                        RespawnType = 0
                    };
                    var data = GetBytes(mapPath);
                    if (data == null)
                    {
                        continue;
                    }

                    using (var ms = new MemoryStream(data))
                    {
                        map.Config = IniFile.Load(ms);
                    }

                    foreach (var enabledMode in map.Config["MAPINFO"]
                             .Where(pair => pair.Key.StartsWith("enableMode", StringComparison.InvariantCultureIgnoreCase))
                             .Select(pair => pair.Value))
                    {
                        switch (enabledMode.Value.ToLower())
                        {
                        case "sl":
                            if (!map.GameRules.Contains(GameRule.Chaser))
                            {
                                map.GameRules.Add(GameRule.Chaser);
                            }
                            break;

                        case "t":
                            if (!map.GameRules.Contains(GameRule.Touchdown))
                            {
                                map.GameRules.Add(GameRule.Touchdown);
                            }
                            if (!map.GameRules.Contains(GameRule.PassTouchdown))
                            {
                                map.GameRules.Add(GameRule.PassTouchdown);
                            }
                            if (!map.GameRules.Contains(GameRule.Captain))
                            {
                                map.GameRules.Add(GameRule.Captain);
                            }
                            break;

                        case "c":
                            if (!map.GameRules.Contains(GameRule.Captain))
                            {
                                map.GameRules.Add(GameRule.Captain);
                            }
                            break;

                        case "f":
                            if (!map.GameRules.Contains(GameRule.Deathmatch))
                            {
                                map.GameRules.Add(GameRule.Deathmatch);
                            }
                            if (!map.GameRules.Contains(GameRule.SnowballFight))
                            {
                                map.GameRules.Add(GameRule.SnowballFight);
                            }
                            if (!map.GameRules.Contains(GameRule.BattleRoyal))
                            {
                                map.GameRules.Add(GameRule.BattleRoyal);
                            }
                            if (!map.GameRules.Contains(GameRule.Captain))
                            {
                                map.GameRules.Add(GameRule.Captain);
                            }
                            break;

                        case "d":
                            if (!map.GameRules.Contains(GameRule.SnowballFight))
                            {
                                map.GameRules.Add(GameRule.SnowballFight);
                            }
                            if (!map.GameRules.Contains(GameRule.BattleRoyal))
                            {
                                map.GameRules.Add(GameRule.BattleRoyal);
                            }
                            if (!map.GameRules.Contains(GameRule.Deathmatch))
                            {
                                map.GameRules.Add(GameRule.Deathmatch);
                            }
                            if (!map.GameRules.Contains(GameRule.Chaser))
                            {
                                map.GameRules.Add(GameRule.Chaser);
                            }
                            if (!map.GameRules.Contains(GameRule.Captain))
                            {
                                map.GameRules.Add(GameRule.Captain);
                            }
                            break;

                        case "s":
                            map.GameRules.Add(GameRule.Survival);
                            break;

                        case "n":
                            map.GameRules.Add(GameRule.Practice);
                            break;

                        case "a":
                            map.GameRules.Add(GameRule.Arcade);
                            break;

                        case "sz":
                            map.GameRules.Add(GameRule.Siege);
                            break;

                        case "std":     // wtf is this?
                            break;

                        case "m":     // wtf is this?
                            break;

                        default:
                            throw new Exception("Invalid game rule " + enabledMode);
                        }
                    }
                    var name_ = new StringTableStringDto();
                    try
                    {
                        name_ = [email protected](s =>
                                                          s.key.Equals(mapDto.Base.map_name_key, StringComparison.InvariantCultureIgnoreCase));
                    }
                    catch (Exception ex)
                    {
                        name_.eng = "unknown";
                    }
                    var name = name_;
                    if (string.IsNullOrWhiteSpace(name.eng))
                    {
                        name.eng = mapDto.Base.map_name_key;
                    }

                    map.Name = name.eng;
                    yield return(map);
                }
            }
        }