Compare commits

...
Author SHA1 Message Date
adminandClaude Opus 4.5 91c990da04 Update C# client for ReconProvincesQuest rename and new ReconSpecificProvincesQuest
- Update DisplayNames.cs with renamed and new quest types
- Update UnaffiliatedHeroRowController.cs to handle both quest types

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 06:50:24 -08:00
adminandClaude Opus 4.5 f15aab6fe7 Rename ReconSpecificProvincesQuest to ReconProvincesQuest and add new ReconSpecificProvincesQuest
- Rename existing ReconSpecificProvincesQuest (count-based) to ReconProvincesQuest
- Add new ReconSpecificProvincesQuest that tracks specific province IDs to recon
- Update proto definitions, Quest.scala, QuestConverter.scala
- Update LLM prompt generators for both quest types
- Update CheckForFulfilledQuestsAction comment

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 06:48:13 -08:00
8 changed files with 62 additions and 11 deletions
@@ -179,8 +179,10 @@ namespace eagle {
case SealedValueOneofCase.SpendOnFeastsQuest: return "Host Feasts";
case SealedValueOneofCase.SendSuppliesQuest: return "Send Supplies";
case SealedValueOneofCase.RestProvinceQuest: return "Rest Province";
case SealedValueOneofCase.ReconSpecificProvincesQuest: return "Recon Provinces";
case SealedValueOneofCase.ReconProvincesQuest: return "Recon Provinces";
case SealedValueOneofCase.RepairDevastationQuest: return "Repair Devastation";
case SealedValueOneofCase.ReconSpecificProvincesQuest:
return "Recon Specific Provinces";
}
throw new ArgumentException($"unknown quest {quest}");
@@ -425,9 +425,16 @@ namespace eagle {
return $"Keep {provinceName} at rest for {quest.ComponentCount} months ({quest.ComponentsFulfilled}/{quest.ComponentCount})";
}
case SealedValueOneofCase.ReconProvincesQuest: {
var details = quest.Details.ReconProvincesQuest;
return $"Recon {details.TargetProvinceCount} provinces ({quest.ComponentsFulfilled}/{quest.ComponentCount})";
}
case SealedValueOneofCase.ReconSpecificProvincesQuest: {
var details = quest.Details.ReconSpecificProvincesQuest;
return $"Recon {details.TargetProvinceCount} provinces ({quest.ComponentsFulfilled}/{quest.ComponentCount})";
var provinceNames =
details.TargetProvinceIds.Select(pid => model.Provinces[pid].Name);
return $"Recon {string.Join(", ", provinceNames)} ({quest.ComponentsFulfilled}/{quest.ComponentCount})";
}
case SealedValueOneofCase.RepairDevastationQuest: {
@@ -58,8 +58,9 @@ message QuestDetails {
SpendOnFeastsQuest spend_on_feasts_quest = 41;
SendSuppliesQuest send_supplies_quest = 42;
RestProvinceQuest rest_province_quest = 43;
ReconSpecificProvincesQuest recon_specific_provinces_quest = 44;
ReconProvincesQuest recon_provinces_quest = 44;
RepairDevastationQuest repair_devastation_quest = 45;
ReconSpecificProvincesQuest recon_specific_provinces_quest = 46;
}
}
@@ -233,10 +234,14 @@ message RestProvinceQuest {
int32 target_province_id = 1;
}
message ReconSpecificProvincesQuest {
message ReconProvincesQuest {
int32 target_province_count = 1;
}
message RepairDevastationQuest {
int32 target_devastation_repaired = 1;
}
message ReconSpecificProvincesQuest {
repeated int32 target_province_ids = 1;
}
@@ -220,7 +220,7 @@ case class CheckForFulfilledQuestsAction(
false // action quest - fulfilled in ControlWeatherCommand
// Note: WinBattlesQuest is handled by ComponentQuest case above
// Note: SpendOnFeastsQuest, SendSuppliesQuest, RestProvinceQuest,
// ReconSpecificProvincesQuest, RepairDevastationQuest are ComponentQuests
// ReconProvincesQuest, ReconSpecificProvincesQuest, RepairDevastationQuest are ComponentQuests
case _: ApprehendOutlawQuest =>
false // action quest - fulfilled in ApprehendOutlawCommand
}
@@ -335,11 +335,17 @@ case class DivineMessagePromptGenerator(
s"$divinedHeroName wants to see ${targetProvince.name} kept at rest for $componentCount months."
)
case ReconSpecificProvincesQuest(componentCount, _, targetProvinceCount) =>
case ReconProvincesQuest(componentCount, _, targetProvinceCount) =>
TextGenerationSuccess(
s"$divinedHeroName wants $actingHeroName to recon $targetProvinceCount provinces."
)
case ReconSpecificProvincesQuest(componentCount, _, targetProvinceIds) =>
val provinceNames = targetProvinceIds.map(pid => gameState.provinces(pid).name)
TextGenerationSuccess(
s"$divinedHeroName wants $actingHeroName to recon the following provinces: ${provinceNames.mkString(", ")}."
)
case RepairDevastationQuest(_, _, targetDevastationRepaired) =>
TextGenerationSuccess(
s"$divinedHeroName wants to see $targetDevastationRepaired devastation repaired across the realm."
@@ -343,11 +343,17 @@ object QuestEndedGeneratorUtilities {
unaffiliatedHeroName <- unaffiliatedHeroNameResult
} yield s"$unaffiliatedHeroName wanted to see ${targetProvince.name} kept at rest for $componentCount months."
case ReconSpecificProvincesQuest(componentCount, _, targetProvinceCount) =>
case ReconProvincesQuest(componentCount, _, targetProvinceCount) =>
for {
unaffiliatedHeroName <- unaffiliatedHeroNameResult
} yield s"$unaffiliatedHeroName wanted ${faction.name} to recon $targetProvinceCount provinces."
case ReconSpecificProvincesQuest(componentCount, _, targetProvinceIds) =>
val provinceNames = targetProvinceIds.map(pid => gameState.provinces(pid).name)
for {
unaffiliatedHeroName <- unaffiliatedHeroNameResult
} yield s"$unaffiliatedHeroName wanted ${faction.name} to recon the following provinces: ${provinceNames.mkString(", ")}."
case RepairDevastationQuest(_, _, targetDevastationRepaired) =>
for {
unaffiliatedHeroName <- unaffiliatedHeroNameResult
@@ -25,6 +25,7 @@ import net.eagle0.eagle.common.unaffiliated_hero_quest.{
MobilizeProvincesQuest as MobilizeProvincesQuestProto,
Quest as QuestProto,
QuestDetails as QuestDetailsProto,
ReconProvincesQuest as ReconProvincesQuestProto,
ReconSpecificProvincesQuest as ReconSpecificProvincesQuestProto,
ReleaseAllPrisonersQuest as ReleaseAllPrisonersQuestProto,
ReleasePrisonerQuest as ReleasePrisonerQuestProto,
@@ -238,9 +239,15 @@ object QuestConverter {
componentCount = q.componentCount,
componentsFulfilled = q.componentsFulfilled
)
case q: ReconProvincesQuest =>
QuestProto(
details = ReconProvincesQuestProto(q.targetProvinceCount),
componentCount = q.componentCount,
componentsFulfilled = q.componentsFulfilled
)
case q: ReconSpecificProvincesQuest =>
QuestProto(
details = ReconSpecificProvincesQuestProto(q.targetProvinceCount),
details = ReconSpecificProvincesQuestProto(q.targetProvinceIds),
componentCount = q.componentCount,
componentsFulfilled = q.componentsFulfilled
)
@@ -469,14 +476,23 @@ object QuestConverter {
componentsFulfilled = questProto.componentsFulfilled,
targetProvinceId = targetProvinceId
)
case ReconSpecificProvincesQuestProto(
case ReconProvincesQuestProto(
targetProvinceCount,
_ /* unknownFieldSet */
) =>
ReconProvincesQuest(
componentCount = questProto.componentCount,
componentsFulfilled = questProto.componentsFulfilled,
targetProvinceCount = targetProvinceCount
)
case ReconSpecificProvincesQuestProto(
targetProvinceIds,
_ /* unknownFieldSet */
) =>
ReconSpecificProvincesQuest(
componentCount = questProto.componentCount,
componentsFulfilled = questProto.componentsFulfilled,
targetProvinceCount = targetProvinceCount
targetProvinceIds = targetProvinceIds.toVector
)
case RepairDevastationQuestProto(
targetDevastationRepaired,
@@ -201,7 +201,7 @@ case class RestProvinceQuest(
this.copy(componentsFulfilled = componentsFulfilled)
}
case class ReconSpecificProvincesQuest(
case class ReconProvincesQuest(
override val componentCount: Int,
override val componentsFulfilled: Int,
targetProvinceCount: Int
@@ -210,6 +210,15 @@ case class ReconSpecificProvincesQuest(
this.copy(componentsFulfilled = componentsFulfilled)
}
case class ReconSpecificProvincesQuest(
override val componentCount: Int,
override val componentsFulfilled: Int,
targetProvinceIds: Vector[ProvinceId]
) extends ComponentQuest {
override def withComponentsFulfilled(componentsFulfilled: Int): Quest =
this.copy(componentsFulfilled = componentsFulfilled)
}
case class RepairDevastationQuest(
override val componentCount: Int,
override val componentsFulfilled: Int,