Feature#2081 (#2100)

* Unit can now only be purchased if no other unit of same type is stationed in city center #2081

* #2081
Added unique to landsknecht and changed condition for movement panelty

* Refactored when statement to if
#2081

* Only one plane at a time can be purchased to a maximum of 6 that are NOT transported in a single city
#2081

* removed duplicate code
#2081

* refactor canPurchase() and now track bought units in a city in a mutableList
#2081

* refactor canPurchase() it basicly just tracks if the unit can be placed on the center tile! if it cant then we dont allow the purchase!
#2081

* Changed wording of unique and added translations
#2081

* Changed wording of unique
#2081

* removed unneeded imports
#2081

Co-authored-by: Yair Morgenstern <yairm210@hotmail.com>
This commit is contained in:
EdinCitaku 2020-03-21 19:35:30 +01:00 committed by GitHub
parent d7ac7f9173
commit e06d537688
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 57 additions and 9 deletions

View file

@ -530,7 +530,7 @@
"strength": 16,
"cost": 45,
"requiredTech": "Civil Service",
"uniques": ["Bonus vs Mounted 50%"],
"uniques": ["Bonus vs Mounted 50%", "Can move immediately once bought" ],
"upgradesTo": "Musketman",
"obsoleteTech": "Gunpowder",
"hurryCostModifier": 20,

View file

@ -3092,6 +3092,10 @@ Calcutta =
# Requires translation!
Lahore =
# Requires translation!
All healing effects doubled =
Can move immediately once bought =
# Requires translation!
# Multiplayer Turn Checker Service
Bangalore =
# Requires translation!
Hyderabad =

View file

@ -879,7 +879,32 @@ Bonus when performing air sweep [bonusAmount]% = [bonusAmount]% Bonus bei Luftra
Dogfighting I = Kurvenkampf I
Dogfighting II = Kurvenkampf II
Dogfighting III = Kurvenkampf III
Bonus when intercepting [bonusAmount]% = [bonusAmount]% Bonus beim Abfangen
Interception I = Abfangen I
Interception II = Abfangen II
Interception III = Abfangen III
Siege I = Belagerung I
Siege II = Belagerung II
Siege III = Belagerung III
Evasion = Ausweichen
Reduces damage taken from interception by 50% = Reduziert den empfangenden Schaden durch Abfangen um 50%
Bonus when intercepting [amount]% = [amount]% Bonus beim Abfangen
Ambush I = Lufthinterhalt I
Ambush II = Lufthinterhalt II
Armor Plating I = Panzerung I
Armor Plating II = Panzerung II
Armor Plating III = Panzerung III
+25% Combat Bonus when defending = +25% Kampfbonus bei Verteidigung
Flight Deck I = Flugdeck I
Flight Deck II = Flugdeck II
Flight Deck III = Flugdeck III
Can carry 1 extra air unit = Kann 1 zusätzliche Lufteinheit tragen
Can carry 2 aircraft = Kann 2 Flugzeuge tragen
Haka War Dance = Haka-Kriegstanz
-10% combat strength for adjacent enemy units = -10% Kampfstärke für angrenzende feindliche Einheiten
Rejuvenation = Verjüngung
All healing effects doubled = Alle Heilungseffekte verdoppelt
Can move immediately once bought = Kann sich nach dem Kauf sofort bewegen
# Multiplayer Turn Checker Service
Multiplayer options = Multiplayer Einstellungen

View file

@ -852,7 +852,6 @@ Bonus when performing air sweep [bonusAmount]% =
Dogfighting I =
Dogfighting II =
Dogfighting III =
# Multiplayer Turn Checker Service
Multiplayer options =

View file

@ -312,7 +312,7 @@ class CityConstructions {
}
fun purchaseConstruction(constructionName: String): Boolean {
if (!getConstruction(constructionName).postBuildEvent(this))
if (!getConstruction(constructionName).postBuildEvent(this, true))
return false // nothing built - no pay
cityInfo.civInfo.gold -= getConstruction(constructionName).getGoldCost(cityInfo.civInfo)

View file

@ -17,6 +17,7 @@ import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType
import com.unciv.models.ruleset.tile.ResourceSupplyList
import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.ruleset.unit.BaseUnit
import com.unciv.models.stats.Stats
import com.unciv.ui.utils.withoutItem
import java.util.*
@ -582,5 +583,18 @@ class CityInfo {
for(otherCiv in civsWithCloseCities)
otherCiv.getDiplomacyManager(civInfo).setFlag(DiplomacyFlags.SettledCitiesNearUs,30)
}
fun canPurchase(construction : IConstruction) : Boolean {
if (construction is BaseUnit)
{
val tile = getCenterTile()
if (construction.unitType.isCivilian())
return tile.civilianUnit == null
if (construction.unitType.isAirUnit())
return tile.airUnits.filter { !it.isTransported }.size < 6
else return tile.militaryUnit == null
}
return true
}
//endregion
}

View file

@ -10,7 +10,7 @@ interface IConstruction : INamed {
fun getGoldCost(civInfo: CivilizationInfo): Int
fun isBuildable(construction: CityConstructions): Boolean
fun shouldBeDisplayed(construction: CityConstructions): Boolean
fun postBuildEvent(construction: CityConstructions): Boolean // Yes I'm hilarious.
fun postBuildEvent(construction: CityConstructions, wasBought: Boolean = false): Boolean // Yes I'm hilarious.
fun canBePurchased(): Boolean
}
@ -61,7 +61,7 @@ open class SpecialConstruction(override var name: String, val description: Strin
throw Exception("Impossible!")
}
override fun postBuildEvent(construction: CityConstructions): Boolean {
override fun postBuildEvent(construction: CityConstructions, wasBought: Boolean): Boolean {
throw Exception("Impossible!")
}

View file

@ -338,7 +338,7 @@ class Building : NamedStats(), IConstruction{
return getRejectionReason(construction)==""
}
override fun postBuildEvent(construction: CityConstructions): Boolean {
override fun postBuildEvent(construction: CityConstructions, wasBought: Boolean): Boolean {
val civInfo = construction.cityInfo.civInfo
if ("Spaceship part" in uniques) {

View file

@ -151,7 +151,7 @@ class BaseUnit : INamed, IConstruction {
return getRejectionReason(construction) == ""
}
override fun postBuildEvent(construction: CityConstructions): Boolean {
override fun postBuildEvent(construction: CityConstructions, wasBought: Boolean): Boolean {
val unit = construction.cityInfo.civInfo.placeUnitNearTile(construction.cityInfo.location, name)
if(unit==null) return false // couldn't place the unit, so there's actually no unit =(
@ -165,6 +165,10 @@ class BaseUnit : INamed, IConstruction {
&& construction.cityInfo.containsBuildingUnique("All newly-trained melee, mounted, and armored units in this city receive the Drill I promotion"))
unit.promotions.addPromotion("Drill I", isFree = true)
//movement penalty
if(!unit.hasUnique("Can move directly once bought") && wasBought)
unit.currentMovement = 0f
return true
}

View file

@ -306,7 +306,9 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre
if (construction == null || !construction.canBePurchased()
|| !construction.isBuildable(cityConstructions)
|| !UncivGame.Current.worldScreen.isPlayersTurn
|| city.isPuppet || city.isInResistance()) {
|| city.isPuppet || city.isInResistance()
|| !city.canPurchase(construction)
) {
button.setText("Buy".tr())
button.disable()
} else {