mirror of
https://github.com/yairm210/Unciv.git
synced 2025-02-02 12:24:15 +07:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
21925b920b
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
@ -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) {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user