diff --git a/android/assets/jsons/Civ V - Gods & Kings/Eras.json b/android/assets/jsons/Civ V - Gods & Kings/Eras.json index 42afb67cf8..1fb404fd91 100644 --- a/android/assets/jsons/Civ V - Gods & Kings/Eras.json +++ b/android/assets/jsons/Civ V - Gods & Kings/Eras.json @@ -1,7 +1,7 @@ [ // Source: the fandom, so take these with a grain of salt // I also did some testing in the official version, but by far not all - + { "name": "Ancient era", "researchAgreementCost": 150, @@ -13,6 +13,7 @@ "baseUnitBuyCost": 200, "embarkDefense": 3, "startPercent": 0, + "citySound": "cityAncient", "friendBonus": { "Cultured": ["Provides [+3 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -42,6 +43,7 @@ "baseUnitBuyCost": 200, "embarkDefense": 4, "startPercent": 10, + "citySound": "cityClassical", "friendBonus": { "Cultured": ["Provides [+3 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -73,6 +75,7 @@ "baseUnitBuyCost": 200, "embarkDefense": 6, "startPercent": 25, + "citySound": "cityMedieval", "friendBonus": { "Cultured": ["Provides [+6 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -100,11 +103,12 @@ "startingCulture": 300, "settlerPopulation": 2, "settlerBuildings": ["Shrine","Monument","Granary","Lighthouse"], - "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", + "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "Terracotta Army", "The Oracle", "Petra", "Great Wall", "Colossus"], "baseUnitBuyCost": 300, "embarkDefense": 8, "startPercent": 37, + "citySound": "cityRenaissance", "friendBonus": { "Cultured": ["Provides [+6 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -138,6 +142,7 @@ "baseUnitBuyCost": 400, "embarkDefense": 10, "startPercent": 50, + "citySound": "cityIndustrial", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -171,11 +176,12 @@ "settlerBuildings": ["Monument","Granary","Lighthouse","Market","Workshop","Amphitheater","Barracks","Library","Colosseum"], "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "Terracotta Army", "The Oracle", "Petra", "Great Wall", "Colossus", - "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", + "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", "Sistine Chapel", "Forbidden Palace", "Leaning Tower of Pisa", "Himeji Castle", "Taj Mahal", "Porcelain Tower", "Kremlin"], "baseUnitBuyCost": 600, "embarkDefense": 13, "startPercent": 65, + "citySound": "cityModern", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -209,12 +215,13 @@ "settlerBuildings": ["Monument","Granary","Lighthouse","Market","Workshop","Amphitheater","Barracks","Library","Colosseum"], "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "Terracotta Army", "The Oracle", "Petra", "Great Wall", "Colossus", - "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", + "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", "Sistine Chapel", "Forbidden Palace", "Leaning Tower of Pisa", "Himeji Castle", "Taj Mahal", "Porcelain Tower", "Kremlin", "The Louvre", "Big Ben", "Brandenburg Gate"], "baseUnitBuyCost": 800, "embarkDefense": 16, "startPercent": 65, + "citySound": "cityAtomic", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -248,16 +255,17 @@ "settlerBuildings": ["Monument","Granary","Lighthouse","Market","Workshop","Amphitheater","Barracks","Library","Colosseum","Theatre","Bank"], "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "Terracotta Army", "The Oracle", "Petra", "Great Wall", "Colossus", - "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", + "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", "Sistine Chapel", "Forbidden Palace", "Leaning Tower of Pisa", "Himeji Castle", "Taj Mahal", "Porcelain Tower", "Kremlin", "The Louvre", "Big Ben", "Brandenburg Gate", "Eiffel Tower", "Statue of Liberty", "Neuschwanstein", "Cristo Redentor"], "baseUnitBuyCost": 1000, "embarkDefense": 20, "startPercent": 80, - // So theoretically this is always just all the wonders at least 2 eras old. So we could just use that. + // So theoretically this is always just all the wonders at least 2 eras old. So we could just use that. // But where is the modularity? The excluding of very specific wonders? That is no fun. // So we just write down the entire long list (sorted by era!) instead. + "citySound": "cityInformation", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -279,8 +287,8 @@ "Starting in this era disables religion" ] }, - { // Technically, this Era doesn't exist in the original game. - // But as it is _really_ usefull to have for testing, I'd like to keep it. + { // Technically, this Era doesn't exist in the original game. + // But as it is _really_ usefull to have for testing, I'd like to keep it. // The stats are just copy-pasted from the information era. "name": "Future era", "researchAgreementCost": 400, @@ -294,13 +302,14 @@ "settlerBuildings": ["Monument","Granary","Lighthouse","Market","Workshop","Amphitheater","Barracks","Library","Colosseum","Theatre","Bank"], "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "Terracotta Army", "The Oracle", "Petra", "Great Wall", "Colossus", - "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", + "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Alhambra", "Notre Dame", "Sistine Chapel", "Forbidden Palace", "Leaning Tower of Pisa", "Himeji Castle", "Taj Mahal", "Porcelain Tower", "Kremlin", "The Louvre", "Big Ben", "Brandenburg Gate", "Eiffel Tower", "Statue of Liberty", "Neuschwanstein", "Cristo Redentor"], "baseUnitBuyCost": 1000, "embarkDefense": 25, "startPercent": 80, + "citySound": "cityFuture", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -322,4 +331,4 @@ "Starting in this era disables religion" ] } -] \ No newline at end of file +] diff --git a/android/assets/jsons/Civ V - Vanilla/Eras.json b/android/assets/jsons/Civ V - Vanilla/Eras.json index 42dc6efd2b..a730a2ffe8 100644 --- a/android/assets/jsons/Civ V - Vanilla/Eras.json +++ b/android/assets/jsons/Civ V - Vanilla/Eras.json @@ -1,7 +1,7 @@ [ // Source: the fandom, so take these with a grain of salt // I also did some testing in the official version, but by far not all - + { "name": "Ancient era", "researchAgreementCost": 150, @@ -13,6 +13,7 @@ "baseUnitBuyCost": 200, "embarkDefense": 3, "startPercent": 0, + "citySound": "cityAncient", "friendBonus": { "Cultured": ["Provides [+3 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -42,6 +43,7 @@ "baseUnitBuyCost": 200, "embarkDefense": 4, "startPercent": 10, + "citySound": "cityClassical", "friendBonus": { "Cultured": ["Provides [+3 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -73,6 +75,7 @@ "baseUnitBuyCost": 200, "embarkDefense": 6, "startPercent": 25, + "citySound": "cityMedieval", "friendBonus": { "Cultured": ["Provides [+6 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -100,11 +103,12 @@ "startingCulture": 300, "settlerPopulation": 2, "settlerBuildings": ["Monument","Granary","Lighthouse"], - "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", + "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "The Oracle", "Great Wall", "Colossus"], "baseUnitBuyCost": 300, "embarkDefense": 8, "startPercent": 37, + "citySound": "cityRenaissance", "friendBonus": { "Cultured": ["Provides [+6 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -138,6 +142,7 @@ "baseUnitBuyCost": 400, "embarkDefense": 10, "startPercent": 50, + "citySound": "cityIndustrial", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -167,11 +172,12 @@ "settlerBuildings": ["Monument","Granary","Lighthouse","Market","Workshop","Temple","Barracks","Library","Colosseum"], "startingObsoleteWonders": ["Temple of Artemis", "Stonehenge", "The Great Library", "Mausoleum of Halicarnassus", "The Pyramids", "Statue of Zeus", "The Great Lighthouse", "Hanging Gardens", "The Oracle", "Great Wall", "Colossus", - "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Notre Dame", + "Hagia Sophia", "Chichen Itza", "Machu Picchu", "Angkor Wat", "Notre Dame", "Sistine Chapel", "Forbidden Palace", "Himeji Castle", "Taj Mahal", "Porcelain Tower", "Kremlin"], "baseUnitBuyCost": 600, "embarkDefense": 13, "startPercent": 65, + "citySound": "cityModern", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -207,6 +213,7 @@ "baseUnitBuyCost": 800, "embarkDefense": 16, "startPercent": 65, + "citySound": "cityAtomic", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -243,9 +250,10 @@ "baseUnitBuyCost": 1000, "embarkDefense": 20, "startPercent": 80, - // So theoretically this is always just all the wonders at least 2 eras old. So we could just use that. + // So theoretically this is always just all the wonders at least 2 eras old. So we could just use that. // But where is the modularity? The excluding of very specific wonders? That is no fun. // So we just write down the entire long list (sorted by era!) instead. + "citySound": "cityInformation", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], @@ -263,8 +271,8 @@ }, "iconRGB": [76, 176, 81], }, - { // Technically, this Era doesn't exist in the original game. - // But as it is _really_ usefull to have for testing, I'd like to keep it. + { // Technically, this Era doesn't exist in the original game. + // But as it is _really_ usefull to have for testing, I'd like to keep it. // The stats are just copy-pasted from the information era. "name": "Future era", "researchAgreementCost": 400, @@ -285,6 +293,7 @@ "baseUnitBuyCost": 1000, "embarkDefense": 25, "startPercent": 80, + "citySound": "cityFuture", "friendBonus": { "Cultured": ["Provides [+13 Culture] per turn"], "Maritime": ["Provides [+2 Food] [in capital] per turn"], diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 0efc3050db..516bf798c9 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -674,6 +674,7 @@ Visit repository = Turns between autosaves = Sound effects volume = Music volume = +City ambient sound volume = Pause between tracks = Currently playing: [title] = Download music = diff --git a/android/assets/sounds/WLTK.ogg b/android/assets/sounds/WLTK.ogg new file mode 100644 index 0000000000..bf8ebf9c7d Binary files /dev/null and b/android/assets/sounds/WLTK.ogg differ diff --git a/android/assets/sounds/cityAncient.ogg b/android/assets/sounds/cityAncient.ogg new file mode 100644 index 0000000000..847dccfda7 Binary files /dev/null and b/android/assets/sounds/cityAncient.ogg differ diff --git a/android/assets/sounds/cityAtomic.ogg b/android/assets/sounds/cityAtomic.ogg new file mode 100644 index 0000000000..a06f05b359 Binary files /dev/null and b/android/assets/sounds/cityAtomic.ogg differ diff --git a/android/assets/sounds/cityClassical.ogg b/android/assets/sounds/cityClassical.ogg new file mode 100644 index 0000000000..20148bd730 Binary files /dev/null and b/android/assets/sounds/cityClassical.ogg differ diff --git a/android/assets/sounds/cityFuture.ogg b/android/assets/sounds/cityFuture.ogg new file mode 100644 index 0000000000..70e25fad64 Binary files /dev/null and b/android/assets/sounds/cityFuture.ogg differ diff --git a/android/assets/sounds/cityIndustrial.ogg b/android/assets/sounds/cityIndustrial.ogg new file mode 100644 index 0000000000..ad72432cf2 Binary files /dev/null and b/android/assets/sounds/cityIndustrial.ogg differ diff --git a/android/assets/sounds/cityInformation.ogg b/android/assets/sounds/cityInformation.ogg new file mode 100644 index 0000000000..e23984c5f2 Binary files /dev/null and b/android/assets/sounds/cityInformation.ogg differ diff --git a/android/assets/sounds/cityMedieval.ogg b/android/assets/sounds/cityMedieval.ogg new file mode 100644 index 0000000000..b9d0696b36 Binary files /dev/null and b/android/assets/sounds/cityMedieval.ogg differ diff --git a/android/assets/sounds/cityModern.ogg b/android/assets/sounds/cityModern.ogg new file mode 100644 index 0000000000..788fe7cdac Binary files /dev/null and b/android/assets/sounds/cityModern.ogg differ diff --git a/android/assets/sounds/cityRenaissance.ogg b/android/assets/sounds/cityRenaissance.ogg new file mode 100644 index 0000000000..ce122f3dc4 Binary files /dev/null and b/android/assets/sounds/cityRenaissance.ogg differ diff --git a/core/src/com/unciv/UncivGame.kt b/core/src/com/unciv/UncivGame.kt index a29ee1445f..b8dd095c02 100644 --- a/core/src/com/unciv/UncivGame.kt +++ b/core/src/com/unciv/UncivGame.kt @@ -112,11 +112,13 @@ class UncivGame(parameters: UncivGameParameters) : Game() { settings = gameSaver.getGeneralSettings() // needed for the screen setScreen(GameStartScreen()) // NOT dependent on any atlas or skin GameSounds.init() + musicController = MusicController() // early, but at this point does only copy volume from settings audioExceptionHelper?.installHooks( musicController.getAudioLoopCallback(), musicController.getAudioExceptionHandler() ) + onlineMultiplayer = OnlineMultiplayer() ImageGetter.resetAtlases() diff --git a/core/src/com/unciv/models/metadata/GameSettings.kt b/core/src/com/unciv/models/metadata/GameSettings.kt index fb0ebbaa51..d1c9e543dd 100644 --- a/core/src/com/unciv/models/metadata/GameSettings.kt +++ b/core/src/com/unciv/models/metadata/GameSettings.kt @@ -32,6 +32,7 @@ class GameSettings { var hasCrashedRecently = false var soundEffectsVolume = 0.5f + var citySoundsVolume = 0.5f var musicVolume = 0.5f var pauseBetweenTracks = 10 diff --git a/core/src/com/unciv/models/ruleset/Era.kt b/core/src/com/unciv/models/ruleset/Era.kt index 24b637a73a..09ea7d1071 100644 --- a/core/src/com/unciv/models/ruleset/Era.kt +++ b/core/src/com/unciv/models/ruleset/Era.kt @@ -29,6 +29,7 @@ class Era : RulesetObject(), IHasUniques { var baseUnitBuyCost = 200 var embarkDefense = 3 var startPercent = 0 + var citySound = "cityClassical" var friendBonus = HashMap>() var allyBonus = HashMap>() diff --git a/core/src/com/unciv/ui/audio/CityAmbiencePlayer.kt b/core/src/com/unciv/ui/audio/CityAmbiencePlayer.kt new file mode 100644 index 0000000000..f300a2ff41 --- /dev/null +++ b/core/src/com/unciv/ui/audio/CityAmbiencePlayer.kt @@ -0,0 +1,57 @@ +package com.unciv.ui.audio + +import com.badlogic.gdx.Files +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.audio.Music +import com.badlogic.gdx.files.FileHandle +import com.unciv.UncivGame +import com.unciv.logic.city.CityInfo +import com.unciv.utils.Log + +class CityAmbiencePlayer { + private val soundsLocation = Files.FileType.Local + private var playingCitySound: Music? = null + val fileExtensions = listOf("mp3", "ogg", "wav") // All Gdx formats + + private fun getFile(path: String) = + if (soundsLocation == Files.FileType.External && Gdx.files.isExternalStorageAvailable) + Gdx.files.external(path) + else Gdx.files.local(path) + + private fun getSoundFolders() = sequence { + val visualMods = UncivGame.Current.settings.visualMods + val mods = UncivGame.Current.gameInfo!!.gameParameters.getModsAndBaseRuleset() + yieldAll( + (visualMods + mods).asSequence() + .map { getFile("mods") + .child(it).child("sounds") } + ) + yield(getFile("sounds")) + } + + private fun getSoundFile(fileName: String): FileHandle? = getSoundFolders() + .filter { it.exists() && it.isDirectory } + .flatMap { it.list().asSequence() } + // ensure only normal files with common sound extension + .filter { it.exists() && !it.isDirectory && it.extension() in fileExtensions } + .firstOrNull { it.name().contains(fileName) } + + fun play(city: CityInfo) { + if (playingCitySound != null) + stop() + try { + val file = FileHandle(getSoundFile(city.civInfo.getEra().citySound).toString()) + playingCitySound = Gdx.audio.newMusic(file) + playingCitySound?.volume = UncivGame.Current.settings.citySoundsVolume + playingCitySound?.isLooping = true + playingCitySound?.play() + } catch (ex: Throwable) { + playingCitySound?.dispose() + Log.error("Error while playing city sound: ", ex) + } + } + + fun stop() { + playingCitySound?.dispose() + } +} diff --git a/core/src/com/unciv/ui/cityscreen/CityScreen.kt b/core/src/com/unciv/ui/cityscreen/CityScreen.kt index 723afc1034..8c7b204611 100644 --- a/core/src/com/unciv/ui/cityscreen/CityScreen.kt +++ b/core/src/com/unciv/ui/cityscreen/CityScreen.kt @@ -9,12 +9,14 @@ import com.unciv.UncivGame import com.unciv.logic.automation.Automation import com.unciv.logic.city.CityInfo import com.unciv.logic.city.IConstruction -import com.unciv.logic.city.INonPerpetualConstruction import com.unciv.logic.map.TileInfo +import com.unciv.models.UncivSound import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.Stat +import com.unciv.ui.audio.CityAmbiencePlayer +import com.unciv.ui.audio.SoundPlayer import com.unciv.ui.images.ImageGetter import com.unciv.ui.map.TileGroupMap import com.unciv.ui.popup.ToastPopup @@ -23,11 +25,13 @@ import com.unciv.ui.utils.BaseScreen import com.unciv.ui.utils.KeyCharAndCode import com.unciv.ui.utils.RecreateOnResize import com.unciv.ui.utils.ZoomableScrollPane -import com.unciv.ui.utils.extensions.center import com.unciv.ui.utils.extensions.disable +import com.unciv.ui.utils.extensions.keyShortcuts +import com.unciv.ui.utils.extensions.onActivation import com.unciv.ui.utils.extensions.onClick import com.unciv.ui.utils.extensions.packIfNeeded import com.unciv.ui.utils.extensions.toTextButton +import kotlin.collections.ArrayList import com.unciv.ui.worldscreen.WorldScreen class CityScreen( @@ -78,7 +82,11 @@ class CityScreen( /** Button for exiting the city - sits on BOTTOM CENTER */ private val exitCityButton = "Exit city".toTextButton().apply { labelCell.pad(10f) - onClick { exit() } + keyShortcuts.add(KeyCharAndCode.BACK) + onActivation { + exit() + cityAmbiencePlayer.stop() + } } /** Holds City tiles group*/ @@ -108,8 +116,15 @@ class CityScreen( // val should be OK as buying tiles is what changes this, and that would re-create the whole CityScreen private val nextTileToOwn = city.expansion.chooseNewTileToOwn() + private val cityAmbiencePlayer = CityAmbiencePlayer() + init { - globalShortcuts.add(KeyCharAndCode.BACK) { game.popScreen() } + if (city.isWeLoveTheKingDayActive() && UncivGame.Current.settings.citySoundsVolume > 0) { + SoundPlayer.play(UncivSound("WLTK")) + } + if (UncivGame.Current.settings.citySoundsVolume > 0) + cityAmbiencePlayer.play(city) + UncivGame.Current.settings.addCompletedTutorialTask("Enter city screen") addTiles() diff --git a/core/src/com/unciv/ui/options/DisplayTab.kt b/core/src/com/unciv/ui/options/DisplayTab.kt index 1fd6f730da..f2576d48f8 100644 --- a/core/src/com/unciv/ui/options/DisplayTab.kt +++ b/core/src/com/unciv/ui/options/DisplayTab.kt @@ -33,9 +33,7 @@ fun displayTab( optionsPopup.addCheckbox(this, "Show unit movement arrows", settings.showUnitMovements, true) { settings.showUnitMovements = it } optionsPopup.addCheckbox(this, "Show tile yields", settings.showTileYields, true) { settings.showTileYields = it } // JN optionsPopup.addCheckbox(this, "Show worked tiles", settings.showWorkedTiles, true) { settings.showWorkedTiles = it } - optionsPopup.addCheckbox(this, "Show resources and improvements", settings.showResourcesAndImprovements, true) { - settings.showResourcesAndImprovements = it - } + optionsPopup.addCheckbox(this, "Show resources and improvements", settings.showResourcesAndImprovements, true) { settings.showResourcesAndImprovements = it } optionsPopup.addCheckbox(this, "Show tutorials", settings.showTutorials, true) { settings.showTutorials = it } optionsPopup.addCheckbox(this, "Show pixel units", settings.showPixelUnits, true) { settings.showPixelUnits = it } optionsPopup.addCheckbox(this, "Show pixel improvements", settings.showPixelImprovements, true) { settings.showPixelImprovements = it } diff --git a/core/src/com/unciv/ui/options/SoundTab.kt b/core/src/com/unciv/ui/options/SoundTab.kt index 318bc74c9d..a9937b8af3 100644 --- a/core/src/com/unciv/ui/options/SoundTab.kt +++ b/core/src/com/unciv/ui/options/SoundTab.kt @@ -29,6 +29,7 @@ fun soundTab( val music = UncivGame.Current.musicController addSoundEffectsVolumeSlider(this, settings) + addCitySoundsVolumeSlider(this, settings) if (UncivGame.Current.musicController.isMusicAvailable()) { addMusicVolumeSlider(this, settings, music) @@ -84,6 +85,20 @@ private fun addSoundEffectsVolumeSlider(table: Table, settings: GameSettings) { table.add(soundEffectsVolumeSlider).pad(5f).row() } +private fun addCitySoundsVolumeSlider(table: Table, settings: GameSettings) { + table.add("City ambient sound volume".tr()).left().fillX() + + val citySoundVolumeSlider = UncivSlider( + 0f, 1.0f, 0.05f, + initial = settings.citySoundsVolume, + getTipText = UncivSlider::formatPercent + ) { + settings.citySoundsVolume = it + settings.save() + } + table.add(citySoundVolumeSlider).pad(5f).row() +} + private fun addMusicVolumeSlider(table: Table, settings: GameSettings, music: MusicController) { table.add("Music volume".tr()).left().fillX() diff --git a/docs/Credits.md b/docs/Credits.md index d0c46ea318..de3e06c337 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -757,49 +757,55 @@ Unless otherwise specified, all the following are from [the Noun Project](https: Sounds are from FreeSound.org unless otherwise noted and are either Creative Commons or Public Domain unless otherwise noted -- [Soft two-fingered snap](https://freesound.org/people/EathanMarkson/sounds/388958/) By EathanMarkson as 'click' for most clicks -- [Pencil1](https://freesound.org/people/stijn/sounds/43673/) By stijn as 'paper' for opening and closing the tech picker -- [SawInOut01](https://freesound.org/people/kingof_thelab/sounds/340243/) By kingof_thelab for construction picking? -- [Chain Snare #1](https://freesound.org/people/lovesbody/sounds/322079/) By lovesbody as 'fortify' -- [Level up](https://freesound.org/people/Marregheriti/sounds/266100/) By Marregheriti as 'upgrade' for upgrading units -- [levelup](https://freesound.org/people/Seidhepriest/sounds/382915/) By Seidhepriest as 'chimes' for special actions (free tech, build city, hurry wonder etc.) -- [Coin](https://freesound.org/people/TheDJoe93/sounds/97373/) By TheDJoe93 as 'coin' for purchasing tiles and constructions -- [fast simple chop 1](https://freesound.org/people/dave.des/sounds/127196/) By dave.dev as 'whoosh' for moving units around, also in edited form to produce the 'swap units' sound. -- [Military kick](https://freesound.org/people/Dodgy%20C/sounds/72070/) By Dodgy C as 'promote' for unit promotions -- [Tank reload](https://freesound.org/people/KieranKeegan/sounds/418882/) By KieranKeegan as 'setup' for siege unit setup -- [Scribble_short](https://freesound.org/people/waldram/sounds/257518/) By waldram as 'policy' for adopting policies -- [Hit Impact](https://freesound.org/people/Mrguff/sounds/369711/) by Mrguff as 'throw' for catapult & trebuchet attacks -- [Slingshot fly by 2](https://freesound.org/people/saturdaysoundguy/sounds/394186/) by saturdaysoundguy as 'arrow' for arrow attacks -- [Metal hit slide](https://freesound.org/people/orginaljun/sounds/149102/) by orginaljun as 'nonmetalhit' for pre-metal melee sounds -- [klick_anlauf](https://freesound.org/people/jascha/sounds/16576/) By jascha as 'metalhit' for metal melee sounds -- [Horse's whinny](https://freesound.org/people/Kubuzz/sounds/347036/) By Kubuzz as 'horse' for cavalry attack sounds -- [machine gun 001 - loop](https://freesound.org/people/pgi/sounds/212602/) By pgi as 'machinegun' for machine gun attack sound -- [uzzi_full_single](https://freesound.org/people/Deganoth/sounds/348685/) By Deganoth as 'shot' for bullet attacks -- [Grenade Launcher 2](https://soundbible.com/2140-Grenade-Launcher-2.html) By Daniel Simon as city bombard sound (CC Attribution 3.0 license) -- [Woosh](https://soundbible.com/2068-Woosh.html) by Mark DiAngelo as 'slider' sound (CC Attribution 3.0 license) -- [Tornado-Siren-II](https://soundbible.com/1937-Tornado-Siren-II.html) by Delilah as part of 'nuke' sound (CC Attribution 3.0 license) -- [Explosion-Ultra-Bass](https://soundbible.com/1807-Explosion-Ultra-Bass.html) by Mark DiAngelo as part of 'nuke' sound (CC Attribution 3.0 license) -- [Short Choir](https://freesound.org/people/Breviceps/sounds/444491/) by Breviceps as 'choir' for free great person pick -- [Death Robot! Robotic scream](https://freesound.org/people/vultraz168/sounds/334660/) by vultraz168 for Giant Death Robot Attack (CC0 1.0 Universal license) -- [ceremonial cannon fire](https://freesound.org/people/DylanSmithSound/sounds/274826/) by DylanSmithSound for cannon -- [artillery fire](https://freesound.org/people/Tomashevsky/sounds/476664/) by Tomashevsky for artillery -- [20mm cannons](https://freesound.org/people/Piotr123/sounds/551534/) by Piotr123 for ship guns -- "bombing" is made by the Unciv team using Audacity from +- [Soft two-fingered snap](https://freesound.org/people/EathanMarkson/sounds/388958/) By EathanMarkson as 'click' for most clicks +- [Pencil1](https://freesound.org/people/stijn/sounds/43673/) By stijn as 'paper' for opening and closing the tech picker +- [SawInOut01](https://freesound.org/people/kingof_thelab/sounds/340243/) By kingof_thelab for construction picking? +- [Chain Snare #1](https://freesound.org/people/lovesbody/sounds/322079/) By lovesbody as 'fortify' +- [Level up](https://freesound.org/people/Marregheriti/sounds/266100/) By Marregheriti as 'upgrade' for upgrading units +- [levelup](https://freesound.org/people/Seidhepriest/sounds/382915/) By Seidhepriest as 'chimes' for special actions (free tech, build city, hurry wonder etc.) +- [Coin](https://freesound.org/people/TheDJoe93/sounds/97373/) By TheDJoe93 as 'coin' for purchasing tiles and constructions +- [fast simple chop 1](https://freesound.org/people/dave.des/sounds/127196/) By dave.dev as 'whoosh' for moving units around, also in edited form to produce the 'swap units' sound. +- [Military kick](https://freesound.org/people/Dodgy%20C/sounds/72070/) By Dodgy C as 'promote' for unit promotions +- [Tank reload](https://freesound.org/people/KieranKeegan/sounds/418882/) By KieranKeegan as 'setup' for siege unit setup +- [Scribble_short](https://freesound.org/people/waldram/sounds/257518/) By waldram as 'policy' for adopting policies +- [Hit Impact](https://freesound.org/people/Mrguff/sounds/369711/) by Mrguff as 'throw' for catapult & trebuchet attacks +- [Slingshot fly by 2](https://freesound.org/people/saturdaysoundguy/sounds/394186/) by saturdaysoundguy as 'arrow' for arrow attacks +- [Metal hit slide](https://freesound.org/people/orginaljun/sounds/149102/) by orginaljun as 'nonmetalhit' for pre-metal melee sounds +- [klick_anlauf](https://freesound.org/people/jascha/sounds/16576/) By jascha as 'metalhit' for metal melee sounds +- [Horse's whinny](https://freesound.org/people/Kubuzz/sounds/347036/) By Kubuzz as 'horse' for cavalry attack sounds +- [machine gun 001 - loop](https://freesound.org/people/pgi/sounds/212602/) By pgi as 'machinegun' for machine gun attack sound +- [uzzi_full_single](https://freesound.org/people/Deganoth/sounds/348685/) By Deganoth as 'shot' for bullet attacks +- [Grenade Launcher 2](https://soundbible.com/2140-Grenade-Launcher-2.html) By Daniel Simon as city bombard sound (CC Attribution 3.0 license) +- [Woosh](https://soundbible.com/2068-Woosh.html) by Mark DiAngelo as 'slider' sound (CC Attribution 3.0 license) +- [Tornado-Siren-II](https://soundbible.com/1937-Tornado-Siren-II.html) by Delilah as part of 'nuke' sound (CC Attribution 3.0 license) +- [Explosion-Ultra-Bass](https://soundbible.com/1807-Explosion-Ultra-Bass.html) by Mark DiAngelo as part of 'nuke' sound (CC Attribution 3.0 license) +- [Short Choir](https://freesound.org/people/Breviceps/sounds/444491/) by Breviceps as 'choir' for free great person pick +- [Death Robot! Robotic scream](https://freesound.org/people/vultraz168/sounds/334660/) by vultraz168 for Giant Death Robot Attack (CC0 1.0 Universal license) +- [ceremonial cannon fire](https://freesound.org/people/DylanSmithSound/sounds/274826/) by DylanSmithSound for cannon +- [artillery fire](https://freesound.org/people/Tomashevsky/sounds/476664/) by Tomashevsky for artillery +- [20mm cannons](https://freesound.org/people/Piotr123/sounds/551534/) by Piotr123 for ship guns +- "bombing" is made by the Unciv team using Audacity from - [lancaster bomber](https://freesound.org/people/confusion_music/sounds/103439/) by confusion_music - aircraft - [Artillery Explosion (Close) (Mixed)](https://freesound.org/people/EFlexMusic/sounds/388528/) by EFlexMusic - impact - [SFX Hit drop/bomb effect 5](https://freesound.org/people/old_waveplay/sounds/187502/) by old_waveplay - bass -- "jetgun" for Jet Fighter attack is made by the Unciv team using Audacity from +- "jetgun" for Jet Fighter attack is made by the Unciv team using Audacity from - [Fighter Jet Aircraft Fly by (synthesised)](https://freesound.org/people/Headphaze/sounds/347795/) by Headphaze - [Machine Gun 001 - triple shot](https://freesound.org/people/pgi/sounds/212600/) by pgi -- Excerpt from [Tanks Shooting](https://freesound.org/people/qubodup/sounds/189344/) by qubodup for tankshot -- "torpedo" is made by the Unciv team using Audacity from +- Excerpt from [Tanks Shooting](https://freesound.org/people/qubodup/sounds/189344/) by qubodup for tankshot +- "torpedo" is made by the Unciv team using Audacity from - [Torpedo launch underwater](https://freesound.org/people/jobro/sounds/35530/) by jobro - [Artillery Explosion (Close) (Mixed)](https://freesound.org/people/EFlexMusic/sounds/388528/) by EFlexMusic -- [elephant 44](https://freesound.org/people/y89312/sounds/139875/) by y89312 for Naruesan's Elephant sound -- Excerpt from [Missile Strike](https://freesound.org/people/BaDoink/sounds/570690/) by BaDoink for guided missile -- Excerpt from [FireBurning_v2.wav](https://freesound.org/people/pcaeldries/sounds/30322/) by pcaeldries for 'remove heresy' action of inquisitor ([License](http://creativecommons.org/licenses/by/3.0/)) +- [elephant 44](https://freesound.org/people/y89312/sounds/139875/) by y89312 for Naruesan's Elephant sound +- Excerpt from [Missile Strike](https://freesound.org/people/BaDoink/sounds/570690/) by BaDoink for guided missile +- Excerpt from [FireBurning_v2.wav](https://freesound.org/people/pcaeldries/sounds/30322/) by pcaeldries for 'remove heresy' action of inquisitor ([License](http://creativecommons.org/licenses/by/3.0/)) - [Up Chime 2](https://freesound.org/people/FoolBoyMedia/sounds/352666/) by FoolBoyMedia for notifications - [dingaling](https://freesound.org/people/morrisjm/sounds/268756/) by morrisjm (based on [Calling_Bell_02.wav](https://freesound.org/people/RSilveira_88/sounds/216306/) by RSilveira_88) for notifications +- City ambience sounds made by Unciv Team using Audacity from CC0 sounds and + - [Street Musician Playing Renaissance Melody on Glockenspiel](https://freesound.org/people/_MC5_/sounds/542107/) by MC5 for Renaissance city sound + - [Ambience, Machine Factory](https://freesound.org/people/InspectorJ/sounds/385943/) by InspectorJ for Industrial city sound + - [Rock_Hammer_Chisel_01](https://freesound.org/people/dheming/sounds/240981/#) by dheming for Ancient city sound + - [Future City ambience](https://freesound.org/people/bolkmar/sounds/502896/) by bolkmar for Future city sound + - [Jingle_Achievement](https://freesound.org/people/LittleRobotSoundFactory/sounds/270404/) by LittleRobotSoundFactory for We Love The King sound ## Music