Fixed edge-case bug when units try to be created but aren't, and then get assigned an Alhambra promotion, triggering viewableTile update

This commit is contained in:
Yair Morgenstern 2019-06-05 23:49:38 +03:00
parent e8bdb8a2e4
commit 99d7b0ea1a
5 changed files with 15 additions and 6 deletions

View File

@ -511,7 +511,7 @@ class CivilizationInfo {
addNotification("A [$greatPerson] has been born!".tr(), city.location, Color.GOLD) 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) return gameInfo.tileMap.placeUnitNearTile(location, unitName, this)
} }

View File

@ -72,7 +72,7 @@ class TileMap {
.filter {contains(it)}.map { get(it) }.toList() .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 unit = GameBasics.Units[unitName]!!.getMapUnit()
val tilesInDistance = getTilesInDistance(position, 2) 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 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) for(promotion in unit.baseUnit.promotions)
unit.promotions.addPromotion(promotion,true) 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 return unit
} }

View File

@ -15,7 +15,7 @@ class UnitPromotions{
fun xpForNextPromotion() = (numberOfPromotions+1)*10 fun xpForNextPromotion() = (numberOfPromotions+1)*10
fun canBePromoted() = XP >= xpForNextPromotion() fun canBePromoted() = XP >= xpForNextPromotion()
fun addPromotion(promotionName:String, isFree:Boolean = false){ fun addPromotion(promotionName:String, isFree:Boolean = false, updateViewableTiles:Boolean=true){
if (!isFree) { if (!isFree) {
XP -= xpForNextPromotion() XP -= xpForNextPromotion()
numberOfPromotions++ numberOfPromotions++
@ -28,6 +28,11 @@ class UnitPromotions{
else promotions.add(promotionName) else promotions.add(promotionName)
unit.updateUniques() 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 unit.updateViewableTiles() // some promotions/uniques give the unit bonus sight
} }

View File

@ -1,10 +1,10 @@
package com.unciv.models.gamebasics.unit package com.unciv.models.gamebasics.unit
import com.unciv.Constants
import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.CityConstructions
import com.unciv.logic.city.IConstruction import com.unciv.logic.city.IConstruction
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.Constants
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.ICivilopedia import com.unciv.models.gamebasics.ICivilopedia
import com.unciv.models.gamebasics.Translations import com.unciv.models.gamebasics.Translations
@ -144,6 +144,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
override fun postBuildEvent(construction: CityConstructions) { override fun postBuildEvent(construction: CityConstructions) {
val unit = construction.cityInfo.civInfo.placeUnitNearTile(construction.cityInfo.location, name) 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 } unit.promotions.XP += construction.getBuiltBuildings().sumBy { it.xpForNewUnits }
if(construction.cityInfo.civInfo.policies.isAdopted("Total War")) if(construction.cityInfo.civInfo.policies.isAdopted("Total War"))
unit.promotions.XP += 15 unit.promotions.XP += 15

View File

@ -94,7 +94,7 @@ class UnitActions {
unit.civInfo.gold -= goldCostOfUpgrade unit.civInfo.gold -= goldCostOfUpgrade
val unitTile = unit.getTile() val unitTile = unit.getTile()
unit.destroy() 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.health = unit.health
newunit.promotions = unit.promotions newunit.promotions = unit.promotions