worldbox-observer-mod/IdleSpectator/ActivityVerbMap.cs

173 lines
8.9 KiB
C#

using System;
using System.Collections.Generic;
namespace IdleSpectator;
/// <summary>Maps every live task shape to an action concept; no creature voice logic.</summary>
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));
}
/// <summary>
/// High-signal verbs skip the ActivityLog same-verb cooldown (combat, danger, romance, etc.).
/// Spammy verbs like play/move/work still dedupe.
/// </summary>
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<string> EnumerateLiveTaskIds()
{
return ActivityAssetCatalog.EnumerateLiveTaskIds();
}
public static string[] EnumerateBehaviorBeatKeys()
{
return (string[])BehaviorBeatKeys.Clone();
}
}