From f9ebc8aa0fa6301eebfe3874c0f7ff72f93310ca Mon Sep 17 00:00:00 2001 From: Federico Luongo Date: Tue, 6 Oct 2020 09:48:59 +0200 Subject: [PATCH] Acquire Great Person Quest implemented (#3210) * Acquire Great Person Quest implemented * List to sequence to list --- .../assets/jsons/Civ V - Vanilla/Quests.json | 4 +-- .../logic/civilization/CivilizationInfo.kt | 1 + .../unciv/logic/civilization/QuestManager.kt | 27 +++++++++++++++++++ .../com/unciv/models/ruleset/unit/BaseUnit.kt | 5 ++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/android/assets/jsons/Civ V - Vanilla/Quests.json b/android/assets/jsons/Civ V - Vanilla/Quests.json index f5be81843c..a682af2fba 100644 --- a/android/assets/jsons/Civ V - Vanilla/Quests.json +++ b/android/assets/jsons/Civ V - Vanilla/Quests.json @@ -19,11 +19,11 @@ { "name": "Construct Wonder", "description": "We recommend you to start building [wonder] to show the whole world your civilization strength." - }/*, + }, { "name": "Acquire Great Person", "description": "Great People can change the course of a Civilization! You will be rewarded for acquiring a new [greatPerson]." - }, + }/*, { "name": "Conquer City State", "description": "You will be rewarded for conquering the city state of [cityState]!", diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 5ea33b47c9..da8a3c45b7 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -197,6 +197,7 @@ class CivilizationInfo { //region Units fun getCivUnits(): Sequence = units.asSequence() + fun getCivGreatPeople(): Sequence = getCivUnits().filter { mapUnit -> mapUnit.hasUnique("Great Person - []") } fun addUnit(mapUnit: MapUnit, updateCivInfo:Boolean=true){ val newList = ArrayList(units) diff --git a/core/src/com/unciv/logic/civilization/QuestManager.kt b/core/src/com/unciv/logic/civilization/QuestManager.kt index 3c8f57a159..2583470d42 100644 --- a/core/src/com/unciv/logic/civilization/QuestManager.kt +++ b/core/src/com/unciv/logic/civilization/QuestManager.kt @@ -250,6 +250,7 @@ class QuestManager { when (quest.name) { QuestName.ConnectResource.value -> data1 = getResourceForQuest(assignee)!!.name QuestName.ConstructWonder.value -> data1 = getWonderToBuildForQuest(assignee)!!.name + QuestName.GreatPerson.value -> data1 = getGreatPersonForQuest(assignee)!!.name } val newQuest = AssignedQuest( @@ -287,6 +288,7 @@ class QuestManager { QuestName.Route.value -> civInfo.hasEverBeenFriendWith(challenger) && !civInfo.isCapitalConnectedToCity(challenger.getCapital()) QuestName.ConnectResource.value -> civInfo.hasEverBeenFriendWith(challenger) && getResourceForQuest(challenger) != null QuestName.ConstructWonder.value -> civInfo.hasEverBeenFriendWith(challenger) && getWonderToBuildForQuest(challenger) != null + QuestName.GreatPerson.value -> civInfo.hasEverBeenFriendWith(challenger) && getGreatPersonForQuest(challenger) != null else -> true } } @@ -298,6 +300,7 @@ class QuestManager { QuestName.Route.value -> civInfo.isCapitalConnectedToCity(assignee.getCapital()) QuestName.ConnectResource.value -> assignee.detailedCivResources.map { it.resource }.contains(civInfo.gameInfo.ruleSet.tileResources[assignedQuest.data1]) QuestName.ConstructWonder.value -> assignee.cities.any { it.cityConstructions.isBuilt(assignedQuest.data1) } + QuestName.GreatPerson.value -> assignee.getCivGreatPeople().any { it.baseUnit.getReplacedUnit(civInfo.gameInfo.ruleSet).name == assignedQuest.data1 } else -> false } } @@ -367,6 +370,30 @@ class QuestManager { return null } + + /** + * Returns a Great Person [BaseUnit] that is not owned by both the [challenger] and the [civInfo] + */ + private fun getGreatPersonForQuest(challenger: CivilizationInfo): BaseUnit? { + val ruleSet = civInfo.gameInfo.ruleSet + + val challengerGreatPeople = challenger.getCivGreatPeople().map { it.baseUnit.getReplacedUnit(ruleSet) } + val cityStateGreatPeople = civInfo.getCivGreatPeople().map { it.baseUnit.getReplacedUnit(ruleSet) } + + val greatPeople = ruleSet.units.values + .asSequence() + .filter { baseUnit -> baseUnit.uniques.any { it.equalsPlaceholderText("Great Person - []") } } + .map { it.getReplacedUnit(ruleSet) } + .distinct() + .filter { !challengerGreatPeople.contains(it) && !cityStateGreatPeople.contains(it) } + .toList() + + if (greatPeople.isNotEmpty()) + return greatPeople.random() + + return null + } + //endregion } diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 931933b1c4..5e3d988681 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -195,4 +195,9 @@ class BaseUnit : INamed, IConstruction { } override fun toString(): String = name + + fun getReplacedUnit(ruleset: Ruleset): BaseUnit { + return if (replaces == null) this + else ruleset.units[replaces!!]!! + } }