diff --git a/IdleSpectator/AgentHarness.cs b/IdleSpectator/AgentHarness.cs
index a5a9e9c..9fdcc52 100644
--- a/IdleSpectator/AgentHarness.cs
+++ b/IdleSpectator/AgentHarness.cs
@@ -7619,7 +7619,7 @@ public static class AgentHarness
}
}
- // Genes are all B (gain/remove tips never own the camera).
+ // Genes / clan / language are all B (never own the camera).
int geneCamera = 0;
foreach (string id in EventCatalog.Gene.AuthoredIds)
{
@@ -7629,6 +7629,24 @@ public static class AgentHarness
}
}
+ int clanCamera = 0;
+ foreach (string id in EventCatalog.ClanTrait.AuthoredIds)
+ {
+ if (EventCatalog.ClanTrait.GetOrFallback(id).CreatesInterest)
+ {
+ clanCamera++;
+ }
+ }
+
+ int languageCamera = 0;
+ foreach (string id in EventCatalog.LanguageTrait.AuthoredIds)
+ {
+ if (EventCatalog.LanguageTrait.GetOrFallback(id).CreatesInterest)
+ {
+ languageCamera++;
+ }
+ }
+
// Spot-check other Signal classes still have camera rows after demote.
int lawSignal = 0;
foreach (string id in EventCatalog.WorldLaw.AuthoredIds)
@@ -7662,6 +7680,8 @@ public static class AgentHarness
pass = dialBad == 0
&& phenotypeCamera == 0
&& geneCamera == 0
+ && clanCamera == 0
+ && languageCamera == 0
&& spellFxCamera == 0
&& spellSpectacleMissing == 0
&& lawSignal > 0
@@ -7669,6 +7689,7 @@ public static class AgentHarness
&& signalCamera == spectacleSpells.Length;
detail =
$"dialBad={dialBad} phenotypeCamera={phenotypeCamera} geneCamera={geneCamera} "
+ + $"clanCamera={clanCamera} languageCamera={languageCamera} "
+ $"spellFxCamera={spellFxCamera} spellSpectacleMissing={spellSpectacleMissing} "
+ $"lawSignal={lawSignal} itemSignal={itemSignal} spectacleOk={signalCamera}";
break;
diff --git a/IdleSpectator/Events/Catalogs/EventCatalog.Decision.cs b/IdleSpectator/Events/Catalogs/EventCatalog.Decision.cs
index 143ff63..54f5110 100644
--- a/IdleSpectator/Events/Catalogs/EventCatalog.Decision.cs
+++ b/IdleSpectator/Events/Catalogs/EventCatalog.Decision.cs
@@ -113,6 +113,12 @@ public static partial class EventCatalog
return false;
}
+ // Soft intent chatter - outcomes already covered by other feeds, or not story-worthy.
+ if (IsSoftDecisionNoise(s))
+ {
+ return false;
+ }
+
return HasToken(s, "war")
|| HasToken(s, "king")
|| HasToken(s, "leader")
@@ -129,7 +135,6 @@ public static partial class EventCatalog
|| s.Contains("plot")
|| s.Contains("marry")
|| s.Contains("banish")
- || s.Contains("steal")
|| s.Contains("kill_unruly")
|| s.Contains("clan")
|| s.Contains("religion")
@@ -137,18 +142,46 @@ public static partial class EventCatalog
|| s.Contains("baby_make")
|| s.Contains("have_child")
|| s.Contains("birth")
- || s.Contains("reproduction")
+ || s.Contains("sexual_reproduction")
|| s.Contains("golden_brain")
|| s.Contains("make_skeleton")
|| s.Contains("soul_harvest")
|| s.Contains("possessed")
- || s.Contains("create_hive")
- || s.Contains("fireworks")
- || s.Contains("affect_dreams")
- || s.Contains("family_group")
- || s.Contains("take_city_item")
- || s.Contains("put_out_fire")
- || s.Contains("burn_tumors");
+ || s.Contains("create_hive");
+ }
+
+ ///
+ /// Soft AI chatter that distracts the story camera. Outcomes (hatch, pack sticky, fires)
+ /// already have better feeds when they matter.
+ ///
+ private static bool IsSoftDecisionNoise(string s)
+ {
+ if (string.IsNullOrEmpty(s))
+ {
+ return true;
+ }
+
+ if (s.Contains("family_group")
+ || s.Contains("affect_dreams")
+ || s.Contains("fireworks")
+ || s.Contains("put_out_fire")
+ || s.Contains("burn_tumors")
+ || s.Contains("asexual_reproduction")
+ || s.Contains("take_city_item")
+ || s.Contains("try_to_steal")
+ || s.Contains("steal_money"))
+ {
+ return true;
+ }
+
+ // Army follow/join intent - keep only lead-to-attack.
+ if (s == "warrior_army_follow_leader"
+ || s == "warrior_try_join_army_group")
+ {
+ return true;
+ }
+
+ return false;
}
///
diff --git a/IdleSpectator/Events/Catalogs/EventCatalog.Libraries.cs b/IdleSpectator/Events/Catalogs/EventCatalog.Libraries.cs
index 307c055..7c4633b 100644
--- a/IdleSpectator/Events/Catalogs/EventCatalog.Libraries.cs
+++ b/IdleSpectator/Events/Catalogs/EventCatalog.Libraries.cs
@@ -245,25 +245,8 @@ public static partial class EventCatalog
}
string s = id.ToLowerInvariant();
- // High / mid-spectacle materials from live items library plus named relics.
- // Leather/wood/copper/iron stay ambient B.
- return s.Contains("legendary")
- || s.Contains("mythic")
- || s.Contains("mythril")
- || s.Contains("adamantine")
- || s.Contains("artifact")
- || s.Contains("relic")
- || s.Contains("divine")
- || s.Contains("demon")
- || s.Contains("dragon")
- || s.Contains("nuke")
- || s.Contains("excalibur")
- || s.Contains("wonder")
- || s.Contains("silver")
- || s.Contains("steel")
- || s.Contains("_bone")
- || s.StartsWith("bone_", StringComparison.Ordinal)
- || s.EndsWith("_bone", StringComparison.Ordinal);
+ // Only top-tier materials own the camera. Steel/silver/bone gear is soak noise.
+ return s.Contains("mythril") || s.Contains("adamantine");
}
private static void Ensure()
@@ -533,23 +516,11 @@ public static partial class EventCatalog
}
string s = id.ToLowerInvariant();
- return s.Contains("war")
- || s.Contains("death")
- || s.Contains("plague")
- || s.Contains("hunger")
- || s.Contains("rebell")
- || s.Contains("disaster")
- || s.Contains("angry")
- || s.Contains("cursed")
+ // God-law toggles are mostly UI spam. Keep era-defining / crisis switches only.
+ return s.Contains("cursed")
|| s.Contains("forever_")
- || s.Contains("tumor")
- || s.Contains("mutant")
- || s.Contains("evolution")
- || s.Contains("old_age")
- || s.Contains("kingdom_expansion")
- || s.Contains("border_steal")
- || s.Contains("civ_army")
- || s.Contains("exploding");
+ || s.Contains("disaster")
+ || s.Contains("rebell");
}
public static IEnumerable AuthoredIds
@@ -658,6 +629,38 @@ public static partial class EventCatalog
|| s.Contains("blaster");
}
+ ///
+ /// Culture camera: hard politics only. Lovers / layouts / craft skins are soak noise.
+ ///
+ private static bool IsDramaticCultureTrait(string id)
+ {
+ if (string.IsNullOrEmpty(id))
+ {
+ return false;
+ }
+
+ string s = id.ToLowerInvariant();
+ if (s.Contains("lover")
+ || s.Contains("city_layout")
+ || s.StartsWith("craft_", StringComparison.Ordinal)
+ || s.Contains("ethno")
+ || s.Contains("reading")
+ || s.Contains("statue")
+ || s.Contains("tower")
+ || s.Contains("gossip"))
+ {
+ return false;
+ }
+
+ return s.Contains("conscript")
+ || s.Contains("xenophob")
+ || s.Contains("expans")
+ || s.Contains("join_or_die")
+ || s.Contains("happiness_from_war")
+ || s.Contains("warriors_ascension")
+ || s.Contains("shattered_crown");
+ }
+
public static class CultureTrait
{
private static readonly Dictionary Entries =
@@ -689,7 +692,7 @@ public static partial class EventCatalog
d.AmbientStrength,
signalIds: null,
d.SignalStrength,
- signalPredicate: IsDramaticMetaTrait,
+ signalPredicate: IsDramaticCultureTrait,
ambientCreatesInterest: d.AmbientCreatesInterest);
}
@@ -784,6 +787,7 @@ public static partial class EventCatalog
Entries.Clear();
_appliedGeneration = EventCatalogConfig.Generation;
+ // Clan blood / vein traits are gene-like soak noise - all B.
LibraryCatalogDefaults d = LibOr("clanTrait", 32f, 72f, "Clan", "{a} clan gains {id}", false);
LiveLibraryInterest.EnsureSeeded(
Entries,
@@ -793,7 +797,6 @@ public static partial class EventCatalog
d.AmbientStrength,
signalIds: null,
d.SignalStrength,
- signalPredicate: IsDramaticMetaTrait,
ambientCreatesInterest: d.AmbientCreatesInterest);
}
@@ -836,6 +839,7 @@ public static partial class EventCatalog
Entries.Clear();
_appliedGeneration = EventCatalogConfig.Generation;
+ // Language flavor traits never own the camera.
LibraryCatalogDefaults d = LibOr("languageTrait", 30f, 68f, "Language", "{a} tongue gains {id}", false);
LiveLibraryInterest.EnsureSeeded(
Entries,
@@ -845,7 +849,6 @@ public static partial class EventCatalog
d.AmbientStrength,
signalIds: null,
d.SignalStrength,
- signalPredicate: IsDramaticMetaTrait,
ambientCreatesInterest: d.AmbientCreatesInterest);
}
diff --git a/IdleSpectator/mod.json b/IdleSpectator/mod.json
index 071ef64..8d71a2b 100644
--- a/IdleSpectator/mod.json
+++ b/IdleSpectator/mod.json
@@ -1,7 +1,7 @@
{
"name": "IdleSpectator",
"author": "dazed",
- "version": "0.28.40",
+ "version": "0.28.41",
"description": "AFK Idle Spectator (I) + Lore (L). Killer button retargets dossier to the killer.",
"GUID": "com.dazed.idlespectator"
}
diff --git a/docs/event-catalog-discovery.md b/docs/event-catalog-discovery.md
index 4efeea9..9d5f71a 100644
--- a/docs/event-catalog-discovery.md
+++ b/docs/event-catalog-discovery.md
@@ -62,28 +62,30 @@ Seeded via `LiveLibraryInterest.EnsureSeeded` + JSON `libraries.*` dials.
| Domain | Live | Camera A | Dial label template | Notes | Priority |
|--------|-----:|---------:|---------------------|-------|----------|
-| decisions | 127 | **33** | `{a} decides to {action}` | Signal tokens + authored phrases; fluff + intent-only genesis (`try_new_plot`, founding/claim) B; dump `.harness/camera-a-inventory.tsv` | P3 variety 0.28.32 |
+| decisions | 127 | **16** politics/spectacle | `{a} decides to {action}` | Soft pack/fireworks/asexual/steal demoted B; fluff + intent-genesis B | noise pass 0.28.41 |
| spells | 12 | 6 | `{a} casts {id}` | Signal spectacle only; FX spells B | P3 |
| powers | 339 | **41** | `God power: {id}` | ambient CI=false; widened spectacle + creature powers; UI `_edit` B | P3 expanded 0.28.27 |
-| items | 111 | **42** | `{a} gains {id}` | Signal mythril/adamantine + silver/steel/bone; leather/iron B | P3 expanded 0.28.27 |
+| items | 111 | **20** mythril/adamantine | `{a} gains {id}` | steel/silver/bone demoted B | noise pass 0.28.41 |
| genes | 47 | **0** | `{a} gains gene {id}` | all B (gain/remove tips not camera-worthy) | demoted |
| phenotypes | 52 | 0 | `{a} shows {id}` | all B | P3 |
-| world_laws | 49 | **17** | `Law changed: {id}` | dramatic + forever_/cursed/army/expansion… | P3 expanded 0.28.27 |
+| world_laws | 49 | **7** crisis | `Law changed: {id}` | hunger/army/expansion/UI toggles B | noise pass 0.28.41 |
| subspecies_traits | 204 | **21** | `{a} evolves {id}` | dramatic + mutation/death/blood/horror | P3 expanded 0.28.27 |
| biomes | 29 | 0 | `Biome shifts: {id}` | ambient CI=false | P3 stay B |
-| culture_traits | 78 | **27** | `{a} culture gains {id}` | dramatic + conscript/necro/craft weapons… | P3 expanded 0.28.27 |
+| culture_traits | 78 | **8** politics | `{a} culture gains {id}` | lovers/layout/craft B; conscript/xenophobe/expansion A | noise pass 0.28.41 |
| religion_traits | 40 | 6 | `{a} faith gains {id}` | dramatic heuristic | P3 |
-| clan_traits | 29 | 13 | `{a} clan gains {id}` | dramatic heuristic | P3 |
-| language_traits | 26 | 2 | `{a} tongue gains {id}` | dramatic heuristic | P3 |
+| clan_traits | 29 | **0** | `{a} clan gains {id}` | all B (blood/vein soak) | noise pass 0.28.41 |
+| language_traits | 26 | **0** | `{a} tongue gains {id}` | all B | noise pass 0.28.41 |
-**Library+decision Layer A inventory (0.28.32):** live dump total **215 A / 928 B** across 13 domains (`camera_a_inventory_ok`). Decisions **33 A**.
+**Library+decision Layer A inventory (0.28.41):** live dump total **125 A / 1018 B** across 13 domains (`camera_a_inventory_ok`). Decisions **16 A**.
-### Decision camera classes (0.28.32)
+### Decision camera classes (0.28.41)
-Allow-token Signal after fluff + intent-genesis filter (not 127 ambient).
+Allow-token Signal after fluff + intent-genesis + soft-noise filter (not 127 ambient).
Authored action phrases required for every A id (`domain_event_audit` decision_prose).
-Classes: reproduction/pack (`reproduction`, `family_group`), army/war/politics (existing), spectacle/dark (`golden_brain`, `make_skeleton`, `soul_harvest`, `possessed`), civic soft (`put_out_fire`, `burn_tumors`, `fireworks`, `affect_dreams`), hive (`create_hive`).
+Classes: sexual reproduction / lover / child, army/war/politics, spectacle/dark (`golden_brain`, `make_skeleton`, `soul_harvest`, `possessed`), hive (`create_hive`).
+
+Stay B (soft noise 0.28.41): `family_group`, `fireworks`, `affect_dreams`, `put_out_fire`, `burn_tumors`, `asexual_reproduction`, steal/take city item, `warrior_army_follow_leader`, `warrior_try_join_army_group`.
Stay B (intent-only; camera on outcome feeds): `try_new_plot*`, `try_to_start_new_civilization*`, `build_civ_city*`, `*city_foundation*`, `claim_land*` → real tips from `PlotInterestFeed` / `MetaEventPatches` (`new_city` 86, `new_kingdom` 92).
diff --git a/docs/event-catalog-discovery.tsv b/docs/event-catalog-discovery.tsv
index 786ee08..7dff6a1 100644
--- a/docs/event-catalog-discovery.tsv
+++ b/docs/event-catalog-discovery.tsv
@@ -9,21 +9,21 @@ traits 116 authored 0 116 wired authored_labels P3
disasters 17 authored 0 via_worldlog wired authored_labels P3 disaster_war_audit PASS
war_types_library 5 authored 0 dials wired authored_labels P3
relationship 11 authored_discrete 0 11 wired authored_labels P3 no AssetManager lib
-decisions_library 127 live+dial 0 33 wired action_phrases P3 intent genesis demoted 0.28.32; camera-a-inventory.tsv
+decisions_library 127 live+dial 0 16 wired action_phrases P3 soft noise demoted 0.28.41; camera-a-inventory.tsv
spells 12 live+dial 0 6 wired display_names P3 Signal spectacle; 6 FX B
powers 339 live+dial 0 41 wired display_names P3 Signal widened 0.28.27; ambient CI=false
-items 111 live+dial 0 42 wired gains_verb P3 Signal mythril/adamantine/silver/steel/bone
+items 111 live+dial 0 20 wired gains_verb P3 Signal mythril/adamantine gear only
genes 47 live+dial 0 0 wired display_names P3 all B; gain/remove not camera
phenotypes 52 live+dial 0 0 wired display_names P3 all B
-world_laws_library 49 live+dial 0 17 wired display_names P3 dramatic + forever_/cursed/army…
+world_laws_library 49 live+dial 0 7 wired display_names P3 cursed/forever_/disaster/rebell only
subspecies_traits 204 live+dial 0 21 wired display_names P3 dramatic + mutation/death/blood
biome_library 29 live+dial 0 0 wired display_names P3 ambient CI=false
-culture_traits 78 live+dial 0 27 wired display_names P3 dramatic widened 0.28.27
+culture_traits 78 live+dial 0 8 wired display_names P3 politics-only 0.28.41
religion_traits 40 live+dial 0 6 wired display_names P3
-clan_traits 29 live+dial 0 13 wired display_names P3
-language_traits 26 live+dial 0 2 wired display_names P3
+clan_traits 29 live+dial 0 0 wired display_names P3 all B 0.28.41
+language_traits 26 live+dial 0 0 wired display_names P3 all B 0.28.41
buildings 618 patch_only n/a consume_and_civ_complete partial EventReason.BuildingEat_BuildingComplete P3 civ complete/wonder A; destroy demoted B
boats n/a patch_only n/a trade_unload wired EventReason.Boat P3 load skipped
combat n/a csharp_policy n/a pair_keys wired EventReason.Fight P3 soft Duel sticky 0.28.28; hard sticky Skirmish+/notable-pair
-camera_a_inventory 1143 harness 0 215 wired camera-a-inventory.tsv P3 A=215 B=928 domains=13; gate camera_a_inventory_ok
+camera_a_inventory 1143 harness 0 125 wired camera-a-inventory.tsv P3 A=125 B=1018 domains=13; gate camera_a_inventory_ok
mutation_gaps 0 harness 0 n/a gaps_empty n/a P3 managers=57 libraryAssets=2893
diff --git a/docs/world-event-inventory.md b/docs/world-event-inventory.md
index 1933b6e..4364944 100644
--- a/docs/world-event-inventory.md
+++ b/docs/world-event-inventory.md
@@ -52,11 +52,11 @@ Only true brief FX, cooldowns, civic Aggregates, and god-tool / biome spam stay
| Relationship | 11 | all interesting discrete |
| Plot / Era / War / Book | 28 / 11 / 5 / 12 | all A |
| Trait | 116 | all CI |
-| Decision | 127 live / 37 prose overlays | **37** camera-interesting (0.28.27) |
-| Spell / Item / Gene / Phenotype / WorldLaw / SubspeciesTrait | live | Signal-only A: spell 6 / item 42 / gene 0 / phenotype 0 / law 17 / subsp 21 |
-| Culture / Religion / Clan / LanguageTrait | live dials | Signal dramatic: 27 / 6 / 13 / 2 |
+| Decision | 127 live / prose overlays | **16** camera-interesting (0.28.41 soft demote) |
+| Spell / Item / Gene / Phenotype / WorldLaw / SubspeciesTrait | live | Signal-only A: spell 6 / item mythril+adamantine 20 / gene 0 / phenotype 0 / law crisis 7 / subsp 21 |
+| Culture / Religion / Clan / LanguageTrait | live dials | Culture politics 8; religion 6; clan 0; language 0 |
| Power / Biome | live | Power Signal **41**; biome 0 (ambient CI=false) |
-| Library+decision inventory dump | 1143 rows | **219 A / 924 B** (`.harness/camera-a-inventory.tsv`) |
+| Library+decision inventory dump | 1143 rows | **125 A / 1018 B** (`.harness/camera-a-inventory.tsv`) |
| Building / Boat | none | destroy/consume/trade/unload; damage/load skipped |
## Wired hooks (major)