using System; using System.Collections.Generic; namespace IdleSpectator; /// Maps every live task shape to an action concept; no creature voice logic. public static class ActivityVerbMap { private static readonly string[] BehaviorBeatKeys = { "BehUnloadResources", "BehThrowResources", "BehSocializeTalk", "BehTryToSocialize", "BehPlantCrops", "BehCityActorFertilizeCrop", "BehBuildTarget", "BehPoopOutside", "BehPoopInside", "BehBoatFishing", "BehBoatCollectFish", "BehClaimZoneForCityActorBorder" }; public static string Resolve(string key) { if (string.IsNullOrEmpty(key)) return ""; string k = key.ToLowerInvariant(); if (ActivitySpeciesVoice.IsAuthoredVerb(k)) return k; if (k.Contains("laugh")) return "laugh"; if (k.Contains("sing") || k.Contains("just_sang")) return "sing"; if (k == "start_fire") return "ignite"; if (k == "put_out_fire" || k.Contains("extinguish") || k.Contains("fireman")) return "extinguish"; if (k.Contains("family_group")) return "group"; if (k.Contains("soul_harvested")) return "harvest_life"; if (k.Contains("loot")) return "loot"; if (k.Contains("crying") || k.Contains("just_cried")) return "cry"; if (k.Contains("swore") || k.Contains("swear")) return "swear"; if (k.Contains("madness")) return "confused"; if (k == "follow_desire_target" || k == "task_unit_weird_desire") return "strange_urge"; if (k == "task_unit_follow_family" || k == "child_follow_parent") return "group"; if (k == "possessed_following") return "possessed"; if (k == "poop_inside" || k == "poop_outside" || k == "try_to_poop" || k == "behpoopinside" || k == "behpoopoutside") return "relieve"; if (k == "status_confused" || k == "task_unit_confused") return "confused"; if (k == "replenish_energy" || k == "task_unit_replenish_energy") return "recharge"; if (k == "strange_urge_finish" || k == "task_strange_urge_finish") return "strange_urge"; if (k == "try_to_steal_money" || k == "try_to_take_city_item") return "steal"; if (k == "possessed") return "possessed"; if (k == "try_affect_dreams") return "dream"; if (k == "behthrowresources") return "haul"; if (k.StartsWith("diet_")) return "eat"; if (k == "city_walking_to_danger_zone" || k == "farmer_random_move" || k == "random_move_towards_civ_building") return "move"; if (k == "warrior_army_captain_idle_walking_city" || k == "warrior_army_leader_move_random") return "warrior"; if (k == "boat_transport_check_taxi") return "settle"; if (k == "punch_a_building") return "fight"; if (k == "run_to_water_when_on_fire") return "flee"; if (k == "try_to_launch_fireworks") return "play"; if (k == "type_bonfire") return "work"; if (k == "random_house_building") return "settle"; if ((k.Contains("play") && !k.Contains("display")) || k.Contains("fun_move") || k.Contains("frolic") || k.StartsWith("child_")) return "play"; if (k.Contains("hunt") || k == "behattackactorhuntingtarget") return "hunt"; if (k.Contains("fight") || k.Contains("attack") || k.Contains("tantrum")) return "fight"; if (k.Contains("social") || k.Contains("talk") || k.Contains("trysocialize")) return "social"; if (k.Contains("lover") || k.Contains("breed") || k.Contains("reproduction") || k.Contains("reproduc") || k.Contains("desire")) return "lover"; if (k.Contains("farm") || k.Contains("plant") || k.Contains("fertiliz") || k.Contains("harvest") || k.Contains("hoe")) return "farm"; if (k == "work" || k.Contains("mine") || k.Contains("woodcut") || k.Contains("chop") || k.Contains("gather") || k.Contains("forag") || k.Contains("build") || k.Contains("construct") || k.Contains("collect_") || k.Contains("cleaning") || k.Contains("make_items") || k.Contains("make_skeleton") || k.Contains("manure") || k.Contains("burn_tumor") || k == "axe" || k == "hammer" || k == "basket" || k == "bucket" || k == "flag" || k == "book" || k == "coffee_cup") return "work"; if (k.Contains("pollinat") || k.Contains("bee_") || k == "behpollinate") return "pollinate"; if (k.Contains("trade") || k.Contains("barter") || k.Contains("tax") || k.Contains("boat_trading")) return "trade"; if (k.Contains("fish")) return "fish"; if (k.Contains("unload") || k.Contains("throw_resource") || k.Contains("carrying") || k.Contains("store_resource") || k.Contains("boat_load_units")) return "haul"; if (k.Contains("heal") || k.Contains("cure")) return "heal"; if (k.Contains("fire") || k.Contains("blaze")) return "fire"; if (k.Contains("sleep") || k.Contains("wakeup") || k.Contains("burrow")) return "sleep"; if (k.Contains("eat") || k.Contains("food") || k.Contains("meal") || k.StartsWith("diet_")) return "eat"; if (k.Contains("run_away") || k.Contains("flee") || k.Contains("retreat") || k.Contains("danger_check") || k.Contains("banish") || k.Contains("kill_unruly")) return "flee"; if (k == "task_unit_run_to_water") return "flee"; if (k.Contains("job") || k.Contains("employ") || k.Contains("find_house") || k.Contains("claim") || k.StartsWith("king_") || k.StartsWith("leader_") || k.Contains("citizen") || k.Contains("join_city") || k.Contains("check_city") || k.Contains("check_plot") || k.Contains("family_check") || k.Contains("embark") || k.Contains("boat_return") || k.Contains("force_into_a_boat") || k.Contains("boat_transport") || k.Contains("boat_check") || k.Contains("investigate") || k == "check_join_empty_nearby_city" || k.Contains("progress_plot") || k == "task_unit_plot" || k.Contains("return_to_dock") || k == "try_new_plot" || k == "try_to_return_to_home_city" || k == "try_to_start_new_civilization" || k == "type_house" || k == "type_well") return "settle"; if (k.Contains("warrior") || k.Contains("army") || k.Contains("formation") || k.Contains("invincible") || k == "type_barracks" || k == "type_training_dummies") return "warrior"; if (k.Contains("wait") || k == "reflection" || k.Contains("hold_still") || k.Contains("make_decision") || k.Contains("think") || k.Contains("stuck") || k == "nothing" || k == "sit_inside_boat" || k.StartsWith("stay_in_") || k == "task_unit_nothing") return "wait"; if (k.Contains("idle") || k.Contains("random_move") || k.Contains("walking") || k.EndsWith("_move") || k.Contains("wander") || k == "move" || k.Contains("dragon_") || k.Contains("godfinger") || k.Contains("follow_") || k.StartsWith("ant_") || k.StartsWith("ufo_") || k.StartsWith("worm_") || k.Contains("slide") || k.Contains("land") || k.Contains("fly") || k.StartsWith("move_") || k == "random_swim" || k.Contains("teleport") || k == "task_unit_walk" || k == "possessed_following") return "move"; if (k.Contains("read")) return "read"; if (k == "pickaxe" || k.StartsWith("print_") || k == "punch_a_tree" || k.Contains("repair_equipment") || k == "ruins" || k == "type_fruits" || k == "type_poop" || k == "type_tree" || k == "type_vegetation" || k == "type_bonfire") return "work"; if (k == "type_flower" || k == "type_hive") return "pollinate"; if (k == "type_crops") return "farm"; return ""; } public static bool HasActionCore(string key) { return !string.IsNullOrEmpty(Resolve(key)); } /// /// High-signal verbs skip the ActivityLog same-verb cooldown (combat, danger, romance, etc.). /// Spammy verbs like play/move/work still dedupe. /// public static bool IsSameVerbCooldownExempt(string verb) { if (string.IsNullOrEmpty(verb)) { return false; } switch (verb) { case "fight": case "hunt": case "flee": case "lover": case "steal": case "loot": case "heal": case "ignite": case "extinguish": case "fire": case "harvest_life": case "possessed": case "confused": case "strange_urge": return true; default: return false; } } public static List EnumerateLiveTaskIds() { return ActivityAssetCatalog.EnumerateLiveTaskIds(); } public static string[] EnumerateBehaviorBeatKeys() { return (string[])BehaviorBeatKeys.Clone(); } }