/// <summary>
        /// Get climate texture information.
        /// </summary>
        /// <param name="archive">Texture archive index.</param>
        /// <returns>ClimateTextureInfo.</returns>
        public static ClimateTextureInfo GetClimateTextureInfo(int archive)
        {
            // Create new climate texture information
            ClimateTextureInfo ci = new ClimateTextureInfo();

            ci.textureSet = DFLocation.ClimateTextureSet.None;

            // Handle nature sets
            if (archive > 499)
            {
                ci.textureSet   = (DFLocation.ClimateTextureSet)archive;
                ci.textureGroup = DFLocation.ClimateTextureGroup.Nature;
                switch (ci.textureSet)
                {
                // Nature sets without snow
                case DFLocation.ClimateTextureSet.Nature_RainForest:
                case DFLocation.ClimateTextureSet.Nature_SubTropical:
                case DFLocation.ClimateTextureSet.Nature_Swamp:
                case DFLocation.ClimateTextureSet.Nature_Desert:
                    break;

                // Nature sets with snow
                case DFLocation.ClimateTextureSet.Nature_TemperateWoodland:
                case DFLocation.ClimateTextureSet.Nature_WoodlandHills:
                case DFLocation.ClimateTextureSet.Nature_HauntedWoodlands:
                case DFLocation.ClimateTextureSet.Nature_Mountains:
                    ci.supportsWinter = true;
                    break;

                // No match
                default:
                    ci.textureGroup = DFLocation.ClimateTextureGroup.None;
                    ci.textureSet   = DFLocation.ClimateTextureSet.None;
                    break;
                }

                return(ci);
            }

            // Get general set
            ci.textureSet = (DFLocation.ClimateTextureSet)(archive - (archive / 100) * 100);
            switch (ci.textureSet)
            {
            // Terrain sets (support winter and rain)
            case DFLocation.ClimateTextureSet.Exterior_Terrain:
                ci.textureGroup   = DFLocation.ClimateTextureGroup.Terrain;
                ci.supportsWinter = true;
                ci.supportsRain   = true;
                break;

            // Exterior sets (supports winter)
            case DFLocation.ClimateTextureSet.Exterior_Ruins:
            case DFLocation.ClimateTextureSet.Exterior_Castle:
            case DFLocation.ClimateTextureSet.Exterior_CityA:
            case DFLocation.ClimateTextureSet.Exterior_CityB:
            case DFLocation.ClimateTextureSet.Exterior_CityWalls:
            case DFLocation.ClimateTextureSet.Exterior_Farm:
            case DFLocation.ClimateTextureSet.Exterior_Fences:
            case DFLocation.ClimateTextureSet.Exterior_MagesGuild:
            case DFLocation.ClimateTextureSet.Exterior_Manor:
            case DFLocation.ClimateTextureSet.Exterior_MerchantHomes:
            case DFLocation.ClimateTextureSet.Exterior_TavernExteriors:
            case DFLocation.ClimateTextureSet.Exterior_TempleExteriors:
            case DFLocation.ClimateTextureSet.Exterior_Village:
            case DFLocation.ClimateTextureSet.Exterior_Roofs:
            case DFLocation.ClimateTextureSet.Exterior_CitySpec:
            case DFLocation.ClimateTextureSet.Exterior_CitySpec_Snow:
            case DFLocation.ClimateTextureSet.Exterior_CitySpecB:
            case DFLocation.ClimateTextureSet.Exterior_CitySpecB_Snow:
                ci.textureGroup   = DFLocation.ClimateTextureGroup.Exterior;
                ci.supportsWinter = true;
                break;

            // Exterior sets (do not support winter)
            case DFLocation.ClimateTextureSet.Exterior_Doors:
                ci.supportsWinter = false;
                break;

            // Interior sets (do not support winter)
            case DFLocation.ClimateTextureSet.Interior_CastleInt:
            case DFLocation.ClimateTextureSet.Interior_CityInt:
            case DFLocation.ClimateTextureSet.Interior_CryptA:
            case DFLocation.ClimateTextureSet.Interior_CryptB:
            case DFLocation.ClimateTextureSet.Interior_DungeonsA:
            case DFLocation.ClimateTextureSet.Interior_DungeonsB:
            case DFLocation.ClimateTextureSet.Interior_DungeonsC:
            case DFLocation.ClimateTextureSet.Interior_DungeonsNEWCs:
            case DFLocation.ClimateTextureSet.Interior_FarmInt:
            case DFLocation.ClimateTextureSet.Interior_MagesGuildInt:
            case DFLocation.ClimateTextureSet.Interior_ManorInt:
            case DFLocation.ClimateTextureSet.Interior_MarbleFloors:
            case DFLocation.ClimateTextureSet.Interior_MerchantHomesInt:
            case DFLocation.ClimateTextureSet.Interior_Mines:
            case DFLocation.ClimateTextureSet.Interior_Caves:
            case DFLocation.ClimateTextureSet.Interior_Paintings:
            case DFLocation.ClimateTextureSet.Interior_TavernInt:
            case DFLocation.ClimateTextureSet.Interior_TempleInt:
            case DFLocation.ClimateTextureSet.Interior_VillageInt:
            case DFLocation.ClimateTextureSet.Interior_Sewer:
                ci.textureGroup = DFLocation.ClimateTextureGroup.Interior;
                break;

            // No match found, revert to non-climate settings
            default:
                ci.textureGroup = DFLocation.ClimateTextureGroup.None;
                ci.textureSet   = DFLocation.ClimateTextureSet.None;
                break;
            }

            return(ci);
        }
        /// <summary>
        /// Converts an archive index to new climate and season.
        /// Will return same index if climate or season not supported.
        /// </summary>
        /// <param name="archive">Archive index of starting texture.</param>
        /// <param name="climate">Climate base to apply.</param>
        /// <param name="season">Climate season to apply</param>
        /// <returns>Archive index of new texture.</returns>
        public static int ApplyClimate(int archive, int record, ClimateBases climate, ClimateSeason season)
        {
            // Get climate texture info
            ClimateTextureInfo ci = ClimateSwaps.GetClimateTextureInfo(archive);

            // Ignore non-climate textures
            if (ci.textureSet == DFLocation.ClimateTextureSet.None)
            {
                return(archive);
            }

            // Handle missing Swamp textures
            if (climate == ClimateBases.Swamp)
            {
                switch (ci.textureSet)
                {
                case DFLocation.ClimateTextureSet.Interior_TempleInt:
                case DFLocation.ClimateTextureSet.Interior_MarbleFloors:
                    return(archive);
                }
            }

            // Bypass winter swaps in desert climates entirely
            // There are too many bad swaps, and you never see this variant in game
            if (climate == ClimateBases.Desert)
            {
                ci.supportsWinter = false;
            }

            // Handle swamp climate sets with missing winter textures
            if (climate == ClimateBases.Swamp)
            {
                switch (ci.textureSet)
                {
                case DFLocation.ClimateTextureSet.Exterior_Castle:
                case DFLocation.ClimateTextureSet.Exterior_MagesGuild:
                    ci.supportsWinter = false;
                    break;
                }
            }

            // Handle archives with missing winter textures
            if (archive == 82 && record > 1 ||
                archive == 77)
            {
                ci.supportsWinter = false;
            }

            // Flag to suppress climate index
            // Certain textures have a winter variant but are climate-specific
            bool suppressClimateIndex = false;

            switch (archive)
            {
            case 75:
            case 76:
            case 77:
            case 79:
            case 80:
            case 82:
            case 83:
                suppressClimateIndex = true;
                break;
            }

            // Calculate new index
            int climateIndex = 0;

            if (archive < 500 && !suppressClimateIndex)
            {
                climateIndex = (int)FromUnityClimateBase(climate) + (int)ci.textureSet;
                if (season == ClimateSeason.Winter && ci.supportsWinter)
                {
                    climateIndex += (int)DFLocation.ClimateWeather.Winter;
                }
                else if (season == ClimateSeason.Rain && ci.supportsRain)
                {
                    climateIndex += (int)DFLocation.ClimateWeather.Rain;
                }
            }
            else
            {
                climateIndex = archive;
                if (season == ClimateSeason.Winter && ci.supportsWinter)
                {
                    climateIndex += (int)DFLocation.ClimateWeather.Winter;
                }
            }

            return(climateIndex);
        }
        /// <summary>
        /// Get climate texture information.
        /// </summary>
        /// <param name="archive">Texture archive index.</param>
        /// <returns>ClimateTextureInfo.</returns>
        public static ClimateTextureInfo GetClimateTextureInfo(int archive)
        {
            // Create new climate texture information
            ClimateTextureInfo ci = new ClimateTextureInfo();
            ci.textureSet = DFLocation.ClimateTextureSet.None;

            // Handle nature sets
            if (archive > 499)
            {
                ci.textureSet = (DFLocation.ClimateTextureSet)archive;
                ci.textureGroup = DFLocation.ClimateTextureGroup.Nature;
                switch (ci.textureSet)
                {
                    // Nature sets without snow
                    case DFLocation.ClimateTextureSet.Nature_RainForest:
                    case DFLocation.ClimateTextureSet.Nature_SubTropical:
                    case DFLocation.ClimateTextureSet.Nature_Swamp:
                    case DFLocation.ClimateTextureSet.Nature_Desert:
                        break;

                    // Nature sets with snow
                    case DFLocation.ClimateTextureSet.Nature_TemperateWoodland:
                    case DFLocation.ClimateTextureSet.Nature_WoodlandHills:
                    case DFLocation.ClimateTextureSet.Nature_HauntedWoodlands:
                    case DFLocation.ClimateTextureSet.Nature_Mountains:
                        ci.supportsWinter = true;
                        break;

                    // No match
                    default:
                        ci.textureGroup = DFLocation.ClimateTextureGroup.None;
                        ci.textureSet = DFLocation.ClimateTextureSet.None;
                        break;
                }

                return ci;
            }

            // Get general set
            ci.textureSet = (DFLocation.ClimateTextureSet)(archive - (archive / 100) * 100);
            switch (ci.textureSet)
            {
                // Terrain sets (support winter and rain)
                case DFLocation.ClimateTextureSet.Exterior_Terrain:
                    ci.textureGroup = DFLocation.ClimateTextureGroup.Terrain;
                    ci.supportsWinter = true;
                    ci.supportsRain = true;
                    break;

                // Exterior sets (supports winter)
                case DFLocation.ClimateTextureSet.Exterior_Ruins:
                case DFLocation.ClimateTextureSet.Exterior_Castle:
                case DFLocation.ClimateTextureSet.Exterior_CityA:
                case DFLocation.ClimateTextureSet.Exterior_CityB:
                case DFLocation.ClimateTextureSet.Exterior_CityWalls:
                case DFLocation.ClimateTextureSet.Exterior_Farm:
                case DFLocation.ClimateTextureSet.Exterior_Fences:
                case DFLocation.ClimateTextureSet.Exterior_MagesGuild:
                case DFLocation.ClimateTextureSet.Exterior_Manor:
                case DFLocation.ClimateTextureSet.Exterior_MerchantHomes:
                case DFLocation.ClimateTextureSet.Exterior_TavernExteriors:
                case DFLocation.ClimateTextureSet.Exterior_TempleExteriors:
                case DFLocation.ClimateTextureSet.Exterior_Village:
                case DFLocation.ClimateTextureSet.Exterior_Roofs:
                case DFLocation.ClimateTextureSet.Exterior_CitySpec:
                case DFLocation.ClimateTextureSet.Exterior_CitySpec_Snow:
                case DFLocation.ClimateTextureSet.Exterior_CitySpecB:
                case DFLocation.ClimateTextureSet.Exterior_CitySpecB_Snow:
                    ci.textureGroup = DFLocation.ClimateTextureGroup.Exterior;
                    ci.supportsWinter = true;
                    break;

                // Exterior sets (do not support winter)
                case DFLocation.ClimateTextureSet.Exterior_Doors:
                    ci.supportsWinter = false;
                    break;

                // Interior sets (do not support winter)
                case DFLocation.ClimateTextureSet.Interior_PalaceInt:
                case DFLocation.ClimateTextureSet.Interior_CityInt:
                case DFLocation.ClimateTextureSet.Interior_CryptA:
                case DFLocation.ClimateTextureSet.Interior_CryptB:
                case DFLocation.ClimateTextureSet.Interior_DungeonsA:
                case DFLocation.ClimateTextureSet.Interior_DungeonsB:
                case DFLocation.ClimateTextureSet.Interior_DungeonsC:
                case DFLocation.ClimateTextureSet.Interior_DungeonsNEWCs:
                case DFLocation.ClimateTextureSet.Interior_FarmInt:
                case DFLocation.ClimateTextureSet.Interior_MagesGuildInt:
                case DFLocation.ClimateTextureSet.Interior_ManorInt:
                case DFLocation.ClimateTextureSet.Interior_MarbleFloors:
                case DFLocation.ClimateTextureSet.Interior_MerchantHomesInt:
                case DFLocation.ClimateTextureSet.Interior_Mines:
                case DFLocation.ClimateTextureSet.Interior_Caves:
                case DFLocation.ClimateTextureSet.Interior_Paintings:
                case DFLocation.ClimateTextureSet.Interior_TavernInt:
                case DFLocation.ClimateTextureSet.Interior_TempleInt:
                case DFLocation.ClimateTextureSet.Interior_VillageInt:
                case DFLocation.ClimateTextureSet.Interior_Sewer:
                    ci.textureGroup = DFLocation.ClimateTextureGroup.Interior;
                    break;

                // No match found, revert to non-climate settings
                default:
                    ci.textureGroup = DFLocation.ClimateTextureGroup.None;
                    ci.textureSet = DFLocation.ClimateTextureSet.None;
                    break;
            }

            return ci;
        }