Melee Escort Attacking Fix (#11310)

* Added a test

* Fixed melee units attack moving into tiles that the escorting unit can't move to

* Added tests

* Update core/src/com/unciv/logic/battle/TargetHelper.kt

---------

Co-authored-by: Yair Morgenstern <yairm210@hotmail.com>
This commit is contained in:
Oskar Niesen
2024-03-15 04:30:37 -05:00
committed by GitHub
parent bf047cf546
commit c6058cdf73
2 changed files with 89 additions and 1 deletions

View File

@ -2,9 +2,15 @@ package com.unciv.logic.map
import com.badlogic.gdx.math.Vector2
import com.unciv.Constants
import com.unciv.logic.battle.Battle
import com.unciv.logic.battle.MapUnitCombatant
import com.unciv.logic.battle.TargetHelper
import com.unciv.logic.civilization.Civilization
import com.unciv.testing.GdxTestRunner
import com.unciv.testing.TestGame
import com.unciv.utils.DebugUtils
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
@ -20,6 +26,11 @@ internal class UnitFormationTests {
civInfo = testGame.addCiv()
}
@After
fun wrapUp() {
DebugUtils.VISIBLE_MAP = false
}
@Test
fun `basic formation functionality civilian`() {
setUp(1)
@ -195,4 +206,74 @@ internal class UnitFormationTests {
civilianDistanceToTiles = civilianUnit.movement.getDistanceToTiles()
assertFalse(militaryUnit.movement.getDistanceToTiles().any { !civilianDistanceToTiles.contains(it.key) })
}
@Test
fun `test escort attack and move civilian unit`() {
setUp(3)
val enemyCiv = testGame.addCiv()
civInfo.diplomacyFunctions.makeCivilizationsMeet(enemyCiv)
civInfo.getDiplomacyManager(enemyCiv).declareWar()
val centerTile = testGame.getTile(Vector2(0f,0f))
val enemyTile = testGame.getTile(Vector2(2f,2f))
val scout = testGame.addUnit("Warrior", civInfo, centerTile)
val civilianUnit = testGame.addUnit("Worker", civInfo, centerTile)
val enemyUnit = testGame.addUnit("Warrior", enemyCiv , enemyTile)
enemyUnit.health = 1 // Needs to be killable by the scout
scout.startEscorting()
assertTrue(scout.isEscorting())
assertTrue(civilianUnit.isEscorting())
assertEquals(1, TargetHelper.getAttackableEnemies(scout, scout.movement.getDistanceToTiles()).count())
Battle.attack(MapUnitCombatant(scout), MapUnitCombatant(enemyUnit))
assertEquals(0, enemyUnit.health)
assertEquals(enemyTile, scout.getTile())
assertEquals(enemyTile, civilianUnit.getTile())
assertTrue(scout.isEscorting())
assertTrue(civilianUnit.isEscorting())
}
@Test
fun `test escort attack with ranged unit`() {
setUp(3)
val enemyCiv = testGame.addCiv()
DebugUtils.VISIBLE_MAP = true
civInfo.diplomacyFunctions.makeCivilizationsMeet(enemyCiv)
civInfo.getDiplomacyManager(enemyCiv).declareWar()
val centerTile = testGame.getTile(Vector2(0f,0f))
val enemyTile = testGame.getTile(Vector2(3f,3f))
val archer = testGame.addUnit("Archer", civInfo, centerTile)
val civilianUnit = testGame.addUnit("Worker", civInfo, centerTile)
val enemyUnit = testGame.addUnit("Warrior", enemyCiv , enemyTile)
enemyUnit.health = 1 // Needs to be killable by the scout
archer.startEscorting()
assertTrue(archer.isEscorting())
assertTrue(civilianUnit.isEscorting())
assertEquals(1, TargetHelper.getAttackableEnemies(archer, archer.movement.getDistanceToTiles()).count())
Battle.attack(MapUnitCombatant(archer), MapUnitCombatant(enemyUnit))
assertEquals(0, enemyUnit.health)
assertTrue(archer.isEscorting())
assertTrue(civilianUnit.isEscorting())
assertEquals(archer.getTile(), civilianUnit.getTile())
}
@Test
fun `test escort attack with military unit having ignoreTerrainCost`() {
setUp(3)
val enemyCiv = testGame.addCiv()
civInfo.diplomacyFunctions.makeCivilizationsMeet(enemyCiv)
civInfo.getDiplomacyManager(enemyCiv).declareWar()
val centerTile = testGame.getTile(Vector2(0f,0f))
val forestTile = testGame.getTile(Vector2(1f,1f))
val enemyTile = testGame.getTile(Vector2(2f,2f))
val scout = testGame.addUnit("Warrior", civInfo, centerTile)
val civilianUnit = testGame.addUnit("Worker", civInfo, centerTile)
val enemyUnit = testGame.addUnit("Warrior", enemyCiv , enemyTile)
enemyUnit.health = 1 // Needs to be killable by the scout
forestTile.addTerrainFeature("Forest")
scout.startEscorting()
assertTrue(scout.isEscorting())
assertTrue(civilianUnit.isEscorting())
assertTrue(TargetHelper.getAttackableEnemies(scout, scout.movement.getDistanceToTiles()).isEmpty())
}
}