diff --git a/Credits.md b/Credits.md index 18abbe00e2..699d2c599e 100644 --- a/Credits.md +++ b/Credits.md @@ -392,7 +392,11 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc # Sound credits -Sounds are from FreeSound.org +Sounds are from FreeSound.org and are either Creative Commons or Public Domain * [Click 01_Minimal UI Sounds](https://freesound.org/people/cabled_mess/sounds/370962/) By cabled_mess for most clicks -* [SawInOut01](https://freesound.org/people/kingof_thelab/sounds/340243/) By kingof_thelab for construction picking? \ No newline at end of file +* [Pencil1](https://freesound.org/people/stijn/sounds/43673/) By stijn 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 for Fortify +* [Level up](https://freesound.org/people/Marregheriti/sounds/266100/) By Marregheriti for Promote action +* [levelup](https://freesound.org/people/Seidhepriest/sounds/382915/) By Seidhepriest for special actions (free tech, build city, hhurry wonder etc. \ No newline at end of file diff --git a/android/assets/sounds/chimes.mp3 b/android/assets/sounds/chimes.mp3 new file mode 100644 index 0000000000..dd67c8c946 Binary files /dev/null and b/android/assets/sounds/chimes.mp3 differ diff --git a/android/assets/sounds/fortify.mp3 b/android/assets/sounds/fortify.mp3 new file mode 100644 index 0000000000..663de06360 Binary files /dev/null and b/android/assets/sounds/fortify.mp3 differ diff --git a/android/assets/sounds/paper.mp3 b/android/assets/sounds/paper.mp3 new file mode 100644 index 0000000000..a420a4dca1 Binary files /dev/null and b/android/assets/sounds/paper.mp3 differ diff --git a/android/assets/sounds/promote.mp3 b/android/assets/sounds/promote.mp3 new file mode 100644 index 0000000000..dc37388e5a Binary files /dev/null and b/android/assets/sounds/promote.mp3 differ diff --git a/core/src/com/unciv/ui/cityscreen/CityScreen.kt b/core/src/com/unciv/ui/cityscreen/CityScreen.kt index 3e3fc9140f..f9271b99ac 100644 --- a/core/src/com/unciv/ui/cityscreen/CityScreen.kt +++ b/core/src/com/unciv/ui/cityscreen/CityScreen.kt @@ -163,31 +163,35 @@ class CityScreen(internal val city: CityInfo) : CameraStageBaseScreen() { val tilesInRange = city.getTilesInRange() // this needs to happen on update, because we can buy tiles, which changes the definition of the bought tiles... - if (tileInfo.getCity()!=city) { // outside of city - if(city.canAcquireTile(tileInfo)){ - tileGroup.addAcquirableIcon() - tileGroup.yieldGroup.isVisible = false - } else { - tileGroup.setColor(0f, 0f, 0f, 0.3f) + var shouldToggleTilesWorked = false + when { + tileInfo.getCity()!=city -> // outside of city + if(city.canAcquireTile(tileInfo)){ + tileGroup.addAcquirableIcon() + tileGroup.yieldGroup.isVisible = false + } else { + tileGroup.setColor(0f, 0f, 0f, 0.3f) + tileGroup.yieldGroup.isVisible = false + } + + tileInfo !in tilesInRange -> // within city but not close enough to be workable tileGroup.yieldGroup.isVisible = false + + !tileInfo.isCityCenter() && tileGroup.populationImage==null -> { // workable + tileGroup.addPopulationIcon() + shouldToggleTilesWorked=true } - } else if(tileInfo !in tilesInRange){ // within city but not close enough to be workable - tileGroup.yieldGroup.isVisible = false } - else if (!tileInfo.isCityCenter() && tileGroup.populationImage==null) { // workable - tileGroup.addPopulationIcon() - tileGroup.onClick { + tileGroup.onClick { + selectedTile = tileInfo + if (shouldToggleTilesWorked) { if (!tileInfo.isWorked() && city.population.getFreePopulation() > 0) city.workedTiles.add(tileInfo.position) else if (tileInfo.isWorked()) city.workedTiles.remove(tileInfo.position) city.cityStats.update() - update() } + update() } - tileGroup.onClick { - selectedTile = tileInfo - update() - } val positionalVector = HexMath().hex2WorldCoords(tileInfo.position.cpy().sub(cityInfo.location)) diff --git a/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt index 02cedefa5b..7bf7a4118b 100644 --- a/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/PromotionPickerScreen.kt @@ -17,7 +17,7 @@ class PromotionPickerScreen(mapUnit: MapUnit) : PickerScreen() { init { onBackButtonClicked { UnCivGame.Current.setWorldScreen(); dispose() } rightSideButton.setText("Pick promotion") - rightSideButton.onClick { + rightSideButton.onClick("promote") { mapUnit.promotions.addPromotion(selectedPromotion!!.name) if(mapUnit.promotions.canBePromoted()) game.screen = PromotionPickerScreen(mapUnit) else game.setWorldScreen() diff --git a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt index 43c1de14bf..947e01094c 100644 --- a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt @@ -77,11 +77,10 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen() setButtonsInfo() rightSideButton.setText("Pick a tech".tr()) - rightSideButton.onClick { - if (isFreeTechPick) { - civTech.getFreeTechnology(selectedTech!!.name) - } else - civTech.techsToResearch = tempTechsToResearch + rightSideButton.onClick("paper") { + if (isFreeTechPick) civTech.getFreeTechnology(selectedTech!!.name) + else civTech.techsToResearch = tempTechsToResearch + game.setWorldScreen() game.worldScreen.shouldUpdate=true dispose() diff --git a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt index b790a567ad..29501ec721 100644 --- a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt +++ b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt @@ -122,16 +122,23 @@ fun Label.setFontSize(size:Int): Label { return this // for chaining } + + // If there are other buttons that require special clicks then we'll have an onclick that will accept a string parameter, no worries -fun Actor.onClick(function: () -> Unit) { + +fun Actor.onClick(sound:String,function: () -> Unit){ this.addListener(object : ClickListener() { override fun clicked(event: InputEvent?, x: Float, y: Float) { - Sounds.play("click") + Sounds.play(sound) function() } } ) } +fun Actor.onClick(function: () -> Unit) { + onClick("click",function) +} + fun Actor.surroundWithCircle(size:Float): IconCircleGroup { return IconCircleGroup(size,this) } diff --git a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt index f6781ba238..74ec188477 100644 --- a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt +++ b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt @@ -43,7 +43,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: for (tileInfo in tileMap.values) { val tileGroup = WorldTileGroup(tileInfo) - tileGroup.onClick{ onTileClicked(tileInfo, tileGroup)} + tileGroup.onClick{ onTileClicked(tileInfo)} val positionalVector = HexMath().hex2WorldCoords(tileInfo.position) val groupSize = 50 @@ -93,7 +93,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: }) } - private fun onTileClicked(tileInfo: TileInfo, tileGroup: WorldTileGroup) { + private fun onTileClicked(tileInfo: TileInfo) { worldScreen.displayTutorials("TileClicked") if (moveToOverlay != null) moveToOverlay!!.remove() selectedTile = tileInfo diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt index f8a6e447c9..178aa4b461 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt @@ -54,7 +54,7 @@ class WorldScreen : CameraStageBaseScreen() { tileMapHolder.addTiles() techButton.touchable=Touchable.enabled - techButton.onClick { + techButton.onClick("paper") { game.screen = TechPickerScreen(civInfo) } diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index e7139f956b..a14a34f523 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -17,7 +17,10 @@ import com.unciv.ui.worldscreen.optionstable.YesNoPopupTable import java.util.* import kotlin.math.max -class UnitAction(var name: String, var canAct:Boolean, var action:()->Unit) +class UnitAction(var name: String, var canAct:Boolean, var action:()->Unit){ + var sound="click" + fun sound(soundName:String): UnitAction {sound=soundName; return this} +} class UnitActions { @@ -44,7 +47,8 @@ class UnitActions { if(!unit.type.isCivilian() && !unit.isEmbarked() && !unit.type.isWaterUnit() && !unit.hasUnique("No defensive terrain bonus") && !unit.isFortified()) { - actionList += UnitAction("Fortify", unit.currentMovement != 0f) { unit.action = "Fortify 0" } + actionList += UnitAction("Fortify", unit.currentMovement != 0f) + { unit.action = "Fortify 0" }.sound("fortify") } if(!unit.isFortified() && actionList.none{it.name=="Fortify"} && unit.action!="Sleep") { @@ -61,7 +65,7 @@ class UnitActions { if(!unit.type.isCivilian() && unit.promotions.canBePromoted()) { actionList += UnitAction("Promote", unit.currentMovement != 0f) - { UnCivGame.Current.screen = PromotionPickerScreen(unit) } + { UnCivGame.Current.screen = PromotionPickerScreen(unit) }.sound("promote") } if(unit.baseUnit().upgradesTo!=null && tile.getOwner()==unit.civInfo) { @@ -87,7 +91,7 @@ class UnitActions { newunit.promotions = unit.promotions newunit.updateUniques() newunit.currentMovement = 0f - } + }.sound("promote") } } @@ -106,7 +110,7 @@ class UnitActions { tile.improvement = null unitTable.currentlyExecutingAction = null // In case the settler was in the middle of doing something and we then founded a city with it unit.destroy() - } + }.sound("chimes") } if (unit.hasUnique("Can build improvements on tiles") && !unit.isEmbarked()) { @@ -143,7 +147,7 @@ class UnitActions { val improvementName = unique.replace("Can build improvement: ","") actionList += UnitAction("Create [$improvementName]", unit.currentMovement != 0f && !tile.isCityCenter(), - constructImprovementAndDestroyUnit(unit, improvementName)) + constructImprovementAndDestroyUnit(unit, improvementName)).sound("chimes") } @@ -153,7 +157,7 @@ class UnitActions { unit.civInfo.tech.freeTechs += 1 unit.destroy() worldScreen.game.screen = TechPickerScreen(true, unit.civInfo) - } + }.sound("chimes") } if (unit.name == "Great Artist" && !unit.isEmbarked()) { @@ -161,7 +165,7 @@ class UnitActions { ) { unit.civInfo.goldenAges.enterGoldenAge() unit.destroy() - } + }.sound("chimes") } if (unit.name == "Great Engineer" && !unit.isEmbarked()) { @@ -173,7 +177,7 @@ class UnitActions { ) { tile.getCity()!!.cityConstructions.addProduction(300 + 30 * tile.getCity()!!.population.population) //http://civilization.wikia.com/wiki/Great_engineer_(Civ5) unit.destroy() - } + }.sound("chimes") } if (unit.name == "Great Merchant" && !unit.isEmbarked()) { @@ -184,7 +188,7 @@ class UnitActions { unit.civInfo.gold += goldGained unit.civInfo.addNotification("Your trade mission has earned you [$goldGained] gold!",null, Color.GOLD) unit.destroy() - } + }.sound("chimes") } actionList += UnitAction("Disband unit",unit.currentMovement != 0f diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt index 36f54dafac..c08a6b8c91 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActionsTable.kt @@ -63,7 +63,7 @@ class UnitActionsTable(val worldScreen: WorldScreen) : Table(){ actionButton.add(Label(unitAction.name.tr(),CameraStageBaseScreen.skin).setFontColor(Color.WHITE)) .pad(5f) actionButton.pack() - actionButton.onClick { unitAction.action(); UnCivGame.Current.worldScreen.shouldUpdate=true } + actionButton.onClick(unitAction.sound) { unitAction.action(); UnCivGame.Current.worldScreen.shouldUpdate=true } if (!unitAction.canAct) actionButton.disable() return actionButton }