Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automated Workers replacing Great Improvements #11082

Closed
1 task done
Diraven8 opened this issue Feb 4, 2024 · 13 comments
Closed
1 task done

Automated Workers replacing Great Improvements #11082

Diraven8 opened this issue Feb 4, 2024 · 13 comments

Comments

@Diraven8
Copy link

Diraven8 commented Feb 4, 2024

Is there an existing issue for this?

  • I have searched the existing issues

Game Version

4.10.6 (Build 965)

Describe the bug

Automated Workers now replace Great Improvements (Customs house, Holy site, Landmark, Manufactory) with regular tile improvements. I'm pretty sure they didn't do this in earlier versions, and I hope this is not a new feature.

Steps to Reproduce

  1. Place a Great Improvement on a tile (any except snow tile) with a Great Person.
  2. Set some Workers to automated
  3. Eventually the automated Workers will replace the Great Improvement with the regular improvement for that tile (farm, mine, lumber mill, etc.)

Screenshots

No response

Link to save file

No response

Operating System

Android

Additional Information

No response

@Diraven8 Diraven8 added the bug label Feb 4, 2024
@tuvus
Copy link
Collaborator

tuvus commented Feb 4, 2024

I have noticed it for Customs House, Holy site, but I thought that was just the way the stat valuing system works. I'll look into a more complete solution that isn't don't replace great improvements.

@SomeTroglodyte
Copy link
Collaborator

SomeTroglodyte commented Feb 7, 2024

Oh my - debug("Replacing fort in progress with new improvement") - does that mean that my strategy to leave build-fort instructions everywhere the AI will expand to but I won't is now moot?

Still haven't found a good place to set a conditional breakpoint to let autoplay generate that missing save for us...

But there's some linting to be had:

Index: core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt b/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt
--- a/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt	(revision 371460038446e2e9efd6fc3b39c9bbecf5374711)
+++ b/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt	(date 1707298117918)
@@ -57,9 +57,12 @@
      * The improvementPriority and bestImprovement are by default not set.
      * Once improvementPriority is set we have already checked for the best improvement, repairImprovement.
      */
-    data class TileImprovementRank(val tilePriority: Float, var improvementPriority: Float? = null,
-                                   var bestImprovement: TileImprovement? = null,
-                                   var repairImprovment: Boolean? = null)
+    data class TileImprovementRank(
+        val tilePriority: Float,
+        var improvementPriority: Float? = null,
+        var bestImprovement: TileImprovement? = null,
+        var repairImprovement: Boolean? = null
+    )
 
     private val tileRankings = HashMap<Tile, TileImprovementRank>()
 
@@ -114,7 +117,7 @@
 
         if (tileHasWorkToDo(currentTile, unit)) {
             val tileRankings = tileRankings[currentTile]!!
-            if (tileRankings.repairImprovment!!) {
+            if (tileRankings.repairImprovement!!) {
                 debug("WorkerAutomation: $unit -> repairs $currentTile")
                 UnitActionsFromUniques.getRepairAction(unit)?.action?.invoke()
                 return
@@ -206,7 +209,7 @@
     }
 
     /**
-     * Calculate a priority for the tile without accounting for the improvement it'self
+     * Calculate a priority for the tile without accounting for the improvement itself
      * This is a cheap guess on how helpful it might be to do work on this tile
      */
     fun getBasePriority(tile: Tile, unit: MapUnit): Float {
@@ -249,11 +252,11 @@
     private fun getImprovementPriority(tile: Tile, unit: MapUnit): Float {
         getBasePriority(tile, unit)
         val rank = tileRankings[tile]
-        if(rank!!.improvementPriority == null) {
+        if (rank!!.improvementPriority == null) {
             // All values of rank have to be initialized
             rank.improvementPriority = -100f
             rank.bestImprovement = null
-            rank.repairImprovment = false
+            rank.repairImprovement = false
 
             val bestImprovement = chooseImprovement(unit, tile)
             if (bestImprovement != null) {
@@ -270,16 +273,17 @@
                 var repairBonusPriority = tile.getImprovementToRepair()!!.getTurnsToBuild(unit.civ,unit) - UnitActionsFromUniques.getRepairTurns(unit)
                 if (tile.improvementInProgress == Constants.repair) repairBonusPriority += UnitActionsFromUniques.getRepairTurns(unit) - tile.turnsToImprovement
 
-                val repairPriority = repairBonusPriority + Automation.rankStatsValue(TileStatFunctions(tile).getStatDiffForImprovement(tile.getTileImprovement()!!, unit.civ, tile.owningCity), unit.civ)
+                val repairPriority = repairBonusPriority +
+                    Automation.rankStatsValue(TileStatFunctions(tile).getStatDiffForImprovement(tile.getTileImprovement()!!, unit.civ, tile.owningCity), unit.civ)
                 if (repairPriority > rank.improvementPriority!!) {
                     rank.improvementPriority = repairPriority
                     rank.bestImprovement = null
-                    rank.repairImprovment = true
+                    rank.repairImprovement = true
                 }
             }
         }
         // A better tile than this unit can build might have been stored in the cache
-        if (!rank.repairImprovment!! && (rank.bestImprovement == null ||
+        if (!rank.repairImprovement!! && (rank.bestImprovement == null ||
                 !unit.canBuildImprovement(rank.bestImprovement!!, tile))) return -100f
         return rank.improvementPriority!!
     }
@@ -296,7 +300,7 @@
      */
     private fun tileHasWorkToDo(tile: Tile, unit: MapUnit): Boolean {
         if (getImprovementPriority(tile, unit) <= 0) return false
-        if (!(tileRankings[tile]!!.bestImprovement != null || tileRankings[tile]!!.repairImprovment!!))
+        if (!(tileRankings[tile]!!.bestImprovement != null || tileRankings[tile]!!.repairImprovement!!))
             throw IllegalStateException("There was an improvementPriority > 0 and nothing to do")
         return true
     }
(and some Kdoc that seems unfinished, or read in leaves you puzzling "the what?" or...)

@SomeTroglodyte
Copy link
Collaborator

Here's a cheated example
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

Next turn, that Tyre Worker will try to replace the Holy Site with a Farm. Caught with a breakpoint on WorkerAutomation line 127 (return currentTile.startWorkingOnImprovement), condition currentTile.containsGreatImprovement().

... is the problem here that getImprovementPriority is positive? I don't think I have the big picture anymore... OK, when getStatDiffForImprovement runs for that it correctly says +2Food,-6Faith. Automation.rankStatsValue then converts that to +2.4 value, which is still in the ranking instance when startWorkingOnImprovement is reached. Why + for a net -? Faith has no value at all...

Could we find a non-faith, non-gold such example?

@SomeTroglodyte
Copy link
Collaborator

(...uh, shouldn't we remove the Holy site from the Vanilla ruleset?)

@SomeTroglodyte
Copy link
Collaborator

So far no luck. Ran several games now, (annoying due to this bug still unfixed), and the breakpoint with condition currentTile.containsGreatImprovement() && currentTile.improvement != "Holy site" && currentTile.improvement != "Customs house" only hits for - Citadel.

So - if the issue claim is true for all Great Improvements, we need proof in form of a save just before such a replace happens. Holy site is explained by the tile ranking function valuing faith at zero, and Customs house -probably- is explained by the ranking function devaluating gold yield by 67% (imho a slight contradiction with the comment text there - the comment would justify 33%).

@tuvus
Copy link
Collaborator

tuvus commented Feb 8, 2024

Holy site is explained by the tile ranking function valuing faith at zero, and Customs house -probably- is explained by the ranking function devaluating gold yield by 67% (imho a slight contradiction with the comment text there - the comment would justify 33%).

I did notice that the AI workers don't like the base holy site and customs house. But since it was a stat rating problem I deemed it out of the scope of what I wanted to change. Interestingly, it is only causing a problem now since the automated workers do work.
Are holy sites even worth it as a player? I never build them or the culture great improvements.

@SomeTroglodyte
Copy link
Collaborator

Are holy sites even worth it as a player

Other way round: The player decided a Holy sh - ahem, site - was worth spending a Prophet on. How exactly should we respect that?

I'd say simply change the Automation.rankStatsValue function to place less widely varying weights. Maybe aim for max-weight/min-weight <= 5 and not ♾️ . That would mean no stat gets < 0.75f weight if the happiness one stays as-is. And with faith worth 0.75, a Farm overridung a Holy outh... Merde! ... a Farm overriding a Holy site would no longer be considered a win. As for a Grinchhouse - with gold up to 0.75 from 0.33 - 3 to 2.4 at most - also not a win. Replacing with something other than a Farm, if in synergy with a bonus resource maybe - they could still be built over, but then maybe rightfully so?

@SomeTroglodyte
Copy link
Collaborator

And/Or - make all those weight factors moddable. And I can't even do division properly.

@yairm210
Copy link
Owner

yairm210 commented Feb 28, 2024

Tile ranking for Faith should definitely not be zero, good catch! e6893ef

@SomeTroglodyte
Copy link
Collaborator

Summary:

  • Holy site very likely fixed
  • Customs house still a known victim - due to unbalance in the same ranking function, overemphasis on food and too much devaluing gold, so 2 food becomes better than 6 gold
  • All others unproven, and unless a save is forthcoming should be assumed false alarm

@SHHHHHHH2024
Copy link

worker left of berlin.json

High chance I have misunderstood this but please see attached my save of an automated working replacing a citadel.

Copy link

This issue is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 15 days.

@github-actions github-actions bot added the Stale label Jun 17, 2024
@yairm210
Copy link
Owner

I think the correct action would be to add "is not replaced by automated workers" unique

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants