mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-27 22:06:05 -04:00
CityScreen plays a sound when opened (#7163)
* added sounds to cityScreen * changes? ..don't know how to name this commit * removed try block * improved era1 sound and added slider for city enter sounds * added Information Era sound * added Future Era sound * better option name + translation * added Atomic Era sound * normalized sounds * prevent spam + better era 0 and 1 sounds * cleanup * sound improvements to medieval and atomic * volume now tied to sound effects * improved information sound * improved future sound * sounds now stop if you exit the city screen * improved Renaissance sound * now in separate function * now using the music controller * better file names * WLTK day sound + sounds are now configurable in Eras.json * removed redundant setting and fixed comment * added PlaySingle * musicController no longer used * Gdx.audio.newMusic is now used * function name * function are now in their own class * CitySoundPlayer now has 1 instance in UncivGame and is hooked * credits * sounds loop * loopable sounds * updated credits * fixed sound not stopping when changing city without leaving cityScreen * changed WLTKNew sound * added toggle for the sounds * changed WLTK sound, removed music and made all tracks have the same volume * addressed some of the issues * addressed more issues * increased sounds volume + volume slider * made WLTK sound slightly quieter * removed entry from Vanilla eras * revert back to CitySoundPlayer.kt * no more hooks * removed unused stuff * changees * completly reverted MusicController * and the MusicTrackChooserFlags * fixed ESC not stopping sounds * updated credits to mention the sounds are modified * dispose() * removed try block
This commit is contained in:
parent
7de3fdf452
commit
8f53262fc4
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -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"],
|
||||
|
@ -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 =
|
||||
|
BIN
android/assets/sounds/WLTK.ogg
Normal file
BIN
android/assets/sounds/WLTK.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityAncient.ogg
Normal file
BIN
android/assets/sounds/cityAncient.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityAtomic.ogg
Normal file
BIN
android/assets/sounds/cityAtomic.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityClassical.ogg
Normal file
BIN
android/assets/sounds/cityClassical.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityFuture.ogg
Normal file
BIN
android/assets/sounds/cityFuture.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityIndustrial.ogg
Normal file
BIN
android/assets/sounds/cityIndustrial.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityInformation.ogg
Normal file
BIN
android/assets/sounds/cityInformation.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityMedieval.ogg
Normal file
BIN
android/assets/sounds/cityMedieval.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityModern.ogg
Normal file
BIN
android/assets/sounds/cityModern.ogg
Normal file
Binary file not shown.
BIN
android/assets/sounds/cityRenaissance.ogg
Normal file
BIN
android/assets/sounds/cityRenaissance.ogg
Normal file
Binary file not shown.
@ -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()
|
||||
|
@ -32,6 +32,7 @@ class GameSettings {
|
||||
var hasCrashedRecently = false
|
||||
|
||||
var soundEffectsVolume = 0.5f
|
||||
var citySoundsVolume = 0.5f
|
||||
var musicVolume = 0.5f
|
||||
var pauseBetweenTracks = 10
|
||||
|
||||
|
@ -29,6 +29,7 @@ class Era : RulesetObject(), IHasUniques {
|
||||
var baseUnitBuyCost = 200
|
||||
var embarkDefense = 3
|
||||
var startPercent = 0
|
||||
var citySound = "cityClassical"
|
||||
|
||||
var friendBonus = HashMap<String, List<String>>()
|
||||
var allyBonus = HashMap<String, List<String>>()
|
||||
|
57
core/src/com/unciv/ui/audio/CityAmbiencePlayer.kt
Normal file
57
core/src/com/unciv/ui/audio/CityAmbiencePlayer.kt
Normal file
@ -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()
|
||||
}
|
||||
}
|
@ -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()
|
||||
|
@ -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 }
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user