diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index c12b548db7..2db9d86f1e 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -511,7 +511,7 @@ class CivilizationInfo { addNotification("A [$greatPerson] has been born!".tr(), city.location, Color.GOLD) } - fun placeUnitNearTile(location: Vector2, unitName: String): MapUnit { + fun placeUnitNearTile(location: Vector2, unitName: String): MapUnit? { return gameInfo.tileMap.placeUnitNearTile(location, unitName, this) } diff --git a/core/src/com/unciv/logic/map/TileMap.kt b/core/src/com/unciv/logic/map/TileMap.kt index bbeb5231bc..eda4736afa 100644 --- a/core/src/com/unciv/logic/map/TileMap.kt +++ b/core/src/com/unciv/logic/map/TileMap.kt @@ -72,7 +72,7 @@ class TileMap { .filter {contains(it)}.map { get(it) }.toList() } - fun placeUnitNearTile(position: Vector2, unitName: String, civInfo: CivilizationInfo): MapUnit { + fun placeUnitNearTile(position: Vector2, unitName: String, civInfo: CivilizationInfo): MapUnit? { val unit = GameBasics.Units[unitName]!!.getMapUnit() val tilesInDistance = getTilesInDistance(position, 2) unit.assignOwner(civInfo) // both the civ name and actual civ need to be in here in order to calculate the canMoveTo...Darn @@ -89,7 +89,10 @@ class TileMap { for(promotion in unit.baseUnit.promotions) unit.promotions.addPromotion(promotion,true) } - else civInfo.removeUnit(unit) // since we added it to the civ units in the previous assignOwner + else { + civInfo.removeUnit(unit) // since we added it to the civ units in the previous assignOwner + return null // we didn't actually create a unit... + } return unit } diff --git a/core/src/com/unciv/logic/map/UnitPromotions.kt b/core/src/com/unciv/logic/map/UnitPromotions.kt index d42c652aeb..e47eeef23e 100644 --- a/core/src/com/unciv/logic/map/UnitPromotions.kt +++ b/core/src/com/unciv/logic/map/UnitPromotions.kt @@ -15,7 +15,7 @@ class UnitPromotions{ fun xpForNextPromotion() = (numberOfPromotions+1)*10 fun canBePromoted() = XP >= xpForNextPromotion() - fun addPromotion(promotionName:String, isFree:Boolean = false){ + fun addPromotion(promotionName:String, isFree:Boolean = false, updateViewableTiles:Boolean=true){ if (!isFree) { XP -= xpForNextPromotion() numberOfPromotions++ @@ -28,6 +28,11 @@ class UnitPromotions{ else promotions.add(promotionName) unit.updateUniques() + + // Since some units get promotions upon construction, they will get the addPromotion from the unit.postBuildEvent + // upon creation, BEFORE they are assigned to a tile, so the updateViewableTiles() would crash. + // So, if the addPromotion was triggered from there, simply don't update +// if(updateViewableTiles) unit.updateViewableTiles() // some promotions/uniques give the unit bonus sight } diff --git a/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt b/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt index 842214f661..fa5ec8c3e7 100644 --- a/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt @@ -1,10 +1,10 @@ package com.unciv.models.gamebasics.unit +import com.unciv.Constants import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.IConstruction import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.MapUnit -import com.unciv.Constants import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.ICivilopedia import com.unciv.models.gamebasics.Translations @@ -144,6 +144,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { override fun postBuildEvent(construction: CityConstructions) { val unit = construction.cityInfo.civInfo.placeUnitNearTile(construction.cityInfo.location, name) + if(unit==null) return // couldn't place the unit, so there's actually no unit =( unit.promotions.XP += construction.getBuiltBuildings().sumBy { it.xpForNewUnits } if(construction.cityInfo.civInfo.policies.isAdopted("Total War")) unit.promotions.XP += 15 diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index f210cf8fb6..b5e38a59be 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -94,7 +94,7 @@ class UnitActions { unit.civInfo.gold -= goldCostOfUpgrade val unitTile = unit.getTile() unit.destroy() - val newunit = unit.civInfo.placeUnitNearTile(unitTile.position, upgradedUnit.name) + val newunit = unit.civInfo.placeUnitNearTile(unitTile.position, upgradedUnit.name)!! newunit.health = unit.health newunit.promotions = unit.promotions