/// <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; }