diff --git a/game.py b/game.py index 3b9ce94..cd89930 100644 --- a/game.py +++ b/game.py @@ -1102,14 +1102,15 @@ def _complete(world: dict, player: dict, action: dict, now: float, rng: random.R xp = xp // 3 if action.get("special") == "recon": event = upcoming_raid(world) - if event: + # Once a threat is fully scouted, scouting only trains the skill (and keeps the informant's leads). + if event and event["recon"] < intel_costs(event)[-1]: city = world["city"] gain = recon_gain(world, action) # An informant's leads double the reconnaissance (and the XP) of whoever follows them up. boost = min(city.get("recon_boost", 0), gain) city["recon_boost"] = city.get("recon_boost", 0) - boost xp *= 1 + boost / gain - event["recon"] += gain + boost + event["recon"] = min(intel_costs(event)[-1], event["recon"] + gain + boost) if action.get("special") == "problem" and action["skill"] != "combat": _work_problem(world, player, action, now) threat = upcoming_raid(world) if action.get("special") == "drill" else None @@ -1597,7 +1598,7 @@ def _city_hour(world: dict, now: float) -> None: city["construction"]["labour"] += pop * TOWNSFOLK_LABOUR threat = upcoming_raid(world) if threat and building_level(world, "spymaster"): - threat["recon"] += SPYMASTER_AGENTS * building_level(world, "spymaster") + threat["recon"] = min(intel_costs(threat)[-1], threat["recon"] + SPYMASTER_AGENTS * building_level(world, "spymaster")) city["food_due"] += (pop * 0.5 / 24 * city_rate(world, "food") * (1.5 if city.get("cold") else 1) * (0.9 if fitted(world, "grain_bins") else 1)) stock = city["stockpile"] @@ -1738,13 +1739,13 @@ def event_view(world: dict, event: dict, now: float) -> dict: """What the city knows about an upcoming event, filtered by intel.""" level = intel_level(world, event, now) half = WINDOW_HOURS[level] * HOUR / speed(world) - costs = intel_costs(event) + costs = intel_costs(event) if "strength" in event else [0, 0, 0] centre = event["fire_at"] + event["jitter"] * half * 0.6 view = { "id": event["id"], "kind": event["kind"], "intel": level, "earliest": max(now, centre - half), "latest": max(now, centre + half), "exact": event["fire_at"] if level >= 3 else None, - "recon": int(event["recon"]), "recon_full": costs[-1], + "recon": int(min(event["recon"], costs[-1])), "recon_full": costs[-1], "recon_next": max(0, round(costs[level] - event["recon"])) if level < 3 else 0, } if event["kind"] == "dragon": diff --git a/static/app.js b/static/app.js index 38bad07..f650357 100644 --- a/static/app.js +++ b/static/app.js @@ -501,7 +501,9 @@ function actionCard(a) { } if (a.special === "recon") { const boost = S.favours.informant.boost; - extra = `