Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New options control over Animations #12050

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions android/assets/jsons/translations/template.properties
Original file line number Diff line number Diff line change
Expand Up @@ -811,11 +811,11 @@ Show pixel units =
Show pixel improvements =
Unit icon opacity =

### Performance subgroup

Performance =
Continuous rendering =
When disabled, saves battery life but certain animations will be suspended =
### Animations subgroup
Animations =
Animation level =
Some =
Expert =

## Gameplay tab
Gameplay =
Expand Down
2 changes: 1 addition & 1 deletion core/src/com/unciv/UncivGame.kt
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ open class UncivGame(val isConsoleMode: Boolean = false) : Game(), PlatformSpeci
settings.tileSet = Constants.defaultTileset
}

Gdx.graphics.isContinuousRendering = settings.continuousRendering
Gdx.graphics.isContinuousRendering = false

Concurrency.run("LoadJSON") {
RulesetCache.loadRulesets()
Expand Down
73 changes: 72 additions & 1 deletion core/src/com/unciv/models/metadata/GameSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.unciv.models.metadata
import com.badlogic.gdx.Application.ApplicationType
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.utils.Base64Coder
import com.badlogic.gdx.utils.Json
import com.badlogic.gdx.utils.JsonValue
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.logic.multiplayer.FriendList
Expand All @@ -19,7 +21,9 @@ import com.unciv.utils.ScreenOrientation
import java.text.Collator
import java.text.NumberFormat
import java.time.Duration
import java.util.EnumSet
import java.util.Locale
import kotlin.enums.EnumEntries
import kotlin.reflect.KClass
import kotlin.reflect.KMutableProperty0

Expand Down Expand Up @@ -79,7 +83,11 @@ class GameSettings {
var unitIconOpacity = 1f // default corresponds to fully opaque
val showPixelUnits: Boolean get() = unitSet != null
var showPixelImprovements: Boolean = true
var continuousRendering = false

@Deprecated("Since 4.12.15", ReplaceWith("GameSettings.Animations.X in enabledAnimations"))
var continuousRendering: Boolean? = null
val enabledAnimations = EnabledAnimations()

var orderTradeOffersByAmount = true
var confirmNextTurn = false
var windowState = WindowState()
Expand Down Expand Up @@ -320,6 +328,69 @@ class GameSettings {
Zulu("zu", "ZA")
}

enum class Animations(val label: String) {
Expanders("Expander arrows"),
Loading("Loading animation"),
SelectedUnit("Selected unit flag"),
HealthBar("Battle healthbar damage"),
AttackSprite("Attack unit sprite"),
FlashDamageRed("Flash damaged unit red"),
DamageNumbers("Damage numbers"),
WLTKFireworks("WLTK fireworks"),
NukeExplosion("Nuke explosion"),
MovementPath("Unit movement")
}

/** Wrapper for a `EnumSet<Animations>` set to allow Json serialization as json-array */
// Would be nice to make this a `MutableSet<Animations> by set` but then Gdx ignores the Serializable interface, as it erroneously tests ClassReflection.isAssignableFrom(Collection.class) first
class EnabledAnimations() : Json.Serializable {
private val set: EnumSet<Animations> = EnumSet.noneOf(Animations::class.java)

constructor(entries: EnumEntries<Animations>) : this() { set.addAll(entries) }
constructor(entries: Array<out Animations>) : this() { set.addAll(entries) }

fun setLevel(from: AnimationLevels) {
set.clear()
set.addAll(from.animations.set)
}
operator fun get(entry: Animations) = entry in set
operator fun set(entry: Animations, value: Boolean) {
if (value) set += entry else set -= entry
}
operator fun contains(entry: Animations) = entry in set
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is EnabledAnimations) return false
return set == other.set
}
override fun hashCode() = set.hashCode()

override fun write(json: Json) {
json.writeArrayStart("items")
for (entry in set) json.writeValue(entry.name)
json.writeArrayEnd()
}
override fun read(json: Json, jsonData: JsonValue) {
val array = jsonData.get("items")
if (array?.isArray != true) return
var child = array.child
while (child != null) {
set.add(json.readValue(Animations::class.java, null, child))
child = child.next
}
}

companion object {
fun of(vararg entries: Animations) = EnabledAnimations(entries)
}
}

enum class AnimationLevels(val animations: EnabledAnimations) {
None(EnabledAnimations()),
Some(EnabledAnimations.of(Animations.Expanders, Animations.Loading, Animations.HealthBar, Animations.SelectedUnit, Animations.DamageNumbers, Animations.FlashDamageRed)),
All(EnabledAnimations(Animations.entries))
}

//endregion
//region Multiplayer-specific

Expand Down
6 changes: 5 additions & 1 deletion core/src/com/unciv/models/metadata/GameSettingsMigrations.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ private const val CURRENT_VERSION = 2
fun GameSettings.doMigrations(json: JsonValue) {
if (version == null) {
migrateMultiplayerSettings(json)
version = 1
}
if (continuousRendering != null) {
enabledAnimations.setLevel(if (continuousRendering!!) GameSettings.AnimationLevels.All else GameSettings.AnimationLevels.None)
continuousRendering = null
}
version = CURRENT_VERSION
}

fun GameSettings.isMigrationNecessary(): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.unciv.json.json
import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers
import com.unciv.models.SpyAction
import com.unciv.models.metadata.BaseRuleset
import com.unciv.models.metadata.GameSettings
import com.unciv.models.metadata.GameSettings.LocaleCode
import com.unciv.models.ruleset.Belief
import com.unciv.models.ruleset.Building
Expand Down Expand Up @@ -139,6 +140,10 @@ object TranslationFileWriter {
for (bindingLabel in KeyboardBinding.getTranslationEntries())
linesToTranslate += "$bindingLabel = "

linesToTranslate += "\n\n#################### Lines from animation settings #######################\n"
for (animation in GameSettings.Animations.entries)
linesToTranslate += "${animation.label} = "

for (baseRuleset in BaseRuleset.entries) {
val generatedStringsFromBaseRuleset =
GenerateStringsFromJSONs(UncivGame.Current.files.getLocalFile("jsons/${baseRuleset.fullName}"))
Expand Down
4 changes: 3 additions & 1 deletion core/src/com/unciv/ui/components/ParticleEffectAnimation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.badlogic.gdx.scenes.scene2d.Stage
import com.badlogic.gdx.utils.Array
import com.badlogic.gdx.utils.Disposable
import com.unciv.UncivGame
import com.unciv.models.metadata.GameSettings
import com.unciv.ui.images.ImageGetter

/** Hosts one template ParticleEffect and any number of clones, and each can travel linearly over part of its lifetime.
Expand All @@ -28,7 +29,8 @@ abstract class ParticleEffectAnimation : Disposable {
const val defaultAtlasName = "ConstructionIcons"

fun isEnabled(game: UncivGame, atlasName: String = defaultAtlasName) =
game.settings.continuousRendering && ImageGetter.getSpecificAtlas(atlasName) != null
GameSettings.Animations.WLTKFireworks in game.settings.enabledAnimations &&
ImageGetter.getSpecificAtlas(atlasName) != null

private val halfPoint = Vector2(0.5f, 0.5f)
}
Expand Down
5 changes: 3 additions & 2 deletions core/src/com/unciv/ui/components/widgets/ExpanderTab.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.utils.Align
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.GUI
import com.unciv.models.metadata.GameSettings
import com.unciv.ui.components.extensions.toLabel
import com.unciv.ui.components.input.KeyboardBinding
import com.unciv.ui.components.input.keyShortcuts
Expand Down Expand Up @@ -108,7 +109,7 @@ class ExpanderTab(
private fun update(noAnimation: Boolean = false) {
if (persistenceID != null)
persistedStates[persistenceID] = isOpen
if (noAnimation || !UncivGame.Current.settings.continuousRendering) {
if (noAnimation || GameSettings.Animations.Expanders !in GUI.getSettings().enabledAnimations) {
contentWrapper.clear()
if (isOpen) contentWrapper.add(innerTable)
headerIcon.rotation = if (isOpen) 90f else 180f
Expand Down
6 changes: 2 additions & 4 deletions core/src/com/unciv/ui/components/widgets/LoadingImage.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
@file:OptIn(ExperimentalTime::class)

package com.unciv.ui.components.widgets

import com.badlogic.gdx.graphics.Color
Expand All @@ -13,6 +11,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup
import com.badlogic.gdx.utils.Align
import com.badlogic.gdx.utils.Disposable
import com.unciv.GUI
import com.unciv.models.metadata.GameSettings
import com.unciv.ui.components.extensions.center
import com.unciv.ui.components.extensions.setSize
import com.unciv.ui.components.input.onChange
Expand All @@ -21,7 +20,6 @@ import com.unciv.ui.components.widgets.LoadingImage.Style
import com.unciv.ui.images.ImageGetter
import com.unciv.ui.screens.basescreen.BaseScreen
import kotlin.math.absoluteValue
import kotlin.time.ExperimentalTime
import kotlin.time.TimeMark
import kotlin.time.TimeSource

Expand All @@ -48,7 +46,7 @@ class LoadingImage(
private val circle: Image?
private val idleIcon: Image?
private val loadingIcon: Image
var animated = GUI.getSettings().continuousRendering
var animated = GameSettings.Animations.Loading in GUI.getSettings().enabledAnimations
private var loadingStarted: TimeMark? = null
//endregion

Expand Down
3 changes: 2 additions & 1 deletion core/src/com/unciv/ui/components/widgets/UnitIconGroup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.badlogic.gdx.utils.Align
import com.unciv.GUI
import com.unciv.UncivGame
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.models.metadata.GameSettings
import com.unciv.ui.components.extensions.addToCenter
import com.unciv.ui.components.extensions.centerX
import com.unciv.ui.components.extensions.colorFromRGB
Expand Down Expand Up @@ -216,7 +217,7 @@ class UnitIconGroup(val unit: MapUnit, val size: Float) : Group() {
flagBg.color.a = alpha
flagSelection.color.a = opacity

if (GUI.getSettings().continuousRendering) {
if (GameSettings.Animations.SelectedUnit in GUI.getSettings().enabledAnimations) {
flagSelection.color.a = opacity
flagSelection.addAction(
Actions.repeat(
Expand Down
Loading
Loading