Moddable quest weighting for city-states

This commit is contained in:
Yair Morgenstern
2022-11-19 23:54:16 +02:00
parent 2d5536e8be
commit e5fbb472b0
5 changed files with 302 additions and 230 deletions

View File

@ -11,7 +11,6 @@ import com.unciv.logic.city.CityInfo
import com.unciv.logic.city.INonPerpetualConstruction
import com.unciv.logic.city.PerpetualConstruction
import com.unciv.logic.civilization.AlertType
import com.unciv.logic.civilization.CityStateType
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.civilization.PlayerType
@ -289,7 +288,7 @@ object NextTurnAutomation {
if (civInfo.wantsToFocusOn(Victory.Focus.Culture)) {
for (cityState in civInfo.getKnownCivs()
.filter { it.isCityState() && it.cityStateType == CityStateType.Cultured }) {
.filter { it.isCityState() && it.cityStateFunctions.canGiveStat(Stat.Culture) }) {
val diploManager = cityState.getDiplomacyManager(civInfo)
if (diploManager.getInfluence() < 40) { // we want to gain influence with them
tryGainInfluence(civInfo, cityState)

View File

@ -641,115 +641,13 @@ class QuestManager : IsPartOfGameInfoSerialization {
*/
private fun getQuestWeight(questName: String): Float {
var weight = 1f
val trait = civInfo.cityStateType
val personality = civInfo.cityStatePersonality
when (questName) {
QuestName.Route.value -> {
when (personality) {
CityStatePersonality.Friendly -> weight *= 2f
CityStatePersonality.Hostile -> weight *= .2f
else -> {}
}
when (trait) {
CityStateType.Maritime -> weight *= 1.2f
CityStateType.Mercantile -> weight *= 1.5f
else -> {}
}
}
QuestName.ConnectResource.value -> {
when (trait) {
CityStateType.Maritime -> weight *= 2f
CityStateType.Mercantile -> weight *= 3f
else -> {}
}
}
QuestName.ConstructWonder.value -> {
if (trait == CityStateType.Cultured)
weight *= 3f
}
QuestName.GreatPerson.value -> {
if (trait == CityStateType.Cultured)
weight *= 3f
}
QuestName.ConquerCityState.value -> {
if (trait == CityStateType.Militaristic)
weight *= 2f
when (personality) {
CityStatePersonality.Hostile -> weight *= 2f
CityStatePersonality.Neutral -> weight *= .4f
else -> {}
}
}
QuestName.FindPlayer.value -> {
when (trait) {
CityStateType.Maritime -> weight *= 3f
CityStateType.Mercantile -> weight *= 2f
else -> {}
}
}
QuestName.FindNaturalWonder.value -> {
if (trait == CityStateType.Militaristic)
weight *= .5f
if (personality == CityStatePersonality.Hostile)
weight *= .3f
}
QuestName.ClearBarbarianCamp.value -> {
weight *= 3f
if (trait == CityStateType.Militaristic)
weight *= 3f
}
QuestName.GiveGold.value -> {
weight *= when (trait) {
CityStateType.Militaristic -> 2f
CityStateType.Mercantile -> 3.5f
else -> 3f
}
}
QuestName.PledgeToProtect.value -> {
weight *= when (trait) {
CityStateType.Militaristic -> 2f
CityStateType.Cultured -> 3.5f
else -> 3f
}
}
QuestName.BullyCityState.value -> {
when (personality) {
CityStatePersonality.Hostile -> weight *= 2f
CityStatePersonality.Irrational -> weight *= 1.5f
CityStatePersonality.Friendly -> weight *= .3f
CityStatePersonality.Neutral -> {}
}
}
QuestName.DenounceCiv.value -> {
weight *= when (trait) {
CityStateType.Religious -> 2.5f
CityStateType.Maritime -> 2f
else -> 1.5f
}
}
QuestName.SpreadReligion.value -> {
if (trait == CityStateType.Religious)
weight *= 3f
}
QuestName.ContestCulture.value -> {
if (trait == CityStateType.Cultured)
weight *= 2f
}
QuestName.ContestFaith.value -> {
weight *= when (trait) {
CityStateType.Religious -> 2f
else -> .5f
}
}
QuestName.ContestTech.value -> {
if (trait == CityStateType.Religious)
weight *= .5f
}
QuestName.Invest.value -> {
if (trait == CityStateType.Mercantile)
weight *= 1.5f
}
}
val quest = civInfo.gameInfo.ruleSet.quests[questName] ?: return 0f
val personalityWeight = quest.weightForCityStateType[civInfo.cityStatePersonality.name]
if (personalityWeight != null) weight *= personalityWeight
val traitWeight = quest.weightForCityStateType[civInfo.cityStateType.name]
if (traitWeight != null) weight *= traitWeight
return weight
}

View File

@ -50,7 +50,12 @@ class Quest : INamed {
* quests [type]. */
var minimumCivs: Int = 1
/** Certain city states are more likely to give certain quests
* This is based on both personality and city-state type
* Both are mapped here as 'how much to multiply the weight of this quest for this kind of city-state' */
var weightForCityStateType = HashMap<String, Float>()
/** Checks if [this] is a Global quest */
fun isGlobal(): Boolean = type == QuestType.Global
fun isIndividual(): Boolean = !isGlobal()
}
}