Clean up some differences between units that can move on water and other units (#9841)

* Clean up some differences between units that can move on water, water units, and land units

* Strangely no evidence this actually comes up?

* refernce the cache in more places

* Decided to change this back to match expected results

* Remove unnecessary parenthesis
This commit is contained in:
SeventhM 2023-07-30 07:39:41 -07:00 committed by GitHub
parent b838d8ec5a
commit 203ee77c8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 7 additions and 6 deletions

View File

@ -121,8 +121,8 @@ object BattleHelper {
if (tileCombatant is CityCombatant && tileCombatant.city.hasJustBeenConquered) return false
if (!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivInfo())) return false
if (combatant is MapUnitCombatant && combatant.isLandUnit() && combatant.isMelee() &&
!combatant.hasUnique(UniqueType.LandUnitEmbarkation) && tile.isWater
if (combatant is MapUnitCombatant && combatant.isLandUnit() && combatant.isMelee() && tile.isWater &&
!combatant.getCivInfo().tech.unitsCanEmbark && !combatant.unit.cache.canMoveOnWater
)
return false

View File

@ -114,7 +114,7 @@ object BattleDamage {
val modifiers = getGeneralModifiers(attacker, defender, CombatAction.Attack, tileToAttackFrom)
if (attacker is MapUnitCombatant) {
if (attacker.unit.isEmbarked()
if (attacker.unit.isEmbarked() && defender.getTile().isLand
&& !attacker.unit.hasUnique(UniqueType.AttackAcrossCoast))
modifiers["Landing"] = -50

View File

@ -513,7 +513,7 @@ class TileMap(initialCapacity: Int = 10) : IsPartOfGameInfoSerialization {
var potentialCandidates = getPassableNeighbours(currentTile)
while (unitToPlaceTile == null && tryCount++ < 10) {
unitToPlaceTile = potentialCandidates
.sortedByDescending { if (unit.baseUnit.isLandUnit()) it.isLand else true } // Land units should prefer to go into land tiles
.sortedByDescending { if (unit.baseUnit.isLandUnit() && !unit.cache.canMoveOnWater) it.isLand else true } // Land units should prefer to go into land tiles
.firstOrNull { unit.movement.canMoveTo(it) }
if (unitToPlaceTile != null) continue
// if it's not found yet, let's check their neighbours

View File

@ -509,6 +509,7 @@ class MapUnit : IsPartOfGameInfoSerialization {
var healing = when {
tile.isCityCenter() -> 25
tile.isWater && isFriendlyTerritory && (baseUnit.isWaterUnit() || isTransported) -> 20 // Water unit on friendly water
tile.isWater && isFriendlyTerritory && cache.canMoveOnWater -> 20 // Treated as a water unit on friendly water
tile.isWater -> 0 // All other water cases
isFriendlyTerritory -> 20 // Allied territory
tile.getOwner() == null -> 10 // Neutral territory

View File

@ -769,7 +769,7 @@ class UnitMovement(val unit: MapUnit) {
unit.civ.getMatchingUniques(UniqueType.UnitsMayEnterOcean)
.any { unit.matchesFilter(it.params[0]) }
}
if (tile.isWater && unit.baseUnit.isLandUnit()) {
if (tile.isWater && unit.baseUnit.isLandUnit() && !unit.cache.canMoveOnWater) {
if (!unit.civ.tech.unitsCanEmbark) return false
if (tile.isOcean && !unit.civ.tech.embarkedUnitsCanEnterOcean && !unitSpecificAllowOcean)
return false
@ -791,7 +791,7 @@ class UnitMovement(val unit: MapUnit) {
if (firstUnit != null && unit.civ != firstUnit.civ) {
// Allow movement through unguarded, at-war Civilian Unit. Capture on the way
// But not for Embarked Units capturing on Water
if (!(unit.baseUnit.isLandUnit() && tile.isWater)
if (!(unit.baseUnit.isLandUnit() && tile.isWater && !unit.cache.canMoveOnWater)
&& firstUnit.isCivilian() && unit.civ.isAtWarWith(firstUnit.civ))
return true
// Cannot enter hostile tile with any unit in there