Constants.minimumMovementEpsilon cleanup (#6285)

This commit is contained in:
SomeTroglodyte
2022-03-08 13:18:57 +01:00
committed by GitHub
parent deafc96d82
commit 6391a5c881
4 changed files with 15 additions and 12 deletions

View File

@ -58,10 +58,15 @@ object Constants {
const val rising = "Rising" const val rising = "Rising"
const val lowering = "Lowering" const val lowering = "Lowering"
const val remove = "Remove " const val remove = "Remove "
const val uniqueOrDelimiter = "\" OR \"" const val uniqueOrDelimiter = "\" OR \""
const val minimumMovementEpsilon = 0.05 /**
* Use this to determine whether a [MapUnit][com.unciv.logic.map.MapUnit]'s movement is exhausted
* (currentMovement <= this) if and only if a fuzzy comparison is needed to account for Float rounding errors.
* _Most_ checks do compare to 0!
*/
const val minimumMovementEpsilon = 0.05f // 0.1f was used previously, too - here for global searches
const val defaultFontSize = 18 const val defaultFontSize = 18
const val headingFontSize = 24 const val headingFontSize = 24
} }

View File

@ -1,5 +1,6 @@
package com.unciv.logic.automation package com.unciv.logic.automation
import com.unciv.Constants
import com.unciv.logic.battle.Battle import com.unciv.logic.battle.Battle
import com.unciv.logic.battle.BattleDamage import com.unciv.logic.battle.BattleDamage
import com.unciv.logic.battle.ICombatant import com.unciv.logic.battle.ICombatant
@ -54,11 +55,6 @@ object BattleHelper {
val rangeOfAttack = unit.getRange() val rangeOfAttack = unit.getRange()
val attackableTiles = ArrayList<AttackableTile>() val attackableTiles = ArrayList<AttackableTile>()
// The >0.1 (instead of >0) solves a bug where you've moved 2/3 road tiles,
// you come to move a third (distance is less that remaining movements),
// and then later we round it off to a whole.
// So the poor unit thought it could attack from the tile, but when it comes to do so it has no movement points!
// Silly floats, basically
val unitMustBeSetUp = unit.hasUnique(UniqueType.MustSetUp) val unitMustBeSetUp = unit.hasUnique(UniqueType.MustSetUp)
val tilesToAttackFrom = if (stayOnTile || unit.baseUnit.movesLikeAirUnits()) val tilesToAttackFrom = if (stayOnTile || unit.baseUnit.movesLikeAirUnits())
@ -75,8 +71,8 @@ object BattleHelper {
unit.currentMovement - distance.totalDistance - movementPointsToExpendBeforeAttack unit.currentMovement - distance.totalDistance - movementPointsToExpendBeforeAttack
Pair(tile, movementLeft) Pair(tile, movementLeft)
} }
// still got leftover movement points after all that, to attack (0.1 is because of Float nonsense, see MapUnit.moveToTile(...) // still got leftover movement points after all that, to attack
.filter { it.second > 0.1f } .filter { it.second > Constants.minimumMovementEpsilon }
.filter { .filter {
it.first == unit.getTile() || unit.movement.canMoveTo(it.first) it.first == unit.getTile() || unit.movement.canMoveTo(it.first)
} }

View File

@ -2,6 +2,7 @@ package com.unciv.ui.overviewscreen
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.unciv.Constants
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.pickerscreens.PromotionPickerScreen import com.unciv.ui.pickerscreens.PromotionPickerScreen
@ -77,7 +78,7 @@ class UnitOverviewTable(
for (unit in viewingPlayer.getCivUnits().sortedWith( for (unit in viewingPlayer.getCivUnits().sortedWith(
compareBy({ it.displayName() }, compareBy({ it.displayName() },
{ !it.due }, { !it.due },
{ it.currentMovement < 0.1f }, { it.currentMovement <= Constants.minimumMovementEpsilon },
{ abs(it.currentTile.position.x) + abs(it.currentTile.position.y) }) { abs(it.currentTile.position.x) + abs(it.currentTile.position.y) })
)) { )) {
val baseUnit = unit.baseUnit() val baseUnit = unit.baseUnit()

View File

@ -13,6 +13,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Button
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.utils.Align import com.badlogic.gdx.utils.Align
import com.unciv.Constants
import com.unciv.UncivGame import com.unciv.UncivGame
import com.unciv.logic.GameInfo import com.unciv.logic.GameInfo
import com.unciv.logic.GameSaver import com.unciv.logic.GameSaver
@ -791,7 +792,7 @@ class WorldScreen(val gameInfo: GameInfo, val viewingCiv:CivilizationInfo) : Bas
} }
!viewingCiv.hasMovedAutomatedUnits && viewingCiv.getCivUnits() !viewingCiv.hasMovedAutomatedUnits && viewingCiv.getCivUnits()
.any { it.currentMovement >= 0.1f && (it.isMoving() || it.isAutomated() || it.isExploring()) } -> .any { it.currentMovement > Constants.minimumMovementEpsilon && (it.isMoving() || it.isAutomated() || it.isExploring()) } ->
NextTurnAction("Move automated units", Color.LIGHT_GRAY) { NextTurnAction("Move automated units", Color.LIGHT_GRAY) {
viewingCiv.hasMovedAutomatedUnits = true viewingCiv.hasMovedAutomatedUnits = true
isPlayersTurn = false // Disable state changes isPlayersTurn = false // Disable state changes