Merge remote-tracking branch 'origin/master'

This commit is contained in:
yairm210 2021-10-19 21:25:57 +03:00
commit 21925b920b
6 changed files with 41 additions and 29 deletions

View File

@ -38,7 +38,7 @@ object BattleHelper {
stayOnTile: Boolean = false
): ArrayList<AttackableTile> {
val tilesWithEnemies = (tilesToCheck ?: unit.civInfo.viewableTiles)
.filter { containsAttackableEnemy(it, MapUnitCombatant(unit)) }
.filter { containsAttackableEnemy(it, MapUnitCombatant(unit)) }
val rangeOfAttack = unit.getRange()
@ -50,27 +50,36 @@ object BattleHelper {
// Silly floats, basically
val unitMustBeSetUp = unit.hasUnique("Must set up to ranged attack")
val tilesToAttackFrom = if (stayOnTile || unit.baseUnit.movesLikeAirUnits()) sequenceOf(unit.currentTile)
val tilesToAttackFrom = if (stayOnTile || unit.baseUnit.movesLikeAirUnits())
sequenceOf(Pair(unit.currentTile, unit.currentMovement))
else
unitDistanceToTiles.asSequence()
.filter {
val movementPointsToExpendAfterMovement = if (unitMustBeSetUp) 1 else 0
val movementPointsToExpendHere = if (unitMustBeSetUp && !unit.isSetUpForSiege()) 1 else 0
val movementPointsToExpendBeforeAttack = if (it.key == unit.currentTile) movementPointsToExpendHere else movementPointsToExpendAfterMovement
unit.currentMovement - it.value.totalDistance - movementPointsToExpendBeforeAttack > 0.1
} // still got leftover movement points after all that, to attack (0.1 is because of Float nonsense, see MapUnit.moveToTile(...)
.map { it.key }
.filter { unit.movement.canMoveTo(it) || it == unit.getTile() }
.map {
val tile = it.key
val movementPointsToExpendAfterMovement = if (unitMustBeSetUp) 1 else 0
val movementPointsToExpendHere =
if (unitMustBeSetUp && !unit.isSetUpForSiege()) 1 else 0
val movementPointsToExpendBeforeAttack =
if (it.key == unit.currentTile) movementPointsToExpendHere else movementPointsToExpendAfterMovement
val movementLeft =
unit.currentMovement - it.value.totalDistance - movementPointsToExpendBeforeAttack
Pair(tile, movementLeft)
}
// still got leftover movement points after all that, to attack (0.1 is because of Float nonsense, see MapUnit.moveToTile(...)
.filter { it.second > 0.1f }
.filter {
it.first == unit.getTile() || unit.movement.canMoveTo(it.first)
}
for (reachableTile in tilesToAttackFrom) { // tiles we'll still have energy after we reach there
for ((reachableTile, movementLeft) in tilesToAttackFrom) { // tiles we'll still have energy after we reach there
val tilesInAttackRange =
if (unit.hasUnique("Ranged attacks may be performed over obstacles") || unit.baseUnit.movesLikeAirUnits())
reachableTile.getTilesInDistance(rangeOfAttack)
else reachableTile.getViewableTilesList(rangeOfAttack)
.asSequence()
if (unit.hasUnique("Ranged attacks may be performed over obstacles") || unit.baseUnit.movesLikeAirUnits())
reachableTile.getTilesInDistance(rangeOfAttack)
else reachableTile.getViewableTilesList(rangeOfAttack)
.asSequence()
attackableTiles += tilesInAttackRange.filter { it in tilesWithEnemies }
.map { AttackableTile(reachableTile, it) }
.map { AttackableTile(reachableTile, it, movementLeft) }
}
return attackableTiles
}

View File

@ -372,15 +372,13 @@ object Battle {
}
private fun postBattleAddXp(attacker: ICombatant, defender: ICombatant) {
if (attacker.isMelee()) {
if (!defender.isCivilian()) // unit was not captured but actually attacked
{
addXp(attacker, 5, defender)
addXp(defender, 4, attacker)
}
} else { // ranged attack
if (!attacker.isMelee()) { // ranged attack
addXp(attacker, 2, defender)
addXp(defender, 2, attacker)
} else if (!defender.isCivilian()) // unit was not captured but actually attacked
{
addXp(attacker, 5, defender)
addXp(defender, 4, attacker)
}
}

View File

@ -470,15 +470,19 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
passingMovementSpent = 0f
}
previousTile = tile
// We can't continue, stop here.
if (unit.isDestroyed || unit.currentMovement - passingMovementSpent < Constants.minimumMovementEpsilon) {
unit.currentMovement = passingMovementSpent // silly floats which are "almost zero"
break
}
}
// Silly floats which are almost zero
if (unit.currentMovement < Constants.minimumMovementEpsilon)
unit.currentMovement = 0f
if (!unit.isDestroyed)
unit.putInTile(lastReachedEnterableTile)

View File

@ -2,4 +2,5 @@ package com.unciv.models
import com.unciv.logic.map.TileInfo
class AttackableTile(val tileToAttackFrom: TileInfo, val tileToAttack: TileInfo)
class AttackableTile(val tileToAttackFrom: TileInfo, val tileToAttack: TileInfo,
val movementLeftAfterMovingToAttackTile:Float)

View File

@ -588,7 +588,7 @@ class Ruleset {
lines.add("${promotion.name} requires promotion $prereq which does not exist!", RulesetErrorSeverity.Warning)
for (unitType in promotion.unitTypes)
if (!unitTypes.containsKey(unitType) && (unitTypes.isNotEmpty() || !baseRuleset.unitTypes.containsKey(unitType)))
lines.add("${promotion.name} references unit type ${unitType}, which does not exist!", RulesetErrorSeverity.Warning)
lines.add("${promotion.name} references unit type $unitType, which does not exist!", RulesetErrorSeverity.Warning)
checkUniques(promotion, lines, UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific)
}
for (unitType in unitTypes.values) {

View File

@ -196,7 +196,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
{
val canBombard = UnitAutomation.getBombardTargets(attacker.city).contains(defender.getTile())
if (canBombard) {
attackableTile = AttackableTile(attacker.getTile(), defender.getTile())
attackableTile = AttackableTile(attacker.getTile(), defender.getTile(), 0f)
}
}
}