Compare commits

...

2 commits

31 changed files with 7028 additions and 1195 deletions

View file

@ -1,76 +1,10 @@
using System;
using System.Collections.Generic;
namespace IdleSpectator;
/// <summary>Single deterministic action-selection pipeline.</summary>
public static class ActivityActionComposer
{
private static readonly Dictionary<string, string[]> BeatTemplates =
new Dictionary<string, string[]>(StringComparer.Ordinal)
{
["BehUnloadResources"] = new[]
{
"unloads {carrying} at {place}",
"delivers {carrying} into store{place_at}"
},
["BehThrowResources"] = new[]
{
"throws {carrying} toward storage",
"tosses {carrying} from the pack"
},
["BehSocializeTalk"] = new[]
{
"talks{with}{place_at}",
"shares words{with}{place_at}"
},
["BehTryToSocialize"] = new[]
{
"tries to socialize{with}{place_at}",
"looks for a conversation{with}{place_at}"
},
["BehPlantCrops"] = new[]
{
"plants crops{place_at}{job_as}",
"sets seed in the soil{place_at}"
},
["BehCityActorFertilizeCrop"] = new[]
{
"fertilizes the crops{place_at}{job_as}",
"feeds the soil{place_at}"
},
["BehBuildTarget"] = new[]
{
"works the build{place_at}{job_as}",
"raises construction{place_at}"
},
["BehPoopOutside"] = new[]
{
"steps aside for a private moment outdoors",
"tends to nature's call outside"
},
["BehPoopInside"] = new[]
{
"steps aside for a private moment indoors",
"tends to nature's call inside"
},
["BehBoatFishing"] = new[]
{
"fishes from the boat{place_at}",
"works the waters from aboard{place_at}"
},
["BehBoatCollectFish"] = new[]
{
"collects the catch aboard{place_at}",
"hauls in the boat's catch{place_at}"
},
["BehClaimZoneForCityActorBorder"] = new[]
{
"claims border land{place_at}",
"stakes new ground for the settlement{place_at}"
}
};
public static string Compose(
ActivityContext ctx,
string key,
@ -82,35 +16,17 @@ public static class ActivityActionComposer
ctx ??= ActivityContext.Empty;
ProseVoice voice = EnsureVoice(ctx);
if (!string.IsNullOrEmpty(key)
&& BeatTemplates.TryGetValue(key, out string[] beatBag)
&& voice.AssetKind != ActivityAssetKind.Vehicle)
{
return Pick(beatBag, voice, key, subjectId, lineIndex);
}
string verb = ActivityVerbMap.Resolve(key);
if (string.IsNullOrEmpty(verb))
{
string factual = ActivityProse.FactualActionPhrase(rawFact, key, hasTarget);
factual = ActivityClauseAssembler.StripSpeciesTokensPublic(factual, ctx);
if (!string.IsNullOrEmpty(factual))
{
return factual;
}
string patterned = ActivityProse.PatternActionPhrase(key, hasTarget);
if (!string.IsNullOrEmpty(patterned))
{
return patterned;
}
string humanized = ActivityProse.HumanizeKeyPublic(key);
verb = string.IsNullOrEmpty(humanized) ? "move" : humanized.ToLowerInvariant();
// Future unknown tasks still get the mob's authored work voice.
// The exhaustive runtime audit blocks every current task from reaching this branch.
verb = "work";
}
string[] bag = ActivityActionLexicon.GetBag(voice, verb, hasTarget, ctx.Terrain);
return Pick(bag, voice, verb, subjectId, lineIndex);
string phrase = Pick(bag, subjectId, lineIndex);
return ActivityModifierVoiceOverlay.Apply(phrase, voice, verb, subjectId, lineIndex);
}
private static ProseVoice EnsureVoice(ActivityContext ctx)
@ -135,8 +51,6 @@ public static class ActivityActionComposer
private static string Pick(
string[] bag,
ProseVoice voice,
string verb,
long subjectId,
int lineIndex)
{
@ -150,29 +64,8 @@ public static class ActivityActionComposer
return bag[0];
}
int slot = VerbSlot(verb);
int bit = voice.AssetKind == ActivityAssetKind.Vehicle
? 0
: ((voice.FlavorOrdinal >> slot) & 1);
int actorVariation = (int)((subjectId ^ (lineIndex * 397L)) & 1L);
int index = (bit ^ actorVariation) % Math.Min(2, bag.Length);
int index = actorVariation % Math.Min(2, bag.Length);
return bag[index];
}
private static int VerbSlot(string verb)
{
switch ((verb ?? "").ToLowerInvariant())
{
case "move": return 0;
case "wait": return 1;
case "play": return 2;
case "eat": return 3;
case "sleep": return 4;
case "hunt": return 5;
case "fight": return 6;
case "social": return 7;
case "laugh": return 8;
default: return 9;
}
}
}

View file

@ -19,15 +19,19 @@ public static class ActivityActionLexicon
return VehicleBag(v);
}
string[] authored = ActivitySpeciesVoiceCatalog.GetBag(voice.BaseSpeciesId, v, terrain);
if (authored != null && authored.Length > 0)
{
return authored;
}
// Safe fallback for unknown future assets that are not yet in the authored catalog.
if (voice.Modifier != ActivityModifier.None)
{
string[] modifier = ModifierBag(voice, v, hasTarget);
if (modifier != null) return modifier;
}
string[] profile = ProfileBag(voice.ProfileTag, v, hasTarget);
if (profile != null) return profile;
string[] body = BodyBag(voice.BaseBodyTag, v, hasTarget, terrain);
return body ?? GenericBag(v, hasTarget);
}
@ -126,77 +130,6 @@ public static class ActivityActionLexicon
};
}
private static string[] ProfileBag(string profile, string verb, bool hasTarget)
{
if (string.IsNullOrEmpty(profile)) return null;
if (profile == "dragon")
{
return verb switch
{
"move" => new[] { "advances at an unhurried pace{place_at}", "moves as if the world should make way{place_at}" },
"sleep" => new[] { "coils into a guarded sleep{place_at}", "rests with one eye on the world{place_at}" },
"eat" => new[] { "feeds with terrifying appetite{place_at}", "devours a meal at leisure{place_at}" },
"laugh" => new[] { "rumbles with deep laughter{place_at}", "laughs in a dangerous rolling growl{place_at}" },
"hunt" => Targeted(hasTarget, "descends on {target}{place_at}", "keeps {target} in sight{place_at}", "circles in search of prey{place_at}", "hunts across a wide range{place_at}"),
_ => null
};
}
if (profile == "fairy")
{
return verb switch
{
"move" => new[] { "flits onward in bright little arcs{place_at}", "drifts ahead on glittering wings{place_at}" },
"play" => new[] { "loops and twirls in sparkling arcs{place_at}", "flutters about mischievously{place_at}" },
"laugh" => new[] { "chimes with tiny laughter{place_at}", "laughs in a bright little trill{place_at}" },
_ => null
};
}
if (profile == "lemon_snail")
{
return verb switch
{
"move" => new[] { "glides ahead at an unhurried pace{place_at}", "follows a slow, winding trail{place_at}" },
"play" => new[] { "turns in slow, winding circles{place_at}", "sways gently from side to side{place_at}" },
"eat" => new[] { "nibbles through a meal slowly{place_at}", "takes a slow, careful meal{place_at}" },
_ => null
};
}
if (profile == "cat")
{
return verb switch
{
"move" => new[] { "pads softly along{place_at}", "slinks ahead, watching the way{place_at}" },
"play" => new[] { "bats, twists, and springs aside{place_at}", "springs into sudden leaps{place_at}" },
_ => null
};
}
if (profile == "buffalo")
{
return verb switch
{
"move" => new[] { "trudges onward with steady weight{place_at}", "ambles ahead in slow, heavy steps{place_at}" },
"play" => new[] { "charges, stops, and wheels around{place_at}", "stomps and bounds with clumsy enthusiasm{place_at}" },
_ => null
};
}
if (profile == "crabzilla")
{
return verb switch
{
"move" => new[] { "takes enormous sideways strides{place_at}", "scuttles onward like a moving fortress{place_at}" },
"fight" => Targeted(hasTarget, "brings a colossal claw against {target}{place_at}", "crashes into {target} like a siege engine{place_at}", "fights with city-shaking force{place_at}", "clashes like a moving fortress{place_at}"),
_ => null
};
}
return null;
}
private static string[] BodyBag(
ActivityBodyTag body,
string verb,

View file

@ -56,11 +56,42 @@ public static class ActivityClauseAssembler
// Traits stay on the dossier chips - they only salt variety below, never named here.
string pressure = BuildPressureClause(ctx, action);
string line = subject + " " + action + pressure;
string target = BuildObservedTargetClause(ctx, action);
string carrying = BuildCarryingClause(ctx, action);
string pressure = BuildPressureClause(ctx, action + target);
string line = subject + " " + action + target + carrying + pressure;
return CollapseSpaces(line).Trim();
}
private static string BuildObservedTargetClause(ActivityContext ctx, string action)
{
if (ctx == null
|| !ctx.TargetIsActor
|| string.IsNullOrEmpty(ctx.TargetName)
|| ctx.InCombat
|| ctx.HasAttackTarget
|| action.IndexOf("{target}", StringComparison.Ordinal) >= 0
|| action.IndexOf("{with}", StringComparison.Ordinal) >= 0)
{
return "";
}
return " with {target}";
}
private static string BuildCarryingClause(ActivityContext ctx, string action)
{
if (ctx == null
|| string.IsNullOrEmpty(ctx.CarryingLabel)
|| action.IndexOf("{carrying}", StringComparison.Ordinal) >= 0
|| action.IndexOf(ctx.CarryingLabel, StringComparison.OrdinalIgnoreCase) >= 0)
{
return "";
}
return " while carrying {carrying}";
}
private static string BuildSubject(ActivityContext ctx, string action, out bool placeInAppositive)
{
placeInAppositive = false;

View file

@ -0,0 +1,184 @@
using System;
namespace IdleSpectator;
/// <summary>
/// Adds a meaningful transformed-variant tone without replacing the recovered base mob voice.
/// Native authored forms keep their own complete voice and do not pass through this overlay.
/// </summary>
public static class ActivityModifierVoiceOverlay
{
private const string ContextTokens = "{place_at}{job_as}";
public static string Apply(
string basePhrase,
ProseVoice voice,
string verb,
long subjectId,
int lineIndex)
{
if (string.IsNullOrEmpty(basePhrase)
|| voice == null
|| voice.Modifier == ActivityModifier.None
|| voice.LiveSpeciesId.Equals(voice.BaseSpeciesId, StringComparison.OrdinalIgnoreCase))
{
return basePhrase;
}
string[] bag = OverlayBag(voice.Modifier, voice.BaseBodyTag, verb);
if (bag == null || bag.Length == 0)
{
return basePhrase;
}
int index = (int)((subjectId ^ (lineIndex * 397L)) & 1L) % bag.Length;
string core = basePhrase.EndsWith(ContextTokens, StringComparison.Ordinal)
? basePhrase.Substring(0, basePhrase.Length - ContextTokens.Length)
: basePhrase;
return core + bag[index] + ContextTokens;
}
private static string[] OverlayBag(
ActivityModifier modifier,
ActivityBodyTag body,
string verb)
{
return modifier switch
{
ActivityModifier.Undead => UndeadBag(body, verb),
ActivityModifier.Elemental => ElementalBag(verb),
ActivityModifier.Mush => MushBag(verb),
ActivityModifier.Tumor => TumorBag(verb),
ActivityModifier.Alien => AlienBag(verb),
ActivityModifier.Construct => ConstructBag(verb),
_ => null
};
}
private static string[] UndeadBag(ActivityBodyTag body, string verb)
{
if (verb == "move")
{
return body switch
{
ActivityBodyTag.Canine => V(
", its paws landing in stiff, uneven beats",
", its muzzle fixed ahead as its gait falters"),
ActivityBodyTag.Feline => V(
", each silent step held rigid too long",
", its once-fluid gait broken into sharp jolts"),
ActivityBodyTag.Bird => V(
", its lifeless wings beating out of rhythm",
", each ragged motion ending in a hard twitch"),
ActivityBodyTag.Insect => V(
", its joints clicking in lifeless sequence",
", each small step snapping into the next"),
ActivityBodyTag.Plant => V(
", its withered growth dragging behind",
", every deadened limb moving in rigid turns"),
ActivityBodyTag.Dragon => V(
", its ruined frame carrying deathly weight",
", every ancient joint grinding through the motion"),
_ => V(
", its gait broken by stiff, uneven jolts",
", every step landing with lifeless weight")
};
}
return verb switch
{
"wait" => V(
", holding an unnaturally rigid posture",
", without breath or any easy motion"),
"play" => V(
", repeating each motion in empty jerks",
", the movement breaking into stiff, empty rhythms"),
"eat" => V(
", driven by a hunger that never eases",
", consuming each bite without satisfaction"),
"sleep" => V(
", lying rigid even at rest",
", never fully losing its restless tension"),
"hunt" => V(
", pursuing without tiring",
", never slowing as the chase continues"),
"fight" => V(
", striking without fear or pain",
", pressing the attack with deathless persistence"),
"social" => V(
", answering with hollow, halting sounds",
", holding close in an uneasy silence"),
"laugh" => V(
", the sound collapsing into a dry rasp",
", each note ending in a hollow groan"),
"work" => V(
", continuing in tireless, rigid motions",
", never pausing as its joints grind on"),
_ => V(
", its body moving with lifeless stiffness",
", each motion marked by restless undeath")
};
}
private static string[] ElementalBag(string verb)
{
return verb switch
{
"wait" => V(", flickering without becoming still", ", its glow rising and falling"),
"sleep" => V(", dimming to a banked glow", ", its brightness settling low"),
"eat" => V(", drawing the meal into its inner heat", ", feeding the flame within"),
"fight" => V(", shedding sparks with every strike", ", flaring brighter through the clash"),
_ => V(", edged by quick tongues of flame", ", trailing brief curls of heat")
};
}
private static string[] MushBag(string verb)
{
return verb switch
{
"wait" => V(", faint spores drifting from every pause", ", its soft growth gently pulsing"),
"eat" => V(", drawing nourishment through fibrous growth", ", feeding in slow, spreading pulses"),
"fight" => V(", bursting spores through every impact", ", its soft mass recoiling and swelling"),
_ => V(", shedding a faint wake of spores", ", its softened form flexing with each motion")
};
}
private static string[] TumorBag(string verb)
{
return verb switch
{
"wait" => V(", its swollen mass quivering in place", ", uneven pulses passing through its body"),
"eat" => V(", absorbing the meal into its growing mass", ", folding each bite into hungry tissue"),
"fight" => V(", its mass surging behind every blow", ", new growth tightening through the clash"),
_ => V(", its form shifting in uneven pulses", ", swollen tissue rolling through each motion")
};
}
private static string[] AlienBag(string verb)
{
return verb switch
{
"wait" => V(", holding a posture that is difficult to read", ", its unfamiliar joints locking at odd angles"),
"social" => V(", answering in precise, unfamiliar signals", ", mirroring the exchange with uncanny timing"),
"fight" => V(", changing angles without warning", ", every strike arriving with uncanny precision"),
_ => V(", following an unfamiliar rhythm", ", each motion precise but difficult to predict")
};
}
private static string[] ConstructBag(string verb)
{
return verb switch
{
"wait" => V(", every mechanism settling into a fixed hold", ", its joints locking into measured stillness"),
"sleep" => V(", its moving parts falling dormant", ", the last small mechanisms winding down"),
"fight" => V(", every joint driving the next strike", ", its rigid frame absorbing the impact"),
"work" => V(", repeating each step with exact precision", ", its mechanisms keeping a flawless cadence"),
_ => V(", every joint moving in measured sequence", ", its mechanisms keeping a precise cadence")
};
}
private static string[] V(string first, string second)
{
return new[] { first, second };
}
}

View file

@ -1,395 +1,13 @@
using System.Collections.Generic;
namespace IdleSpectator;
/// <summary>
/// Fact-preserving activity sentences with colored actor/target names.
/// Fact-preserving activity sentence formatting with colored actor/target names.
/// <see cref="ActivityClauseAssembler"/> supplies templates from the verb map and authored species bags.
/// </summary>
public static class ActivityProse
{
public const string NameColorHex = "#F0C14A";
/// <summary>
/// Long detailed templates. Tokens: {actor}{target}{species}{place}{place_at}{job}{job_as}{carrying}{with}.
/// Never invent outcomes - only flavor observed tasks.
/// Prefer <see cref="ActivityClauseAssembler"/> for full alive composition; Variants seed action phrases.
/// </summary>
private static readonly Dictionary<string, string[]> Variants = new Dictionary<string, string[]>
{
["attack"] = new[]
{
"{actor} strikes hard at {target}{place_at}",
"{actor} presses the attack on {target}{place_at}",
"{actor} lunges toward {target} with clear intent{place_at}"
},
["fight"] = new[]
{
"{actor} fights {target} in a fierce clash{place_at}",
"{actor} clashes with {target}{place_at}{job_as}",
"{actor} trades blows with {target}{place_at}"
},
["fighting"] = new[]
{
"{actor} is locked in combat with {target}{place_at}",
"{actor} fights {target} without giving ground{place_at}",
"{actor} clashes with {target}{place_at}"
},
["hunt"] = new[]
{
"{actor} pursues {target}{place_at}",
"{actor} stalks {target} from cover{place_at}",
"{actor} closes in on {target}{place_at}"
},
["BehAttackActorHuntingTarget"] = new[]
{
"{actor} hunts {target} and strikes when the moment opens{place_at}",
"{actor} closes on {target} in the chase{place_at}",
"{actor} strikes at {target} while hunting{place_at}"
},
["heal"] = new[]
{
"{actor} tends carefully to {target}{place_at}",
"{actor} works to heal {target}{place_at}",
"{actor} binds {target}'s wounds with steady hands{place_at}"
},
["check_heal"] = new[]
{
"{actor} checks over wounds with worried care{place_at}",
"{actor} looks closely at injuries{place_at}",
"{actor} takes stock of pain before moving on{place_at}"
},
["cure"] = new[]
{
"{actor} seeks a cure for what ails them{place_at}",
"{actor} works to recover from sickness{place_at}",
"{actor} fights sickness with stubborn will{place_at}"
},
["eat"] = new[]
{
"{actor} sits down to eat{place_at}{job_as}",
"{actor} finds something to eat{place_at}",
"{actor} finishes a meal{place_at}"
},
["eating"] = new[]
{
"{actor} sits down to eat{place_at}{job_as}",
"{actor} finds something to eat{place_at}",
"{actor} finishes a meal{place_at}"
},
["sleep"] = new[]
{
"{actor} settles into sleep and lets the world go quiet{place_at}",
"{actor} rests deeply after the day's demands{place_at}{job_as}",
"{actor} curls into sleep{place_at}"
},
["decide_where_to_sleep"] = new[]
{
"{actor} searches for a safe place to sleep{place_at}",
"{actor} weighs where to rest for the night{place_at}",
"{actor} seeks shelter before settling down{place_at}"
},
["random_move"] = new[]
{
"{actor} wanders without hurry{place_at}",
"{actor} roams nearby, looking around{place_at}",
"{actor} drifts along with nowhere urgent to be{place_at}"
},
["city_idle_walking"] = new[]
{
"{actor} walks the streets at an easy pace{place_at}{job_as}",
"{actor} strolls through the settlement, watching life pass{place_at}",
"{actor} paces familiar paths between errands{place_at}"
},
["move"] = new[]
{
"{actor} is on the move with purpose{place_at}{job_as}",
"{actor} travels onward through the world{place_at}",
"{actor} heads out toward the next mark{place_at}"
},
["pollinate"] = new[]
{
"{actor} dusts the blossom with careful work{place_at}",
"{actor} works the flower and leaves the air sweet{place_at}",
"{actor} leaves pollen behind on the bloom{place_at}"
},
["BehPollinate"] = new[]
{
"{actor} dusts the blossom with careful work{place_at}",
"{actor} works the flower and leaves the air sweet{place_at}",
"{actor} leaves pollen behind on the bloom{place_at}"
},
["farm"] = new[]
{
"{actor} tends the fields with patient labor{place_at}{job_as}",
"{actor} works the soil until it answers{place_at}",
"{actor} farms the plot through the day{place_at}"
},
["harvest"] = new[]
{
"{actor} harvests the ripe crop with practiced hands{place_at}{job_as}",
"{actor} gathers the yield before it spoils{place_at}",
"{actor} cuts the ripe fields clean{place_at}"
},
["forag"] = new[]
{
"{actor} forages through wild growth for food{place_at}",
"{actor} gathers what the land offers freely{place_at}",
"{actor} searches the brush for forage{place_at}"
},
["gather"] = new[]
{
"{actor} gathers stores for leaner days{place_at}{job_as}",
"{actor} collects goods with steady purpose{place_at}",
"{actor} forages supplies into the pack{place_at}"
},
["mine"] = new[]
{
"{actor} delves the mine for ore and stone{place_at}{job_as}",
"{actor} chips at the rock face with hard labor{place_at}",
"{actor} works the dig until the haul is ready{place_at}"
},
["build"] = new[]
{
"{actor} builds with focused craft{place_at}{job_as}",
"{actor} raises walls and timber into shape{place_at}",
"{actor} labors on construction until it stands{place_at}"
},
["woodcut"] = new[]
{
"{actor} fells timber for the settlement's need{place_at}{job_as}",
"{actor} takes an axe to the trees with measured swings{place_at}",
"{actor} cuts wood and stacks the haul{place_at}"
},
["fire"] = new[]
{
"{actor} races the blaze and fights to keep it down{place_at}",
"{actor} douses flames before they claim more ground{place_at}",
"{actor} battles the fire with urgent work{place_at}"
},
["BehCityActorRemoveFire"] = new[]
{
"{actor} races the blaze and fights to keep it down{place_at}",
"{actor} douses flames before they claim more ground{place_at}",
"{actor} beats back the fire with urgent work{place_at}"
},
["social"] = new[]
{
"{actor} talks at length{with}{place_at}{job_as}",
"{actor} socializes and shares the moment{with}{place_at}",
"{actor} converses warmly{with}{place_at}"
},
["socialize"] = new[]
{
"{actor} talks at length{with}{place_at}{job_as}",
"{actor} socializes and shares the moment{with}{place_at}",
"{actor} joins company nearby{with}{place_at}"
},
["lover"] = new[]
{
"{actor} seeks out {target} with unmistakable longing{place_at}",
"{actor} is drawn toward {target} through the day{place_at}",
"{actor} pursues {target}'s affection with quiet resolve{place_at}"
},
["breed"] = new[]
{
"{actor} tries to start a family with {target}{place_at}",
"{actor} courts {target} with clear intent{place_at}",
"{actor} seeks offspring with {target}{place_at}"
},
["sexual_reproduction"] = new[]
{
"{actor} tries to start a family with {target}{place_at}",
"{actor} courts {target} with clear intent{place_at}",
"{actor} seeks offspring with {target}{place_at}"
},
["unload"] = new[]
{
"{actor} unloads {carrying} into store{place_at}",
"{actor} delivers {carrying} after a long haul{place_at}",
"{actor} empties the pack of {carrying}{place_at}"
},
["BehUnloadResources"] = new[]
{
"{actor} unloads {carrying} at {place}",
"{actor} delivers {carrying} into store{place_at}",
"{actor} empties the pack of {carrying}{place_at}"
},
["job"] = new[]
{
"{actor} looks for honest work{place_at}",
"{actor} looks for a job that will keep them fed{place_at}",
"{actor} searches for employment through the settlement{place_at}"
},
["find_city_job"] = new[]
{
"{actor} seeks work in town{place_at}",
"{actor} checks the available city jobs{place_at}",
"{actor} searches the settlement for employment{place_at}"
},
["find_house"] = new[]
{
"{actor} looks for a house to call home{place_at}",
"{actor} seeks shelter and a lasting roof{place_at}",
"{actor} searches for a place to settle{place_at}"
},
["claim"] = new[]
{
"{actor} claims new ground for the settlement{place_at}",
"{actor} stakes a claim on open land{place_at}",
"{actor} takes claim of border ground{place_at}"
},
["warrior"] = new[]
{
"{actor} follows the army with disciplined steps{place_at}",
"{actor} marches with the warband{place_at}{job_as}",
"{actor} keeps formation and waits for orders{place_at}"
},
["army"] = new[]
{
"{actor} follows the army with disciplined steps{place_at}",
"{actor} marches with the warband{place_at}",
"{actor} keeps formation among the ranks{place_at}"
},
["wait"] = new[]
{
"{actor} waits in watchful quiet{place_at}{job_as}",
"{actor} holds still and lets the moment pass{place_at}",
"{actor} bides time without wasting motion{place_at}"
},
["make_decision"] = new[]
{
"{actor} considers next steps with care{place_at}",
"{actor} weighs a choice before moving{place_at}{job_as}",
"{actor} pauses in thought while the world waits{place_at}"
},
["reflection"] = new[]
{
"{actor} reflects on what the day has asked{place_at}",
"{actor} takes a quiet moment to think things over{place_at}",
"{actor} settles into reflection away from noise{place_at}"
},
["run_away"] = new[]
{
"{actor} flees hard for safer ground{place_at}",
"{actor} runs for safety without looking back{place_at}",
"{actor} retreats in a burst of fear{place_at}"
},
["trade"] = new[]
{
"{actor} keeps a careful eye on traded goods{place_at}{job_as}",
"{actor} barters over prices{place_at}",
"{actor} makes a trading run{place_at}"
},
["fish"] = new[]
{
"{actor} waits patiently for a bite{place_at}{job_as}",
"{actor} casts for fish where the current runs{place_at}",
"{actor} works the waters for a catch{place_at}"
},
["family_group"] = new[]
{
"{actor} joins the herd and stays close to kin{place_at}",
"{actor} seeks the family group across open ground{place_at}",
"{actor} gathers with kin for safety and company{place_at}"
},
["generate_loot"] = new[]
{
"{actor} gathers loot from what the fight left behind{place_at}",
"{actor} claims spoils with practical hands{place_at}",
"{actor} picks through loot before moving on{place_at}"
},
["laughing"] = new[]
{
"{actor} laughs aloud and lets the mood carry{place_at}",
"{actor} bursts into laughter without restraint{place_at}",
"{actor} keeps laughing until short of breath{place_at}"
},
["happy_laughing"] = new[]
{
"{actor} laughs with bright, unguarded joy{place_at}",
"{actor} laughs happily among nearby company{place_at}",
"{actor} chuckles aloud until the mood softens{place_at}"
},
["just_laughed"] = new[]
{
"{actor} just finished laughing and catches a breath{place_at}",
"{actor} settles after a laugh, still smiling{place_at}",
"{actor} catches their breath from laughing{place_at}"
},
["singing"] = new[]
{
"{actor} sings out for whoever will hear{place_at}{job_as}",
"{actor} lifts a song into the open air{place_at}",
"{actor} is singing through the quiet stretch{place_at}"
},
["task_unit_play"] = new[]
{
"{actor} moves about in quick, restless bursts{place_at}",
"{actor} darts back and forth for a while{place_at}",
"{actor} bounds around with eager energy{place_at}"
},
["just_played"] = new[]
{
"{actor} slows down after playing{place_at}",
"{actor} stops to catch a breath{place_at}",
"{actor} settles after a burst of activity{place_at}"
},
["child_play_at_one_spot"] = new[]
{
"{actor} hops and pivots without wandering far{place_at}",
"{actor} keeps busy in one small spot{place_at}",
"{actor} turns and bounces in place{place_at}"
},
["child_random_flips"] = new[]
{
"{actor} flips and tumbles about{place_at}",
"{actor} rolls forward and springs upright{place_at}",
"{actor} tries one quick flip after another{place_at}"
},
["child_random_jump"] = new[]
{
"{actor} jumps about in quick bursts{place_at}",
"{actor} leaps forward and doubles back{place_at}",
"{actor} bounces around without settling{place_at}"
},
["child_follow_parent"] = new[]
{
"{actor} follows a parent with careful steps{place_at}",
"{actor} stays close to {target} through the day{place_at}",
"{actor} trails after kin and will not stray far{place_at}"
},
["random_fun_move"] = new[]
{
"{actor} frolics and wheels around{place_at}",
"{actor} darts off and circles back{place_at}",
"{actor} skips along without hurry{place_at}"
},
["godfinger_random_fun_move"] = new[]
{
"{actor} moves in sudden, unpredictable turns{place_at}",
"{actor} darts one way, then abruptly another{place_at}",
"{actor} loops around in restless motion{place_at}"
},
["try_to_read"] = new[]
{
"{actor} tries to read and settle into the page{place_at}",
"{actor} opens a book and gives it quiet attention{place_at}",
"{actor} settles in to read while the world softens{place_at}"
},
["try_to_poop"] = new[]
{
"{actor} looks for a private moment away from eyes{place_at}",
"{actor} tends to nature's call with hurried dignity{place_at}",
"{actor} steps aside briefly for a private need{place_at}"
},
["try_to_launch_fireworks"] = new[]
{
"{actor} tries to launch fireworks into celebration{place_at}",
"{actor} readies a firework with careful hands{place_at}",
"{actor} prepares a celebration blast for the sky{place_at}"
}
};
public static string ColorName(string name)
{
if (string.IsNullOrEmpty(name))
@ -464,15 +82,10 @@ public static class ActivityProse
varietyId,
lineIndex);
// Unreachable by composer contract. Preserve empty output so missing authored coverage remains auditable.
if (string.IsNullOrEmpty(template))
{
template = "{actor} attends to " + LowerFirst(HumanizeKey(key))
+ "{place_at}{job_as}";
if (string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(rawFact))
{
template = GerundSentence(rawFact);
}
return;
}
plain = Apply(template, ctx, colored: false);
@ -526,34 +139,11 @@ public static class ActivityProse
}
}
/// <summary>Action-only phrase from pattern heuristics (no subject).</summary>
public static string PatternActionPhrase(string key, bool hasTarget)
{
string full = PatternTemplate(key, hasTarget);
if (string.IsNullOrEmpty(full))
{
return "";
}
return ActivityClauseAssembler.StripSubject(full);
}
public static string HumanizeKeyPublic(string key)
{
return HumanizeKey(key);
}
public static string HumanizeJobPublic(string jobId)
{
return HumanizeJob(jobId);
}
/// <summary>Observed localized fact as an action-only phrase for unknown task ids.</summary>
public static string FactualActionPhrase(string rawFact, string key, bool hasTarget)
{
return ActivityClauseAssembler.StripSubject(LocalizedTemplate(rawFact, key, hasTarget));
}
/// <summary>Legacy helper used by older call sites / harness.</summary>
public static string Format(
ActivityKind kind,
@ -624,6 +214,19 @@ public static class ActivityProse
.Replace(" toward {target}", "")
.Replace(" after {target}", "")
.Replace(" at {target}", "")
.Replace(" against {target}", "")
.Replace(" before {target}", "")
.Replace(" beside {target}", "")
.Replace(" near {target}", "")
.Replace(" around {target}", "")
.Replace(" past {target}", "")
.Replace(" behind {target}", "")
.Replace(" under {target}", "")
.Replace(" over {target}", "")
.Replace(" across {target}", "")
.Replace(" from {target}", "")
.Replace(" into {target}", "")
.Replace(" upon {target}", "")
.Replace(" {target}", "")
.Replace("{target}", "someone");
}
@ -657,362 +260,6 @@ public static class ActivityProse
return LowerFirst(s);
}
private static string PatternTemplate(string key, bool hasTarget)
{
if (string.IsNullOrEmpty(key))
{
return null;
}
string k = key.ToLowerInvariant();
const string clauses = "{place_at}{job_as}";
if (k.StartsWith("try_to_"))
{
return "{actor} tries to " + HumanizeKey(k.Substring("try_to_".Length))
+ " with careful effort" + clauses;
}
if (k.StartsWith("check_"))
{
return "{actor} checks " + HumanizeKey(k.Substring("check_".Length))
+ " before deciding what comes next" + clauses;
}
if (k.StartsWith("find_"))
{
return "{actor} looks for " + HumanizeKey(k.Substring("find_".Length))
+ clauses;
}
if (k.StartsWith("decide_"))
{
return "{actor} decides " + HumanizeKey(k.Substring("decide_".Length))
+ " after a moment of thought" + clauses;
}
if (k.StartsWith("build_"))
{
return "{actor} builds " + HumanizeKey(k.Substring("build_".Length))
+ " with steady hands" + clauses;
}
if (k.StartsWith("boat_"))
{
return "{actor} " + BoatVerb(k.Substring("boat_".Length)) + clauses;
}
if (k.StartsWith("warrior_"))
{
return WarriorTemplate(k, hasTarget) + clauses;
}
if (k.StartsWith("socialize_"))
{
return hasTarget
? "{actor} spends time with {target}" + clauses
: "{actor} looks for company" + clauses;
}
if (k.StartsWith("sexual_reproduction") || k.StartsWith("asexual_reproduction"))
{
return hasTarget
? "{actor} tries to start a family with {target}" + clauses
: "{actor} tries to reproduce and carry life forward" + clauses;
}
if (k.StartsWith("child_"))
{
return "{actor} " + LowerFirst(HumanizeKey(k.Substring("child_".Length)))
+ " eagerly" + clauses;
}
if (k.StartsWith("ant_") || k.StartsWith("bee_") || k.StartsWith("ufo_")
|| k.StartsWith("dragon_") || k.StartsWith("worm_"))
{
return "{actor} " + LowerFirst(HumanizeKey(StripCreaturePrefix(k)))
+ clauses;
}
if (k.StartsWith("task_unit_"))
{
return LocalizedStyleFromId(k.Substring("task_unit_".Length), hasTarget);
}
if (k.Contains("laugh"))
{
return "{actor} laughs aloud and lets the mood carry" + clauses;
}
if (k.Contains("sing"))
{
return "{actor} sings out for whoever will hear" + clauses;
}
if (k.Contains("play") && !k.Contains("display"))
{
return hasTarget
? "{actor} plays with {target}" + clauses
: "{actor} finds a way to amuse itself" + clauses;
}
if (k.Contains("wait"))
{
return "{actor} waits in watchful quiet" + clauses;
}
if (k.Contains("sleep"))
{
return "{actor} settles into sleep and lets the world go quiet" + clauses;
}
if (k.Contains("idle") || k.Contains("random_move") || k.EndsWith("_move")
|| k.Contains("walking"))
{
return "{actor} wanders without hurry" + clauses;
}
if (k.Contains("fight") || k.Contains("attack") || k.Contains("hunt"))
{
return hasTarget
? "{actor} strikes at {target} with clear intent" + clauses
: "{actor} braces for a fight" + clauses;
}
if (k.Contains("heal") || k.Contains("cure"))
{
return hasTarget
? "{actor} tends carefully to {target}" + clauses
: "{actor} tends to wounds with worried care" + clauses;
}
if (k.Contains("eat") || k.Contains("food"))
{
return "{actor} sits down to eat" + clauses;
}
if (k.Contains("farm") || k.Contains("harvest") || k.Contains("forag")
|| k.Contains("gather") || k.Contains("chop") || k.Contains("mine")
|| k.Contains("build") || k.Contains("woodcut"))
{
return "{actor} " + LowerFirst(HumanizeKey(k))
+ " with steady labor" + clauses;
}
if (k.Contains("trade") || k.Contains("fish") || k.Contains("unload")
|| k.Contains("claim") || k.Contains("fire"))
{
return "{actor} " + LowerFirst(HumanizeKey(k))
+ clauses;
}
return null;
}
private static string WarriorTemplate(string k, bool hasTarget)
{
if (k.Contains("follow"))
{
return hasTarget
? "{actor} follows {target} with disciplined steps"
: "{actor} follows the army with disciplined steps";
}
if (k.Contains("train"))
{
return "{actor} trains for war with hard repetition";
}
if (k.Contains("join"))
{
return "{actor} tries to join the army and take a place in the ranks";
}
if (k.Contains("attack"))
{
return hasTarget
? "{actor} marches on {target} with the warband"
: "{actor} marches to attack with the warband";
}
if (k.Contains("wait") || k.Contains("idle"))
{
return "{actor} holds formation and waits for orders";
}
return "{actor} " + LowerFirst(HumanizeKey(k.Replace("warrior_", "")))
+ " among the ranks";
}
private static string BoatVerb(string rest)
{
if (rest.Contains("fish"))
{
return "fishes from the boat and waits for a bite";
}
if (rest.Contains("trade"))
{
return "carries trade goods by boat";
}
if (rest.Contains("dock") || rest.Contains("return"))
{
return "returns to dock after time on the water";
}
if (rest.Contains("load"))
{
return "loads the boat for the next run";
}
if (rest.Contains("unload"))
{
return "unloads the boat and clears the hold";
}
if (rest.Contains("idle"))
{
return "waits aboard between trips";
}
return LowerFirst(HumanizeKey(rest)) + " aboard";
}
private static string StripCreaturePrefix(string k)
{
int idx = k.IndexOf('_');
return idx > 0 && idx < k.Length - 1 ? k.Substring(idx + 1) : k;
}
private static string LocalizedStyleFromId(string rest, bool hasTarget)
{
const string clauses = "{place_at}{job_as}";
if (rest == "play")
{
return "{actor} finds a way to amuse itself" + clauses;
}
if (rest == "wait")
{
return "{actor} waits in watchful quiet" + clauses;
}
if (rest == "walk")
{
return "{actor} walks at an easy pace" + clauses;
}
if (rest.Contains("social"))
{
return hasTarget
? "{actor} spends time with {target}" + clauses
: "{actor} looks for company" + clauses;
}
return "{actor} " + LowerFirst(HumanizeKey(rest))
+ clauses;
}
/// <summary>
/// Turn game localized labels like "Laughing" / "Job Seeking" into real sentences.
/// </summary>
private static string LocalizedTemplate(string rawFact, string key, bool hasTarget)
{
string loc = ExtractLocalizedBody(rawFact, key);
if (string.IsNullOrEmpty(loc))
{
return null;
}
return GerundSentence(loc);
}
private static string ExtractLocalizedBody(string rawFact, string key)
{
if (string.IsNullOrEmpty(rawFact))
{
return null;
}
string body = rawFact;
int arrow = body.IndexOf('→');
if (arrow < 0)
{
arrow = body.IndexOf("->", System.StringComparison.Ordinal);
}
if (arrow >= 0)
{
body = body.Substring(0, arrow).Trim();
}
if (body.StartsWith("Task:", System.StringComparison.OrdinalIgnoreCase))
{
return null;
}
// Ignore if it's just the raw key.
if (!string.IsNullOrEmpty(key)
&& body.Equals(key, System.StringComparison.OrdinalIgnoreCase))
{
return null;
}
return body.Trim();
}
private static string GerundSentence(string loc)
{
if (string.IsNullOrEmpty(loc))
{
return null;
}
string body = loc.Trim();
// "Laughing" / "Job Seeking" / "Holding Still"
if (IsGerundPhrase(body))
{
return "{actor} is " + LowerFirst(body)
+ "{place_at}{job_as}";
}
// Already a short verb phrase - still give it place/job room.
return "{actor} " + LowerFirst(body) + "{place_at}{job_as}";
}
private static bool IsGerundPhrase(string body)
{
if (string.IsNullOrEmpty(body))
{
return false;
}
string[] parts = body.Split(new[] { ' ' }, System.StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 0 || parts.Length > 4)
{
return false;
}
// Last token ends with -ing (Laughing, Seeking, Holding...)
string last = parts[parts.Length - 1];
return last.Length > 4
&& last.EndsWith("ing", System.StringComparison.OrdinalIgnoreCase);
}
private static string HumanizeKey(string key)
{
if (string.IsNullOrEmpty(key))
{
return "";
}
string s = key.Replace("Beh", "").Replace('_', ' ').Trim();
// Collapse common noise words for readability.
s = s.Replace("task unit ", "").Replace("type ", "");
return s;
}
private static string LowerFirst(string s)
{
if (string.IsNullOrEmpty(s))
@ -1027,90 +274,4 @@ public static class ActivityProse
return char.ToLowerInvariant(s[0]) + s.Substring(1);
}
private static string PickTemplate(string key, long subjectId, int lineIndex, bool hasTarget)
{
if (string.IsNullOrEmpty(key))
{
return null;
}
string[] bag = null;
if (Variants.TryGetValue(key, out bag) && bag != null && bag.Length > 0)
{
return PreferTargetAware(bag, hasTarget, subjectId, key, lineIndex);
}
string lower = key.ToLowerInvariant();
string bestKey = null;
string[] bestBag = null;
int bestLen = -1;
foreach (KeyValuePair<string, string[]> kv in Variants)
{
if (kv.Value == null || kv.Value.Length == 0)
{
continue;
}
if (lower.IndexOf(kv.Key, System.StringComparison.Ordinal) >= 0 && kv.Key.Length > bestLen)
{
bestLen = kv.Key.Length;
bestKey = kv.Key;
bestBag = kv.Value;
}
}
if (bestBag == null)
{
return null;
}
return PreferTargetAware(bestBag, hasTarget, subjectId, bestKey, lineIndex);
}
private static string PreferTargetAware(
string[] bag,
bool hasTarget,
long subjectId,
string key,
int lineIndex)
{
var suited = new List<string>(bag.Length);
for (int i = 0; i < bag.Length; i++)
{
string line = bag[i];
bool needsTarget = line.IndexOf("{target}", System.StringComparison.Ordinal) >= 0;
if (hasTarget || !needsTarget)
{
suited.Add(line);
}
}
if (suited.Count == 0)
{
suited.AddRange(bag);
}
return suited[PickIndex(subjectId, key, lineIndex, suited.Count)];
}
private static int PickIndex(long subjectId, string key, int lineIndex, int count)
{
if (count <= 1)
{
return 0;
}
unchecked
{
int h = (int)(subjectId * 397) ^ (key?.GetHashCode() ?? 0) ^ (lineIndex * 31);
h ^= (int)(UnityEngine.Time.unscaledTime * 10f);
if (h < 0)
{
h = -h;
}
return h % count;
}
}
}

View file

@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
namespace IdleSpectator;
public enum ActivityVoiceSource
{
Unknown,
AuthoredSpecies,
TaxonomyFallback,
Vehicle
}
/// <summary>
/// Complete authored action vocabulary for one verified base mob.
/// Contextual clauses such as actor, target, terrain, place, and job stay outside this type.
/// </summary>
public sealed class ActivitySpeciesVoice
{
public static readonly string[] AuthoredVerbs =
{
"move", "wait", "play", "eat", "sleep",
"hunt", "fight", "social", "laugh", "work",
"sing", "lover", "farm", "pollinate", "trade",
"fish", "haul", "heal", "fire", "flee",
"settle", "warrior", "read", "gather_life", "relieve",
"confused", "recharge", "strange_urge", "steal", "possessed",
"dream", "ignite", "extinguish", "group", "harvest_life",
"loot", "cry", "swear"
};
private readonly Dictionary<string, string[]> _bags;
private readonly Dictionary<string, string[]> _liquidBags =
new Dictionary<string, string[]>(StringComparer.Ordinal);
public string Id { get; }
internal ActivitySpeciesVoice(string id, Dictionary<string, string[]> bags)
{
Id = id ?? "";
_bags = bags ?? new Dictionary<string, string[]>(StringComparer.Ordinal);
}
public static bool IsAuthoredVerb(string verb)
{
string key = verb ?? "";
for (int i = 0; i < AuthoredVerbs.Length; i++)
{
if (AuthoredVerbs[i].Equals(key, StringComparison.Ordinal))
{
return true;
}
}
return false;
}
public string[] GetBag(string verb, ActivityTerrain terrain)
{
string key = verb ?? "";
if (terrain == ActivityTerrain.Liquid
&& _liquidBags.TryGetValue(key, out string[] liquid)
&& liquid != null
&& liquid.Length > 0)
{
return liquid;
}
return _bags.TryGetValue(key, out string[] bag) ? bag : null;
}
public bool HasCompleteCore()
{
for (int i = 0; i < AuthoredVerbs.Length; i++)
{
if (!_bags.TryGetValue(AuthoredVerbs[i], out string[] bag)
|| bag == null
|| bag.Length < 2
|| string.IsNullOrEmpty(bag[0])
|| string.IsNullOrEmpty(bag[1]))
{
return false;
}
}
return true;
}
internal void SetLiquidBag(string verb, string[] bag)
{
if (!string.IsNullOrEmpty(verb) && bag != null && bag.Length > 0)
{
_liquidBags[verb] = bag;
}
}
internal void SetBag(string verb, string[] bag)
{
if (!string.IsNullOrEmpty(verb) && bag != null && bag.Length > 0)
{
_bags[verb] = bag;
}
}
}

View file

@ -0,0 +1,207 @@
using System;
using System.Collections.Generic;
namespace IdleSpectator;
/// <summary>Authoritative authored voice registry keyed by verified base actor asset id.</summary>
public static partial class ActivitySpeciesVoiceCatalog
{
private static readonly Dictionary<string, ActivitySpeciesVoice> Voices = Build();
private static Dictionary<string, ActivitySpeciesVoice> Build()
{
var voices = new Dictionary<string, ActivitySpeciesVoice>(StringComparer.OrdinalIgnoreCase);
AddCivVoices(voices);
AddMammalVoices(voices);
AddAnimalVoices(voices);
AddInvertebrateVoices(voices);
AddFantasyVoices(voices);
AddCivExtendedVoices(voices);
AddMammalExtendedVoices(voices);
AddAnimalExtendedVoices(voices);
AddInvertebrateExtendedVoices(voices);
AddFantasyExtendedVoices(voices);
AddCivSpecializedVoices(voices);
AddMammalSpecializedVoices(voices);
AddAnimalSpecializedVoices(voices);
AddInvertebrateSpecializedVoices(voices);
AddFantasySpecializedVoices(voices);
return voices;
}
public static bool TryGet(string baseSpeciesId, out ActivitySpeciesVoice voice)
{
return Voices.TryGetValue(baseSpeciesId ?? "", out voice);
}
public static bool HasCompleteVoice(string baseSpeciesId)
{
return TryGet(baseSpeciesId, out ActivitySpeciesVoice voice) && voice.HasCompleteCore();
}
public static string VoiceKey(string baseSpeciesId)
{
return TryGet(baseSpeciesId, out ActivitySpeciesVoice voice) ? voice.Id : "";
}
public static string[] GetBag(string baseSpeciesId, string verb, ActivityTerrain terrain)
{
return TryGet(baseSpeciesId, out ActivitySpeciesVoice voice)
? voice.GetBag(verb, terrain)
: null;
}
public static List<string> AuthoredIds()
{
var ids = new List<string>(Voices.Keys);
ids.Sort(StringComparer.Ordinal);
return ids;
}
private static void Add(
Dictionary<string, ActivitySpeciesVoice> voices,
string id,
string[] move,
string[] wait,
string[] play,
string[] eat,
string[] sleep,
string[] hunt,
string[] fight,
string[] social,
string[] laugh,
string[] work)
{
var bags = new Dictionary<string, string[]>(StringComparer.Ordinal)
{
["move"] = Contextualize(move),
["wait"] = Contextualize(wait),
["play"] = Contextualize(play),
["eat"] = Contextualize(eat),
["sleep"] = Contextualize(sleep),
["hunt"] = Contextualize(hunt),
["fight"] = Contextualize(fight),
["social"] = Contextualize(social),
["laugh"] = Contextualize(laugh),
["work"] = Contextualize(work)
};
voices[id] = new ActivitySpeciesVoice(id, bags);
}
private static void AddLiquid(
Dictionary<string, ActivitySpeciesVoice> voices,
string id,
string verb,
string first,
string second)
{
if (voices.TryGetValue(id, out ActivitySpeciesVoice voice))
{
voice.SetLiquidBag(verb, Contextualize(V(first, second)));
}
}
private static void AddExtended(
Dictionary<string, ActivitySpeciesVoice> voices,
string id,
string[] sing,
string[] lover,
string[] farm,
string[] pollinate,
string[] trade,
string[] fish,
string[] haul,
string[] heal,
string[] fire,
string[] flee,
string[] settle,
string[] warrior,
string[] read,
string[] gatherLife,
string[] relieve,
string[] confused,
string[] recharge,
string[] strangeUrge,
string[] steal,
string[] possessed,
string[] dream)
{
if (!voices.TryGetValue(id, out ActivitySpeciesVoice voice))
{
throw new InvalidOperationException("Extended voice has no base entry: " + id);
}
Set(voice, "sing", sing);
Set(voice, "lover", lover);
Set(voice, "farm", farm);
Set(voice, "pollinate", pollinate);
Set(voice, "trade", trade);
Set(voice, "fish", fish);
Set(voice, "haul", haul);
Set(voice, "heal", heal);
Set(voice, "fire", fire);
Set(voice, "flee", flee);
Set(voice, "settle", settle);
Set(voice, "warrior", warrior);
Set(voice, "read", read);
Set(voice, "gather_life", gatherLife);
Set(voice, "relieve", relieve);
Set(voice, "confused", confused);
Set(voice, "recharge", recharge);
Set(voice, "strange_urge", strangeUrge);
Set(voice, "steal", steal);
Set(voice, "possessed", possessed);
Set(voice, "dream", dream);
}
private static void Set(ActivitySpeciesVoice voice, string verb, string[] phrases)
{
voice.SetBag(verb, Contextualize(phrases));
}
private static void AddSpecialized(
Dictionary<string, ActivitySpeciesVoice> voices,
string id,
string[] ignite,
string[] extinguish,
string[] group,
string[] harvestLife,
string[] loot,
string[] cry,
string[] swear)
{
if (!voices.TryGetValue(id, out ActivitySpeciesVoice voice))
{
throw new InvalidOperationException("Specialized voice has no base entry: " + id);
}
Set(voice, "ignite", ignite);
Set(voice, "extinguish", extinguish);
Set(voice, "group", group);
Set(voice, "harvest_life", harvestLife);
Set(voice, "loot", loot);
Set(voice, "cry", cry);
Set(voice, "swear", swear);
}
private static string[] V(string first, string second)
{
return new[] { first, second };
}
private static string[] Contextualize(string[] phrases)
{
if (phrases == null)
{
return null;
}
var result = new string[phrases.Length];
for (int i = 0; i < phrases.Length; i++)
{
result[i] = (phrases[i] ?? "") + "{place_at}{job_as}";
}
return result;
}
}

View file

@ -0,0 +1,259 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddAnimalExtendedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddExtended(
voices,
"chicken",
V("lifts its beak through a bright clucking phrase", "pulses its throat while its comb bobs in rhythm"),
V("sidles close with one wing lowered", "touches beak tips through slow head bobs"),
V("rakes backward with alternating clawed feet", "pecks in a measured row with tail raised"),
V("brushes its breast feathers through repeated crouches", "dips its beak while wing tips sweep past"),
V("extends its neck and taps its beak twice", "steps beak-first through a deliberate exchange"),
V("cocks one eye before stabbing its beak downward", "holds a low crouch before a quick beak snap"),
V("leans breast-first and drives with both feet", "hooks its beak forward while legs keep pushing"),
V("preens along a wing with careful beak strokes", "parts breast feathers with short inspecting pecks"),
V("fans both wings through forceful downward beats", "stamps its feet while flight feathers flick rapidly"),
V("hurries in high steps with wings spread wide", "ducks its comb and runs with tail feathers level"),
V("circles twice before folding its legs beneath", "scrapes with both feet and lowers its feathered breast"),
V("raises its spurs while wings brace outward", "marches with comb high and beak held forward"),
V("tracks side to side with one bright eye", "tilts its head between small beak-led nods"),
V("combs its beak through rapid low sweeps", "scratches once before pinching with its beak"),
V("drops its tail and flexes beneath puffed feathers", "crouches low while its vent feathers lift"),
V("turns its head in abrupt one-eyed checks", "crosses its feet while its comb swivels back"),
V("shudders from breast to wing tips in quick pulses", "stiffens both legs as neck feathers ripple"),
V("jerks its beak sideways between uneven wing flicks", "pivots on one foot while its head bobs off-beat"),
V("crouches behind spread wings and darts its beak", "tiptoes with neck tucked before a sudden peck"),
V("paces in rigid steps with feathers standing out", "twists its neck while both wings twitch together"),
V("tucks its beak beneath one wing as toes curl", "settles into feathered stillness with comb tilted"));
AddExtended(
voices,
"crab",
V("clicks alternating pincers beneath pulsing mouthparts", "raises both claws through a clattering cadence"),
V("crosses pincers gently beneath touching eyestalks", "sidesteps close with both claws folded inward"),
V("rakes backward with alternating pointed walking legs", "clips repeatedly with one pincer while eyestalks track"),
V("sweeps both antennae through precise brushing arcs", "opens its pincers around a series of delicate dabs"),
V("presents one open claw then closes it slowly", "passes a measured pincer tap from side to side"),
V("holds one claw poised before a sudden pinch", "probes in short arcs with both pincers parted"),
V("grips forward and rows backward on six legs", "leans its shell rim ahead while pincers pull"),
V("grooms a bent leg between careful pincers", "picks along its shell seam with the smaller claw"),
V("fans its mouthparts while claws beat downward", "stamps its walking legs beneath a lifted shell"),
V("scuttles crabwise with pincers guarding its face", "drops its shell low and pedals every leg rapidly"),
V("tests a circle with antennae before folding its legs", "presses its shell down as pincers sweep outward"),
V("brandishes the larger claw above a squared stance", "locks both pincers forward while legs spread wide"),
V("tracks a line with independently turning eyestalks", "taps each pincer tip while mouthparts count"),
V("clips in tiny bites with alternating claw tips", "rakes its walking legs as antennae inspect each pass"),
V("lifts its shell rim while rear legs flex", "settles low as its abdominal flap tightens"),
V("sidesteps twice then reverses with claws crossed", "aims its eyestalks apart while legs shuffle inward"),
V("vibrates every walking leg beneath a rigid shell", "pumps its mouthparts as both claws slowly rise"),
V("winds one pincer overhead while circling crabwise", "flicks its antennae crosswise through uneven claw taps"),
V("reaches under its shell rim with the smaller pincer", "backs away while one claw closes out of sight"),
V("jerks sideways as both eyestalks dip together", "marches stiff-legged while pincers open and shut"),
V("folds its claws beneath the shell with legs tucked", "rests on bent joints as eyestalks gradually lower"));
AddExtended(
voices,
"crocodile",
V("lifts its long snout through a rumbling bellow", "vibrates its armored throat beneath parted jaws"),
V("rests jaw-to-jaw with its tail curled", "rubs plated snouts through a slow sideward sweep"),
V("pushes its snout forward while foreclaws rake", "presses its belly low and scrapes with splayed claws"),
V("sweeps its broad muzzle through low brushing passes", "nudges forward as ridged scales skim repeatedly"),
V("opens its jaws halfway then closes them with care", "angles its armored head through a measured jaw display"),
V("holds only its eyes and nostrils high before snapping", "creeps belly-low with jaws poised for a sideways clamp"),
V("drives its plated shoulders behind a steady shove", "backs with jaw muscles locked and tail braced"),
V("scrapes its teeth gently along a foreleg scale", "rubs one plated flank with slow hind-claw strokes"),
V("lashes its heavy tail through broad beating arcs", "raises its chest and stamps with splayed forefeet"),
V("surges low with tail whipping behind its plates", "scrambles on spread legs with jaw clamped shut"),
V("circles with snout lowered before flattening its belly", "slides its armored side through a full-length turn"),
V("stands high on splayed legs with jaws agape", "sweeps its plated tail behind a forward-facing snout"),
V("tracks side to side with one ridged eyelid narrowing", "tilts its long jaw between deliberate tooth-lined pauses"),
V("rakes backward with foreclaws beside its muzzle", "roots with its snout through short armored thrusts"),
V("raises its tail base while hind legs straighten", "arches its plated back above a low belly press"),
V("turns in a tight arc around its planted forefeet", "halts mid-crawl as jaw and tail point opposite ways"),
V("shudders along every dorsal ridge from snout to tail", "pumps its throat while all four claws grip"),
V("rolls one shoulder as its jaws yaw sideways", "corkscrews its plated torso through a sudden half-turn"),
V("slides its lower jaw forward beneath closed teeth", "hooks its snout aside while foreclaws conceal a motion"),
V("stalks stiff-legged with tail twitching in sections", "snaps at empty space as armored eyelids flutter"),
V("rests chin-flat with teeth hidden and legs folded", "lies motionless while its heavy tail slowly curves"));
AddExtended(
voices,
"frog",
V("inflates its throat sac through a rolling croak", "pulses its round throat beneath a chirping trill"),
V("presses splayed forefeet close through matching blinks", "leans in with throat pulsing and hind legs folded"),
V("scrapes backward with webbed hind toes", "plants its forefeet while long legs kick in alternation"),
V("brushes its belly past with toes spread broadly", "dabs with forefeet between short throat pulses"),
V("extends both forefeet then draws them to its chest", "bobs on folded legs through a deliberate toe display"),
V("aims both eyes before a lightning tongue flick", "compresses its hind legs beneath a still snout"),
V("shoves from the hips in repeated squat-legged thrusts", "braces both forefeet while long hind legs drive"),
V("wipes one round eye with a flexible forefoot", "rubs its mottled flank using a folded hind leg"),
V("springs upright as forefeet pat rapidly downward", "puffs its throat while webbed toes slap in sequence"),
V("bounds in low arcs with forelegs reaching ahead", "kicks backward in rapid leaps with eyes wide"),
V("tests a small circle by hopping toe-first", "squats centrally with all four feet spread"),
V("rises tall on hind legs with forefeet thrust forward", "crouches like a spring while throat sac stays taut"),
V("follows marks with alternating eye swivels", "counts along with tiny foretoe taps and blinks"),
V("snaps its tongue between careful forward hops", "parts with splayed fingers during short collecting dabs"),
V("lifts its rump while forelegs hold a deep squat", "stretches both hind legs behind a lowered belly"),
V("hops sideways then freezes with crossed forefeet", "swivels each eye separately while toes flex"),
V("quivers through its thighs as throat sac pulses fast", "stiffens its forelegs while hind toes tremble"),
V("jerks through crooked hops with tongue briefly extended", "twists its squat body between mismatched leg kicks"),
V("crouches over its forefeet before a furtive tongue snap", "folds its hind legs tight while one foretoe hooks inward"),
V("bounces without rhythm as both eyes roll", "puffs and collapses its throat through rigid little jumps"),
V("draws every foot beneath its belly and blinks slowly", "rests squat with throat pulses becoming shallow"));
AddExtended(
voices,
"ostrich",
V("stretches its long neck through a hollow booming call", "clacks its broad beak while throat feathers pulse"),
V("weaves raised necks through mirrored curves", "fans short wings while lowering its beak close"),
V("scrapes backward with alternating two-toed feet", "bends its tall neck through repeated beak dips"),
V("sweeps breast feathers past in a low-necked pass", "brushes with short wing plumes while stepping precisely"),
V("extends its flat beak then draws its neck upright", "bows on long legs through a measured wing display"),
V("holds its neck rigid before a downward beak jab", "tracks intently then lunges on lengthening strides"),
V("leans its feathered breast into a long-legged drive", "hooks its beak as both two-toed feet push"),
V("preens beneath one short wing with its flat beak", "combs shaggy breast feathers through quick beak pinches"),
V("beats both short wings while stamping long feet", "fans loose plumes through forceful sideward sweeps"),
V("runs with neck lowered and wing tips spread", "takes bounding strides while tail plumes flatten"),
V("paces a broad circle before folding its knees", "scrapes twice and lowers its feathered body centrally"),
V("stands neck-high with one long leg lifted", "drives a two-toed kick beneath spread wing plumes"),
V("traces side to side with high-set eyes", "bobs its long neck through deliberate beak-led pauses"),
V("pinches repeatedly while striding in a straight line", "rakes with one two-toed foot before a deep beak dip"),
V("raises its tail plumes as long knees bend", "squats with wings lifted from its feathered flanks"),
V("crosses its long legs while neck looping backward", "stares past its own shoulder as wing tips twitch"),
V("shivers from tall neck to loose tail plumes", "locks both knees while breast feathers ripple downward"),
V("whips its neck in an uneven curve between stamps", "circles with one wing fanned and one folded"),
V("stoops behind spread plumes and hooks its beak inward", "tiptoes on two-toed feet with neck tightly curved"),
V("struts stiff-kneed as its long neck zigzags", "kicks aside while both short wings flap together"),
V("folds long legs beneath its feathered body", "rests with its neck curled and broad beak still"));
AddExtended(
voices,
"penguin",
V("raises its narrow beak through a braying phrase", "pumps its chest beneath a chain of sharp honks"),
V("taps beaks softly with both flippers lowered", "leans chest-close while matching slow head tilts"),
V("scrapes with broad webbed feet between beak dips", "patters in rows while flippers balance each bend"),
V("brushes its white breast through low waddling passes", "sweeps stiff flipper edges with short side steps"),
V("extends its beak and flares one flipper", "bows from the ankles through a deliberate beak tap"),
V("leans beak-first before a sudden neck snap", "fixes both eyes while its webbed feet stop paddling"),
V("shoves with its chest through heel-to-heel steps", "braces stiff flippers backward as broad feet drive"),
V("preens its white breast with tiny beak pinches", "runs its narrow beak along one stiff flipper"),
V("slaps both flippers in rapid downward strokes", "stamps webbed feet while its compact chest bucks"),
V("waddles rapidly with flippers stretched sideways", "drops its belly low and paddles with both feet"),
V("turns heel-to-heel before settling on its belly", "traces a compact circle with beak taps and steps"),
V("squares its chest behind outstretched flippers", "marches upright with narrow beak leveled forward"),
V("tracks a line through alternating head tilts", "touches its beak along a sequence of tiny nods"),
V("picks in quick rows while flippers hold balance", "rakes backward with webbed feet before a beak pinch"),
V("lifts its short tail above a deep ankle crouch", "rocks forward as belly feathers spread apart"),
V("waddles sideways while looking straight behind", "crosses its webbed feet as both flippers point inward"),
V("trembles from white chest into rigid flipper tips", "stiffens upright while its short tail vibrates"),
V("windmills one flipper through a lopsided turn", "jerks its beak upward between uneven foot pats"),
V("hunches behind both flippers and darts its beak", "sidles heel-first with narrow beak tucked low"),
V("paces upright as flippers twitch in unison", "pecks sharply while its compact body rocks backward"),
V("rests belly-down with flippers fitted to its sides", "tucks its beak low as broad feet stop flexing"));
AddExtended(
voices,
"piranha",
V("pulses its gill covers around a clicking jaw rhythm", "flares paired fins while teeth chatter in cadence"),
V("aligns flank-close with fins beating in synchrony", "circles tightly through matched tail flicks"),
V("rakes with its lower jaw as paired fins brace", "nudges repeatedly with its blunt snout and folded fins"),
V("brushes past with scales angled and fins extended", "fans its paired fins through a sequence of close passes"),
V("opens its toothed jaw then folds both fins", "presents one scaled flank through a measured pivot"),
V("fixes its round eye before a rapid tooth snap", "stills every fin before its compact body darts"),
V("drives snout-first with strong lateral tail beats", "locks its jaws while paired fins reverse together"),
V("scrapes one scaled flank with a fin ray", "works its lower jaw while gill covers open wide"),
V("whips its tail as every fin beats rapidly", "bucks its compact body through forceful gill pulses"),
V("darts in sharp angles with fins pinned close", "lashes its tail through a rapid zigzag retreat"),
V("circles tightly with snout angled inward", "hovers centrally as paired fins make tiny corrections"),
V("flares every fin behind a fully opened jaw", "charges in a straight burst with teeth exposed"),
V("tracks a sequence with one round eye", "ticks its jaw between deliberate paired-fin pauses"),
V("nips in careful rows with tail held nearly still", "probes snout-first between short jaw closures"),
V("arches its belly as the tail base rises", "angles its vent downward while paired fins spread"),
V("faces backward through a tight tail-led pivot", "rolls half sideways as its fins oppose each other"),
V("shivers from gill covers through the forked tail", "stiffens its fin rays while its jaw vibrates"),
V("spirals unevenly with one paired fin folded", "jerks tail-first while the toothed mouth gapes"),
V("nips furtively then hides its jaw beneath a turn", "slides flankwise with paired fins shielding its mouth"),
V("darts in rigid bursts as gill covers flutter", "snaps repeatedly while its forked tail twists"),
V("hangs nearly still with fins tucked to scales", "slows its tail beats as the lower jaw settles"));
AddExtended(
voices,
"seal",
V("raises its whiskered muzzle through a chesty bark", "pulses its throat beneath a run of blunt honks"),
V("touches whiskers softly with foreflippers folded", "rests muzzle-close through matching head tilts"),
V("rakes backward with broad foreflippers", "presses its chest low through repeated muzzle nudges"),
V("sweeps whiskers through close side-to-side passes", "brushes with foreflipper edges while its muzzle dips"),
V("extends its whiskered muzzle then folds one flipper", "rises chest-high through a measured foreflipper pat"),
V("aims its whiskers before a quick jaw clamp", "holds its hind flippers straight before surging snout-first"),
V("drives its broad chest through foreflipper pulls", "hooks its teeth as hind flippers brace together"),
V("combs its whiskers with one curled foreflipper", "scratches its thick flank using pointed hind claws"),
V("slaps both foreflippers through heavy downward beats", "bucks its chest while hind flippers clap together"),
V("lurches forward with foreflippers reaching fast", "bunches its thick body through rapid chest-first surges"),
V("turns a full circle on alternating foreflippers", "presses its belly centrally with muzzle sweeping around"),
V("props its chest high above squared foreflippers", "bares pointed teeth while hind flippers stiffen"),
V("follows a sequence with whiskers twitching", "nods its rounded head between deliberate flipper taps"),
V("probes in rows with its whiskered muzzle", "scrapes lightly with one foreflipper before a tooth pinch"),
V("raises its hind flippers above an arched rump", "flexes its thick belly behind planted foreflippers"),
V("rolls sideways while its muzzle stays forward", "crosses foreflippers as hind flippers fan apart"),
V("quivers from whiskered muzzle through thick shoulders", "stiffens both foreflippers while its chest trembles"),
V("twists through a crooked roll with jaws ajar", "jerks its head between mismatched flipper sweeps"),
V("hunches over folded foreflippers and snaps sideways", "inches backward with whiskers tucked against its muzzle"),
V("lurches stiff-bodied as both flippers twitch", "bites at empty space while its thick torso rolls"),
V("curls with foreflippers pressed against its chest", "rests its whiskered muzzle atop one broad flipper"));
AddExtended(
voices,
"snake",
V("raises its head through a long pulsing hiss", "flicks its forked tongue between breathy scales of sound"),
V("rests its jaw across a parallel coil", "matches slow tongue flicks with necks intertwined"),
V("pushes its snout ahead while ribs ripple forward", "presses broad coils through repeated sideward bends"),
V("brushes its scaled flanks through close looping passes", "sweeps its forked tongue along a winding route"),
V("extends its head then loops its neck inward", "lifts one body coil through a measured tongue display"),
V("holds its forked tongue still before striking", "compresses its front coils beneath an aligned jaw"),
V("loops around and contracts in traveling bands", "braces its tail while rib waves pull forward"),
V("rubs its jaw along a smooth body coil", "scrapes between scales with a brief tail-tip stroke"),
V("lashes its tail as rib muscles bunch rapidly", "rears its neck and pounds down through stacked coils"),
V("streams forward in narrow bends with head lowered", "uncoils rapidly as its tail whips behind"),
V("traces a tight circle before stacking its coils", "presses its belly scales into a compact spiral"),
V("raises a third of its body above braced loops", "flares its neck while jaws part around curved teeth"),
V("tracks a sequence with forked tongue samples", "nods its narrow head between deliberate coil shifts"),
V("probes in rows with snout and tongue together", "rakes belly scales backward through short rippling passes"),
V("lifts its tail while the rear coils tighten", "arches its scaled body above a flattened belly section"),
V("loops backward while its head keeps facing ahead", "knots its middle briefly as tail and neck cross"),
V("shivers along every scale from jaw to tail tip", "stiffens into a curve while its ribs pulse rapidly"),
V("corkscrews through uneven coils with tongue extended", "jerks its neck sideways as the tail circles opposite"),
V("folds its head beneath an outer coil", "slides tail-first while its jaw remains hidden"),
V("rears in rigid bends as its tongue flicks erratically", "snaps at empty space while body loops twitch"),
V("settles its jaw atop a tightly wound coil", "draws head and tail inward as rib waves slow"));
AddExtended(
voices,
"turtle",
V("extends its neck through a throaty chirping phrase", "clicks its hard beak while throat folds pulse"),
V("touches shell rims through slow neck stretches", "rests beak-close with foreclaws folded inward"),
V("scrapes backward with alternating foreclaws", "bends its long neck through repeated beak dips"),
V("brushes its shell edge through low deliberate passes", "sweeps with clawed forefeet while its beak points down"),
V("extends its neck and opens its hard beak slowly", "raises one foreclaw through a measured shell-rock"),
V("holds its neck rigid before a sudden beak clip", "plants all four claws before thrusting shell and head"),
V("drives shell-first as foreclaws pull in sequence", "hooks its beak forward while hind claws keep pushing"),
V("scrapes its beak gently along one foreleg scale", "rubs beneath its shell rim with a hooked hind claw"),
V("pumps all four legs as its shell rocks sharply", "stamps foreclaws while neck and beak jab downward"),
V("plods rapidly with neck stretched straight ahead", "pulls its shell in hurried alternating claw strokes"),
V("walks a small circle before drawing its limbs close", "presses its shell centrally as neck sweeps around"),
V("stands high on straightened legs beneath its shell", "drives forward behind a hard open beak"),
V("follows a sequence with slow sideward head turns", "taps one foreclaw between deliberate beak-led nods"),
V("clips in careful rows with its hard beak", "rakes backward with foreclaws before each neck reach"),
V("lifts its tail while hind legs brace the shell", "raises the rear shell rim above bent forelegs"),
V("turns backward while its neck stays extended ahead", "crosses its forefeet as head and tail angle sideways"),
V("shudders beneath its shell from neck to hind claws", "stiffens all four legs while shell plates vibrate"),
V("rocks unevenly as its neck loops to one side", "jerks its beak between mismatched foreclaw steps"),
V("withdraws its head behind the shell rim and bites", "sidles with one foreclaw tucked beneath its shell"),
V("plods rigidly as neck and tail twitch together", "snaps at empty space while its shell rocks backward"),
V("draws head and limbs beneath the shell rim", "rests its chin inside the shell as claws uncurl"));
}
}

View file

@ -0,0 +1,119 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddAnimalSpecializedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddSpecialized(
voices,
"chicken",
V("fans a spark into flame with rapid wingbeats", "pecks a spark into flame beneath beating primaries"),
V("beats flame low beneath overlapping wings", "smothers flame under spread breast feathers"),
V("presses feathered flanks among gathering kin", "tucks wing-to-wing into a clustered flock"),
V("draws visible essence through its pulsing throat", "pulls observed life-glow along raised neck feathers"),
V("searches with one bright eye and quick beak tilts", "reaches ahead with neck stretched and beak parted"),
V("wails through a trembling comb and open beak", "keens in thin clucks as its throat quivers"),
V("clacks its beak through a harsh squawk", "lashes both wings beneath a rasping cackle"));
AddSpecialized(
voices,
"crab",
V("clicks a spark into flame between closing pincers", "fans a spark into flame with beating mouthparts"),
V("clamps flame low beneath its broad shell rim", "beats flame down with alternating flattened claws"),
V("locks jointed legs beside gathering kin", "fits shell-to-shell into a clustered cast"),
V("draws visible essence through pulsing mouthparts", "pulls observed life-glow between raised pincers"),
V("searches with swiveling eyestalks and parted claws", "reaches ahead with one open pincer"),
V("rasps through fluttering mouthparts and lowered eyestalks", "clatters both pincers beneath a quivering shell"),
V("snaps raised pincers in a jagged clatter", "grinds its mouthparts under a rigid shell"));
AddSpecialized(
voices,
"crocodile",
V("breathes a spark into flame through parted jaws", "fans a spark into flame with a plated tail sweep"),
V("presses flame low beneath its armored belly", "beats flame down with broad sweeps of its plated tail"),
V("settles flank-to-flank among gathering kin", "fits its plated body into a jaw-aligned congregation"),
V("draws visible essence through vibrating throat plates", "pulls observed life-glow between rows of exposed teeth"),
V("searches with ridged eyes above a slowly opening jaw", "reaches forward with its long snout and spread foreclaws"),
V("bellows through a heaving armored throat", "moans between slack jaws as its tail trembles"),
V("claps its jaws around a gravelly roar", "lashes its plated tail beneath a guttural bark"));
AddSpecialized(
voices,
"frog",
V("puffs a spark into flame from its swelling throat sac", "fans a spark into flame with rapid webbed kicks"),
V("presses flame low beneath its broad belly", "beats flame down with slapping webbed hind feet"),
V("folds splayed feet among gathering kin", "presses squat flanks into a croaking cluster"),
V("draws visible essence through its pulsing throat sac", "pulls observed life-glow along an unfurling tongue"),
V("searches with separately swiveling round eyes", "reaches ahead with a flicking tongue and spread forefeet"),
V("keens through a collapsed throat sac", "trills thinly as its webbed toes quiver"),
V("blasts a raw croak through its swollen throat", "slaps both forefeet beneath a rasping chirr"));
AddSpecialized(
voices,
"ostrich",
V("fans a spark into flame with broad wing plumes", "puffs a spark into flame through its long feathered throat"),
V("beats flame low beneath sweeping short wings", "presses flame down with broad two-toed feet"),
V("weaves its raised neck among gathering kin", "presses feathered flanks into a long-legged cluster"),
V("draws visible essence along its extended throat", "pulls observed life-glow through fanned breast plumes"),
V("searches with high-set eyes and low beak sweeps", "reaches ahead on a fully extended neck"),
V("booms through a sagging feathered throat", "keens with its broad beak agape and neck bowed"),
V("clacks its broad beak beneath a harsh boom", "lashes short wings around a guttural hiss"));
AddSpecialized(
voices,
"penguin",
V("fans a spark into flame with rigid flipper strokes", "puffs a spark into flame through its narrow raised beak"),
V("beats flame low beneath alternating stiff flippers", "presses flame down with its dense feathered belly"),
V("fits shoulder-to-shoulder among gathering kin", "presses its white breast into a compact huddle"),
V("draws visible essence through its pumping chest", "pulls observed life-glow along both rigid flippers"),
V("searches through sharp head tilts and beak dips", "reaches ahead with narrow beak and one flared flipper"),
V("brays through a bowed head and shaking chest", "keens softly with its beak tucked against white breast feathers"),
V("honks harshly through a thrust-up beak", "slaps both flippers beneath a grating bray"));
AddSpecialized(
voices,
"piranha",
V("fans a spark into flame with beating fin rays", "snaps a spark into flame between chattering teeth"),
V("beats flame low with a whipping forked tail", "presses flame down beneath its compact scaled flank"),
V("aligns fin-to-fin among gathering kin", "fits its scaled flank into a tight shoal"),
V("draws visible essence through pulsing gill covers", "pulls observed life-glow between its parted teeth"),
V("searches with round eyes and sweeping paired fins", "reaches ahead with blunt snout and open toothed jaw"),
V("chatters its teeth as both gill covers shudder", "rasps through pumping gills and folded fins"),
V("gnashes exposed teeth behind flared gill covers", "whips its forked tail beneath a jagged jaw rattle"));
AddSpecialized(
voices,
"seal",
V("fans a spark into flame with broad foreflippers", "puffs a spark into flame past its whiskered muzzle"),
V("beats flame low beneath alternating foreflippers", "presses flame down with its thick chest and folded flippers"),
V("presses thick flanks among gathering kin", "fits whiskered muzzle to shoulder in a clustered rookery"),
V("draws visible essence through its heaving chest", "pulls observed life-glow along trembling whiskers"),
V("searches with sweeping whiskers and lifted muzzle", "reaches ahead with one broad foreflipper"),
V("moans through a lowered whiskered muzzle", "keens as its thick chest and throat quiver"),
V("barks harshly behind bared pointed teeth", "slaps both foreflippers beneath a guttural roar"));
AddSpecialized(
voices,
"snake",
V("breathes a spark into flame past its forked tongue", "fans a spark into flame with rapid rib pulses"),
V("presses flame low beneath stacked muscular coils", "beats flame down with broad sweeps of its scaled body"),
V("threads its coils among gathering kin", "stacks parallel loops into a clustered knot"),
V("draws visible essence through flicking tongue tips", "pulls observed life-glow along rippling belly scales"),
V("searches with forked tongue and sideward jaw turns", "reaches ahead on a straightened neck coil"),
V("hisses through a lowered jaw and slack coils", "keens in thin breath as its tail tip quivers"),
V("spits a harsh hiss between exposed fangs", "lashes its tail beneath a rasping jaw gape"));
AddSpecialized(
voices,
"turtle",
V("puffs a spark into flame through its hard beak", "fans a spark into flame with alternating clawed forefeet"),
V("presses flame low beneath its broad shell", "beats flame down with sweeping clawed forefeet"),
V("fits shell rim to shell rim among gathering kin", "folds clawed feet into a close-shelled cluster"),
V("draws visible essence through pulsing throat folds", "pulls observed life-glow along its patterned shell plates"),
V("searches with slow head turns and beak dips", "reaches ahead on an extended wrinkled neck"),
V("keens through a lowered beak and trembling throat folds", "rasps softly as its foreclaws curl beneath the shell rim"),
V("clacks its hard beak through a throaty hiss", "stamps clawed forefeet beneath a grating chirr"));
}
}

View file

@ -0,0 +1,445 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddAnimalVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
Add(
voices,
"chicken",
V(
"takes high, quick steps with head bobbing",
"hurries along with wings tucked tight"),
V(
"balances on one foot while its comb tilts",
"holds still and turns one bright eye"),
V(
"flutters both wings in a brief burst",
"hops and tosses its head with beak raised"),
V(
"pecks up morsels with brisk jabs",
"pins a bite beneath one foot and tears at it"),
V(
"tucks its beak beneath a folded wing",
"settles with feathers puffed around its body"),
V(
"scratches twice before darting toward {target}",
"tilts the head toward {target} and pecks forward"),
V(
"leaps with both spurs aimed at {target}",
"beats both wings before pecking at {target}"),
V(
"clucks while brushing shoulders with another",
"circles close with soft beak taps"),
V(
"breaks into rapid clucks with beak wide",
"shakes its comb through a rattling cackle"),
V(
"rakes with both feet in alternating strokes",
"carries material pinched in its beak"));
Add(
voices,
"crab",
V(
"scuttles sideways on sharply jointed legs",
"keeps its shell level through a quick sidestep"),
V(
"holds both claws ready while its eyestalks pivot",
"rests on bent legs with mouthparts ticking"),
V(
"taps its claws together and spins sideways",
"weaves between its own raised pincers"),
V(
"passes small bites from pincer to mouthparts",
"tears a morsel apart between mismatched claws"),
V(
"folds its legs beneath the rim of its shell",
"tucks both pincers close and stills its eyestalks"),
V(
"probes toward {target} with one open pincer",
"advances sideways toward {target} with claws spread"),
V(
"snaps both pincers at {target}",
"raises one heavy claw and sidesteps toward {target}"),
V(
"waves one claw while its antennae sweep forward",
"touches pincers with another in measured taps"),
V(
"clicks its pincers in a quick clattering run",
"chatters its mouthparts beneath raised eyestalks"),
V(
"sorts loose material between precise pincers",
"grips and shifts a load one sidestep at a time"));
Add(
voices,
"crocodile",
V(
"crawls on splayed legs with belly held low",
"drives forward while its heavy tail counterbalances"),
V(
"lies motionless with only its eyes shifting",
"holds its long jaw slightly parted"),
V(
"rolls its armored body and lashes its tail",
"makes a short feint with jaws agape"),
V(
"clamps a meal between interlocking teeth",
"tilts its broad head back to gulp a bite"),
V(
"rests its chin with legs drawn against its flanks",
"stills beneath ridged eyelids and folded jaws"),
V(
"creeps toward {target} with belly pressed low",
"freezes before surging toward {target}"),
V(
"parts long jaws before snapping at {target}",
"lashes an armored tail toward {target}"),
V(
"bumps an armored snout against another",
"rumbles low while resting jaw beside jaw"),
V(
"claps its jaws around a deep throat rumble",
"shudders through a run of gravelly bellows"),
V(
"shoves a load with its plated snout",
"drags a load in the hinge of its jaws"));
Add(
voices,
"frog",
V(
"springs forward on long folded hind legs",
"bounds with forefeet tucked beneath its chest"),
V(
"squats still while its round eyes swivel",
"holds its crouch as its throat pulses"),
V(
"pops through a chain of short, crooked hops",
"bounces in place with toes spread wide"),
V(
"flicks its tongue around a morsel",
"swallows a bite with a slow double blink"),
V(
"folds all four legs beneath its body",
"lowers its eyelids over still, round eyes"),
V(
"swivels both eyes toward {target} before springing",
"crouches low before flicking a sticky tongue toward {target}"),
V(
"kicks both hind feet at {target}",
"thrusts both splayed forefeet toward {target}"),
V(
"pulses its throat through a carrying croak",
"answers another with quick chirps and toe taps"),
V(
"croaks in a bouncing, uneven chain",
"puffs its throat sac around a chirping trill"),
V(
"pushes a load with its blunt head",
"braces its hind legs and shifts a load forward"));
Add(
voices,
"ostrich",
V(
"covers distance in long, springing strides",
"paces forward while its tall neck sways"),
V(
"stands high with its neck drawn straight",
"shifts between long legs while its head scans"),
V(
"fans its short wings and prances in a circle",
"bobs its long neck between skipping steps"),
V(
"pinches up a morsel with its flat beak",
"cranes its neck high to swallow a bite"),
V(
"folds its long legs beneath a feathered body",
"rests with its neck curved across its back"),
V(
"turns the long neck toward {target}",
"rushes toward {target} in lengthening strides"),
V(
"swings a long leg toward {target}",
"drives a two-toed kick at {target}"),
V(
"weaves its neck beside another's raised neck",
"fans loose wing feathers through a measured display"),
V(
"booms with its neck stretched upright",
"clacks its broad beak between hollow calls"),
V(
"carries material in its beak",
"nudges a load forward with its feathered breast"));
Add(
voices,
"penguin",
V(
"waddles in short steps with flippers angled out",
"rocks forward from heel to heel"),
V(
"stands upright with both flippers tucked",
"shifts its weight across broad webbed feet"),
V(
"spins with its stiff flippers spread",
"drops to its belly and scoots with both feet"),
V(
"snaps its narrow beak around a bite",
"tilts its head back to swallow a morsel"),
V(
"stands with its beak tucked beneath one flipper",
"rests on its belly with flippers held close"),
V(
"leans toward {target} with beak aligned",
"waddles toward {target} in rapid steps"),
V(
"slaps both flippers at {target}",
"leans forward and pecks at {target}"),
V(
"taps beaks with another between low calls",
"presses shoulder to shoulder in a compact cluster"),
V(
"brays with its beak lifted high",
"shakes its chest through a run of sharp honks"),
V(
"shoves a load ahead with its chest",
"carries material at the tip of its beak"));
AddLiquid(
voices,
"penguin",
"move",
"cuts through the water with powerful flipper strokes",
"torpedoes beneath the surface with feet trailing");
AddLiquid(
voices,
"penguin",
"wait",
"treads water with small strokes of both feet",
"bobs at the surface with flippers spread");
AddLiquid(
voices,
"penguin",
"play",
"porpoises above the surface with flippers driving",
"loops underwater and twists through rising bubbles");
AddLiquid(
voices,
"penguin",
"sleep",
"rests afloat with its beak tucked low",
"dozes while bobbing at the surface");
Add(
voices,
"piranha",
V(
"propels its compact body with quick tail beats",
"glides forward with paired fins angled wide"),
V(
"holds position with its tail twitching",
"hangs still while its gill covers pulse"),
V(
"wheels in a tight circle with fins flared",
"darts forward and pivots on a rigid tail flick"),
V(
"shears off a bite with triangular teeth",
"nips rapid mouthfuls with its jaw working"),
V(
"slows its tail until only its gills move",
"hangs nearly motionless with fins folded close"),
V(
"darts after {target} with gill covers flaring",
"darts toward {target} with jaws open"),
V(
"bites at {target} with interlocking teeth",
"whips the tail and snaps toward {target}"),
V(
"aligns beside another with fins matching pace",
"circles another while flicking its paired fins"),
V(
"clacks its triangular teeth in a rapid chatter",
"works its lower jaw through a clicking rattle"),
V(
"nudges a load with its blunt snout",
"grips material between its teeth"));
AddLiquid(
voices,
"piranha",
"move",
"slices through the water with rapid tail beats",
"darts beneath the surface with fins tucked");
AddLiquid(
voices,
"piranha",
"wait",
"hovers in the water with fins fanning",
"faces the current while its tail makes tiny corrections");
AddLiquid(
voices,
"piranha",
"play",
"zigzags through the water in sudden bursts",
"spirals beneath the surface with fins flared");
AddLiquid(
voices,
"piranha",
"sleep",
"drifts underwater with its tail barely moving",
"rests below the surface with gills pulsing");
Add(
voices,
"seal",
V(
"inches forward by bunching its heavy body",
"pulls itself along with broad foreflippers"),
V(
"props its chest up while whiskers quiver",
"rests on folded flippers with muzzle raised"),
V(
"rolls onto its side and bats with both flippers",
"arches its body through a clumsy half-turn"),
V(
"grips a meal between pointed teeth",
"tears off a bite with a sharp head shake"),
V(
"curls with its flippers pressed against its sides",
"rests its whiskered muzzle on one foreflipper"),
V(
"turns a whiskered muzzle toward {target}",
"lunges toward {target} with jaws ready"),
V(
"bares pointed teeth before snapping at {target}",
"surges chest-first and bites toward {target}"),
V(
"touches whiskers with another between low grunts",
"leans close and answers another with a short bark"),
V(
"barks in bouncing, chesty bursts",
"huffs through its whiskers between blunt honks"),
V(
"pushes a load with its broad chest",
"grips a load between its teeth and pulls"));
AddLiquid(
voices,
"seal",
"move",
"swims through the water with sweeping hind-flipper strokes",
"dives beneath the surface with foreflippers tucked");
AddLiquid(
voices,
"seal",
"wait",
"floats upright with its whiskered muzzle above water",
"treads water with slow hind-flipper sweeps");
AddLiquid(
voices,
"seal",
"play",
"rolls underwater with bubbles streaming past its whiskers",
"slaps the surface and dives through the splash");
AddLiquid(
voices,
"seal",
"sleep",
"dozes afloat with its muzzle tipped above water",
"rests at the surface with flippers drifting");
Add(
voices,
"snake",
V(
"slithers forward in deep S-shaped bends",
"glides by rippling its ribs beneath smooth scales"),
V(
"coils with its head raised above the loops",
"holds still while a forked tongue samples nearby scents"),
V(
"loops its body around itself in quick turns",
"darts its head between shifting coils"),
V(
"opens its hinged jaw around a meal",
"works a bite backward with alternating jaw steps"),
V(
"coils tightly with its head at the center",
"rests its jaw across a loop of scaled body"),
V(
"flicks a forked tongue toward {target}",
"glides toward {target} with head aligned"),
V(
"strikes with open jaws at {target}",
"coils and snaps toward {target}"),
V(
"rests in parallel coils beside another",
"follows another's motion with matched tongue flicks"),
V(
"hisses in short bursts with jaws parted",
"flicks its tongue through a breathy rattle"),
V(
"loops around a load and pulls",
"braces its coils to shift a load"));
Add(
voices,
"turtle",
V(
"plods on clawed feet while its shell rocks",
"extends its neck and pulls its shell forward"),
V(
"withdraws its head halfway beneath the shell rim",
"blinks slowly with all four feet braced"),
V(
"rocks its shell from side to side",
"paws forward with alternating forefeet"),
V(
"clips off a bite with its hard beak",
"cranes its neck to reach a morsel"),
V(
"draws its limbs beneath the shell",
"rests its chin just inside the shell rim"),
V(
"extends the neck toward {target}",
"holds the hard beak open while lunging toward {target}"),
V(
"drives forward shell-first toward {target}",
"bites at {target} with a hard beak"),
V(
"stretches its neck beside another",
"taps its shell rim against another's shell"),
V(
"clicks its beak between throaty chirps",
"bobs its head through a rasping chuckle"),
V(
"shoves a load with the front of its shell",
"braces its claws and pushes a load forward"));
AddLiquid(
voices,
"turtle",
"move",
"paddles through the water with all four feet",
"glides beneath the surface with its shell level");
AddLiquid(
voices,
"turtle",
"wait",
"floats at the surface with its nostrils raised",
"holds beneath the water with feet spread wide");
AddLiquid(
voices,
"turtle",
"play",
"rolls underwater with its shell turning slowly",
"paddles in a circle just below the surface");
AddLiquid(
voices,
"turtle",
"sleep",
"rests underwater with limbs tucked beneath its shell",
"dozes at the surface with its chin above water");
}
}

View file

@ -0,0 +1,883 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddCivExtendedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddExtended(voices, "civ_acid_gentleman",
V("sings in clipped upright phrases", "holds each note behind a formal posture"),
V("courts with measured bows", "mates without loosening a rigid stance"),
V("cultivates in ruler-straight passes", "squares both shoulders while cultivating"),
V("pollinates with precise fingertip touches", "visits each bloom in strict order"),
V("trades through exacting hand gestures", "bargains with chin held level"),
V("fishes from a square-footed stance", "fishes in straight ruler-like pulls"),
V("hauls with back severely straight", "bears the weight at matching angles"),
V("tends wounds with level steady hands", "treats wounds in measured hand passes"),
V("faces the flames with cuffs held clear", "handles fire with formal precision"),
V("retreats in controlled backward strides", "flees without breaking upright form"),
V("settles into equal-ranked formation", "joins the civic cluster at exact spacing"),
V("drills behind a rigid forearm guard", "patrols in sharply measured steps"),
V("reads with one finger marking each line", "studies with chin and shoulders held square"),
V("gathers kin into ordered ranks", "collects spoils in matching groups"),
V("relieves the body from a rigid squat", "straightens immediately after relieving itself"),
V("starts one duty at conflicting angles", "pauses stiffly over a mistaken sequence"),
V("recovers with spine still vertical", "recharges through counted intervals of stillness"),
V("obeys an odd impulse through formal gestures", "answers the compulsion in exact measures"),
V("pilfers with cuffed hands held level", "takes covertly behind a rigid bow"),
V("moves under possession in rigid counts", "executes unseen commands without bending"),
V("dreams with hands folded symmetrically", "sleeps through small ceremonial gestures"));
AddExtended(voices, "civ_alpaca",
V("hums through a wool-soft throat", "sings with chin lifted above the fleece"),
V("courts in springy side steps", "mates beneath a close woolly press"),
V("cultivates with light four-footed pacing", "tends planted growth beneath bobbing fleece"),
V("pollinates with a soft probing muzzle", "brushes blooms beneath forward ears"),
V("trades through soft nose-led greetings", "bargains with ears tipped forward"),
V("fishes with long legs planted wide", "leans woolly chest-first and fishes"),
V("hauls against a padded shoulder", "carries weight in a fleece-deep sway"),
V("nuzzles wounds with slow wool-framed lips", "tends wounds beneath a lowered woolly neck"),
V("steps around flames on nimble feet", "faces fire with fleece drawn back"),
V("bounds away on long springing legs", "flees with ears flattened into the wool"),
V("settles with all four feet neatly tucked", "forms a close fleece-lined civic cluster"),
V("drills in high-stepping charges", "guards with chest wool pushed forward"),
V("reads with muzzle hovering close", "studies while long ears track each pause"),
V("herds kin with low humming calls", "gathers spoils against thick chest wool"),
V("relieves itself with tail held clear", "squats lightly on folded hind legs"),
V("turns long ears toward the wrong duty", "stutters through uncertain four-footed steps"),
V("recharges with legs folded under fleece", "rests upright in a woolly bundle"),
V("follows a strange urge in sideways hops", "bobs sideways under an inexplicable compulsion"),
V("pilfers with soft lips and lifted chin", "sidles away beneath upright ears"),
V("bounds possessed in stiff-legged pulses", "fleece trembles through each compelled bound"),
V("dreams with ears twitching above the wool", "dozes through tiny long-legged kicks"));
AddExtended(voices, "civ_armadillo",
V("chitters beneath rattling back plates", "sings through a half-curled shell"),
V("courts by circling plated flank to flank", "mates beneath overlapping armor"),
V("cultivates with low digging claws", "tends planted growth beneath bobbing plates"),
V("pollinates with a narrow snuffling snout", "nudges blooms beneath a domed back"),
V("trades through brisk shell taps", "bargains from a guarded half-curl"),
V("fishes with foreclaws braced low", "snuffles between short claw-led pulls"),
V("hauls beneath a plated shoulder", "rolls weight against the curved shell"),
V("tends wounds with small digging claws", "uncurls one plate at a time and treats wounds"),
V("curls beside flames behind thick plates", "tests fire from beneath a shell rim"),
V("scuttles away under lowered armor", "flees in a tight plated roll"),
V("scrapes and curls into civic formation", "settles with shell backs facing outward"),
V("drills in armored rolling charges", "guards from a clawed half-curl"),
V("reads with snout nearly touching", "studies beneath a raised plate edge"),
V("gathers kin into a plated ring", "rolls spoils beneath the shell curve"),
V("relieves itself from a low squat", "uncurls the plated rear to relieve itself"),
V("circles the wrong duty in a puzzled half-roll", "scratches at the wrong step with small claws"),
V("recharges tightly sealed in armor", "rests while overlapping plates settle"),
V("scuttles after an odd inward tug", "rolls onward under a strange compulsion"),
V("pilfers with one small hooking claw", "curls away around the taking"),
V("rattles possessed inside a rigid shell", "rolls under unseen direction"),
V("dreams in a fully plated curl", "sleeps while tiny claws paddle beneath armor"));
AddExtended(voices, "civ_bear",
V("sings in broad chest-deep rumbles", "holds a note through a lifted muzzle"),
V("courts with heavy shoulder sways", "mates in a broad paw-braced embrace"),
V("cultivates with sweeping forepaws", "tends planted growth behind a broad muzzle"),
V("pollinates with a wide lowered snout", "brushes blooms between blunt claws"),
V("trades with booming paw-led emphasis", "bargains while looming on hind legs"),
V("fishes with paws poised to scoop", "fishes with broad chest leaning forward"),
V("hauls high against a massive chest", "bears weight between sweeping forearms"),
V("tends wounds with broad slow paws", "sniffs over wounds before treating them"),
V("rears beside flames with paws raised", "handles fire behind a thick forearm guard"),
V("lumbers away before breaking into bounds", "flees with heavy paws pounding"),
V("settles into a broad paw-marked formation", "joins the civic cluster with a heavy chest brace"),
V("drills through weighty upright blows", "patrols with rolling shoulders"),
V("reads between two broad paws", "studies with muzzle lowered over the lines"),
V("calls kin together with a low roar", "scoops spoils against the chest"),
V("relieves itself from a heavy haunch squat", "rises broad-backed after relieving itself"),
V("swipes uncertainly between opposing duties", "rears and sniffs at a mistaken duty"),
V("recharges curled around both forepaws", "rests in deep belly-driven breaths"),
V("lumbers after a baffling inner pull", "answers it through ponderous paw sweeps"),
V("pilfers in one broad scooping paw", "lumbers away behind broad shoulders"),
V("rears possessed with claws spread", "moves under command in crushing steps"),
V("dreams through deep muzzle-rumbling breaths", "sleeps while massive paws flex"));
AddExtended(voices, "civ_beetle",
V("sings in dry wing-case vibrations", "clicks a measured carapace chorus"),
V("courts with antennae tracing paired arcs", "mates beneath locked wing cases"),
V("cultivates in straight six-legged measures", "tends growth with clipping mouthparts"),
V("pollinates beneath sweeping antennae", "walks each bloom on hooked feet"),
V("trades through coded feeler taps", "bargains with polished wing cases raised"),
V("fishes from six evenly braced legs", "fishes in jointed six-leg pulses"),
V("hauls under a hard domed back", "drives weight with all six legs"),
V("examines wounds with circling feelers", "tends wounds between delicate forelegs"),
V("faces flame behind sealed wing cases", "tests fire with one extended antenna"),
V("skitters away in a six-legged burst", "flees with feelers folded against the shell"),
V("settles into a geometric carapace cluster", "locks into civic formation along straight traces"),
V("drills with horn and shell aligned", "patrols in clicking six-step measures"),
V("reads by tracking lines with antennae", "studies beneath a lowered horn"),
V("signals kin into an antenna-linked group", "pushes spoils beneath the wing case"),
V("relieves itself with hind legs spread", "locks the forelegs while relieving itself"),
V("turns both feelers between conflicting duties", "clicks through an uncertain leg pattern"),
V("recharges with every joint locked", "rests sealed beneath the hard wing case"),
V("skitters under a strange antenna-led impulse", "clicks through it in rigid segments"),
V("pilfers between quick clipping forelegs", "withdraws beneath closed cases"),
V("marches possessed on synchronized legs", "wing cases rattle through compelled steps"),
V("dreams with antennae drawing slow circles", "rests while folded legs twitch in sequence"));
AddExtended(voices, "civ_buffalo",
V("sings in horn-framed bellows", "rolls a note through a massive chest"),
V("courts with broad forehead presses", "mates on firmly planted hooves"),
V("cultivates in heavy hoof-timed passes", "keeps horns level while tending planted growth"),
V("pollinates with a broad brushing muzzle", "moves between blooms beneath curved horns"),
V("trades through solid brow-led gestures", "bargains without shifting planted hooves"),
V("fishes with horns angled aside", "fishes through massive shoulder pulls"),
V("hauls from a thick horn-set neck", "pulls weight through four grinding hooves"),
V("nudges wounds with a broad muzzle", "tends wounds while standing horn-outward"),
V("faces flames with horns lowered", "stamps around fire on heavy hooves"),
V("thunders away with tail held straight", "flees behind a rolling wall of shoulders"),
V("settles in a horn-outward civic ring", "joins the formation through deep hoof presses"),
V("drills in low repeated charges", "patrols with horns maintaining a broad front"),
V("reads with muzzle lowered between horns", "studies while one hoof holds position"),
V("bellows kin into a guarded circle", "pushes spoils together with the broad brow"),
V("relieves itself on widely planted hooves", "flicks the tail clear while relieving itself"),
V("paws between two mistaken directions", "swings the horned head over a confused duty"),
V("recharges standing on locked heavy legs", "rests with chin sunk into the chest"),
V("charges toward an inexplicable duty", "obeys a strange tug with horns forward"),
V("pilfers behind the curve of one horn", "backs away on guarded hooves"),
V("stamps possessed in a rigid cadence", "drives forward beneath unseen direction"),
V("dreams with nostrils pulsing under the horns", "dozes while thick hooves scrape softly"));
AddExtended(voices, "civ_candy_man",
V("sings in bright crackling trills", "rings a note through glossy layers"),
V("courts with striped spinning bows", "mates in a springy wrapped embrace"),
V("cultivates in glossy heel-to-toe turns", "crinkles both hands through planted growth"),
V("pollinates with quick lacquered fingertips", "twirls between blooms on pointed heels"),
V("trades through wide striped flourishes", "bargains with palms turned brightly outward"),
V("fishes in a balanced glossy crouch", "fishes with elastic arms snapping straight"),
V("hauls against a hardened bright shoulder", "bears weight on springing striped legs"),
V("tends wounds with light crinkling fingers", "bends glossy limbs incrementally and treats wounds"),
V("circles flames on quick polished heels", "faces fire with glossy hands fluttering"),
V("skips away in sharp zigzag bounds", "flees with striped limbs snapping straight"),
V("settles into a neatly wrapped civic cluster", "aligns glossy edges with the formation"),
V("drills in snapping spiral turns", "patrols on bright quick heels"),
V("reads with one shiny finger tracing", "studies while striped shoulders stay square"),
V("crackles a call to gather kin", "folds spoils against a glossy chest"),
V("relieves itself in a compact crinkled squat", "unbends glossy knees after relieving itself"),
V("twists between mismatched duty steps", "crinkles uncertainly over the wrong duty"),
V("recharges folded into a bright compact curl", "rests while glossy limbs regain their spring"),
V("springs after an inexplicable impulse", "twirls onward under the strange compulsion"),
V("pilfers with quick lacquered fingers", "skips away with striped arms tucked"),
V("jerks possessed on rigid glossy joints", "striped limbs spin through compelled turns"),
V("dreams with striped limbs softly uncurling", "sleeps through tiny wrapper-like crackles"));
AddExtended(voices, "civ_capybara",
V("sings in low blunt-muzzled pulses", "hums steadily through a rounded chest"),
V("courts with slow flank-to-flank nudges", "mates on broad evenly planted feet"),
V("cultivates at an unhurried four-footed pace", "tends growth with a steady blunt muzzle"),
V("pollinates with whiskered nose touches", "ambles bloom to bloom on broad feet"),
V("trades through repeated chin-led nods", "bargains without shifting its broad stance"),
V("fishes from a low balanced crouch", "fishes by cycling both small forepaws"),
V("hauls against a solid rounded shoulder", "moves weight in broad measured steps"),
V("nuzzles wounds with a blunt nose", "tends wounds from a low broad stance"),
V("sits solidly beside the flames", "handles fire with whiskers held back"),
V("ambles away before lengthening its stride", "flees low with broad feet drumming"),
V("settles into a close flank-sharing group", "joins the formation at a measured pace"),
V("drills through compact shoulder shoves", "patrols without breaking its even stride"),
V("reads with blunt chin held close", "studies while small ears remain still"),
V("gathers kin through low pulsing calls", "pushes spoils together with both forepaws"),
V("relieves itself on folded broad haunches", "rises at the same measured pace afterward"),
V("stares between duties with whiskers twitching", "ambles through an uncertain wrong turn"),
V("recharges in a compact low curl", "rests with blunt chin sunk to the chest"),
V("follows a strange urge at the same slow pace", "ambles through it on measured paws"),
V("pilfers beneath a low rounded chest", "ambles away without lifting its head"),
V("moves possessed in unnaturally even steps", "obeys unseen direction with a fixed muzzle"),
V("dreams with whiskers pulsing softly", "dozes while broad forefeet paddle once"));
AddExtended(voices, "civ_cat",
V("sings in narrow purring rises", "trills with tail curled high"),
V("courts through arched circling rubs", "closes the mating crouch with paws braced"),
V("cultivates in silent paw-timed passes", "tends growth with tail balancing each turn"),
V("pollinates with delicate whiskered sniffs", "steps among blooms on soft paws"),
V("trades through slow blinks and tail flicks", "bargains with whiskers angled forward"),
V("fishes from a motionless paw-raised crouch", "fishes with quick hooking claws"),
V("hauls low between clenched teeth", "draws weight backward on padded paws"),
V("licks around wounds with a rough tongue", "tends wounds through light paw-tip taps"),
V("watches flames through narrowed eyes", "pats toward fire then snaps the paw back"),
V("springs away with spine arched", "flees low with tail streaming straight"),
V("settles after three tail-led circles", "joins the civic cluster cheek and flank first"),
V("drills in silent pouncing bursts", "patrols with claws sheathed and tail level"),
V("reads with one paw held firmly down", "tracks each line through narrowed eyes"),
V("calls kin with a throaty chirrup", "draws spoils inward beneath both paws"),
V("relieves itself in a low hind-leg squat", "scrapes backward after relieving itself"),
V("stalks the wrong duty with puzzled whiskers", "switches duties after an abrupt tail twitch"),
V("recharges curled nose-to-tail", "rests through a deep chest purr"),
V("pounces toward a baffling private impulse", "obeys the odd urge with twitching tail"),
V("pilfers with silent hooked claws", "slips away on noiseless paws"),
V("arches possessed with pupils fixed", "pads under command in stiff silence"),
V("dreams with paws kneading the air", "sleeps while whiskers and tail tip twitch"));
AddExtended(voices, "civ_chicken",
V("sings in sharp beak-led bursts", "crows with neck feathers lifted"),
V("courts through wing-dropped circling steps", "mates in a brief flapping crouch"),
V("cultivates through quick claw scratches", "pecks planted growth in repeated beats"),
V("pollinates by brushing blooms with feathers", "pecks among blossoms on quick feet"),
V("trades through brisk clucks and head bobs", "bargains with one sideways eye fixed"),
V("fishes with beak held motionless", "fishes by pecking in abrupt bursts"),
V("hauls in short beak-gripped tugs", "drags weight with wings spread for balance"),
V("preens slowly around wounds", "tends wounds with measured beak taps"),
V("flaps around flames with feathers raised", "pecks toward fire between quick retreats"),
V("scurries away with wings beating", "flees in darting head-low steps"),
V("settles into a close feathered civic circle", "joins the cluster through quick scratching turns"),
V("drills with spurred hopping strikes", "patrols in stiff head-bobbing strides"),
V("reads with one eye turned to each line", "reads each line with head-bobbing pecks"),
V("clucks kin into a tight cluster", "scratches spoils into a beak-reached heap"),
V("relieves itself in a brief feathered squat", "flicks the tail after relieving itself"),
V("pecks at the wrong duty in confusion", "turns each eye toward a different duty"),
V("recharges with beak tucked under wing", "rests in a fluffed rounded crouch"),
V("scurries after an unexplained pecking urge", "obeys the urge with wings half spread"),
V("pilfers in one quick beak jab", "darts away on scratching feet"),
V("struts possessed in abrupt rigid beats", "wings flap through each compelled step"),
V("dreams with one wing twitching", "dozes through tiny claw scratches"));
AddExtended(voices, "civ_cow",
V("sings in long dewlap-shaking tones", "moans a broad muzzle-led melody"),
V("courts with slow flank-brushing circles", "mates on four firmly spread hooves"),
V("cultivates in steady cud-chewing passes", "tends growth beneath a swinging dewlap"),
V("pollinates with a broad damp muzzle", "walks among blooms with tail flicking"),
V("trades through low calls and horn tilts", "bargains from a repeated hipshot stance"),
V("fishes with muzzle lowered between horns", "fishes muzzle-low at a steady pace"),
V("hauls through a broad horn-set neck", "draws weight on evenly grinding hooves"),
V("tends wounds with a wide slow tongue", "treats wounds from a broadside stance"),
V("faces flames with broad nostrils pulsing", "steps around fire on evenly placed hooves"),
V("trots away with dewlap swinging", "flees behind a broad lowered head"),
V("settles into a shoulder-close civic herd", "joins the formation through steady hoof steps"),
V("drills in sweeping horn-led turns", "patrols with head low and hooves even"),
V("reads with muzzle close beneath the brow", "studies while chewing in slow cycles"),
V("calls kin together in mellow waves", "pushes spoils inward with a broad muzzle"),
V("relieves itself with tail held aside", "stands hipshot while relieving itself"),
V("chews through a long uncertain pause", "turns the broad head between mistaken duties"),
V("recharges on folded heavy legs", "rests with muzzle laid against one flank"),
V("plods after an inexplicable inward nudge", "chews steadily through the compelled duty"),
V("pilfers beneath a broad lowered muzzle", "backs away on quiet hooves"),
V("walks possessed with dewlap held rigid", "obeys unseen direction on locked legs"),
V("dreams through slow cyclical chewing", "dozes while the tail flicks once"));
AddExtended(voices, "civ_crab",
V("sings in alternating claw clacks", "bubbles a sideways shell-borne rhythm"),
V("courts through mirrored pincer waves", "mates beneath interlocking side-held claws"),
V("cultivates in lateral eight-legged sequences", "tends growth with paired cutting pincers"),
V("pollinates with delicate pincer brushes", "sidesteps from bloom to bloom"),
V("trades through exact shell-and-claw taps", "bargains with eyestalks held level"),
V("fishes with both pincers poised", "fishes through sideways claw tugs"),
V("hauls between paired locking claws", "sidesteps weight beneath a raised shell"),
V("tends wounds with fine pincer tips", "circles wounds on evenly moving jointed legs"),
V("faces flames behind a lifted shell edge", "tests fire with one extended claw"),
V("scuttles sideways in a rapid retreat", "flees with eyestalks folded low"),
V("settles into a shell-outward civic ring", "joins the circle with paired pincers raised"),
V("drills in hammering claw combinations", "patrols laterally with pincers raised"),
V("reads with eyestalks tracking separate lines", "studies between two balanced claws"),
V("clacks kin into a tight shell cluster", "snips spoils into a central grouping"),
V("relieves itself beneath a lowered rear shell", "plants all jointed legs while relieving itself"),
V("sidesteps between contradictory duties", "waves both claws over a confused duty"),
V("recharges sealed beneath shell and limbs", "rests with pincers folded to the mouth"),
V("scuttles after a strange sideways compulsion", "alternates both claws under compulsion"),
V("pilfers in one narrow pincer snip", "sidles away behind the raised claw"),
V("clacks possessed in exact harsh beats", "moves under command on rigid jointed legs"),
V("dreams with eyestalks slowly retracting", "sleeps while folded pincers click once"));
AddExtended(voices, "civ_crocodile",
V("sings in deep jaw-parted rumbles", "rolls a note along a plated throat"),
V("courts through low tail-sweeping circles", "mates in a heavy splay-legged press"),
V("cultivates belly-low on clawed feet", "tends growth with plated back held flat"),
V("pollinates with the long snout lowered", "brushes blooms beneath still nostrils"),
V("trades through slow jaw and tail signals", "bargains without lifting the armored belly"),
V("fishes with jaws held motionless", "fishes with one sudden jaw snap"),
V("hauls backward in a low jaw-locked drag", "pulls weight with tail and splayed legs"),
V("nudges wounds with the closed snout", "tends wounds between slow claw-tip taps"),
V("lies plated and still beside flames", "tests fire with jaws slightly open"),
V("bursts away from a motionless crouch", "flees low with armored tail whipping"),
V("settles into a low civic wall of plated backs", "joins formation on firmly splayed feet"),
V("drills in jaw-led lunges and tail sweeps", "patrols belly-low behind armored ridges"),
V("reads with one eye fixed on each line", "studies between motionless open jaws"),
V("rumbles kin into a plated gathering", "sweeps spoils together with the heavy tail"),
V("relieves itself on braced splayed legs", "raises the plated rear while relieving itself"),
V("snaps between mismatched duty directions", "lies still over a confused duty"),
V("recharges flat beneath settled back plates", "rests with jaws open and eyes narrowed"),
V("slides toward an inexplicable compulsion", "answers it with plated belly held low"),
V("pilfers with one swift closing jaw", "slides away behind a sweeping tail"),
V("lunges possessed from complete stillness", "rigid jaws drive each compelled lunge"),
V("dreams with the plated tail slowly flexing", "sleeps while one eye opens briefly"));
AddExtended(voices, "civ_dog",
V("sings in muzzle-lifted howling phrases", "barks a tail-beating civic rhythm"),
V("courts through quick circling sniffs", "mates on braced hind legs"),
V("cultivates in nose-led bounding passes", "tends planted growth in brisk pawing bursts"),
V("pollinates with a soft searching nose", "bounds among blooms with ears forward"),
V("trades through paw taps and quick barks", "bargains with tail sweeping behind"),
V("fishes with one paw held poised", "fishes through sharp single-paw snaps"),
V("hauls in a firm jaw-held pull", "draws weight at a quick trot"),
V("licks wounds in repeated tongue strokes", "tends wounds with ears trained close"),
V("barks at flames from a paw-wide stance", "circles fire with nostrils pulsing"),
V("bounds away with ears streaming", "flees low as the tail draws tight"),
V("settles after repeated tail-led circling", "joins a close muzzle-facing civic cluster"),
V("drills in shoulder-first rushing tackles", "patrols nose-first with ears alert"),
V("reads with muzzle resting near the lines", "studies while one forepaw taps"),
V("calls kin together with repeated barks", "gathers spoils beneath both forepaws"),
V("relieves itself with one hind leg raised", "sniffs twice before relieving itself"),
V("paces between duties with ears askew", "sniffs at an obviously mistaken duty"),
V("recharges curled around twitching paws", "rests through long open-mouthed breaths"),
V("bounds after a baffling urge", "answers it with tail beating in bursts"),
V("pilfers between quick closing jaws", "trots away with ears flattened"),
V("stalks possessed on stiffened paws", "obeys unseen direction without sniffing"),
V("dreams with forepaws running in place", "sleeps through muffled muzzle twitches"));
AddExtended(voices, "civ_fox",
V("sings in quick narrow muzzle-notes", "barks a tail-curled rising refrain"),
V("courts through crossing tail-led circles", "mates in a light black-pawed crouch"),
V("cultivates through angled silent passes", "tends growth with quick crossing paw strokes"),
V("pollinates with a narrow whiskered muzzle", "threads between blooms on black paws"),
V("trades through oblique bows and ear tilts", "bargains with tail masking the paws"),
V("fishes from a poised tail-balanced crouch", "fishes with one hooking black paw"),
V("hauls by backing on quiet black feet", "draws weight beneath a level sweeping tail"),
V("licks wounds with a narrow moving tongue", "tends wounds with narrow paw-tip touches"),
V("circles flames in angled crossing steps", "tests fire with whiskers held sideways"),
V("darts away through crossing turns", "flees with brush held straight behind"),
V("settles into an offset civic formation", "joins it through angled body circuits"),
V("drills in feinting black-pawed rushes", "patrols by crossing its own earlier line"),
V("reads with the brush wrapped around its feet", "tracks each line through bright narrowed eyes"),
V("calls kin with clipped rising barks", "sweeps spoils inward beneath the long brush"),
V("relieves itself in a light hind-leg crouch", "flicks the brush aside while relieving itself"),
V("tilts both ears over conflicting duties", "circles a mistaken duty with puzzled whiskers"),
V("recharges nose-deep in the sweeping tail", "rests in a narrow black-pawed curl"),
V("slips after a peculiar inward whisper", "follows it on tiptoe black paws"),
V("pilfers with nimble narrow teeth", "weaves away behind the broad brush"),
V("paces possessed in unnaturally straight lines", "obeys unseen direction with tail rigid"),
V("dreams with brush and black paws twitching", "sleeps through tiny muzzle-led feints"));
AddExtended(voices, "civ_frog",
V("sings through a round pulsing throat", "croaks a springy civic refrain"),
V("courts with throat-puffed hopping displays", "folds long legs into the mating crouch"),
V("cultivates in compact repeated leaps", "handles planted growth between broad splayed hands"),
V("pollinates with quick tongue-tip touches", "springs bloom to bloom on folded legs"),
V("trades through rhythmic croaks and blinks", "bargains from a deep squat"),
V("fishes with tongue poised and eyes wide", "fishes in long tongue-led leaps"),
V("hauls in short two-handed hops", "drags weight with long hind legs braced"),
V("tends wounds with broad damp hands", "leans round-eyed while treating wounds"),
V("squats beside flames with throat pulsing", "springs around fire on tucked legs"),
V("bounds away in long rapid arcs", "flees with throat flat and eyes wide"),
V("settles into a close croaking cluster", "joins the formation through repeated short hops"),
V("drills in double-footed kicking leaps", "patrols by springing between low crouches"),
V("reads with both round eyes lowered", "tracks the lines with one broad fingertip"),
V("croaks kin into a facing circle", "gathers spoils between splayed hands"),
V("relieves itself in a deep compact squat", "unfolds long legs after relieving itself"),
V("hops between contradictory duty cues", "blinks broadly over the wrong duty"),
V("recharges folded into a tiny crouch", "rests while the round throat slows"),
V("springs toward an unexplained urge", "answers it in throat-pulsing hops"),
V("pilfers in a quick two-handed flick", "bounds away with eyes forward"),
V("leaps possessed in fixed repeating arcs", "the throat croaks through compelled leaps"),
V("dreams with long hind feet twitching", "dozes while the throat pulses silently"));
AddExtended(voices, "civ_garlic_man",
V("sings through rustling layered breaths", "crackles a papery civic tune"),
V("courts by unfurling outer layers", "bundles knobby limbs during mating"),
V("cultivates with alternating layered hands", "tends planted growth on knobby bobbing feet"),
V("pollinates with soft papery brushes", "rustles between blooms in layered turns"),
V("trades through peeling hand flourishes", "bargains with bundled layers drawn tight"),
V("fishes with knobby feet firmly planted", "fishes by rustling both layered arms"),
V("hauls against a densely layered shoulder", "bears weight on knotted feet"),
V("wraps wounds in overlapping outer layers", "tends wounds with knobby fingertips"),
V("draws papery layers back from flames", "circles fire with dry arms held wide"),
V("rolls away in a rustling rush", "flees with loose layers streaming"),
V("settles into a tightly layered civic cluster", "bundles into formation along concentric lines"),
V("drills in knotted head-first rushes", "patrols with papery arms spread"),
V("reads while smoothing each rustling layer", "studies with one knobby finger tracing"),
V("rustles kin into a layered cluster", "bundles spoils between both dry arms"),
V("relieves itself from a knobby-footed squat", "gathers loose layers after relieving itself"),
V("peels back layers over a mistaken duty", "bobs uncertainly between duties"),
V("recharges folded inside dry outer layers", "rests while papery edges settle"),
V("rustles after an inexplicable impulse", "unfolds through the duty layer by layer"),
V("pilfers behind loose overlapping layers", "rolls away on knobby feet"),
V("bobs possessed beneath rigid dry layers", "bundled arms jerk under compulsion"),
V("dreams as papery layers softly shift", "sleeps with knobby feet tucked inward"));
AddExtended(voices, "civ_goat",
V("sings in sharp horn-framed bleats", "trills with chin lifted above the beard"),
V("courts through high springing head tosses", "mates on nimble split hooves"),
V("cultivates in quick hoof-timed passes", "tends growth with browsing lips"),
V("pollinates with a nimble probing muzzle", "clatters among blooms on split hooves"),
V("trades through repeated horn tilts", "bargains from a high braced stance"),
V("fishes with beard hanging over the stance", "fishes from four nimble split hooves"),
V("hauls through a low horn-set neck", "draws weight with split hooves gripping"),
V("nuzzles wounds beneath curled horns", "tends wounds with slow browsing lips"),
V("bounds around flames with beard held clear", "faces fire behind lowered curled horns"),
V("scrambles away in high uneven leaps", "flees on clattering split hooves"),
V("settles into a high-standing horned cluster", "joins the formation with brisk hoof stamps"),
V("drills in sudden brow-first charges", "patrols with curled horns tipped forward"),
V("reads with beard brushing close", "studies while one ear cocks sideways"),
V("bleats kin into a head-to-head group", "nudges spoils together beneath the horns"),
V("relieves itself on flexed hind legs", "holds the short tail clear while relieving itself"),
V("nibbles at the wrong duty in confusion", "tilts horns between opposing duties"),
V("recharges kneeling on tucked split hooves", "rests with beard against the chest"),
V("leaps toward an inexplicable urge", "answers it on firmly split hooves"),
V("pilfers with agile browsing lips", "bounds away behind raised horns"),
V("charges possessed in repeated straight lines", "clatters under unseen direction"),
V("dreams with beard and hooves twitching", "dozes through tiny horn-led head tosses"));
AddExtended(voices, "civ_hyena",
V("sings in rising broken whoops", "cackles a slope-backed refrain"),
V("courts through looping shoulder-low runs", "mates on broad jaw-braced haunches"),
V("cultivates in sloping side-to-side passes", "tends growth with heavy jaws flexing close"),
V("pollinates with a broad sniffing muzzle", "loops among blooms on uneven shoulders"),
V("trades through cackling jaw displays", "bargains with sloped back held low"),
V("fishes from a crooked shoulder-heavy stance", "fishes with broad jaws snapping sideways"),
V("hauls in a crushing jaw grip", "draws weight with hindquarters driving"),
V("licks wounds between low pulsing whoops", "tends wounds with broad muzzle lowered"),
V("paces around flames with jaws parted", "faces fire from a low sloping crouch"),
V("lopes away in widening loops", "flees with shoulders low and jaws shut"),
V("settles into a shoulder-close laughing clan", "circles the civic group before lying low"),
V("drills through harrying jaw-first passes", "patrols in broad looping circuits"),
V("reads with jaws slightly parted", "studies while sloped shoulders rock"),
V("whoops kin into a close flank group", "crushes spoils into manageable groupings"),
V("relieves itself from crooked lowered haunches", "sniffs around after relieving itself"),
V("loops between duties with puzzled jaws open", "cackles once at a mistaken duty"),
V("recharges in a loose slope-backed sprawl", "rests with chin between heavy forepaws"),
V("lopes after a strange private compulsion", "answers it in slope-backed widening circles"),
V("pilfers inside heavy closing jaws", "veers away on crooked strides"),
V("cackles possessed without opening its jaws", "runs under command in rigid loops"),
V("dreams through broken throat-whoops", "sleeps while heavy jaws flex silently"));
AddExtended(voices, "civ_lemon_man",
V("sings in sharp rind-bright squeaks", "fizzes through a pointed-crown refrain"),
V("courts with springy rolling pivots", "presses rounded limbs together during mating"),
V("cultivates in bouncing segmented passes", "tends growth with rounded feet and quick palms"),
V("pollinates with pointed fingertip touches", "rolls between blooms before popping upright"),
V("trades through brisk rind-polishing gestures", "bargains with pointed crown held high"),
V("fishes from a springy rounded crouch", "fishes with quick puckered mouth pulses"),
V("hauls against the firm curved rind", "rolls weight on rounded feet"),
V("tends wounds with quick alternating palms", "leans the pointed crown away and treats wounds"),
V("pivots around flames with rind held back", "faces fire on bouncing rounded feet"),
V("rolls away before springing upright", "flees with pointed crown angled forward"),
V("settles into a neatly segmented civic cluster", "joins formation through rounded divisions"),
V("drills in rolling pointed-crown charges", "patrols with quick springing pivots"),
V("reads with mouth held in a pucker", "traces lines beneath the pointed crown"),
V("squeaks kin into a rounded cluster", "presses spoils together with both palms"),
V("relieves itself in a tight rounded squat", "straightens the pointed crown after relieving itself"),
V("rolls between mismatched duty segments", "puckers over an obviously mistaken duty"),
V("recharges curled against the firm rind", "rests with rounded feet tucked close"),
V("bounces after an inexplicable impulse", "answers it through pointed-crown rolling starts"),
V("pilfers with a quick rounded pivot", "rolls away beneath the pointed crown"),
V("jerks possessed on spring-locked limbs", "the pointed crown spins through compelled turns"),
V("dreams with rounded feet softly bouncing", "sleeps while the pointed crown tilts"));
AddExtended(voices, "civ_liliar",
V("sings in layered silvery trills", "chimes through unfurled throat-frills"),
V("courts through slow frill-unfolding bows", "mates in a slender layered embrace"),
V("cultivates with long interweaving hands", "tends planted growth beneath drifting frills"),
V("pollinates with delicate leaf-edge brushes", "glides bloom to bloom on slender steps"),
V("trades through broad many-layered gestures", "bargains with long fingers interlaced"),
V("fishes from a stem-straight stance", "fishes through supple long-armed arcs"),
V("hauls with layered arms braided together", "bears weight along a supple upright frame"),
V("wraps wounds in overlapping soft frills", "tends wounds with long leaflike fingers"),
V("unfurls around flames at a measured distance", "faces fire with layered edges drawn inward"),
V("glides away with frills streaming", "flees in long supple sweeping steps"),
V("settles into a facing circle of layered forms", "weaves the civic group into interlocking bands"),
V("drills in supple stem-led turns", "patrols with sharpened frills held outward"),
V("reads with one long finger following lines", "studies behind folded layered hands"),
V("chimes kin into a layered ring", "braids spoils together between slender arms"),
V("relieves itself in a folded upright crouch", "closes lower frills while relieving itself"),
V("unfurls toward two conflicting duties", "tilts layered hands over a confused duty"),
V("recharges enclosed by overlapping frills", "rests upright with slender hands joined"),
V("glides after an unaccountable inner pull", "unfurls through it in supple arcs"),
V("pilfers behind overlapping layered frills", "sweeps away on silent slender steps"),
V("unfurls possessed in severe symmetry", "rigid frills repeat the compelled pattern"),
V("dreams while layered edges slowly open", "sleeps as long fingers weave delicate patterns"));
AddExtended(voices, "civ_monkey",
V("sings in rapid chest-patting chatter", "howls a long-armed civic refrain"),
V("courts through tail-curled swinging displays", "grapples long limbs and tail during mating"),
V("cultivates with hands, feet, and tail alternating", "crouches nimbly while tending growth"),
V("pollinates with quick fingertip inspections", "swings among blooms with tail curled"),
V("trades through animated many-handed gestures", "bargains while hanging from the tail"),
V("fishes with one hand poised below the other", "fishes from a long-armed squat"),
V("hauls with tail and both hands braced", "bears weight across long swinging arms"),
V("grooms wounds with nimble fingertips", "tends wounds through long-fingered grooming"),
V("circles flames on hands and feet", "reaches toward fire then recoils up the arms"),
V("scrambles away on all four limbs", "flees with tail streaming behind"),
V("settles into a close grooming civic troop", "joins the troop through swinging circuits"),
V("drills in long-armed grappling turns", "patrols above and below on nimble limbs"),
V("reads while tracing with fingers and toes", "studies with tail curled around the stance"),
V("chatters kin into a hand-linked cluster", "gathers spoils with hands, feet, and tail"),
V("relieves itself from a low long-armed squat", "raises the curling tail while relieving itself"),
V("scratches its head between conflicting duties", "swings toward an obviously mistaken duty"),
V("recharges curled inside long arms and tail", "rests with both hands beneath the head"),
V("scrambles after a peculiar sudden urge", "answers it while hanging tail-first"),
V("pilfers with quick curling fingers", "swings away with tail wrapped tight"),
V("clambers possessed in repetitive limb patterns", "teeth chatter through compelled climbing"),
V("dreams with hands grasping empty air", "sleeps while tail and toes curl"));
AddExtended(voices, "civ_penguin",
V("sings in upright bill-led honks", "warbles while both flippers beat time"),
V("courts through formal flipper-spread bows", "huddles upright with flippers during mating"),
V("cultivates in waddling parallel passes", "tends growth with bill and flipper taps"),
V("pollinates with repeated narrow-bill touches", "waddles among blooms with flippers out"),
V("trades through stiff bows and bill clicks", "bargains while rocking heel to heel"),
V("fishes with narrow bill held poised", "fishes through belly-first lunges"),
V("hauls by sliding on the rounded belly", "pushes weight with both broad flippers"),
V("preens wounds with measured bill touches", "tends wounds through soft flipper presses"),
V("rocks beside flames with flippers shielding", "faces fire from a close upright stance"),
V("slides away on the rounded belly", "flees in short rapid waddles"),
V("settles into a shoulder-locked civic huddle", "joins the group with bill facing inward"),
V("drills in stiff bill-and-flipper jabs", "patrols with flippers spread for balance"),
V("reads with the narrow bill tracking lines", "studies while rocking on flat heels"),
V("honks kin into a packed huddle", "slides spoils inward between flippers"),
V("relieves itself from a brief upright squat", "lifts the short tail while relieving itself"),
V("waddles between mismatched duties", "tilts the bill over a confused duty"),
V("recharges with bill tucked under flipper", "rests upright inside the huddle"),
V("slides toward an inexplicable urge", "answers it with both flippers stiff"),
V("pilfers between narrow bill and chest", "waddles away behind spread flippers"),
V("marches possessed without its usual waddle", "the narrow bill honks through rigid steps"),
V("dreams with flippers paddling softly", "dozes while the narrow bill twitches"));
AddExtended(voices, "civ_piranha",
V("sings in sharp jaw-clicking pulses", "vibrates a fin-beaten civic refrain"),
V("courts through tight synchronized fin loops", "spirals through mating with synchronized tail flicks"),
V("cultivates in darting fin-led passes", "tends growth with quick shearing mouthparts"),
V("pollinates in level fin-guided passes", "darts among blooms without snapping"),
V("trades through flashing jaw-and-fin signals", "bargains in a tightly held hover"),
V("fishes in sudden fin-led lunges", "fishes with jaws poised between tail flicks"),
V("hauls by driving with tail and fins", "bears weight against a compact scaled flank"),
V("tends wounds with closed mouthparts", "hovers level while fins guide each touch"),
V("circles flames in quick snapping turns", "faces fire with fins making tiny corrections"),
V("darts away in a flashing straight burst", "flees with fins clamped close"),
V("settles into a tight fin-aligned civic school", "joins the school through circling ranks"),
V("drills in repeated jaw-first rushes", "patrols through coordinated fin turns"),
V("reads while hovering rigidly level", "tracks lines with quick eye and fin shifts"),
V("clicks kin into a close-moving school", "herds spoils together with snapping turns"),
V("relieves itself during a brief tail-held hover", "flicks away after relieving itself"),
V("circles between contradictory duty signals", "snaps once at a mistaken duty"),
V("recharges nearly motionless on tucked fins", "rests with only the tail tip correcting"),
V("darts after an inexplicable compulsion", "answers it in jaw-clicking loops"),
V("pilfers inside flashing shearing teeth", "veers away behind beating fins"),
V("darts possessed in rigid repeated circuits", "clicks jaws under unseen direction"),
V("dreams with fins making tiny corrections", "rests while the tail flicks in bursts"));
AddExtended(voices, "civ_rabbit",
V("sings in soft nose-trembling trills", "pipes a long-eared civic refrain"),
V("courts through high twisting leaps", "mates in a compact hind-leg crouch"),
V("cultivates in quick paired-foot passes", "tends growth with nimble forepaws"),
V("pollinates with twitching nose brushes", "bounds among blooms beneath upright ears"),
V("trades through ear tilts and paw taps", "bargains while sitting tall on haunches"),
V("fishes with forepaws held close together", "fishes with long ears laid backward"),
V("hauls in short double-footed bounds", "bears weight against a compact chest"),
V("nuzzles wounds with a trembling nose", "tends wounds between soft forepaws"),
V("hops around flames with ears flattened", "faces fire from a spring-loaded crouch"),
V("zigzags away in rapid paired bounds", "flees with long ears streaming backward"),
V("settles into a close ear-alert formation", "joins the group with quick forepaw taps"),
V("drills in alternating paw-boxing bursts", "patrols through sharp zigzag leaps"),
V("reads with ears rotating above the lines", "studies between two lifted forepaws"),
V("thumps kin into a compact gathering", "draws spoils close with quick paw sweeps"),
V("relieves itself on folded springy haunches", "raises the small tail while relieving itself"),
V("turns each long ear toward a different duty", "hops once toward the mistaken duty"),
V("recharges folded into a tight crouch", "rests with ears laid over the shoulders"),
V("bounds after an unexplained twitching urge", "answers it in ear-streaming hops"),
V("pilfers between two cupped forepaws", "zigzags away with ears low"),
V("boxes possessed at empty space", "leaps under command in rigid doubles"),
V("dreams with hind feet kicking softly", "dozes while long ears rotate"));
AddExtended(voices, "civ_rat",
V("sings in high whisker-twitching squeaks", "pipes a quick tail-curled civic refrain"),
V("courts through close nose-led circles", "mates in a low nimble crouch"),
V("cultivates in narrow whisker-guided turns", "tends growth with tiny gripping paws"),
V("pollinates with rapid whiskered sniffs", "scurries among blooms on quick toes"),
V("trades through paw rubbing and low squeaks", "bargains with whiskers pitched forward"),
V("fishes with both small paws poised", "fishes from a tail-balanced squat"),
V("hauls backward in a firm tooth-grip", "draws weight with the long tail balancing"),
V("grooms wounds between tiny moving paws", "tends wounds through alternating paw presses"),
V("sniffs around flames with whiskers recoiling", "faces fire from a low paw-ready crouch"),
V("scurries away through narrow turns", "flees with tail drawn straight"),
V("settles into a whisker-touching civic cluster", "joins the group through tight scurrying runs"),
V("drills in low darting bites", "patrols nose-first along every edge"),
V("reads with one paw tracking the line", "studies while whiskers sweep side to side"),
V("squeaks kin into a tail-linked cluster", "sorts spoils rapidly between both paws"),
V("relieves itself from a low tail-lifted squat", "combs whiskers after relieving itself"),
V("scurries between mismatched duties", "rubs both paws over a confused duty"),
V("recharges curled tightly around the tail", "rests with whiskers tucked to the chest"),
V("follows an odd nose-led compulsion", "scurries through it in whisker-led bursts"),
V("pilfers beneath the chest in small paws", "scurries away with whiskers flat"),
V("moves possessed in sharp repeated darts", "squeaks beneath unseen direction"),
V("dreams with paws sorting empty air", "sleeps while whiskers and tail twitch"));
AddExtended(voices, "civ_rhino",
V("sings in rough horn-backed bellows", "rumbles a thick-chested civic note"),
V("courts through heavy horn-side head sweeps", "mates on four massively planted feet"),
V("cultivates in deep hoof-timed passes", "tends growth beneath a lowered horn"),
V("pollinates with the broad lower lip", "walks between blooms behind an angled horn"),
V("trades through blunt horn-and-ear gestures", "bargains from an immovable stance"),
V("fishes with the horn angled aside", "fishes through thick shoulder thrusts"),
V("hauls behind a massive pushing brow", "drives weight on pounding broad feet"),
V("nudges wounds with the broad lower lip", "tends wounds while standing hide-outward"),
V("faces flames behind a lowered horn", "stamps around fire in heavy arcs"),
V("thunders away with horn held level", "flees on pounding thick legs"),
V("settles into a hide-and-horn civic barrier", "joins the formation through massive hoof presses"),
V("drills in direct horn-led charges", "patrols with thick hide facing outward"),
V("reads with small eyes close to the lines", "studies beneath the shadow of the horn"),
V("bellows kin into a heavy defensive ring", "pushes spoils together with the broad snout"),
V("relieves itself on widely braced thick legs", "raises the short tail while relieving itself"),
V("swings the horn between conflicting duties", "stamps over an obviously mistaken duty"),
V("recharges in a massive folded crouch", "rests with thick chin against the chest"),
V("charges after an inexplicable inner pull", "answers it with the heavy horn lowered"),
V("pilfers behind the lowered heavy horn", "backs away on heavy guarded feet"),
V("stomps possessed in an unbroken straight line", "obeys unseen direction without turning"),
V("dreams with broad feet grinding softly", "dozes while the heavy horn tilts"));
AddExtended(voices, "civ_scorpion",
V("sings in dry pincer-clicking measures", "rasps a tail-arched civic refrain"),
V("courts through mirrored claw and tail waves", "mates beneath crossed and lifted stingers"),
V("cultivates in eight-legged segmented passes", "tends growth between paired pincers"),
V("pollinates with delicate claw-tip touches", "skitters among blooms beneath a curled tail"),
V("trades through exact pincer signals", "bargains with stinger held ceremonially high"),
V("fishes with paired claws poised", "fishes beneath a balancing arched tail"),
V("hauls between locking heavy pincers", "draws weight on eight gripping feet"),
V("tends wounds with fine claw tips", "keeps the stinger clear and treats wounds"),
V("faces flames behind raised pincers", "tests fire beneath a tightly curled tail"),
V("skitters away with stinger flattened", "flees on eight rapid jointed feet"),
V("settles into a claw-outward civic circle", "aligns tail arches across the formation"),
V("drills in pincer grabs and stinger feints", "patrols with eight feet keeping cadence"),
V("reads with both claws held level", "studies beneath a motionless stinger"),
V("clicks kin into a pincer-linked group", "draws spoils inward with paired claws"),
V("relieves itself on spread rear legs", "lifts the arched tail while relieving itself"),
V("turns pincers toward conflicting duties", "trembles the stinger over a confused duty"),
V("recharges with limbs folded under armor", "rests beneath the tail's tight curve"),
V("skitters after a strange claw-led impulse", "answers it beneath a poised stinger"),
V("pilfers between tightly clasped pincers", "backs away beneath the raised tail"),
V("marches possessed on rigid synchronized legs", "strikes empty air under unseen command"),
V("dreams with pincers clicking softly", "sleeps while the curled tail tightens"));
AddExtended(voices, "civ_seal",
V("sings in bouncing whiskered barks", "honks a broad-flippered civic tune"),
V("courts through rolling flipper claps", "presses belly-down with flippers during mating"),
V("cultivates in low galumphing passes", "tends growth with broad flipper sweeps"),
V("pollinates with soft whiskered nose touches", "flops among blooms on broad flippers"),
V("trades through claps and whisker-led nods", "bargains while balanced upright"),
V("fishes with whiskers pitched forward", "fishes through sleek rolling body turns"),
V("hauls by sliding on the broad belly", "pushes weight with paired flippers"),
V("nuzzles wounds with a whiskered muzzle", "tends wounds using soft flipper presses"),
V("claps around flames from a low position", "faces fire with whiskers drawn back"),
V("galumphs away in rolling lunges", "flees belly-low on beating flippers"),
V("settles into a close whisker-touching cohort", "joins the cohort with broad flipper strokes"),
V("drills in rolling body-first charges", "patrols with alternating flipper strokes"),
V("reads propped upright on the belly", "tracks lines with whiskers almost touching"),
V("barks kin into a flipper-close gathering", "sweeps spoils inward across the belly"),
V("relieves itself from a low tail-lifted crouch", "claps once after relieving itself"),
V("rolls between duties with whiskers askew", "flops toward an obviously mistaken duty"),
V("recharges in a loose whiskered curl", "rests with nose against the tail"),
V("galumphs after a baffling impulse", "answers it through whiskered flipper claps"),
V("pilfers beneath one broad flipper", "slides away belly-first"),
V("flops possessed in exact repeated rolls", "whiskered barks punctuate each compelled roll"),
V("dreams with broad flippers paddling", "dozes while whiskers tremble"));
AddExtended(voices, "civ_sheep",
V("sings in soft fleece-muffled bleats", "warbles with woolly chest trembling"),
V("courts through close wool-brushing circles", "mates on four softly planted feet"),
V("cultivates in even fleece-bobbing passes", "tends growth with small repeated bites"),
V("pollinates with a soft wool-framed muzzle", "steps among blooms beneath drooping ears"),
V("trades through low bleats and brow dips", "bargains while fleece settles around the stance"),
V("fishes with wool held clear of the reach", "fishes from four close-set hooves"),
V("hauls against a thickly padded shoulder", "draws weight in even woolly steps"),
V("nuzzles wounds through soft fleece", "tends wounds with a slow narrow muzzle"),
V("edges around flames with wool pulled back", "faces fire behind a lowered thick brow"),
V("bounds away with fleece bouncing", "flees on close quick hooves"),
V("settles into a shoulder-tight civic flock", "joins the flock in a fleece-close cluster"),
V("drills in thick-browed rushing turns", "patrols with woolly flanks kept together"),
V("reads with muzzle beneath the woolly fringe", "studies while drooping ears hold still"),
V("bleats kin into a fleece-packed group", "nudges spoils inward with the soft brow"),
V("relieves itself on folded hind legs", "holds the woolly tail aside while relieving itself"),
V("turns drooping ears between mistaken duties", "nibbles uncertainly at the wrong duty"),
V("recharges folded into deep fleece", "rests with muzzle against one woolly flank"),
V("follows a strange flockless compulsion", "answers it on fleece-muted quick steps"),
V("pilfers beneath thick overlapping fleece", "trots away with ears low"),
V("marches possessed without flock formation", "fleece shivers through compelled steps"),
V("dreams with fleece shivering lightly", "dozes while small hooves twitch"));
AddExtended(voices, "civ_snake",
V("sings in long coiling hisses", "rattles a winding civic refrain"),
V("courts through paired rising coils", "mates in closely interwoven loops"),
V("cultivates in smooth coiling curves", "tends growth with a flicking tongue"),
V("pollinates with repeated tongue-tip tests", "winds among blooms in polished curves"),
V("trades through poised head and coil gestures", "bargains with tongue flicking in measured beats"),
V("fishes from a motionless raised coil", "fishes through a single coil-driven strike"),
V("hauls by winding loops around the weight", "draws backward through muscular coils"),
V("wraps wounds in a loose supporting loop", "tends wounds with repeated tongue tests"),
V("coils beside flames with head raised", "tests fire through rapid tongue flicks"),
V("flows away in tightening curves", "flees with head low and coils lengthened"),
V("settles into a low interlocking civic coil", "links the group through overlapping loops"),
V("drills in sudden coil-driven strikes", "patrols in silent looping curves"),
V("reads with tongue tracking each line", "studies from a neatly raised coil"),
V("hisses kin into an overlapping knot", "winds spoils together inside broad loops"),
V("relieves itself with the rear coils straightened", "recoils compactly after relieving itself"),
V("loops between contradictory duty cues", "raises the head over a confused duty"),
V("recharges knotted into compact coils", "rests beneath overlapping muscular loops"),
V("winds after a strange tongue-led impulse", "coils through it in repeated curves"),
V("pilfers inside one tightening loop", "flows away without a sound"),
V("strikes possessed at empty space", "coils under command in rigid symmetry"),
V("dreams with tongue flicking silently", "sleeps while polished coils tighten"));
AddExtended(voices, "civ_turtle",
V("sings in slow shell-deep tones", "wheezes a measured beak-led refrain"),
V("courts through slow shell-to-shell circles", "mates on four widely braced feet"),
V("cultivates in shell-shadowed passes", "tends growth with a clipping beaked mouth"),
V("pollinates with slow beak-tip touches", "plods among blooms beneath the ridged shell"),
V("trades through long nods over the shell rim", "bargains without changing its planted stance"),
V("fishes with beak poised beyond the shell", "fishes through slow shell-paced reaches"),
V("hauls beneath the weight-bearing shell", "draws steadily on short braced legs"),
V("nudges wounds with a slow hooking beak", "extends incrementally from the shell and treats wounds"),
V("faces flames from behind the shell rim", "tests fire with the beak then withdraws"),
V("plods away before drawing limbs inward", "flees under the protection of the shell"),
V("settles into a slow shell-rimmed civic ring", "joins the ring through repeated circuits"),
V("drills in shell-braced forward shoves", "patrols without breaking its measured pace"),
V("reads with chin resting on the shell rim", "tracks lines using slow beak movements"),
V("calls kin into a ridged-shell cluster", "pushes spoils together with the shell edge"),
V("relieves itself on short firmly planted legs", "extends the rear beyond the shell to relieve itself"),
V("turns slowly between conflicting duties", "withdraws halfway over a confused duty"),
V("recharges fully enclosed by the shell", "rests with chin on the ridged rim"),
V("plods after an inexplicable inner direction", "answers it through shell-paced steps"),
V("pilfers with a slow hooking beak", "withdraws behind the shell"),
V("marches possessed at an unnatural pace", "extends under command with eyes fixed"),
V("dreams with limbs shifting inside the shell", "sleeps while the beaked mouth moves"));
AddExtended(voices, "civ_unicorn",
V("sings in clear horn-lifted tones", "trills while the long mane settles"),
V("courts through high-stepping mane tosses", "mates on four high-braced legs"),
V("cultivates in high-hoofed passes", "tends growth beneath a lifted horn"),
V("pollinates with the horn tip held aside", "steps among blooms on light raised hooves"),
V("trades through high horn-led bows", "bargains with mane and tail held still"),
V("fishes with horn angled above the stance", "fishes on lightly planted high hooves"),
V("hauls through a high arched neck", "draws weight in high even steps"),
V("tends wounds beneath the horn tip", "tends wounds with slow muzzle nudges"),
V("circles flames with mane drawn clear", "faces fire behind a level pointed horn"),
V("gallops away with mane streaming", "flees in long horn-forward strides"),
V("settles into a horn-outward civic formation", "joins it through high hoof circuits"),
V("drills in poised horn-led charges", "patrols with lifted hooves and neck arched"),
V("reads with the horn held straight", "studies while the mane falls to one side"),
V("trills kin into a high-stepping group", "draws spoils together with alternating hoof nudges"),
V("relieves itself on lightly flexed hind legs", "holds the flowing tail clear while relieving itself"),
V("tosses the mane between opposing duties", "angles the horn over a confused duty"),
V("recharges with long legs folded evenly", "rests beneath a mane spread along the neck"),
V("canters after a strange inward summons", "answers it with horn held high"),
V("pilfers beneath a lifted narrow chin", "prances away behind the leveled horn"),
V("gallops possessed in severe straight lines", "the rigid mane follows each compelled stride"),
V("dreams with long hooves stepping softly", "dozes while the horn and mane tilt"));
AddExtended(voices, "civ_wolf",
V("sings in long muzzle-raised howls", "carries a shoulder-deep pack refrain"),
V("courts through close muzzle-and-flank circles", "mates on firmly braced hind legs"),
V("cultivates in coordinated pack-timed passes", "tends growth as paws alternate in formation"),
V("pollinates with scenting muzzle passes", "ranges among blooms on quiet paws"),
V("trades through low growls and ear signals", "bargains from a shoulder-close stance"),
V("fishes with muzzle poised and paws spread", "fishes through a swift jaw-led lunge"),
V("hauls in a firm jaw-held formation", "draws weight with rolling shoulders"),
V("licks wounds with slow repeated strokes", "tends wounds while standing flank-outward"),
V("circles flames with muzzle testing the air", "faces fire behind a low shoulder guard"),
V("ranges away in long driving strides", "flees with ears flat and tail low"),
V("settles into a close shoulder-linked formation", "joins it through pack-timed circuits"),
V("drills in coordinated flanking rushes", "patrols with shoulders rolling in formation"),
V("reads with muzzle between both forepaws", "studies while ears track every pause"),
V("howls kin into a shoulder-close pack", "gathers spoils within a guarded ring"),
V("relieves itself with one hind leg lifted", "tests the air after relieving itself"),
V("turns ears toward contradictory duties", "circles an obviously mistaken duty"),
V("recharges curled muzzle-to-flank", "rests with tail wrapped over the paws"),
V("ranges after a strange solitary compulsion", "breaks pack formation through compelled strides"),
V("pilfers in quick closing jaws", "slips away with flank held low"),
V("runs possessed without pack signals", "the raised muzzle howls through rigid strides"),
V("dreams with paws coursing in place", "sleeps through low muzzle-rumbles"));
AddExtended(voices, "dwarf",
V("sings in beard-shaking chest notes", "booms a compact marching refrain"),
V("courts through stout forearm clasps", "mates on short powerfully braced legs"),
V("cultivates in short forceful passes", "tends growth with beard tucked close"),
V("pollinates with thick fingertip taps", "moves bloom to bloom on compact strides"),
V("trades through blunt palm and beard gestures", "bargains with thick arms folded"),
V("fishes from a low immovable stance", "fishes with short beard-braced pulls"),
V("hauls against a stout shoulder", "bears weight on short driving legs"),
V("braces wounds with thick forearms", "tends wounds through compact hand presses"),
V("faces flames with beard gathered close", "handles fire from a deep braced crouch"),
V("retreats in short pounding strides", "flees with beard and elbows tucked"),
V("settles into a tightly joined civic formation", "aligns with it from a stout square stance"),
V("drills in compact hammering blows", "patrols with fists at a low guard"),
V("reads with one thick finger under each line", "studies above a beard spread on the chest"),
V("booms kin into a forearm-linked gathering", "stacks spoils in compact ordered groups"),
V("relieves the body from a stout squat", "straightens the beard after relieving itself"),
V("stamps between two conflicting duties", "pulls the beard over a confused duty"),
V("recharges in a short solid curl", "rests beneath a beard spread wide"),
V("marches after an inexplicable compulsion", "answers it with beard and jaw set"),
V("pilfers with thick compact fingers", "backs away behind folded forearms"),
V("stomps possessed in a harsh compact cadence", "marches under command with beard rigid"),
V("dreams with thick fists closing softly", "sleeps while short legs brace"));
AddExtended(voices, "elf",
V("sings in clear long-breathed phrases", "threads a light civic melody"),
V("courts through poised fingertip bows", "mates in a light long-limbed embrace"),
V("cultivates in near-silent even passes", "tends growth with long alternating fingers"),
V("pollinates with delicate fingertip brushes", "steps among blooms without stirring them"),
V("trades through small repeated hand signs", "bargains with head lightly inclined"),
V("fishes from a silent balanced stance", "fishes in fine long-fingered arcs"),
V("hauls with long arms held evenly", "bears weight on light measured steps"),
V("tends wounds with slender steady hands", "leans close and treats wounds in small touches"),
V("faces flames with long fingers held clear", "handles fire through silent measured gestures"),
V("withdraws in quick near-silent steps", "flees with long limbs gathered close"),
V("settles into a quietly ordered civic formation", "joins it through light even pacing"),
V("drills in swift narrow strikes", "patrols without sound on balanced feet"),
V("reads with a long finger tracing lines", "studies while head remains lightly bowed"),
V("calls kin together in a clear low phrase", "arranges spoils with slender exact fingers"),
V("relieves the body in a poised crouch", "rises lightly after relieving itself"),
V("tilts the head between incompatible duties", "places long fingers over a mistaken duty"),
V("recharges with limbs folded in balance", "rests through slow controlled breaths"),
V("glides after a strange inward prompting", "answers it with long fingers tracing silently"),
V("pilfers on light slender fingers", "steps away without a sound"),
V("moves possessed in severe straight measures", "obeys unseen direction without blinking"),
V("dreams with long fingers tracing the air", "sleeps while light feet shift"));
AddExtended(voices, "human",
V("sings in open breath-shaped phrases", "keeps rhythm with alternating hand taps"),
V("courts through close face-to-face gestures", "mates in a balanced two-armed embrace"),
V("cultivates in brisk alternating passes", "tends growth as both hands alternate"),
V("pollinates with alternating fingertip touches", "moves between blooms on steady feet"),
V("trades through animated hand bargaining", "negotiates with eyes fixed on the exchange"),
V("fishes with both hands held ready", "fishes through steady alternating arm pulls"),
V("hauls with shoulders and knees aligned", "bears weight between both arms"),
V("braces wounds with both hands", "kneels close and tends each wound"),
V("faces flames with forearms shielding", "handles fire from a balanced crouch"),
V("runs away with arms driving hard", "flees in quick alternating strides"),
V("settles into a hand-linked civic formation", "joins it through paced alternating turns"),
V("drills through balanced alternating hand strikes", "patrols with eyes and shoulders forward"),
V("reads with one finger tracking the line", "studies while shifting weight between feet"),
V("calls kin into an arm-linked gathering", "sorts spoils between quick alternating hands"),
V("relieves the body from a low squat", "stands and adjusts posture after relieving itself"),
V("hesitates between two incompatible duties", "starts the wrong duty before stopping"),
V("recharges with knees drawn close", "rests through slow even breaths"),
V("walks after an inexplicable duty impulse", "answers it with alternating hand sweeps"),
V("pilfers in one quick palm sweep", "backs away with hands held close"),
V("moves possessed in stiff alternating steps", "marches beneath unseen direction"),
V("dreams with fingers and eyelids twitching", "sleeps while feet make tiny steps"));
AddExtended(voices, "orc",
V("sings in tusk-bared booming chants", "pounds a broad chest through the refrain"),
V("courts through heavy forearm clashes", "mates on wide powerfully braced legs"),
V("cultivates in forceful shoulder-driven passes", "tends growth with broad hands and tusks high"),
V("pollinates with repeated knuckle touches", "moves among blooms on heavy feet"),
V("trades through loud tusk-framed bargaining", "negotiates with fists open at the sides"),
V("fishes from a deep shoulder-heavy crouch", "fishes through hard two-armed pulls"),
V("hauls against one massive shoulder", "heaves weight with both thick arms"),
V("braces wounds with broad hands", "tends wounds behind a tusk-bared guard"),
V("faces flames with fists raised", "handles fire while keeping tusks and chest clear"),
V("pounds away in long heavy strides", "flees with shoulders hunched and tusks forward"),
V("settles into a forearm-locked civic formation", "joins it through heavy heel stamps"),
V("drills in chopping fist-and-forearm blows", "patrols with tusks high and shoulders broad"),
V("reads with one heavy finger under the lines", "studies while tusks frame a lowered jaw"),
V("bellows kin into a shoulder-packed gathering", "heaves spoils into a guarded grouping"),
V("relieves the body from a deep wide squat", "rises with fists braced after relieving itself"),
V("growls between conflicting duties", "headbutts toward an obviously mistaken duty"),
V("recharges in a heavy loose sprawl", "rests with one fist closed against the chest"),
V("stalks after a strange compelling duty", "answers it with tusks and fists clenched"),
V("pilfers in one broad sweeping hand", "backs away behind raised forearms"),
V("marches possessed with fists locked", "strikes empty air beneath unseen command"),
V("dreams with tusks bared and fists flexing", "sleeps through low chest-deep growls"));
}
}

View file

@ -0,0 +1,351 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddCivSpecializedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddSpecialized(voices, "civ_acid_gentleman",
V("flicks a caustic spark into flame", "draws a green flame between rigid fingertips"),
V("presses both palms down against the flame", "sweeps a rigid forearm across the flames"),
V("bows into a gathering circle", "beckons the family together with one formal hand"),
V("draws a soul upward in an emerald strand", "coaxes life essence between poised fingers"),
V("searches the spoils with precise fingertips", "lifts spoils with a measured bow"),
V("weeps behind one upright hand", "releases a clipped, trembling sob"),
V("snaps out a curse through clenched teeth", "cuts the air with a rigid, scolding finger"));
AddSpecialized(voices, "civ_alpaca",
V("puffs a bright flame from pursed lips", "kicks a spark into a spreading flame"),
V("stamps broad feet through the flames", "presses a woolly chest down against the flame"),
V("hums while joining the herd", "nudges the family into a close cluster"),
V("draws a soul along a curling breath", "pulls life essence between soft lips"),
V("sniffs through the spoils", "hooks spoils closer with one forefoot"),
V("warbles through a streaming nose", "folds long ears through a breathy sob"),
V("spits a sharp curse through soft lips", "stamps both forefeet while swearing"));
AddSpecialized(voices, "civ_armadillo",
V("strikes plated claws into a flickering flame", "rolls a spark into a widening flame"),
V("rakes low claws across the flames", "presses a plated curl against the flame"),
V("uncurls among the gathering family", "trundles into a shell-to-shell group"),
V("draws a soul beneath overlapping plates", "cups life essence between curved claws"),
V("snuffles through the spoils", "rakes spoils beneath a plated forearm"),
V("chitters through a tightly curled body", "rocks inside the shell with dry sobs"),
V("clacks out a curse from a half-curl", "scrapes both claws while swearing"));
AddSpecialized(voices, "civ_bear",
V("claps broad paws around a newborn flame", "rakes a spark into a rising flame"),
V("beats heavy paws against the flames", "presses a broad forepaw over the flame"),
V("lumbers into the gathered family", "pulls the group close with both forelegs"),
V("draws a soul between cupped paws", "inhales life essence with a deep rumble"),
V("sniffs heavily through the spoils", "scoops spoils between broad paws"),
V("roars through a shaking muzzle", "covers the eyes with both paws and sobs"),
V("bellows a curse through bared teeth", "swears with both paws raised"));
AddSpecialized(voices, "civ_beetle",
V("rasps wing cases until a flame sparks", "clicks a bright flame between hooked feet"),
V("fans rigid wing cases against the flames", "scrapes jointed feet across the flame"),
V("clicks while entering the gathered group", "fits carapace to carapace among the family"),
V("draws a soul between trembling antennae", "guides life essence beneath the wing case"),
V("feels through the spoils with both antennae", "clasps spoils between hooked feet"),
V("rattles the wing case through thin cries", "folds every leg beneath a clicking sob"),
V("rasps out a curse with snapping mouthparts", "jabs both antennae while swearing"));
AddSpecialized(voices, "civ_buffalo",
V("strikes both horns into a bursting flame", "snorts a spark into a broad flame"),
V("stamps heavy hooves across the flames", "sweeps lowered horns through the flame"),
V("shoulders into the gathered herd", "calls the family into a horn-ringed group"),
V("draws a soul between curved horns", "pulls life essence into a deep breath"),
V("roots through the spoils with a broad muzzle", "hooks spoils inward with one horn"),
V("bellows with tears streaking the muzzle", "bows the heavy head through rumbling sobs"),
V("snorts out a rolling curse", "slashes both horns in a sharp arc while swearing"));
AddSpecialized(voices, "civ_candy_man",
V("snaps glossy fingers into a sparkling flame", "spins a bright flame from striped palms"),
V("claps glossy hands around the flame", "pats quick palms across the flames"),
V("twirls into the gathering family", "waves the group into a striped circle"),
V("draws a soul through spiraling fingers", "winds life essence around glossy hands"),
V("taps through the spoils with glossy fingertips", "tucks spoils against a striped chest"),
V("crackles through a high, wet sob", "covers glossy eyes with trembling hands"),
V("snaps out a brittle curse", "wags a striped finger while swearing"));
AddSpecialized(voices, "civ_capybara",
V("nudges a spark into a low flame", "breathes steadily until a flame catches"),
V("presses broad forepaws against the flames", "rolls a blunt muzzle across the flame"),
V("ambles into the gathered family", "settles flank-first among the group"),
V("draws a soul beneath a blunt chin", "pulls life essence between cupped forepaws"),
V("sniffs slowly through the spoils", "draws spoils close between both forepaws"),
V("squeaks through streaming eyes", "rests the muzzle low through bubbling sobs"),
V("chatters out a blunt curse", "slaps one broad forepaw while swearing"));
AddSpecialized(voices, "civ_cat",
V("strikes a claw-tip spark into flame", "whips a spark into a rising flame"),
V("bats quick paws against the flames", "presses both forepaws over the flame"),
V("threads into the gathered family", "winds tail-first through the group"),
V("draws a soul between hooked claws", "laps life essence from the air"),
V("paws silently through the spoils", "hooks spoils beneath one forepaw"),
V("yowls with whiskers wet", "hides the face beneath both paws and sobs"),
V("hisses a curse through flattened whiskers", "lashes the tail while swearing"));
AddSpecialized(voices, "civ_chicken",
V("scratches a spark into a darting flame", "flaps a small flame into a wider blaze"),
V("scratches both feet across the flames", "beats spread wings against the flame"),
V("clucks while joining the gathered group", "calls the family into a feathered group"),
V("draws a soul beneath a lifted beak", "pecks life essence into a pulsing strand"),
V("scratches briskly through the spoils", "pecks spoils into reach"),
V("keens with the beak held open", "tucks the face beneath one wing and sobs"),
V("squawks out a clipped curse", "spurs the air while swearing"));
AddSpecialized(voices, "civ_cow",
V("scuffs a hoof-spark into a steady flame", "blows a low flame into a broad flare"),
V("tramples heavy hooves through the flames", "sweeps a broad muzzle against the flame"),
V("lows while joining the gathered herd", "presses shoulder-first into the family group"),
V("draws a soul between wide nostrils", "pulls life essence beneath a heavy brow"),
V("sniffs through the spoils with a broad muzzle", "nudges spoils between split hooves"),
V("moans with tears tracing the muzzle", "bows the head through long, shaking sobs"),
V("bellows a deep curse", "stamps one split hoof while swearing"));
AddSpecialized(voices, "civ_crab",
V("clacks both claws into a snapping flame", "fans a spark into a sideways flame"),
V("presses both claws against the flames", "rakes jointed legs across the flame"),
V("sidesteps into the gathered family", "waves the group into a shell-close cluster"),
V("draws a soul between raised pincers", "pulls life essence beneath the shell"),
V("probes the spoils with both claws", "pinches spoils between polished pincers"),
V("bubbles through a shuddering shell", "covers both eyestalks with trembling claws"),
V("clacks out a jagged curse", "brandishes both pincers while swearing"));
AddSpecialized(voices, "civ_crocodile",
V("snaps broad jaws around a sudden flame", "whips a spark into a crawling flame"),
V("beats the flames with a plated tail", "presses a broad jaw against the flame"),
V("slides into the gathered family", "rumbles the group into a flank-close line"),
V("draws a soul between parted jaws", "pulls life essence beneath plated eyelids"),
V("sniffs low through the spoils", "drags spoils beneath one foreleg"),
V("rumbles with tears beneath plated lids", "rests the jaw low through heaving sobs"),
V("growls a curse through locked teeth", "lashes the tail while swearing"));
AddSpecialized(voices, "civ_dog",
V("scratches a paw-spark into lively flame", "pants a small flame into a wider flare"),
V("digs both forepaws across the flames", "beats the flame with quick paw strokes"),
V("bounds into the gathered family", "calls the group into a nose-close cluster"),
V("draws a soul along a lifted muzzle", "laps life essence from a wavering strand"),
V("sniffs rapidly through the spoils", "pulls spoils closer between both paws"),
V("whines with tears on the muzzle", "covers the nose with both paws and sobs"),
V("barks out a sharp curse", "stamps alternating paws while swearing"));
AddSpecialized(voices, "civ_fox",
V("flicks a black paw into a slender flame", "sweeps a spark into a spreading flame"),
V("beats the flames with a broad tail", "scrapes quick forepaws across the flame"),
V("slips into the gathered family", "curls tail-to-tail among the group"),
V("draws a soul around the tail tip", "pulls life essence between narrow jaws"),
V("sniffs sidelong through the spoils", "hooks spoils closer with one black paw"),
V("barks through wet whiskers", "folds the tail over the face and sobs"),
V("spits a quick curse through narrow teeth", "slashes the tail sideways while swearing"));
AddSpecialized(voices, "civ_frog",
V("flicks a tongue-spark into a bobbing flame", "inflates the throat and blows up a flame"),
V("slaps broad hands against the flames", "presses a broad tongue over the flame"),
V("hops into the gathered family", "croaks the group into a squat circle"),
V("draws a soul along the tongue", "pulls life essence into a pulsing throat"),
V("prods through the spoils with long fingers", "flicks spoils closer with the tongue"),
V("croaks through streaming round eyes", "folds low beneath a throbbing sob"),
V("ribbits out a booming curse", "slaps both hands down while swearing"));
AddSpecialized(voices, "civ_garlic_man",
V("rubs papery fingers into a crackling flame", "fans a spark into layered flame"),
V("beats loose layers against the flames", "presses knobby hands over the flame"),
V("rustles into the gathering family", "bundles the group into a layered cluster"),
V("draws a soul between folded layers", "wraps life essence around knobby fingers"),
V("rustles through the spoils with both hands", "tucks spoils beneath folded layers"),
V("crinkles through a dry, shaking sob", "covers the face with papery hands and weeps"),
V("crackles out a jagged curse", "shakes both knobby fists while swearing"));
AddSpecialized(voices, "civ_goat",
V("strikes split hooves into a jumping flame", "tosses a horn-spark into spreading flame"),
V("stamps split hooves across the flames", "sweeps curled horns through the flame"),
V("bounds into the gathered herd", "butts shoulder-first into the family group"),
V("draws a soul between curled horns", "pulls life essence beneath a lifted chin"),
V("noses quickly through the spoils", "hooks spoils closer with one horn"),
V("bleats with tears on the muzzle", "bows between sharp, shaking sobs"),
V("brays out a rasping curse", "clatters both forehooves while swearing"));
AddSpecialized(voices, "civ_hyena",
V("scrapes broad jaws into a crackling flame", "kicks a spark into a loping flame"),
V("rakes heavy forepaws through the flames", "snaps broad jaws against the flame"),
V("whoops while joining the gathered family", "shoulders into the close group"),
V("draws a soul between crushing jaws", "pulls life essence along a rising whoop"),
V("sniffs in circles through the spoils", "drags spoils close beneath one paw"),
V("whoops through streaming eyes", "folds sloping shoulders around broken sobs"),
V("cackles out a coarse curse", "snaps broad jaws while swearing"));
AddSpecialized(voices, "civ_lemon_man",
V("rubs pointed fingers into a fizzing flame", "sprays a spark into a sharp flame"),
V("presses rounded palms against the flames", "rolls a pointed crown across the flame"),
V("bounces into the gathering family", "pivots the group into a rind-close circle"),
V("draws a soul around the pointed crown", "presses life essence between rounded palms"),
V("taps through the spoils with pointed fingers", "rolls spoils closer with both hands"),
V("squeaks through streaming eyes", "folds both hands over the face and sobs"),
V("spits out a sharp curse", "jabs the pointed crown forward while swearing"));
AddSpecialized(voices, "civ_liliar",
V("rubs slender leaves into a silver flame", "unfurls a spark into layered flame"),
V("folds broad frills against the flames", "lashes sharpened leaves across the flame"),
V("glides into the gathering family", "unfurls the group into a facing circle"),
V("draws a soul along a supple stem", "folds life essence between layered frills"),
V("sifts through the spoils with slender fingers", "draws spoils beneath layered arms"),
V("chimes through trembling frills", "folds slender hands over the face and sobs"),
V("trills out a cutting curse", "flicks sharpened leaves while swearing"));
AddSpecialized(voices, "civ_monkey",
V("claps long hands into a flashing flame", "whips a spark into a growing flame"),
V("slaps broad palms against the flames", "presses a curling tail over the flame"),
V("swings into the gathered family", "chatters the group into a long-armed cluster"),
V("draws a soul around a curling tail", "pulls life essence between cupped hands"),
V("picks rapidly through the spoils", "grasps spoils with hands and tail"),
V("howls with both hands over wet eyes", "curls the tail tight through chattering sobs"),
V("shrieks out a tumbling curse", "slaps both palms while swearing"));
AddSpecialized(voices, "civ_penguin",
V("claps stiff flippers into a small flame", "pecks a spark into a rising flame"),
V("slaps broad flippers against the flames", "presses a rounded belly over the flame"),
V("waddles into the gathered family", "honks the group into a shoulder-close huddle"),
V("draws a soul along a narrow bill", "folds life essence between stiff flippers"),
V("pecks through the spoils", "slides spoils between both flippers"),
V("honks with tears along the bill", "hides the face beneath one flipper and sobs"),
V("squawks out a clipped curse", "claps both flippers while swearing"));
AddSpecialized(voices, "civ_piranha",
V("snaps bright teeth into a darting flame", "flicks the tail and spreads a thin flame"),
V("presses quick fins against the flames", "lashes a narrow tail over the flame"),
V("darts into the gathered family", "clicks the group into a tight-finned cluster"),
V("draws a soul between flashing teeth", "pulls life essence past pulsing gills"),
V("nips rapidly through the spoils", "tugs spoils between sharp teeth"),
V("chatters through trembling gills", "bows the head through thin, clicking sobs"),
V("snaps out a staccato curse", "bares flashing teeth while swearing"));
AddSpecialized(voices, "civ_rabbit",
V("scratches quick paws into a hopping flame", "kicks a spark into a spreading flame"),
V("beats long ears against the flames", "scrapes both forepaws across the flame"),
V("bounds into the gathered family", "thumps the group into an ear-close cluster"),
V("draws a soul between upright ears", "pulls life essence beneath a twitching nose"),
V("sniffs rapidly through the spoils", "cups spoils between both forepaws"),
V("sniffles with long ears folded low", "covers the nose with both paws and sobs"),
V("thumps out a sharp curse", "boxes the air while swearing"));
AddSpecialized(voices, "civ_rat",
V("scratches nimble claws into a thin flame", "whips a spark into a spreading flame"),
V("rakes both forepaws across the flames", "presses a bare tail over the flame"),
V("scurries into the gathered family", "squeaks the group into a whisker-close cluster"),
V("draws a soul along trembling whiskers", "winds life essence around a bare tail"),
V("sniffs quickly through the spoils", "pulls spoils close between nimble paws"),
V("squeals with whiskers dripping", "wrings both paws through rapid sobs"),
V("shrills out a jagged curse", "lashes the tail while swearing"));
AddSpecialized(voices, "civ_rhino",
V("drives the horn-tip into a bursting flame", "stomps a spark into a broad flame"),
V("tramples heavy feet through the flames", "sweeps the thick horn across the flame"),
V("stomps into the gathered herd", "shoulders the family into a horn-outward group"),
V("draws a soul along the heavy horn", "pulls life essence beneath thick eyelids"),
V("roots heavily through the spoils", "hooks spoils closer with the horn"),
V("bellows with tears beneath thick lids", "bows the heavy head through booming sobs"),
V("snorts out a crushing curse", "stamps both feet while swearing"));
AddSpecialized(voices, "civ_scorpion",
V("strikes the stinger into a green flame", "clacks both pincers into a spreading flame"),
V("rakes eight feet across the flames", "snips raised pincers against the flame"),
V("skitters into the gathered family", "clicks the group into a tail-outward ring"),
V("draws a soul along the arched stinger", "pulls life essence between heavy pincers"),
V("feels through the spoils with both claws", "clasps spoils between heavy pincers"),
V("clicks through a trembling plated body", "folds both pincers over the face and sobs"),
V("rasps out a dry curse", "jabs the arched stinger while swearing"));
AddSpecialized(voices, "civ_seal",
V("claps broad flippers into a bouncing flame", "barks a spark into a rising flame"),
V("slaps both flippers against the flames", "rolls a broad belly across the flame"),
V("galumphs into the gathered family", "barks the group into a whisker-close cluster"),
V("draws a soul along trembling whiskers", "folds life essence between broad flippers"),
V("sniffs through the spoils", "draws spoils close with both flippers"),
V("barks with tears dripping from whiskers", "covers the face with both flippers and sobs"),
V("honks out a blunt curse", "claps both flippers while swearing"));
AddSpecialized(voices, "civ_sheep",
V("strikes split hooves into a soft flame", "puffs a spark into a widening flame"),
V("stamps split hooves across the flames", "presses thick fleece against the flame"),
V("bleats while joining the gathered herd", "nestles into the family group"),
V("draws a soul through settling fleece", "pulls life essence beneath a lowered muzzle"),
V("sniffs gently through the spoils", "nudges spoils between both forehooves"),
V("bleats with tears along the muzzle", "buries the face in thick fleece and sobs"),
V("brays out a wavering curse", "stamps one forehoof while swearing"));
AddSpecialized(voices, "civ_snake",
V("flicks a forked tongue into a winding flame", "rattles a spark into a rising flame"),
V("presses tight coils against the flames", "lays overlapping loops across the flame"),
V("glides into the gathered family", "coils among the close group"),
V("draws a soul along a forked tongue", "winds life essence between tightening coils"),
V("tastes through the spoils", "loops spoils inside a curling tail"),
V("hisses with wet scales beneath the eyes", "knots into a tight coil and sobs"),
V("hisses out a winding curse", "strikes the air while swearing"));
AddSpecialized(voices, "civ_turtle",
V("scrapes a beaked spark into a low flame", "fans a small flame with broad forefeet"),
V("presses the shell rim against the flames", "rakes measured forefeet across the flame"),
V("plods into the gathered family", "settles shell-to-shell among the group"),
V("draws a soul beneath the shell rim", "pulls life essence between slow forefeet"),
V("probes slowly through the spoils", "draws spoils beneath the shell edge"),
V("wheezes with tears beneath lowered lids", "withdraws the face and sobs inside the shell"),
V("croaks out a slow curse", "snaps the beaked mouth while swearing"));
AddSpecialized(voices, "civ_unicorn",
V("touches the horn-tip to a radiant flame", "casts a bright flame from the lifted horn"),
V("presses split hooves against the flames", "stamps raised hooves across the flame"),
V("canters into the gathered herd", "bows the family into a horn-outward group"),
V("draws a soul along the shining horn", "winds life essence through a streaming mane"),
V("tests the spoils with the horn tip", "draws spoils closer between lifted hooves"),
V("trills with tears beneath the mane", "folds long legs through ringing sobs"),
V("rings out a piercing curse", "slashes the horn in a sharp arc while swearing"));
AddSpecialized(voices, "civ_wolf",
V("scratches a paw-spark into a lean flame", "howls a thin flame into a wider flare"),
V("rakes broad paws across the flames", "presses a heavy tail over the flame"),
V("trots into the gathered family", "calls the group into a muzzle-close ring"),
V("draws a soul along a lifted howl", "pulls life essence between bared teeth"),
V("sniffs methodically through the spoils", "drags spoils close beneath one paw"),
V("howls with tears along the muzzle", "covers the nose with both paws and sobs"),
V("growls out a rough curse", "bares every tooth while swearing"));
AddSpecialized(voices, "dwarf",
V("strikes thick knuckles into a bright flame", "cups a deep flame between stout hands"),
V("beats heavy palms against the flames", "stamps short feet across the flame"),
V("clasps forearms within the gathering group", "calls the family into a stout circle"),
V("draws a soul through a braided beard", "pulls life essence between thick fingers"),
V("sorts through the spoils with square hands", "tucks spoils beneath one stout arm"),
V("sobs into a bristling beard", "covers both eyes with thick, shaking hands"),
V("booms out a bearded curse", "shakes both square fists while swearing"));
AddSpecialized(voices, "elf",
V("traces slender fingers into a clear flame", "coaxes a silver flame between long hands"),
V("sweeps long fingers across the flames", "presses slender palms against the flame"),
V("bows into the gathering kin-group", "beckons the family into a facing circle"),
V("draws a soul between long fingertips", "guides life essence along an open palm"),
V("searches the spoils with light fingertips", "draws spoils beneath one slender arm"),
V("weeps behind long, trembling fingers", "releases a clear, unsteady sob"),
V("speaks a cutting curse through still lips", "points one long finger while swearing"));
AddSpecialized(voices, "human",
V("rubs bare palms into a sudden flame", "snaps a spark into a climbing flame"),
V("beats both hands against the flames", "stamps alternating feet across the flame"),
V("waves the family into a gathering circle", "steps among the forming civic group"),
V("draws a soul between cupped hands", "pulls life essence toward the chest"),
V("searches through the spoils with both hands", "gathers spoils against one forearm"),
V("weeps into both open hands", "draws shaking breaths between audible sobs"),
V("shouts a clipped curse", "jabs one finger while swearing"));
AddSpecialized(voices, "orc",
V("claps heavy fists into a roaring flame", "scrapes broad tusks into a spreading flame"),
V("pounds thick forearms against the flames", "stamps heavy feet across the flame"),
V("shoulders into the gathering group", "calls the family into a tusk-outward group"),
V("draws a soul between broad tusks", "pulls life essence into a clenched fist"),
V("rakes through the spoils with heavy hands", "hauls spoils beneath one thick arm"),
V("roars with tears across broad tusks", "bows over both fists through heavy sobs"),
V("barks out a brutal curse", "pounds both fists together while swearing"));
}
}

View file

@ -0,0 +1,465 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddCivVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
Add(voices, "civ_acid_gentleman",
V("paces with back held straight", "advances in an upright stride"),
V("holds chin high and shoulders level", "repeats each gesture at the same angle"),
V("practices an elaborate bow", "turns with one arm held across the chest"),
V("divides the meal into equal portions", "takes one bite between upright pauses"),
V("reclines with back still straight", "rests with every limb folded together"),
V("stalks {target} in even steps", "closes on {target} behind a rigid guard"),
V("slashes at {target} with a caustic hand", "parries {target} with a rigid forearm"),
V("offers another a deep bow", "trades clipped greetings with nearby company"),
V("lets out a clipped chuckle", "muffles a short laugh behind one hand"),
V("measures the task twice", "keeps records in matching groups"));
Add(voices, "civ_alpaca",
V("steps lightly with chin held high", "pads onward in a woolly sway"),
V("plants all four feet and listens", "chews slowly with ears turned forward"),
V("bounds sideways in sudden hops", "prances through a woolly little dance"),
V("pulls mouthfuls from the meal", "chews each bite in a steady rhythm"),
V("tucks long legs beneath thick fleece", "settles into an upright doze"),
V("tracks {target} with ears pricked", "presses after {target} in springing strides"),
V("kicks at {target} with both hind feet", "shoulders {target} behind dense fleece"),
V("leans close for a soft-nosed greeting", "hums in low pulses beside nearby company"),
V("bursts into a breathy warble", "shakes all over with a muffled chuckle"),
V("carries the load", "sorts material between both forefeet"));
Add(voices, "civ_armadillo",
V("scuttles with plated back bobbing", "trots onward in a low quick rhythm"),
V("sits back on haunches to listen", "holds still inside a half-curled shell"),
V("curls fully and spins", "uncurls and scampers in a tight loop"),
V("breaks the meal apart", "snuffles up each bite"),
V("curls tight beneath overlapping plates", "sleeps fully enclosed by the shell"),
V("sniffs out {target} with lowered snout", "trundles after {target} beneath a lowered shell"),
V("rams {target} in a plated roll", "claws at {target} from a crouched guard"),
V("taps shells in a brisk greeting", "chitters softly with nearby company"),
V("uncurls with a rattling little laugh", "chitters until the back plates shake"),
V("reinforces the construction", "hauls a load against one plated shoulder"));
Add(voices, "civ_bear",
V("lumbers forward on heavy paws", "advances with a broad rolling gait"),
V("rises tall with head held high", "rests heavily on broad forepaws"),
V("rears and sways from paw to paw", "bounds through a spinning charge"),
V("scoops the meal with both paws", "licks the meal from broad claws"),
V("curls around one heavy forepaw", "drops into a deep rumbling sleep"),
V("follows {target} by scent", "surges after {target} with head low"),
V("mauls at {target} with sweeping claws", "rears over {target} and crashes down"),
V("claps another on the shoulder", "shares a booming greeting with nearby company"),
V("roars with belly-deep amusement", "huffs into a rumbling chuckle"),
V("lifts the load above the chest", "braces the construction with both forepaws"));
Add(voices, "civ_beetle",
V("clicks onward on lacquered legs", "traces a straight line on quick feet"),
V("locks every joint and watches", "turns both feelers in slow arcs"),
V("spins on tightly planted legs", "clambers over its own folded limbs"),
V("clips the meal apart", "works steadily along each bite"),
V("folds all legs beneath a hard wing case", "rests sealed beneath the carapace"),
V("feels out {target} with raised antennae", "skitters after {target} in a straight line"),
V("drives a horn at {target}", "meets {target} behind a polished carapace"),
V("touches antennae in greeting", "joins nearby company with evenly spaced clicks"),
V("rattles wing cases through a laugh", "clicks out a quick dry chuckle"),
V("sorts material with repeated leg motions", "fits the construction edge to edge"));
Add(voices, "civ_buffalo",
V("plods ahead with horns level", "advances in heavy rolling steps"),
V("stands solidly and chews the cud", "waits without shifting a hoof"),
V("bucks in a broad turning arc", "charges forward before wheeling back"),
V("tears off a mouthful", "grinds the meal with slow jaw strokes"),
V("kneels heavily with horns lowered", "sleeps inside a guard of curved horns"),
V("closes on {target} at a steady run", "drives after {target} with horns forward"),
V("gores at {target} from a planted stance", "buffets {target} with a massive brow"),
V("presses foreheads in greeting", "forms a horn-outward circle with nearby company"),
V("snorts into a rolling thunderous laugh", "bellows between blunt chuckles"),
V("pulls the load", "drives the construction into place"));
Add(voices, "civ_candy_man",
V("skips along on glossy heels", "twirls onward in quick steps"),
V("straightens up and waits", "stands with stripes held vertically"),
V("spins in quick circles", "hops through a springy little dance"),
V("nibbles around the meal", "snaps off one bite"),
V("curls into a compact crinkling shape", "rests with glossy limbs folded together"),
V("feints toward {target} in a wide turn", "dashes after {target} in zigzag steps"),
V("clubs at {target} with a hardened fist", "pelts {target} with rapid hand strikes"),
V("greets another with a full turn", "offers quick bows to nearby company"),
V("tinkles with a high laugh", "crackles into rapid giggles"),
V("groups the work with both hands", "folds the craft in repeated motions"));
Add(voices, "civ_capybara",
V("ambles onward on evenly placed feet", "takes broad slow steps"),
V("sits on folded haunches and observes", "rests a blunt chin against the chest"),
V("bobs the head in a low rhythm", "rolls slowly from side to side"),
V("chews each bite in slow jaw strokes", "holds the meal between both forepaws"),
V("sinks into a close compact curl", "dozes with nose tucked to the chest"),
V("trails {target} in even steps", "closes on {target} without breaking stride"),
V("shoves {target} with a solid shoulder", "snaps at {target} from a low brace"),
V("shifts aside for nearby company", "rests flank to flank beside another"),
V("chuckles in soft bubbling pulses", "squeaks once before a low laugh"),
V("keeps a measured working pace", "moves the load with both forepaws"));
Add(voices, "civ_cat",
V("threads onward on silent paws", "saunters ahead with tail high"),
V("sits upright and washes one paw", "watches nearby motion through narrowed eyes"),
V("pounces on its own twitching tail", "springs sideways with back arched"),
V("takes bites from the meal", "pins each bite beneath one paw"),
V("turns three circles before curling tight", "tucks nose beneath one flank"),
V("stalks {target} belly-low", "springs after {target} in sudden silence"),
V("rakes at {target} with quick claws", "arches against {target} with teeth bared"),
V("winds around another in greeting", "offers nearby company a slow blink"),
V("chirps into a short laugh", "purrs until the sound breaks into chuckles"),
V("sorts material with paw tips", "checks the work from every angle"));
Add(voices, "civ_chicken",
V("struts in quick head-bobbing steps", "hurries onward on scratching feet"),
V("stands high and fluffs every feather", "freezes with one eye turned sideways"),
V("flaps into a short hopping turn", "hops and pivots on quick feet"),
V("pecks the meal repeatedly", "scratches twice before each bite"),
V("tucks the beak beneath one wing", "settles into a rounded sleeping crouch"),
V("rushes after {target} with wings spread", "tracks {target} in darting circles"),
V("spurs at {target} in a flapping leap", "pecks at {target} between sharp sidesteps"),
V("clucks over civic news with another", "gathers near company with rapid calls"),
V("cackles in a rapid rising burst", "erupts into breathless clucks"),
V("sorts material with the beak", "scratches briskly at the task"));
Add(voices, "civ_cow",
V("walks with a broad pendulous sway", "takes steady repeated steps"),
V("chews while standing hipshot", "waits without shifting a hoof"),
V("trots in a broad uneven circle", "flicks the tail and kicks up both heels"),
V("pulls in a mouthful", "chews the meal in repeated cycles"),
V("folds down into a heavy resting curl", "rests with muzzle against one flank"),
V("follows {target} with steady nostrils", "trots after {target} with lowered head"),
V("hooks at {target} with a sweeping horn", "kicks at {target} from a braced stance"),
V("greets another with a mellow call", "stands shoulder to shoulder with nearby company"),
V("moos into a long wobbling laugh", "shakes the dewlap with deep amusement"),
V("draws a steady load", "works the task at an even pace"));
Add(voices, "civ_crab",
V("sidesteps briskly with claws held high", "scuttles onward on quick jointed legs"),
V("settles into a low armored crouch", "raises both eyestalks and waits"),
V("waves alternating claws in a quick dance", "spins through a tight sideways circle"),
V("snips the meal into mouthfuls", "holds each bite between polished pincers"),
V("tucks every limb beneath the shell", "rests fully closed inside the shell"),
V("circles {target} in tightening sidesteps", "scuttles after {target} with claws open"),
V("pinches at {target} with one heavy claw", "hammers {target} behind a raised shell"),
V("waves a claw in brisk greeting", "trades measured taps with nearby company"),
V("clacks both claws in choppy amusement", "bubbles out a sideways little laugh"),
V("cuts material with paired claws", "carries the load in paired claws"));
Add(voices, "civ_crocodile",
V("prowls low with tail sweeping behind", "slides onward on splayed feet"),
V("lies motionless with jaws slightly open", "waits with one eye open"),
V("spins around its sweeping tail", "snaps between quick turns"),
V("gulps down a bite", "pins the meal before tearing it apart"),
V("sinks flat into a resting pose", "sleeps with one eye barely closed"),
V("creeps toward {target} in complete stillness", "bursts after {target} from a dead stop"),
V("clamps down on {target} with crushing jaws", "whips the tail across {target}"),
V("rumbles a low greeting to another", "rests flank to flank with nearby company"),
V("chuffs through a deep toothy laugh", "rattles the throat through low chuckles"),
V("drags the load", "guards the work without moving"));
Add(voices, "civ_dog",
V("trots ahead with tail swinging", "bounds onward with ears streaming"),
V("sits with ears trained forward", "waits with paws tapping"),
V("bows low before springing in a circle", "chases its own tail in bounding loops"),
V("devours the meal in rapid bites", "holds a bite between both forepaws"),
V("circles three times and drops with a sigh", "sleeps with paws twitching"),
V("tracks {target} nose-first", "races after {target} with ears streaming"),
V("bites at {target} and holds fast", "surges into {target} with one shoulder"),
V("greets another with repeated sniffs", "leans one flank against nearby company"),
V("pants into a barking laugh", "yips through repeated chuckles"),
V("carries the load at a trot", "watches the work with ears forward"));
Add(voices, "civ_fox",
V("slips forward on black paws", "weaves onward in a crossing line"),
V("wraps the tail once around the feet", "listens with ears angled apart"),
V("pounces on its own sweeping tail", "feints one way before springing another"),
V("nibbles around the meal first", "takes one bite at a time"),
V("curls nose-deep into a sweeping tail", "folds into a narrow sleeping curl"),
V("trails {target} with angled steps", "cuts ahead of {target} with a sudden dash"),
V("feints past {target} and snaps back", "slashes at {target} from an oblique angle"),
V("trades low whispers with another", "bows to nearby company with ears raised"),
V("barks out a quick laugh", "masks a short chuckle with the tail tip"),
V("keeps records in narrow groups", "checks each part of the work"));
Add(voices, "civ_frog",
V("hops forward in compact arcs", "springs onward in quick bounds"),
V("squats with throat pulsing slowly", "holds still and blinks"),
V("leapfrogs over its own folded legs", "bounces through a springy little turn"),
V("flicks each bite straight into the mouth", "swallows a bite with a round-eyed blink"),
V("folds into a tiny crouched form", "dozes with chin resting on both hands"),
V("bounds after {target} in long leaps", "waits before springing toward {target}"),
V("kicks at {target} with both feet", "lashes at {target} with a whipping tongue"),
V("croaks a greeting to another", "joins nearby company in rhythmic calls"),
V("ribbits into a bubbling laugh", "inflates the throat with booming amusement"),
V("reaches upper parts of the construction", "presses the work with both hands"));
Add(voices, "civ_garlic_man",
V("marches with papery layers rustling", "bobs onward on knobby feet"),
V("smooths one loose outer layer", "stands bundled beneath folded layers"),
V("spins with papery arms spread", "bobs from side to side in a rustling dance"),
V("pulls apart the meal segment by segment", "crunches one bite at a time"),
V("folds into its own dry layers", "gathers every loose layer before sleeping"),
V("follows {target} by the faintest scent", "rolls after {target} in a papery rush"),
V("buffets {target} with a knotted head", "strikes at {target} with both hands"),
V("greets another with a full-body bob", "rustles beside nearby company"),
V("rustles into a crackling laugh", "splits into quick giggles"),
V("groups material between both hands", "layers the craft with knobby hands"));
Add(voices, "civ_goat",
V("clatters onward on nimble split hooves", "picks a quick high-stepping route"),
V("balances on four feet while waiting", "chews with one ear cocked"),
V("leaps high simply to twist around", "bounds sideways on springy legs"),
V("tears off a mouthful", "samples every part of the meal"),
V("kneels into a compact sleeping curl", "sleeps with legs tucked tightly"),
V("scrambles after {target} without slowing", "charges {target} with chin tucked"),
V("butts {target} with curled horns", "kicks at {target} from a sudden pivot"),
V("nuzzles another in brisk greeting", "joins nearby company with noisy bleats"),
V("bleats out a brash hiccupping laugh", "snorts between sharp little chuckles"),
V("works the task from a high stance", "clears material with quick bites"));
Add(voices, "civ_hyena",
V("lope-walks with sloping shoulders", "circles onward without slowing"),
V("sits crookedly with jaws parted", "sniffs with head turning side to side"),
V("bounds in looping bursts", "spins with jaws open and shoulders lowered"),
V("cracks through one bite first", "guards the meal between broad jaws"),
V("drops into a loose sleeping sprawl", "sleeps with one ear twitching"),
V("runs {target} down in repeated stages", "fans wide before closing on {target}"),
V("crushes at {target} with heavy jaws", "harrows {target} with darting bites"),
V("shoulder-bumps another in greeting", "calls nearby company into a close group"),
V("whoops into a cascading laugh", "cackles until the flanks heave"),
V("breaks material into separate parts", "works the task with repeated jaw motions"));
Add(voices, "civ_lemon_man",
V("zips along with a springy step", "rolls onward before popping upright"),
V("polishes the rind with one hand", "waits with arms folded over a pointed chest"),
V("bounces lightly on rounded feet", "spins on one pointed toe"),
V("takes a bite and puckers", "presses the meal before another bite"),
V("rests with limbs tucked against the rind", "curls around the pointed crown"),
V("pursues {target} in quick cutting turns", "rolls after {target} at sudden speed"),
V("sprays a stinging burst at {target}", "jabs at {target} with the pointed crown"),
V("greets another with a brisk nod", "pivots toward each nearby speaker"),
V("squeaks into a sharp fizzy laugh", "puckers before bursting into giggles"),
V("presses the material with both palms", "groups the work into even sections"));
Add(voices, "civ_liliar",
V("glides with layered frills whispering", "drifts onward in measured steps"),
V("folds slender hands beneath the chin", "stands statuesque with head raised"),
V("weaves layered arms through a slow turn", "unfurls through a spinning dance"),
V("takes one bite between slender fingers", "eats the meal in equal morsels"),
V("closes layered frills around the body", "rests upright with hands folded together"),
V("tracks {target} without blinking", "sweeps toward {target} along a curved path"),
V("lashes at {target} with a supple stem", "cuts at {target} with sharpened leaves"),
V("exchanges a sweeping bow with another", "turns nearby company into a facing circle"),
V("chimes with a light silvery laugh", "hides a trilling chuckle behind slim fingers"),
V("braids material into the craft", "sets the construction with both hands"));
Add(voices, "civ_monkey",
V("scampers ahead with arms swinging low", "bounds onward in long-armed strides"),
V("squats and picks through its fur", "hangs by the tail while watching"),
V("swings between its own planted hands", "somersaults with the tail curled high"),
V("takes the meal in quick bites", "stuffs both cheeks before chewing"),
V("curls up with tail wound around the body", "sleeps with both hands beneath the head"),
V("swings toward {target} before dropping close", "scrambles after {target} in quick bounds"),
V("clubs at {target} with heavy fists", "grapples {target} with hands and tail"),
V("grooms another during rapid chatter", "waves both hands at nearby company"),
V("chatters into a rolling shriek of laughter", "slaps both knees and howls"),
V("handles several parts of the task", "reaches upper parts of the construction"));
Add(voices, "civ_penguin",
V("waddles forward with flippers held out", "slides onward on a rounded belly"),
V("rocks from heel to heel", "stands in a close inward-facing huddle"),
V("spins belly-down in a tight circle", "bobs through a brisk flipper dance"),
V("tips back a morsel", "pecks the meal apart with a narrow bill"),
V("tucks the bill beneath one flipper", "sleeps upright with flippers folded"),
V("slides after {target} in bounding lunges", "waddles toward {target} in short strides"),
V("jabs at {target} with a stiff beak", "flipper-slaps {target} from a planted stance"),
V("bows stiffly to another", "huddles shoulder to shoulder with nearby company"),
V("honks into a stuttering laugh", "wobbles through short chuckles"),
V("slides the load with steady force", "checks each part of the task in order"));
Add(voices, "civ_piranha",
V("darts onward in brisk fin-led bursts", "weaves ahead with snapping turns"),
V("hovers with fins making tiny corrections", "holds position with jaws slightly open"),
V("loops around its own flicking tail", "snaps between quick turns"),
V("shears a bite from the meal", "tears each morsel into bites"),
V("settles with fins tucked close", "rests almost motionless"),
V("homes in on {target} with sudden speed", "circles {target} before rushing close"),
V("tears at {target} with flashing teeth", "darts past {target} in repeated bites"),
V("clicks teeth in brisk greeting", "moves tightly with nearby company"),
V("chatters into a sharp staccato laugh", "snaps the jaws between quick giggles"),
V("trims material in rapid cuts", "sorts the task into short stages"));
Add(voices, "civ_rabbit",
V("hops along with ears streaming back", "bounds onward in quick doubles"),
V("sits tall and rotates both ears", "twitches the nose while waiting"),
V("leaps high and twists in midair", "boxes with alternating forepaws"),
V("nibbles the meal into scalloped edges", "holds a bite between both paws"),
V("folds long ears over the shoulders", "rests in a compact sleeping crouch"),
V("zigzags after {target} in rapid bounds", "tracks {target} with ears pitched forward"),
V("kicks at {target} with both hind feet", "boxes at {target} with flashing forepaws"),
V("touches noses twice in greeting", "shares rapid civic news with another"),
V("snickers through a trembling nose", "thumps once before breaking into laughter"),
V("carries the load in quick hops", "weaves material with both forepaws"));
Add(voices, "civ_rat",
V("scurries onward with whiskers forward", "threads ahead in low quick steps"),
V("sits back and combs both whiskers", "waits with nose twitching rapidly"),
V("rolls between its own nimble paws", "spins and darts back with a squeak"),
V("gnaws the meal repeatedly", "cups a bite between both paws"),
V("curls tightly around the tail", "sleeps with forepaws tucked beneath the chin"),
V("sniffs a winding trail toward {target}", "cuts ahead of {target} with a quick dash"),
V("bites at {target} from below", "swipes at {target} with sharp claws"),
V("trades whispered civic news with another", "inclines its whiskers toward nearby company"),
V("squeaks into a high laugh", "wrings both paws through shrill giggles"),
V("sorts material by size", "checks each part of the task"));
Add(voices, "civ_rhino",
V("stomps onward behind a lowered horn", "pushes ahead in broad heavy steps"),
V("stands immovable with ears raised", "rests thick chin against the chest"),
V("bucks through a heavy turning charge", "tosses the head and stamps both feet"),
V("grinds through the meal", "scoops up bites with the lower lip"),
V("drops heavily into a resting crouch", "sleeps with the horn angled clear"),
V("charges straight at {target}", "pounds after {target} in heavy steps"),
V("drives the horn at {target}", "tramples toward {target} behind thick hide"),
V("bumps shoulders twice in greeting", "stands solidly beside nearby company"),
V("bellows into a rough booming laugh", "snorts until the heavy sides shake"),
V("breaks material apart", "pushes the construction into place"));
Add(voices, "civ_scorpion",
V("skitters forward beneath an arched tail", "advances on eight jointed feet"),
V("holds both pincers open and still", "waits with the stinger raised"),
V("waves both claws in alternating rhythm", "spins beneath a curling tail"),
V("snips the meal into paired portions", "draws each bite between small mouthparts"),
V("folds pincers beneath the plated body", "rests with the tail curled over the back"),
V("angles both pincers toward {target}", "skitters after {target} with tail cocked"),
V("stings at {target} over a raised guard", "seizes {target} between heavy pincers"),
V("crosses claws in a salute", "holds a fixed distance from nearby company"),
V("clicks both pincers in dry amusement", "trembles the tail through a rasping laugh"),
V("handles material between both pincers", "cuts and grips each part of the task"));
Add(voices, "civ_seal",
V("galumphs ahead on broad flippers", "slides onward with whiskers streaming"),
V("props upright and balances on the belly", "rests whiskered chin against the chest"),
V("spins in a rolling turn", "claps flippers after a full-body flop"),
V("swallows a morsel whole", "pins the meal beneath one flipper"),
V("flops into a loose sleeping curl", "dozes with nose resting on the tail"),
V("slides after {target} in bounding lunges", "tracks {target} with twitching whiskers"),
V("body-slams {target} from a rolling start", "bites at {target} behind raised flippers"),
V("claps a loud welcome to another", "leans into nearby company whisker-first"),
V("barks into a bouncing breathless laugh", "claps through a series of honking chuckles"),
V("moves the load with both flippers", "smooths the work with both flippers"));
Add(voices, "civ_sheep",
V("trots in a soft close-stepping rhythm", "follows a steady path with fleece bobbing"),
V("stands with fleece softly settling", "chews with drooping ears"),
V("bounds high on springy legs", "pushes nose-first into a woolly tumble"),
V("crops the meal in even bites", "chews beneath a woolly fringe"),
V("folds into a deep woolly curl", "sleeps with muzzle against one flank"),
V("follows {target} along a steady line", "rushes after {target} with head lowered"),
V("rams {target} with a thick brow", "kicks at {target} behind a woolly guard"),
V("gathers close for low civic chatter", "greets nearby company with soft bleats"),
V("bleats into a soft wavering laugh", "shivers the fleece with low chuckles"),
V("sorts and groups material", "moves the load in even motions"));
Add(voices, "civ_snake",
V("glides forward in polished curves", "threads onward without a sound"),
V("coils tightly and watches", "raises the head with tongue flicking slowly"),
V("loops around its own rising coils", "sways through a winding rhythm"),
V("works the meal down in repeated gulps", "unhinges the jaw around a bite"),
V("knots into a compact sleeping coil", "rests beneath overlapping loops"),
V("tastes the trail toward {target}", "flows after {target} without a sound"),
V("strikes at {target} from a tight coil", "wraps {target} in tightening loops"),
V("loops into a low bow", "shares low whispers with another"),
V("hisses into a winding laugh", "rattles the tail through short chuckles"),
V("threads material in repeated loops", "winds material into the craft"));
Add(voices, "civ_turtle",
V("plods onward beneath a ridged shell", "takes each step at a measured pace"),
V("draws halfway into the shell and waits", "rests chin on the shell rim"),
V("rocks carefully from side to side", "spins slowly on the curved shell"),
V("clips off a bite with a beaked mouth", "chews the meal in slow jaw strokes"),
V("withdraws every limb beneath the shell", "settles into a low resting pose"),
V("follows {target} without changing pace", "intercepts {target} along a direct line"),
V("snaps at {target} from behind the shell", "drives the shell edge into {target}"),
V("nods through a long greeting", "shares quiet company without crowding another"),
V("wheezes into a slow creaking laugh", "bobs the head through quiet chuckles"),
V("checks each construction joint", "carries a load beneath the shell"));
Add(voices, "civ_unicorn",
V("canters with mane streaming", "prances onward on lifted hooves"),
V("stands with the horn lifted", "smooths the mane with repeated turns"),
V("dances an even stepping pattern", "tosses the mane through a high rear"),
V("selects one bite at a time", "takes morsels from the meal"),
V("folds long legs beneath the body", "rests with the horn angled high"),
V("gallops after {target} in a direct line", "closes on {target} with horn lowered"),
V("thrusts the horn at {target}", "strikes at {target} with raised hooves"),
V("offers another a deep bow", "leads nearby company in high steps"),
V("trills into a clear ringing laugh", "tosses the mane through short chuckles"),
V("engraves the craft with the horn tip", "draws a load with high steps"));
Add(voices, "civ_wolf",
V("trots forward with shoulders rolling", "ranges onward without slowing"),
V("sits with tail wrapped close", "tests every nearby scent"),
V("bows low before bounding sideways", "chases its own tail in a quick circle"),
V("tears off a bite", "holds the meal beneath one paw"),
V("turns into a tight sleeping circle", "rests with muzzle tucked to one flank"),
V("courses after {target} along the flank", "drives {target} toward a tighter line"),
V("slashes at {target} with repeated bites", "knocks {target} down from the side"),
V("touches muzzles in a close greeting", "raises a gathering call to nearby company"),
V("yips into a rough rising laugh", "howls between long chuckles"),
V("patrols around the work", "moves the load in close formation"));
Add(voices, "dwarf",
V("strides on short powerful legs", "marches onward with beard tucked close"),
V("plants both feet and folds thick arms", "waits with chin resting on one fist"),
V("stamps through a compact turning dance", "drops into a deep braced crouch"),
V("cuts an even bite and chews", "wipes the meal from a braided mustache"),
V("drops into a stout sleeping curl", "sleeps beneath a beard spread wide"),
V("tracks {target} with eyes fixed forward", "closes on {target} behind a low guard"),
V("hammers at {target} with heavy fists", "hooks {target} with a thick forearm"),
V("clasps forearms with another", "trades craft boasts with nearby company"),
V("booms with a body-shaking laugh", "snorts through a bristling beard"),
V("aligns the construction", "drives the craft in a steady rhythm"));
Add(voices, "elf",
V("walks with a light even stride", "passes onward in near-silent steps"),
V("stands listening with head slightly bowed", "rests long fingers against one palm"),
V("balances through a turning step", "springs lightly from foot to foot"),
V("divides the meal into equal portions", "takes bites with long fingers"),
V("reclines with limbs folded together", "sleeps with one hand lightly raised"),
V("follows {target} with soundless steps", "draws a direct line toward {target}"),
V("strikes at {target} with a swift hand", "cuts at {target} with a slender hand"),
V("exchanges brief greetings with another", "shares civic lore with nearby company"),
V("laughs in a clear ascending ripple", "muffles a short chuckle with long fingers"),
V("shapes the craft with fingertips", "keeps records of the work"));
Add(voices, "human",
V("hurries onward with arms swinging", "threads ahead in alternating steps"),
V("shifts weight with eyes forward", "pauses to catch a breath"),
V("hops through a quick uneven rhythm", "turns a small stumble into a low bow"),
V("divides the meal before taking a bite", "alternates bites with short pauses"),
V("curls with knees drawn to the chest", "rests with hands folded over the chest"),
V("follows {target} through repeated turns", "runs down {target} with eyes fixed forward"),
V("strikes at {target} with ready hands", "holds firm against {target} from a balanced stance"),
V("trades names and civic news with another", "waves nearby company into the conversation"),
V("breaks into an open laugh", "slaps one knee through a broad grin"),
V("checks the record", "moves briskly from task to task"));
Add(voices, "orc",
V("stalks forward in long heavy strides", "shoulders onward with tusks high"),
V("squats with fists resting on the thighs", "stands with fists held at the sides"),
V("wrestles against its own braced strength", "stomps through a rough turning dance"),
V("tears the meal apart with both hands", "crunches through each bite"),
V("drops into a heavy sleeping sprawl", "sleeps with one fist tightly closed"),
V("runs {target} down with pounding steps", "closes on {target} behind raised forearms"),
V("chops at {target} with repeated hand strikes", "headbutts {target} between heavy blows"),
V("greets another with a forearm clash", "swaps loud boasts with nearby company"),
V("barks out a harsh booming laugh", "bares both tusks in rumbling amusement"),
V("heaves material into place", "drives the construction with both arms"));
}
}

View file

@ -0,0 +1,836 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddFantasyExtendedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddExtended(voices, "UFO",
V("broadcasts a layered electronic hymn", "sings through synchronized hull tones"),
V("reproduces through pulsing silver light", "begins replication beneath cycling lights"),
V("tends growth with measured underlight", "cultivates in scanning passes"),
V("pollinates {target} through a soft tractor pulse", "sweeps pollen across {target} with controlled underlight"),
V("trades through sequenced signal flashes", "pulses colored lights during exchange"),
V("fishes with a narrow scanning beam", "tracks fish beneath pulsing sensors"),
V("hauls through steady lifting force", "moves the load beneath its hull"),
V("heals {target} under a soft scanning ray", "bathes {target} in modulated light"),
V("projects a concentrated heat ray", "fires a bright lower pulse"),
V("flees {target} in a silent silver rush", "banks away from {target} with lights streaming"),
V("settles into a stable hover", "anchors itself with downward force"),
V("patrols with sensor lights sweeping", "holds formation in guarded flight"),
V("reads through a traveling scan bar", "decodes marks in flickering lights"),
V("gathers life through calibrated scans", "samples living signals with underlight"),
V("vents a brief waste vapor", "purges residue beneath its hull"),
V("wobbles as its lights missequence", "spins while indicators flash irregularly"),
V("recharges with every light brightening", "draws power into its humming hull"),
V("jitters through erratic hover loops", "flashes compulsive signal bursts"),
V("steals {target} beneath dimmed lights", "reaches for {target} with lifting force"),
V("shudders under foreign signal pulses", "flickers as another force pilots it"),
V("sees {target} in projected dreams", "drifts dormant through waves of colored light"));
AddExtended(voices, "alien",
V("sings in clicking throat pulses", "layers chirps through its throat sac"),
V("reproduces with synchronized body pulses", "begins mating through mirrored gestures"),
V("tends growth with four quick hands", "cultivates through nimble fingerwork"),
V("pollinates {target} with trembling narrow fingers", "brushes pollen across {target} through rapid handwork"),
V("trades through taps and soft clicks", "braids its fingers during exchange"),
V("fishes with darting eyes and hands", "grabs near fish with springing reflexes"),
V("hauls against its springing shoulders", "moves the load with four hands"),
V("heals {target} through careful narrow fingertips", "presses {target} with clicking mouthparts"),
V("fires a sharp bioelectric pulse", "launches crackling force from its wrists"),
V("flees {target} in bounding sideways leaps", "scuttles away from {target} on springing legs"),
V("settles into a compact crouch", "claims space with tapping fingertips"),
V("stands guard on flexed legs", "patrols with darting eyes"),
V("reads by tracing marks rapidly", "studies symbols with unblinking eyes"),
V("gathers life with tasting fingertips", "samples living traces through mouthparts"),
V("relieves itself in a low crouch", "expels waste as its throat sac contracts"),
V("tilts as its eyes desynchronize", "fumbles while four hands disagree"),
V("recharges through pulsing throat sacs", "draws energy into springing limbs"),
V("twitches through compulsive hand patterns", "scuttles in abrupt repeated bursts"),
V("steals {target} with four synchronized hands", "lunges toward {target} with grasping fingers"),
V("jerks as its limbs move independently", "chatters while foreign pulses seize it"),
V("sees {target} in dreams as eyelids flutter", "curls tightly while throat colors ripple"));
AddExtended(voices, "angle",
V("sings in resonant celestial chimes", "voices a hymn through radiant pulses"),
V("reproduces within converging holy radiance", "begins mating as divine light swells"),
V("tends growth beneath measured brilliance", "cultivates with steady sacred light"),
V("pollinates {target} in a radiant wash", "guides pollen across {target} through holy light"),
V("trades beneath steady divine illumination", "pulses sacred light during exchange"),
V("fishes through revealing celestial light", "sweeps radiant force near fish"),
V("hauls within surrounding radiance", "moves the load through divine force"),
V("heals {target} beneath holy light", "bathes {target} in celestial brilliance"),
V("releases a searing sacred flash", "fires a focused surge of divinity"),
V("flees {target} as radiance streams behind", "withdraws from {target} in a burst of holy light"),
V("settles beneath a steadfast sacred glow", "holds its station with radiant presence"),
V("keeps watch in unwavering brilliance", "patrols as a celestial presence"),
V("reads as divine light reveals marks", "studies symbols within pale radiance"),
V("gathers life in revealing holy light", "reaches for living essence through sacred radiance"),
V("relieves itself in a fading shimmer", "releases waste beneath veiling radiance"),
V("flickers as its sacred glow falters", "wanders while divine pulses misfire"),
V("recharges in gathering celestial brilliance", "draws holy power into its presence"),
V("surges through repeated radiant flashes", "burns with an erratic sacred pulse"),
V("steals {target} beneath a muted sacred glow", "reaches for {target} through radiance"),
V("flares as foreign force grips it", "shudders beneath a distorted holy glow"),
V("sees {target} in radiant dreams", "rests as celestial visions pulse visibly"));
AddExtended(voices, "assimilator",
V("sings through several borrowed throats", "layers mismatched voices across its surface"),
V("reproduces by budding a pulsing mass", "begins mating as membranes intermingle"),
V("tends growth with braided tendrils", "cultivates through probing filaments"),
V("pollinates {target} with rippling surface cilia", "spreads pollen across {target} on tasting tendrils"),
V("trades through shifting grasping limbs", "layers borrowed voices during exchange"),
V("fishes with a snapping membrane", "senses fish through trailing filaments"),
V("hauls with braided grasping tendrils", "moves the load beneath its mass"),
V("heals {target} by matching living tissue", "covers {target} beneath a clear membrane"),
V("fires a hardened organic barb", "launches a dense pulse of tissue"),
V("flees {target} in rolling bodily surges", "flees {target} on rapidly pulling tendrils"),
V("settles by anchoring many filaments", "spreads into a rooted living mound"),
V("guards with hardened surface plates", "patrols on braided tendrils"),
V("reads through borrowed clustered eyes", "traces marks with tasting filaments"),
V("gathers life into sampling membranes", "draws living traces through cilia"),
V("expels waste through opening pores", "sheds a clouded outer membrane"),
V("ripples through mismatched borrowed forms", "stumbles as limbs repeatedly reform"),
V("recharges as inner pulses quicken", "draws energy beneath its surface"),
V("buds grasping hands in repeated cycles", "surges through rapid transformations"),
V("steals {target} with a sudden pseudopod", "reaches around {target} with a clear membrane"),
V("convulses as foreign patterns spread", "forms unfamiliar faces across its surface"),
V("sees {target} in borrowed dream-faces", "rests while remembered forms ripple"));
AddExtended(voices, "civ_crystal_golem",
V("sings in deep crystalline resonance", "rings harmonics through its faceted chest"),
V("reproduces as core light divides", "begins mating through synchronized core pulses"),
V("tends growth with heavy faceted hands", "cultivates beneath refracted core light"),
V("pollinates {target} through prismatic light pulses", "brushes pollen across {target} with crystal fingertips"),
V("trades with slow resonant hand taps", "pulses chest light during exchange"),
V("fishes through refracted glints", "closes faceted palms near fish"),
V("hauls against its massive crystal frame", "moves the load with stone hands"),
V("heals {target} through refracted core light", "presses {target} beneath glowing facets"),
V("fires a concentrated prismatic burst", "releases core light in a hot flash"),
V("flees {target} with heavy ringing strides", "flees {target} as core light races"),
V("settles into rooted statue stillness", "plants its faceted feet firmly"),
V("guards with broad crystal arms", "patrols in resonant heavy steps"),
V("reads through shifting facet reflections", "studies marks in core light"),
V("gathers life through vibrating fingertips", "draws living traces into its core"),
V("vents powdered residue from its seams", "sheds dull grit between crystal joints"),
V("staggers as core light scatters", "turns while facets flash inconsistently"),
V("recharges as its core intensifies", "draws energy through glowing seams"),
V("trembles with compulsive core surges", "strides as facets flash erratically"),
V("steals {target} with a heavy crystal hand", "reaches for {target} between glowing facets"),
V("cracks with invading dark pulses", "moves as foreign light fills its core"),
V("sees {target} in prismatic dreams", "rests as visions cross its facets"));
AddExtended(voices, "cold_one",
V("sings through chiming frozen breath", "voices a brittle frost cadence"),
V("reproduces amid mingling cold vapor", "begins mating as rime pulses"),
V("tends growth beneath numbing palms", "cultivates with measured cooling touch"),
V("pollinates {target} on emitted cold vapor", "brushes pollen across {target} with frost-rimmed fingers"),
V("trades with clicks of frozen teeth", "emits pale vapor during exchange"),
V("fishes by sensing warmth below", "closes whitening hands near fish"),
V("hauls with rigid frostbound limbs", "moves the load across slick rime"),
V("heals {target} beneath a frost sheen", "numbs {target} with a pale palm"),
V("fires a lance of intense cold", "releases a burst of hard rime"),
V("flees {target} in a skidding frost trail", "flees {target} behind emitted cold vapor"),
V("settles beneath an anchored ice crust", "plants stiff limbs in spreading rime"),
V("guards behind hardening frost", "patrols with whitening palms ready"),
V("reads as rime highlights marks", "studies symbols through pale eyes"),
V("gathers life through heat-sensing fingers", "draws living warmth into rime"),
V("relieves itself in brittle frozen waste", "expels waste beneath cold vapor"),
V("stares as frost pulses unevenly", "stumbles while rime locks its limbs"),
V("recharges as its rime thickens", "draws energy into a whitening core"),
V("scrapes compulsively at its own frost", "paces beneath surging cold vapor"),
V("steals {target} with a numbing quick palm", "reaches for {target} through hardening rime"),
V("jerks as black frost spreads", "moves beneath an invading cold pulse"),
V("sees {target} in dreams beneath sleeping ice", "rests as emitted vapor forms visions"));
AddExtended(voices, "crabzilla",
V("sings in thunderous shell resonance", "booms a rhythm through colossal plates"),
V("reproduces through booming pincer displays", "begins mating as shell plates rumble"),
V("tends growth beneath careful claw taps", "cultivates with immense measured pincers"),
V("pollinates {target} with sweeping pincer beats", "fans pollen across {target} beneath colossal claws"),
V("trades through monumental claw gestures", "rumbles its shell during exchange"),
V("fishes between immense closing pincers", "tracks fish with sweeping eye stalks"),
V("hauls beneath its fortress shell", "moves the load with colossal pincers"),
V("heals {target} by applying plated pressure", "presses {target} beneath a broad claw"),
V("fires a crushing pressure blast", "launches force between snapping pincers"),
V("flees {target} in thundering sideways strides", "flees {target} behind its fortress shell"),
V("settles on folded towering limbs", "anchors its shell with planted legs"),
V("guards behind raised colossal pincers", "patrols with eye stalks sweeping"),
V("reads through swiveling eye stalks", "studies marks with careful claw taps"),
V("gathers life through vibrating leg tips", "samples living motion with eye stalks"),
V("relieves itself beneath folded rear plates", "expels waste below its vast shell"),
V("clacks while eye stalks cross", "lurches as towering legs mistime"),
V("recharges as shell plates vibrate", "draws energy through planted leg tips"),
V("stamps through compulsive sideways surges", "snaps both pincers without cause"),
V("steals {target} with one sweeping pincer", "reaches for {target} beneath its shell"),
V("shudders as shell plates darken", "stomps beneath an invading pulse"),
V("sees {target} in rumbling dreams", "rests as eye stalks twitch"));
AddExtended(voices, "crystal_sword",
V("sings through a ringing crystal blade", "voices a clear hilt-deep peal"),
V("reproduces as prismatic light separates", "begins mating through crossed resonant tones"),
V("tends growth with careful blade glints", "cultivates beneath refracted light"),
V("pollinates {target} through sweeping flat-side passes", "guides pollen across {target} on prismatic pulses"),
V("trades with a formal hilt dip", "rings clearly during exchange"),
V("fishes in a swift point-first dive", "flashes beneath fish with its flat"),
V("hauls beneath its hovering guard", "moves the load with lifting resonance"),
V("heals {target} by laying its flat nearby", "bathes {target} in prismatic shimmer"),
V("fires a piercing crystal pulse", "releases a bright blast from its point"),
V("flees {target} in a ringing aerial sweep", "flees {target} point-first through prismatic light"),
V("settles point-down in steady hover", "anchors its presence through low resonance"),
V("guards upright with edge forward", "patrols in measured sweeping arcs"),
V("reads by tracing marks with light", "studies symbols reflected along its blade"),
V("gathers life through testing resonance", "draws living traces along its fuller"),
V("sheds cloudy residue from its facets", "vents dull particles beneath its guard"),
V("wobbles as its resonance breaks", "spins while prismatic light scatters"),
V("recharges as its facets brighten", "draws energy along its fuller"),
V("slashes through repeated empty sweeps", "rings in rapidly recurring bursts"),
V("steals {target} beneath a muted prismatic shimmer", "hooks toward {target} with its guard"),
V("jerks as dark resonance grips it", "rings harshly under foreign control"),
V("sees {target} in chiming dreams", "rests as visions shimmer along its blade"));
AddExtended(voices, "demon",
V("sings in a cracked furnace roar", "chants through smoking fangs"),
V("reproduces amid mingling embers", "begins mating with pulsing wingbeats"),
V("tends growth with ember-warm claws", "cultivates beneath controlled heat"),
V("pollinates {target} with careful wingbeats", "fans pollen across {target} with leathery wings"),
V("trades with horns lowered formally", "sheds red sparks during exchange"),
V("fishes with heat-sensing nostrils", "closes hooked claws near fish"),
V("hauls against its horned shoulders", "moves the load with clawed hands"),
V("heals {target} beneath claw heat", "presses {target} with ember-warm claws"),
V("fires a scorching throat burst", "hurls flame from both claws"),
V("flees {target} on smoking hooves", "flees {target} behind beating wings"),
V("settles within a scorched crouch", "plants smoking hooves firmly"),
V("guards with horns and claws raised", "patrols beneath folded wings"),
V("reads through ember-bright eyes", "traces marks with a hot claw"),
V("gathers life through flared nostrils", "draws living heat into embers"),
V("relieves itself in smoking waste", "expels waste beneath folded wings"),
V("snarls as sparks misfire", "stumbles when hooves flare unevenly"),
V("recharges around a red-hot core", "draws energy through smoking horns"),
V("lashes its tail compulsively", "paces beneath uncontrolled embers"),
V("steals {target} with a hooked claw", "reaches for {target} beneath one wing"),
V("convulses as black flame spreads", "moves beneath a foreign infernal pulse"),
V("sees {target} in ember-lit dreams", "rests while wing membranes twitch"));
AddExtended(voices, "dragon",
V("sings in rolling chest thunder", "voices a vast plated resonance"),
V("reproduces through synchronized wing displays", "begins mating amid pulsing throat glow"),
V("tends growth with careful foreclaws", "cultivates beneath measured warm breath"),
V("pollinates {target} with broad wingbeats", "fans pollen across {target} with controlled wings"),
V("trades with a formal horn dip", "rumbles its chest during exchange"),
V("fishes in a talon-first plunge", "tracks fish with unblinking eyes"),
V("hauls against its plated shoulders", "moves the load in closed talons"),
V("heals {target} beneath warming breath", "presses {target} with careful foreclaws"),
V("fires a narrow blazing torrent", "launches a throat-deep blast"),
V("flees {target} on vast wingbeats", "flees {target} with plated tail streaming"),
V("settles onto folded haunches", "anchors itself beneath spread talons"),
V("guards with wings half spread", "patrols beneath a horned gaze"),
V("reads with one unblinking eye", "traces marks using a foreclaw"),
V("gathers life through flared nostrils", "draws living traces in deep breaths"),
V("relieves itself beneath a raised tail", "expels waste in a plated crouch"),
V("tilts as its pupils lose focus", "missteps while tail and wings disagree"),
V("recharges as throat glow deepens", "draws energy beneath plated scales"),
V("snaps through compulsive wingbeats", "paces under surging throat light"),
V("steals {target} in a swift talon sweep", "reaches for {target} beneath its chest"),
V("thrashes as scales pulse darkly", "moves under an invading throat glow"),
V("sees {target} in smoke-lit dreams", "rests while vast wings twitch"));
AddExtended(voices, "druid",
V("sings in layered rustling tones", "chants as leaf fibers tremble"),
V("reproduces amid entwining living fibers", "begins mating as leaf patterns pulse"),
V("tends growth through coaxing palms", "cultivates with fresh root magic"),
V("pollinates {target} with rustling leaves", "guides pollen across {target} through curling vines"),
V("trades with a leaf-hood bow", "rustles living fibers during exchange"),
V("fishes with sensing root magic", "draws fish near through living fibers"),
V("hauls with tightening green vines", "moves the load through living growth"),
V("heals {target} beneath fresh green fibers", "binds {target} with curling growth"),
V("fires a burst of hard thorns", "launches force through snapping vines"),
V("flees {target} beneath streaming leaf fibers", "flees {target} on quick curling roots"),
V("settles as roots spread below", "anchors itself through living fibers"),
V("guards behind layered thorn growth", "patrols as leaves listen"),
V("reads as leaf veins trace marks", "studies symbols through living grain"),
V("gathers life through fine roots", "draws living traces into fresh growth"),
V("relieves itself into absorbing roots", "releases waste beneath folded leaves"),
V("turns as leaves rustle erratically", "stumbles while roots pull apart"),
V("recharges as fresh leaves unfurl", "draws energy through living fibers"),
V("sprouts vines in compulsive bursts", "paces while leaves pulse rapidly"),
V("steals {target} with a curling vine", "reaches around {target} with living fibers"),
V("jerks as black roots spread", "moves beneath invading thorn growth"),
V("sees {target} in leaf-veined dreams", "rests while roots trace visions"));
AddExtended(voices, "evil_mage",
V("sings in layered shadow whispers", "chants through violet sparks"),
V("reproduces amid merging dark sigils", "begins mating as shadows pulse"),
V("tends growth beneath violet force", "cultivates through crawling dark symbols"),
V("pollinates {target} with circling shadows", "guides pollen across {target} with violet sparks"),
V("trades with a hooded bow", "cycles dark sigils during exchange"),
V("fishes through a hovering violet gaze", "draws fish upward with shadow force"),
V("hauls within grasping shadows", "moves the load through violet force"),
V("heals {target} beneath binding dark symbols", "presses {target} with smoking fingertips"),
V("fires crackling violet force", "launches a burst of shadow"),
V("flees {target} inside emitted black vapor", "flees {target} as shadows fold inward"),
V("settles within hovering dark sigils", "anchors shadows beneath its robe"),
V("guards behind a violet barrier", "patrols with shadows circling"),
V("reads through crawling luminous symbols", "studies marks beneath violet light"),
V("gathers life through a circling gaze", "draws living traces into shadow"),
V("relieves itself beneath folded darkness", "expels waste inside layered shadow"),
V("flickers as sigils scramble", "wanders while shadows point elsewhere"),
V("recharges as violet symbols brighten", "draws energy into layered shadow"),
V("casts compulsive empty sigils", "paces amid uncontrolled dark sparks"),
V("steals {target} through a grasping shadow", "reaches for {target} with folded darkness"),
V("convulses beneath foreign pale symbols", "moves while foreign shadows pull"),
V("sees {target} in violet dreams", "rests as shadows reenact visions"));
AddExtended(voices, "fairy",
V("sings in tiny bell trills", "layers bright notes with wingbeats"),
V("reproduces amid mingling shimmer", "begins mating through synchronized glow pulses"),
V("tends growth with sparkling fingertips", "cultivates beneath a tiny warm glow"),
V("pollinates {target} with shimmering wingbeats", "dusts pollen across {target} with sparkling motes"),
V("trades through spiraling light ribbons", "trills brightly during exchange"),
V("fishes in quick shimmering dives", "tracks fish through pulsing glow"),
V("hauls within a sparkling lift", "moves the load on rapid wingbeats"),
V("heals {target} beneath bright motes", "bathes {target} in a tiny flash"),
V("fires a needle-thin sparkle", "launches a bright mote burst"),
V("flees {target} in looping wing flashes", "flees {target} with glow streaming"),
V("settles into a hovering shimmer", "perches with wings folded upright"),
V("guards with wings buzzing brightly", "patrols in tight glowing loops"),
V("reads by tracing marks in light", "studies symbols through tiny glints"),
V("gathers life into sparkling motes", "samples living traces with shimmer"),
V("relieves itself beneath veiling motes", "releases waste during a brief hover"),
V("loops as its glow pulses unevenly", "hovers while wings lose rhythm"),
V("recharges inside a swelling glow", "draws energy through shimmering wings"),
V("darts through compulsive tiny loops", "scatters motes in urgent bursts"),
V("steals {target} in a quick sparkling pass", "reaches for {target} through shimmer"),
V("jerks as its glow turns harsh", "flies under an invading pulse"),
V("sees {target} in glowing dreams", "rests as wings trace visions"));
AddExtended(voices, "fire_elemental",
V("sings in roaring flame harmonics", "crackles through a rising cadence"),
V("reproduces as core flame divides", "begins mating through mingling fire"),
V("tends growth with measured warmth", "cultivates beneath careful flame"),
V("pollinates {target} with controlled heat pulses", "guides pollen across {target} with thin flames"),
V("trades through sequenced spark bursts", "flares white during exchange"),
V("fishes by sensing cooler motion", "surrounds fish with curling heat"),
V("hauls within a lifting heat column", "moves the load through flowing flame"),
V("heals {target} beneath measured warmth", "presses {target} with a white fingertip"),
V("fires a roaring arm of flame", "launches a white-hot burst"),
V("flees {target} as streaming orange ribbons", "flees {target} in a sudden flare"),
V("settles into a steady upright blaze", "anchors around a white-hot core"),
V("guards as a broad wall of fire", "patrols in folding flames"),
V("reads as heat reveals marks", "studies symbols through flickering tongues"),
V("gathers life through trembling flames", "draws living warmth toward its core"),
V("sheds spent ash beneath itself", "vents dark smoke from its core"),
V("flares as tongues split repeatedly", "wavers while its core pulses unevenly"),
V("recharges around a whitening core", "draws energy through every flame"),
V("lashes out in compulsive firebursts", "surges through uncontrolled flares"),
V("steals {target} behind a curtain of flame", "reaches for {target} through lowered heat"),
V("blackens as foreign fire spreads", "moves beneath an invading blaze"),
V("sees {target} in ember dreams", "rests as flames replay visions"));
AddExtended(voices, "fire_elemental_blob",
V("sings in bubbly molten pops", "gurgles through bright crackles"),
V("reproduces by budding a hot lobe", "begins mating as molten surfaces mingle"),
V("tends growth with warm pseudopods", "cultivates beneath soft heat"),
V("pollinates {target} with popping heat bubbles", "brushes pollen across {target} with glowing lobes"),
V("trades through shaped molten gestures", "pops a bright bubble during exchange"),
V("fishes with a stretching hot lobe", "senses fish through surface ripples"),
V("hauls within several molten lobes", "moves the load across its surface"),
V("heals {target} beneath a warm fold", "covers {target} with controlled heat"),
V("fires a clinging heat glob", "launches a popping molten burst"),
V("flees {target} in wobbling molten hops", "flees {target} with flames streaming"),
V("settles into a broad hot puddle", "anchors through spreading molten folds"),
V("guards behind swelling fiery lobes", "patrols in bouncing molten surges"),
V("reads through traveling surface bubbles", "traces marks with a narrow pseudopod"),
V("gathers life across tasting folds", "draws living traces beneath its skin"),
V("expels dark slag from one fold", "sheds spent crust beneath itself"),
V("wobbles as bubbles reverse direction", "splits and rejoins in repeated cycles"),
V("recharges as its center brightens", "draws energy through molten skin"),
V("buds compulsive grasping lobes", "pops through urgent surface surges"),
V("steals {target} with a stretching pseudopod", "reaches around {target} with one fold"),
V("convulses as black bubbles spread", "moves while foreign pulses deform it"),
V("sees {target} in rippling dreams", "rests as bubbles form visions"));
AddExtended(voices, "fire_elemental_horse",
V("sings in furnace-bright whinnies", "nickers through a crackling mane"),
V("reproduces amid synchronized flame pulses", "begins mating through blazing prances"),
V("tends growth with warm careful hooves", "cultivates beneath controlled hoof heat"),
V("pollinates {target} with mane-driven pulses", "fans pollen across {target} with a fiery tail"),
V("trades through ember-bright muzzle dips", "flares one hoof during exchange"),
V("fishes with smoke-sensitive nostrils", "strikes near fish with a hot hoof"),
V("hauls against its blazing shoulders", "moves the load in a heated stride"),
V("heals {target} beneath a warming muzzle", "presses {target} with controlled hoof heat"),
V("fires a blazing forward breath", "launches sparks through a sharp snort"),
V("flees {target} on streaming fiery hooves", "flees {target} with mane blazing"),
V("settles onto folded ember legs", "plants four compact flame hooves"),
V("guards with mane fully raised", "patrols in a measured hot canter"),
V("reads through ember-bright eyes", "traces marks with one hot hoof"),
V("gathers life through flared nostrils", "draws living traces through warm breath"),
V("relieves itself beneath a lifted flame tail", "expels glowing waste in a crouch"),
V("sidesteps as mane pulses unevenly", "stamps while nostrils flare repeatedly"),
V("recharges as its mane whitens", "draws energy through glowing hooves"),
V("prances in compulsive fiery bursts", "stamps through uncontrolled sparks"),
V("steals {target} in a quick muzzle sweep", "reaches for {target} with glowing teeth"),
V("bucks as black flame spreads", "gallops beneath a foreign pulse"),
V("sees {target} in ember-lit dreams", "rests while blazing legs twitch"));
AddExtended(voices, "fire_elemental_slug",
V("sings in wet sizzling whistles", "bubbles through a molten trill"),
V("reproduces amid mingling mantle glow", "begins mating as hot bodies pulse"),
V("tends growth with a heated foot", "cultivates beneath mantle warmth"),
V("pollinates {target} with curling feeler sparks", "brushes pollen across {target} with flame feelers"),
V("trades through paired feeler curls", "pulses its mantle during exchange"),
V("fishes with heat-sensitive feelers", "surrounds fish in a slow hot fold"),
V("hauls atop its broad heated foot", "moves the load beneath a mantle fold"),
V("heals {target} under a warm body trail", "covers {target} with controlled mantle heat"),
V("fires a strip of clinging flame", "launches a hot mantle spark"),
V("flees {target} in a swift molten glide", "flees {target} beneath streaming feelers"),
V("settles into a low smoldering coil", "anchors through its broad heated foot"),
V("guards with both feelers blazing", "patrols along a narrow hot trail"),
V("reads by sweeping sensitive feelers", "traces marks with its heated foot"),
V("gathers life across tasting skin", "draws living traces through feelers"),
V("leaves a dark waste bead behind", "expels residue beneath its mantle"),
V("coils as feelers point apart", "glides while mantle pulses misfire"),
V("recharges as its mantle glows", "draws energy through its broad underside"),
V("curls through compulsive hot spirals", "flicks feelers in urgent bursts"),
V("steals {target} beneath a mantle fold", "reaches for {target} along its heated foot"),
V("writhes as black heat spreads", "glides beneath an invading pulse"),
V("sees {target} in mantle dreams", "rests as feelers trace visions"));
AddExtended(voices, "fire_elemental_snake",
V("sings in a crackling hiss", "rattles through bright flame notes"),
V("reproduces amid braided fiery coils", "begins mating as core flames pulse"),
V("tends growth within warm loose coils", "cultivates through measured body heat"),
V("pollinates {target} with sweeping coils", "guides pollen across {target} with a flame tongue"),
V("trades through paired coil gestures", "rattles its tail during exchange"),
V("fishes with a heat-sensitive tongue", "strikes near fish with glowing jaws"),
V("hauls within tightening fiery coils", "moves the load along its body"),
V("heals {target} beneath a warm coil", "surrounds {target} with controlled flame"),
V("fires a searing tongue bolt", "launches flame from raised jaws"),
V("flees {target} in a swift incandescent slither", "flees {target} with tail sparks"),
V("settles into a banked ember coil", "anchors through overlapping fiery loops"),
V("guards with head raised brightly", "patrols in tight burning curves"),
V("reads through tongue-tip heat changes", "traces marks with a glowing tail"),
V("gathers life through its split tongue", "draws living warmth into coils"),
V("expels glowing waste behind its coils", "leaves a dark residue pellet"),
V("knots as tongue flicks erratically", "turns while coils pull against themselves"),
V("recharges as every coil brightens", "draws energy through a flickering tongue"),
V("strikes through compulsive empty lunges", "rattles beneath uncontrolled flame"),
V("steals {target} within a swift coil", "reaches around {target} with its body"),
V("writhes as dark flame bands it", "slithers under a foreign pulse"),
V("sees {target} in coiling dreams", "rests while its tail twitches"));
AddExtended(voices, "fire_skull",
V("sings through a blazing hollow howl", "cackles in pitched jaw notes"),
V("reproduces as crown flame divides", "begins mating through synchronized jaw fire"),
V("tends growth with measured crown heat", "cultivates beneath careful flame breath"),
V("pollinates {target} with hollow-mouth pulses", "guides pollen across {target} with crown sparks"),
V("trades through formal jaw clacks", "pulses socket flame during exchange"),
V("fishes through heat-sensing sockets", "snaps fish between blazing teeth"),
V("hauls with gripping fiery jaws", "moves the load beneath its chin"),
V("heals {target} beneath measured flame breath", "presses {target} with warm teeth"),
V("fires a compact mouth bolt", "launches flame through open jaws"),
V("flees {target} with crown flame streaming", "flees {target} in a hollow rush"),
V("settles jaw-down in low hover", "anchors beneath a banked blue crown"),
V("guards with sockets fixed forward", "patrols in snapping fiery arcs"),
V("reads through pulsing empty sockets", "traces marks with crown light"),
V("gathers life through hollow nostrils", "draws living warmth into its crown"),
V("drops dark ash through its jaw", "vents spent soot from hollow sockets"),
V("spins as sockets flare unevenly", "chatters while crown flame misfires"),
V("recharges as its crown whitens", "draws energy through hollow jaws"),
V("snaps compulsively at empty space", "bobs through uncontrolled flame bursts"),
V("steals {target} in a sudden jaw snap", "reaches for {target} between blazing teeth"),
V("rattles as black flame crowns it", "flies under an invading socket glow"),
V("sees {target} in crown-lit dreams", "rests as jaws silently chatter"));
AddExtended(voices, "ghost",
V("sings in airy layered echoes", "warbles through a translucent form"),
V("reproduces as two auras intermingle", "begins mating through synchronized fading"),
V("tends growth with spectral pressure", "cultivates beneath a cool aura"),
V("pollinates {target} with spectral pressure", "guides pollen across {target} with translucent hands"),
V("trades through pulsing aura gestures", "bows its spectral form during exchange"),
V("fishes with an unseen lifting force", "tracks fish through its emitted mist"),
V("hauls through steady unseen pressure", "moves the load without contact"),
V("heals {target} beneath a spectral veil", "presses {target} with translucent hands"),
V("fires a chilling spectral pulse", "launches force through a sudden wail"),
V("flees {target} as a thinning pale streak", "flees {target} within its trailing mist"),
V("settles into a faint hovering veil", "anchors as a dim silhouette"),
V("guards with aura spread broadly", "patrols through silent drifting passes"),
V("reads by passing through marks", "studies symbols as its aura ripples"),
V("gathers life through spectral fingertips", "draws living traces into its emitted mist"),
V("releases cloudy residue through itself", "sheds a dim spectral waste"),
V("fades in and out irregularly", "drifts while hands pass through itself"),
V("recharges as its outline brightens", "draws energy into a hollow form"),
V("loops through compulsive fading passes", "wails beneath an urgent aura pulse"),
V("steals {target} through a passing spectral hand", "reaches for {target} within its emitted mist"),
V("distorts as foreign shadow crosses its mist", "moves beneath a foreign spectral pull"),
V("sees {target} in translucent dreams", "rests as its aura reenacts visions"));
AddExtended(voices, "god_finger",
V("sings by drumming its nail", "wiggles through a silent fingertip ballad"),
V("reproduces through paired fingertip pulses", "begins mating as nail glints synchronize"),
V("tends growth with its sensitive tip", "cultivates with measured fingertip presses"),
V("pollinates {target} with nail-tip taps", "brushes pollen across {target} with its fingertip"),
V("trades through a formal fingertip curl", "taps its nail during exchange"),
V("fishes with a sudden fingertip flick", "tests for fish with its sensitive tip"),
V("hauls by bracing its curved body", "nudges the load with its nail"),
V("heals {target} with measured pressure", "tends {target} with careful fingertip taps"),
V("fires a bright nail-tip pulse", "flicks a compact burst forward"),
V("flees {target} in upright hops", "slides away as its fingertip bends"),
V("settles upright on its rounded tip", "curls into a stable resting posture"),
V("stands guard with nail raised", "patrols in deliberate fingertip hops"),
V("reads by tracing marks with its nail", "taps symbols in measured sequence"),
V("gathers life through its sensitive tip", "samples living traces with its nail"),
V("relieves itself through a brief tip contraction", "expels waste while curled low"),
V("wobbles as its fingertip flexes backward", "taps unrelated marks in confusion"),
V("recharges as its nail gleams", "draws energy through its rounded tip"),
V("flicks repeatedly under a strange urge", "curls and uncurls without pause"),
V("steals {target} with a quick hook", "flicks {target} toward its curled body"),
V("jerks as a foreign pulse bends it", "taps in an imposed rhythm"),
V("sees {target} in fingertip dreams", "rests as its nail glints in sleeping pulses"));
AddExtended(voices, "greg",
V("sings in a wobbling nasal honk", "bellows notes through a slack jaw"),
V("reproduces through an uneven mating dance", "begins mating with elbows flung wide"),
V("tends growth with alternating hand pats", "cultivates in a lopsided crouch"),
V("pollinates {target} with windmilling hands", "brushes pollen across {target} with spread fingers"),
V("trades through an overlarge two-hand wave", "nods after each exchange gesture"),
V("fishes with abrupt two-handed grabs", "peers for fish beneath one arm"),
V("hauls against one oversized shoulder", "shoves the load with both palms"),
V("heals {target} with clumsy hand pressure", "pats {target} with splayed fingers"),
V("fires a forceful open-mouthed burst", "claps both hands into a shock pulse"),
V("flees {target} in a crooked shuffle", "lopes away with elbows swinging"),
V("settles into a wide heel squat", "plants mismatched feet and sways"),
V("stands guard with windmilling fists", "patrols in abrupt sideways hops"),
V("reads with its jaw hanging open", "follows marks using a waggling finger"),
V("gathers life through noisy close sniffs", "pokes at living traces with one finger"),
V("relieves itself in a slack-limbed squat", "expels waste with shoulders bouncing"),
V("stares while its hands copy each other", "turns in place with one eye narrowed"),
V("recharges as its limbs twitch awake", "draws energy through a wide yawn"),
V("hops twice whenever the urge strikes", "waves both hands in repeated bursts"),
V("steals {target} in a windmilling grab", "snatches {target} with both hands"),
V("lurches as its limbs move out of sequence", "grins while foreign force jerks its elbows"),
V("sees {target} in lopsided dreams", "sleeps while fingers mime crooked gestures"));
AddExtended(voices, "jumpy_skull",
V("sings through rapid tooth clacks", "rattles a tune inside its cranium"),
V("reproduces through synchronized jaw bounces", "begins mating as empty sockets pulse"),
V("tends growth with light crown taps", "cultivates through measured jaw hops"),
V("pollinates {target} with bouncing jawbeats", "puffs pollen across {target} through clenched teeth"),
V("trades with alternating tooth clicks", "bobs its cranium during exchange"),
V("fishes in quick jaw-first snaps", "tracks fish through tilted sockets"),
V("hauls with the load between its teeth", "pushes the load using its crown"),
V("heals {target} with light crown pressure", "tends {target} through pulsing socket light"),
V("fires a bolt between open jaws", "launches force in a snapping bounce"),
V("flees {target} in ricocheting hops", "boings away on its springing jaw"),
V("settles crown-down with jaw tucked", "balances quietly on its lower teeth"),
V("guards with teeth clenched forward", "patrols in quick rebounding arcs"),
V("reads by tapping symbols with teeth", "tilts one socket across the marks"),
V("gathers life through hollow socket pulses", "samples living traces with chattering teeth"),
V("drops waste through its open jaw", "expels residue during a low bounce"),
V("spins while its sockets point apart", "bounces between unrelated marks"),
V("recharges as its sockets brighten", "draws energy through clenched teeth"),
V("snaps repeatedly at a strange urge", "boings in place without stopping"),
V("steals {target} in a teeth-first hop", "clamps {target} between chattering teeth"),
V("rattles as foreign light fills its sockets", "bounces in an imposed rhythm"),
V("sees {target} in bouncing dreams", "rests as dim scenes cross its sockets"));
AddExtended(voices, "living_house",
V("sings through resonant inner rooms", "rings a tune through door and shutters"),
V("reproduces as its foundation stones divide", "begins mating while windows pulse together"),
V("tends growth with careful shutter movements", "cultivates through measured foundation taps"),
V("pollinates {target} with rhythmic shutter beats", "fans pollen across {target} through its doorway"),
V("trades through opening and closing windows", "rings from within during exchange"),
V("fishes with a swiveling window gaze", "snaps its door near passing fish"),
V("hauls against its broad foundation", "draws the load through its doorway"),
V("heals {target} with sheltering inner warmth", "tends {target} through a softly lit window"),
V("fires a forceful chimney pulse", "launches a blast through its doorway"),
V("flees {target} on lurching foundation stones", "shuffles away as shutters flap"),
V("settles with every foundation stone braced", "rests squarely with shutters tucked"),
V("guards behind a firmly shut door", "patrols with windows swiveling"),
V("reads by scanning marks through its windows", "opens shutters in response to symbols"),
V("gathers life through listening walls", "samples living motion with swiveling windows"),
V("expels waste through a brief door opening", "vents residue through its chimney"),
V("lurches as doors open out of sequence", "turns while its windows face different ways"),
V("recharges as every window brightens", "draws energy through its open doorway"),
V("rattles shutters under a strange urge", "opens and closes its door repeatedly"),
V("steals {target} through a sudden doorway snap", "draws {target} past its threshold"),
V("shudders as foreign light fills its windows", "moves while its door slams by itself"),
V("sees {target} in window-lit dreams", "rests as scenes flicker behind its windows"));
AddExtended(voices, "living_plants",
V("sings through rustling layered leaves", "rattles seed pods in a leafy cadence"),
V("reproduces as living fibers intertwine", "begins mating while central buds pulse"),
V("tends growth with fine probing roots", "cultivates through careful vine curls"),
V("pollinates {target} with shaking seed pods", "dusts {target} through trembling blooms"),
V("trades through paired tendril gestures", "opens a bright bloom during exchange"),
V("fishes with sensitive trailing roots", "curls a vine near passing fish"),
V("hauls with several tightening vines", "pulls the load across braided roots"),
V("heals {target} with soft binding fibers", "tends {target} beneath layered leaves"),
V("fires a cluster of hardened thorns", "snaps a vine into a forceful burst"),
V("flees {target} on rapidly probing roots", "pulls away with leaves streaming"),
V("settles as roots spread beneath its body", "folds broad leaves around its stem"),
V("guards behind thorned vines", "patrols with roots and tendrils extended"),
V("reads by tracing marks with tendrils", "turns leaf surfaces toward each symbol"),
V("gathers life through fine root hairs", "samples living traces with sensitive leaves"),
V("releases waste through opening leaf pores", "sheds a dark bead from its roots"),
V("twists as roots pull opposite ways", "turns while leaves open and close randomly"),
V("recharges as every leaf unfurls", "draws energy through its central bud"),
V("sprouts grasping vines under a strange urge", "shakes seed pods in repeated bursts"),
V("steals {target} with a curling tendril", "draws {target} between layered leaves"),
V("jerks as dark growth crosses its stem", "moves beneath an invading root pulse"),
V("sees {target} in leafy dreams", "rests while leaf veins replay dim scenes"));
AddExtended(voices, "mush_animal",
V("sings in soft gill-puff squeaks", "chuffs a tune beneath its broad cap"),
V("reproduces through a pulsing spore release", "begins mating as gills synchronize"),
V("tends growth with quick forepaw pats", "cultivates beneath a tilted cap"),
V("pollinates {target} with soft spore puffs", "brushes pollen across {target} with short paws"),
V("trades through cap dips and chirps", "puffs its gills during exchange"),
V("fishes with a porous snout", "pounces near fish with both forepaws"),
V("hauls against its squat shoulders", "pushes the load beneath its cap"),
V("heals {target} with soft gill puffs", "tends {target} using quick paw presses"),
V("fires a dense spore burst", "launches force from beneath its cap"),
V("flees {target} in cap-bobbing bounds", "scampers away on stubby feet"),
V("settles beneath its lowered cap", "curls into a squat spongy ball"),
V("guards with cap tilted forward", "patrols in quick snout-led bounds"),
V("reads by sniffing along marks", "taps symbols with one short paw"),
V("gathers life through trembling gills", "samples living traces with its snout"),
V("relieves itself beneath its lowered cap", "expels waste as its gills contract"),
V("paws at spores that are not there", "turns while its gills pulse unevenly"),
V("recharges as its gills swell", "draws energy beneath its broad cap"),
V("pounces repeatedly under a strange urge", "shakes spores from its cap without pause"),
V("steals {target} with a quick paw swipe", "nudges {target} beneath its cap"),
V("convulses as dark spores fill its gills", "bounds in an imposed rhythm"),
V("sees {target} in spore-filled dreams", "rests as spores form fleeting scenes"));
AddExtended(voices, "mush_unit",
V("sings in low papery gill notes", "voices a rhythm beneath its broad cap"),
V("reproduces through a measured spore release", "begins mating as cap pulses synchronize"),
V("tends growth with pale careful hands", "cultivates through controlled spore puffs"),
V("pollinates {target} with a directed spore plume", "brushes pollen across {target} with pale fingers"),
V("trades with a formal cap tilt", "presses its palms during exchange"),
V("fishes with tapping fingertips", "tracks fish through trembling gills"),
V("hauls against its stalk-like shoulders", "moves the load with both pale hands"),
V("heals {target} with measured palm pressure", "tends {target} beneath a soft spore veil"),
V("fires a compact hardened spore burst", "launches force between both palms"),
V("flees {target} in long cap-led strides", "marches away as gills pulse rapidly"),
V("settles upright beneath its lowered cap", "folds pale arms beneath hanging gills"),
V("guards with forearms raised", "patrols with cap tilted forward"),
V("reads by tracing marks with fingertips", "studies symbols while its gills pulse"),
V("gathers life through sensing spores", "samples living traces with tapping hands"),
V("relieves itself in a cap-covered squat", "expels waste as its gills close"),
V("tilts its cap between unrelated marks", "stares while its gills pulse out of sequence"),
V("recharges as its gills brighten", "draws energy through its stalk-like body"),
V("casts spore puffs under a strange urge", "taps both hands in repeated patterns"),
V("steals {target} with both pale hands", "draws {target} beneath its lowered cap"),
V("jerks as black spores cross its gills", "moves while foreign pulses bend its arms"),
V("sees {target} in cap-shadowed dreams", "rests as gill pulses form dim scenes"));
AddExtended(voices, "necromancer",
V("sings in layered papery whispers", "chants while pale fragments rattle"),
V("reproduces through paired spectral pulses", "begins mating as pale runes synchronize"),
V("tends growth with grave-pale fingertips", "cultivates beneath orbiting bone light"),
V("pollinates {target} with circling pale fragments", "guides pollen across {target} through spectral force"),
V("trades through measured rune flashes", "bows its hood during exchange"),
V("fishes with a searching spectral wisp", "draws near fish through pale force"),
V("hauls within grasping spectral hands", "moves the load through pale force"),
V("heals {target} with binding pale runes", "tends {target} using spectral fingertips"),
V("fires a grave-pale force bolt", "launches grasping spectral hands"),
V("flees {target} inside streaming pale runes", "glides away as bone light circles faster"),
V("settles within a low rune glow", "rests upright as pale fragments orbit"),
V("guards behind spectral hands", "patrols with bone light circling"),
V("reads through hovering pale runes", "traces symbols with a spectral fingertip"),
V("gathers life through a cold spectral wisp", "samples living traces with pale runes"),
V("relieves itself beneath folded robes", "expels waste as orbiting fragments turn aside"),
V("stares while pale runes reorder themselves", "turns as spectral hands point apart"),
V("recharges as bone light intensifies", "draws energy through raised fingertips"),
V("summons empty hands under a strange urge", "casts pale runes in repeated bursts"),
V("steals {target} with a spectral hand", "draws {target} into circling pale light"),
V("convulses as foreign runes cross its robe", "moves while foreign whispers leave its mouth"),
V("sees {target} in bone-lit dreams", "rests while pale runes replay visions"));
AddExtended(voices, "plague_doctor",
V("sings in filtered beak notes", "hums while round lenses vibrate"),
V("reproduces through a measured mating display", "begins mating as masked breaths synchronize"),
V("tends growth with precise gloved fingers", "cultivates beneath the lowered beak"),
V("pollinates {target} with careful glove strokes", "brushes pollen across {target} beneath its beak"),
V("trades through a formal masked bow", "raises one glove during exchange"),
V("fishes by tracking motion through round lenses", "snaps its long beak near fish"),
V("hauls against its coated shoulders", "moves the load with both gloves"),
V("heals {target} with measured gloved pressure", "examines {target} through round lenses"),
V("fires a narrow beak-directed pulse", "launches force between raised gloves"),
V("flees {target} with coat tails snapping", "hurries away beneath the forward beak"),
V("settles with gloved hands clasped", "rests upright beneath the long mask"),
V("guards with lenses fixed forward", "patrols in quick coated strides"),
V("reads through round mask lenses", "traces marks with one gloved finger"),
V("gathers life through filtered beak breaths", "samples living traces with close lens work"),
V("relieves itself beneath folded coat tails", "expels waste while the beak points aside"),
V("tilts its mask toward unrelated marks", "fumbles as gloved hands repeat different motions"),
V("recharges through slow filtered breaths", "draws energy behind the beaked mask"),
V("taps its beak under a strange urge", "flexes both gloves in repeated patterns"),
V("steals {target} with a quick gloved hand", "draws {target} beneath one folded sleeve"),
V("jerks as foreign vapor fills the beak", "moves while its lenses flash unnaturally"),
V("sees {target} in masked dreams", "rests as its gloved fingers twitch"));
AddExtended(voices, "printer",
V("sings through sequenced electronic tones", "chatters a tune through turning gears"),
V("reproduces through synchronized print cycles", "begins replication as indicators pulse together"),
V("tends growth with measured roller passes", "cultivates beneath a traveling scan bar"),
V("pollinates {target} with tray-driven puffs", "feeds pollen across {target} beneath its rollers"),
V("trades by printing matching marks", "beeps twice during exchange"),
V("fishes with its traveling scan bar", "snaps its tray near detected fish"),
V("hauls atop its extended tray", "moves the load through humming rollers"),
V("heals {target} with a scanning pass", "applies measured pressure to {target} with its tray"),
V("fires a rapid sheet burst", "launches a pulse from its scan bar"),
V("flees {target} on humming rollers", "trundles away with its tray rattling"),
V("settles with print head parked", "rests with tray tucked closed"),
V("guards with scan bar traveling", "patrols on steady humming rollers"),
V("reads through its narrow glass slit", "copies symbols beneath the scan bar"),
V("gathers life through calibrated scans", "samples living traces with its glass slit"),
V("ejects a strip of dark residue", "purges waste through its lower tray"),
V("feeds blank strips without printing", "flashes conflicting indicators"),
V("recharges as its display brightens", "draws power into humming internal gears"),
V("cycles its tray under a strange urge", "prints repeated marks without pause"),
V("steals {target} through snapping rollers", "draws {target} into its open tray"),
V("shudders as foreign marks fill its display", "runs an imposed sequence of gear turns"),
V("renders {target} in dim display dreams", "rests while its print head twitches"));
AddExtended(voices, "skeleton",
V("sings through hollow jaw clacks", "rattles a tune across bare ribs"),
V("reproduces through synchronized bone taps", "begins mating as rib cages resonate"),
V("tends growth with bony fingertips", "cultivates through alternating foot rakes"),
V("pollinates {target} with rib-driven puffs", "brushes pollen across {target} with finger bones"),
V("trades through measured jaw clicks", "raises a bare hand during exchange"),
V("fishes with empty sockets lowered", "snaps bare teeth near fish"),
V("hauls against its exposed rib cage", "moves the load with hooked bone fingers"),
V("heals {target} with careful bone pressure", "tends {target} using jointed fingertips"),
V("fires a rattling bone burst", "launches force through its open rib cage"),
V("flees {target} in clattering strides", "scatters away and reassembles farther on"),
V("settles into a neatly folded bone pile", "rests with hands hooked through ribs"),
V("guards with sharpened forearms raised", "patrols in hollow clattering steps"),
V("reads by tapping marks with finger bones", "tilts empty sockets across symbols"),
V("gathers life through vibrating bare feet", "samples living motion with empty sockets"),
V("drops dry waste through its pelvis", "expels residue between loose ribs"),
V("reassembles with bones misplaced", "turns while its jaw chatters at nothing"),
V("recharges as its bones resonate", "draws energy through its empty mouth"),
V("juggles knuckles under a strange urge", "detaches and replaces its jaw repeatedly"),
V("steals {target} with hooked finger bones", "draws {target} behind its rib cage"),
V("rattles as foreign light fills its sockets", "marches in an imposed bone rhythm"),
V("sees {target} in rattling dreams", "rests as dim scenes cross its sockets"));
AddExtended(voices, "tumor_monster_animal",
V("sings through several wet throats", "gurgles a rhythm across pulsing growths"),
V("reproduces as fleshy buds divide", "begins mating while nodules pulse together"),
V("tends growth with quick uneven paws", "cultivates beneath probing tendrils"),
V("pollinates {target} with trembling nodules", "brushes pollen across {target} with extra limbs"),
V("trades through pulsing sensory lobes", "raises a hooked limb during exchange"),
V("fishes with a ring of wet nostrils", "snaps clustered mouths near fish"),
V("hauls against its swollen shoulder", "moves the load with hooked extra limbs"),
V("heals {target} with soft tissue pressure", "tends {target} using probing tendrils"),
V("fires a hardened tissue barb", "launches force from a pulsing nodule"),
V("flees {target} on scrambling uneven limbs", "lopes away with growths shaking"),
V("settles around its largest pulsing mass", "folds several limbs beneath its body"),
V("guards behind hardened growths", "patrols with wet nostrils testing"),
V("reads by touching marks with tendrils", "turns clustered eyes across symbols"),
V("gathers life through sensitive nodules", "samples living traces with wet nostrils"),
V("expels waste through a puckered opening", "releases residue beneath folded limbs"),
V("stumbles as its limbs choose different paths", "snaps mouths while clustered eyes cross"),
V("recharges as its nodules throb", "draws energy through several mouths"),
V("paws at its flank under a strange urge", "twitches extra limbs in repeated bursts"),
V("steals {target} with a hooked extra limb", "draws {target} beneath a sensory lobe"),
V("convulses as dark pulses cross its growths", "moves while foreign force tightens its tendrils"),
V("sees {target} in pulsing dreams", "rests while clustered eyes flicker"));
AddExtended(voices, "tumor_monster_unit",
V("sings in overlapping throat pitches", "drums a rhythm across hardened nodules"),
V("reproduces as smaller hands interlace", "begins mating while clustered eyes synchronize"),
V("tends growth with three careful hands", "cultivates through a tasting tendril"),
V("pollinates {target} with several quick palms", "brushes pollen across {target} with extra fingers"),
V("trades through alternating hand signs", "blinks clustered eyes during exchange"),
V("fishes with a thin tasting tendril", "grabs near fish with a smaller hand"),
V("hauls against its oversized arm", "moves the load using three hands"),
V("heals {target} with several measured palms", "tends {target} through soft tissue pressure"),
V("fires a dense tissue pulse", "launches force from its oversized palm"),
V("flees {target} on mismatched legs", "lumbers away with extra arms swinging"),
V("settles with every hand braced", "folds extra limbs around its torso"),
V("guards behind an oversized forearm", "patrols with clustered eyes blinking"),
V("reads by tracing marks with three hands", "turns clustered eyes across symbols"),
V("gathers life through a tasting tendril", "samples living traces with clustered eyes"),
V("expels waste through a side opening", "releases residue beneath its swollen torso"),
V("reaches in several directions at once", "stares while clustered eyes blink out of sequence"),
V("recharges as its growths pulse faster", "draws energy into its swollen frame"),
V("wrestles its own hands under a strange urge", "drums nodules in repeated bursts"),
V("steals {target} with its smaller hands", "draws {target} behind its oversized arm"),
V("jerks as foreign pulses cross its abdomen", "moves while clustered eyes glow darkly"),
V("sees {target} in many-handed dreams", "rests while its nodules replay slow pulses"));
AddExtended(voices, "white_mage",
V("sings in clear pearl-bright notes", "chants while pale sigils pulse"),
V("reproduces through synchronized light patterns", "begins mating as pearl glows intermingle"),
V("tends growth with open glowing palms", "cultivates beneath woven pale light"),
V("pollinates {target} with pearl-bright motes", "guides pollen across {target} through pale light"),
V("trades through ordered sigil flashes", "bows its bright-edged hood during exchange"),
V("fishes with a searching luminous mote", "draws near fish through pale force"),
V("hauls within woven pale light", "moves the load between open palms"),
V("heals {target} with cleansing light", "tends {target} beneath pearl radiance"),
V("fires a concentrated pale pulse", "launches force between open palms"),
V("flees {target} inside streaming pale light", "glides away as sigils brighten"),
V("settles within ordered pale sigils", "rests with both palms open"),
V("guards behind a shining barrier", "patrols with pearl motes circling"),
V("reads as pale light reveals marks", "studies symbols through ordered sigils"),
V("gathers life through a luminous mote", "samples living traces with pearl light"),
V("relieves itself beneath a pale veil", "releases waste as sigils turn aside"),
V("flickers while sigils reorder themselves", "turns as pearl motes point apart"),
V("recharges as robe edges brighten", "draws energy through open palms"),
V("folds light under a strange urge", "casts empty sigils in repeated bursts"),
V("steals {target} with a pale force pulse", "draws {target} between open palms"),
V("shudders as dark sigils cross its robe", "moves while foreign light bends its hands"),
V("sees {target} in pearl-lit dreams", "rests as pale sigils replay visions"));
AddExtended(voices, "zombie",
V("sings in a broken throaty moan", "groans a rhythm through its crooked jaw"),
V("reproduces through a stiff mating display", "begins mating as dead limbs twitch together"),
V("tends growth with slow stiff fingers", "cultivates through repeated palm presses"),
V("pollinates {target} with dragging hand sweeps", "brushes pollen across {target} with stiff fingers"),
V("trades through a delayed hand raise", "groans once during exchange"),
V("fishes with an unbroken forward stare", "snaps broken teeth near fish"),
V("hauls against its stiff shoulders", "pushes the load with both rigid arms"),
V("heals {target} with slow hand pressure", "tends {target} using stiff fingertips"),
V("fires a hoarse mouth pulse", "launches force with both reaching hands"),
V("flees {target} in a dragging lurch", "shambles away with arms swinging"),
V("settles into a limp heap", "rests upright with jaw hanging"),
V("guards with both stiff hands raised", "patrols in slow dragging steps"),
V("reads with an unbroken stare", "traces marks using one rigid finger"),
V("gathers life through a ruined nose", "samples living traces with broken teeth"),
V("relieves itself without changing its stare", "expels waste in a stiff crouch"),
V("turns toward unrelated movement", "reaches while its feet remain planted"),
V("recharges as dead limbs twitch", "draws energy through its open mouth"),
V("reaches repeatedly under a strange urge", "rocks side to side without pause"),
V("steals {target} with both stiff hands", "draws {target} against its rigid chest"),
V("jerks as foreign force straightens it", "marches while dark pulses cross its limbs"),
V("sees {target} in twitching dreams", "rests as its fingers grasp at dim visions"));
AddExtended(voices, "snowman",
V("sings in cold hollow crunches", "rumbles a tune through packed sections"),
V("reproduces as packed sections bud", "begins mating while cold pulses synchronize"),
V("tends growth with stick-like limb taps", "cultivates through careful body pressure"),
V("pollinates {target} with broad limb sweeps", "brushes pollen across {target} with packed hands"),
V("trades through a rounded body dip", "waves one stick-like limb during exchange"),
V("fishes through pulsing cold-body effects", "scoops near fish with packed limbs"),
V("hauls against its rounded lower section", "pushes the load with both stick-like limbs"),
V("heals {target} with numbing body pressure", "tends {target} using packed hands"),
V("fires a burst of packed body snow", "launches cold force between raised limbs"),
V("flees {target} in a swaying waddle", "pivots away as packed sections wobble"),
V("settles into a stable stacked posture", "rests with stick-like limbs tucked"),
V("guards with both limbs spread", "patrols in slow rounded pivots"),
V("reads by tapping marks with one limb", "rotates its upper section across symbols"),
V("gathers life through cold-body pulses", "samples living traces with packed hands"),
V("releases waste beneath its lower section", "expels dark residue while sections compress"),
V("rotates its sections in conflicting directions", "points both limbs toward unrelated marks"),
V("recharges as its packed body brightens", "draws energy through stacked sections"),
V("twirls both limbs under a strange urge", "rotates its upper section repeatedly"),
V("steals {target} with a sweeping limb", "draws {target} against its rounded body"),
V("shudders as dark cold pulses spread", "moves while foreign force twists its sections"),
V("sees {target} in cold-pulsed dreams", "rests while cold-body pulses replay visions"));
}
}

View file

@ -0,0 +1,333 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddFantasySpecializedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddSpecialized(voices, "UFO",
V("kindles flame beneath a focused heat ray", "spreads fire with a sweeping thermal beam"),
V("smothers flame beneath a cooling field", "dims fire with a pulsing suppression ray"),
V("gathers with kin through synchronized signals", "joins kin beneath matching light pulses"),
V("draws observed essence through a scanning beam", "samples visible life force beneath its hull"),
V("searches with a narrow scan", "reaches with a controlled lifting field"),
V("sounds a rising electronic trill", "pulses a wavering alarm tone"),
V("blasts clipped synthetic notes", "flashes harsh signals with a metallic buzz"));
AddSpecialized(voices, "alien",
V("sparks flame between clicking fingertips", "spreads fire with crackling wrist pulses"),
V("presses flame down with splayed hands", "quenches fire beneath a bioelectric pulse"),
V("gathers with kin through rapid clicks", "joins kin in mirrored body pulses"),
V("draws observed essence through tasting fingertips", "samples visible life force with its mouthparts"),
V("searches with four darting hands", "reaches with narrow grasping fingers"),
V("cries through a trembling throat sac", "releases a chain of bubbling chirps"),
V("chatters in jagged throat clicks", "snaps out a harsh clicking burst"));
AddSpecialized(voices, "angle",
V("kindles flame with holy radiance", "spreads fire through a surge of divine light"),
V("suppresses flame beneath sacred brilliance", "dims fire within steady celestial light"),
V("gathers with kin through shared holy radiance", "joins kin beneath shared divine light"),
V("draws life essence into holy radiance", "channels life force through celestial light"),
V("searches beneath revealing sacred light", "reaches through a pulse of divine radiance"),
V("sounds a sustained celestial chime", "releases a trembling hymn of light"),
V("voices sharp sacred tones", "flares with a harsh divine cadence"));
AddSpecialized(voices, "assimilator",
V("kindles flame with a searing membrane pulse", "spreads fire through reaching hot tendrils"),
V("smothers flame beneath a widening membrane", "draws fire into heat-drinking tissue"),
V("gathers with kin through braided tendrils", "joins kin by matching surface pulses"),
V("draws observed essence through tasting filaments", "absorbs visible life force beneath rippling tissue"),
V("searches with many probing feelers", "reaches through a forming grasping limb"),
V("cries through several borrowed throats", "releases mismatched wails across its surface"),
V("barks layered borrowed syllables", "snaps through a chorus of harsh voices"));
AddSpecialized(voices, "civ_crystal_golem",
V("kindles flame with a white-hot core pulse", "spreads fire through radiant crystal seams"),
V("suppresses flame beneath cooling crystal light", "draws fire into dimming core seams"),
V("gathers with kin through resonant core hums", "joins kin as inner lights pulse together"),
V("draws observed essence through luminous facets", "channels visible life force into its core"),
V("searches with refracted inner light", "reaches with broad crystalline hands"),
V("cries in a deep crystalline peal", "rings from every facet in trembling notes"),
V("booms in sharp core-deep pulses", "clashes its facets through a harsh resonance"));
AddSpecialized(voices, "cold_one",
V("kindles flame with a concentrated pale spark", "spreads fire from a pale crackling palm"),
V("smothers flame beneath hardening rime", "quenches fire with a numbing cold pulse"),
V("gathers with kin through clicking frozen teeth", "joins kin as cold vapors mingle"),
V("draws observed essence through a whitening palm", "pulls visible life force into its rime"),
V("searches with heat-sensitive fingers", "reaches with a frost-rimmed hand"),
V("cries in a thin ice-cracking shriek", "releases a long chime through frozen teeth"),
V("snaps out brittle frozen clicks", "rasps through a burst of cracking rime"));
AddSpecialized(voices, "crabzilla",
V("kindles flame between grinding mouthplates", "spreads fire with a vast heated breath"),
V("smothers flame beneath a colossal pincer", "quenches fire with a crushing shell-borne pressure"),
V("gathers with kin through booming pincer clacks", "joins kin as armored shells resonate"),
V("draws observed essence through sweeping eye stalks", "pulls visible life force between its mouthplates"),
V("searches with swiveling eye stalks", "reaches with a colossal open pincer"),
V("cries in a shell-rattling bellow", "clacks its mouthparts in thunderous pulses"),
V("snaps both pincers in a harsh barrage", "grinds out a booming plated rasp"));
AddSpecialized(voices, "crystal_sword",
V("kindles flame along its glowing edge", "spreads fire through a searing blade pulse"),
V("parts flame with a cooling edge", "draws fire into dimming crystal facets"),
V("gathers with kin through matching crystal peals", "joins kin as suspended blades resonate"),
V("draws observed essence along its fuller", "channels visible life force into its jeweled guard"),
V("searches with its point slowly testing", "reaches with a hovering hilt"),
V("cries in a high sustained ring", "trembles through a descending crystal peal"),
V("rings in sharp metallic bursts", "shivers its edge through a harsh bright note"));
AddSpecialized(voices, "demon",
V("kindles flame between blackened claws", "spreads fire with a scorching breath"),
V("smothers flame inside a smoking palm", "draws fire beneath ember-hot skin"),
V("gathers with kin through heated snarls", "joins kin as smoking bodies press close"),
V("draws observed essence through glowing fangs", "pulls visible life force into its hot core"),
V("searches with heat-sensing nostrils", "reaches with hooked claws"),
V("cries in a cracked furnace howl", "releases a throat-deep scorching wail"),
V("barks harsh syllables through smoking fangs", "snarls in short ember-spitting bursts"));
AddSpecialized(voices, "dragon",
V("kindles flame behind serrated teeth", "spreads fire with a broad searing breath"),
V("smothers flame beneath a plated foreclaw", "draws fire back through flared nostrils"),
V("gathers with kin through chest-deep rumbles", "joins kin as plated bodies resonate"),
V("draws observed essence through flared nostrils", "pulls visible life force between glowing teeth"),
V("searches with unblinking eyes", "reaches with an open foreclaw"),
V("cries in a vast chest-deep roar", "releases a long horn-rattling bellow"),
V("snaps out thunderous guttural syllables", "growls through bursts of bright sparks"));
AddSpecialized(voices, "druid",
V("kindles flame between bark-lined palms", "spreads fire through glowing sap"),
V("smothers flame beneath unfurling leaves", "draws fire into darkening living grain"),
V("gathers with kin through rustling leaf-signals", "joins kin as living fibers intertwine"),
V("draws observed essence through root-like fingers", "pulls visible life force into living grain"),
V("searches with curling rootlets", "reaches with a vine-wrapped hand"),
V("cries through a dry leafy rasp", "releases a low wooden groan"),
V("utters clipped syllables through rustling leaves", "snaps living grain in a harsh cadence"));
AddSpecialized(voices, "evil_mage",
V("kindles flame from violet fingertips", "spreads fire through crawling dark sparks"),
V("smothers flame beneath folded shadow", "draws fire into a dim violet aura"),
V("gathers with kin through layered whispers", "joins kin as dark auras overlap"),
V("draws observed essence into a shadowed palm", "pulls visible life force through violet sparks"),
V("searches through a circling violet eye", "reaches with a shadow-wrapped hand"),
V("cries in a thin echoing rasp", "releases a wavering chorus of whispers"),
V("hisses clipped words through violet static", "barks a harsh syllable as shadows pulse"));
AddSpecialized(voices, "fairy",
V("kindles flame from sparkling fingertips", "spreads fire through pulsing bright motes"),
V("dims flame beneath cooling shimmer", "smothers fire inside a veil of motes"),
V("gathers with kin through matching light pulses", "joins kin as tiny glows mingle"),
V("draws observed essence into sparkling motes", "pulls visible life force through its shimmer"),
V("searches with flickering motes", "reaches with both tiny hands"),
V("cries in a piercing bell-like trill", "releases a trembling chain of tiny notes"),
V("chirps sharp syllables in rapid bursts", "flashes harshly through a clipped trill"));
AddSpecialized(voices, "fire_elemental",
V("kindles flame from its white-hot core", "spreads fire through reaching tongues of flame"),
V("draws loose flame back into its core", "banks fire beneath a dim ember shell"),
V("gathers with kin as sparks intermingle", "joins kin through merging flame pulses"),
V("draws observed essence into its burning core", "pulls visible life force through licking flames"),
V("searches with thin reaching flames", "reaches with a forming arm of fire"),
V("cries in a roaring cascade of crackles", "releases a long furnace-like howl"),
V("snaps in harsh explosive pops", "flares through a jagged crackling burst"));
AddSpecialized(voices, "fire_elemental_blob",
V("kindles flame from a bubbling hot lobe", "spreads fire through clinging molten droplets"),
V("draws flame beneath a cooling crust", "smothers fire inside its soft molten body"),
V("gathers with kin through shared bubbling pulses", "joins kin as molten sides mingle"),
V("draws observed essence through a glowing pseudopod", "pulls visible life force beneath its liquid surface"),
V("searches with a wavering hot lobe", "reaches with a stretching pseudopod"),
V("cries in a wet chain of fiery pops", "gurgles through a long bubbling wail"),
V("bursts in harsh sputtering pops", "slaps its molten surface through a jagged hiss"));
AddSpecialized(voices, "fire_elemental_horse",
V("kindles flame between glowing teeth", "spreads fire through a blazing breath"),
V("draws flame into its ember-bright muzzle", "stamps fire beneath a cooling hoof"),
V("gathers with kin through furnace nickers", "joins kin as fiery manes mingle"),
V("draws observed essence through flared nostrils", "pulls visible life force into its burning chest"),
V("searches with a glowing muzzle", "reaches with ember-bright teeth"),
V("cries in a rising furnace whinny", "releases a long crackling nicker"),
V("snorts sharp bursts of sparks", "barks a harsh note through glowing teeth"));
AddSpecialized(voices, "fire_elemental_slug",
V("kindles flame beneath its glowing mantle", "spreads fire through a molten body ribbon"),
V("draws flame under a cooled black crust", "smothers fire beneath its broad heated underside"),
V("gathers with kin through touching flame feelers", "joins kin as glowing mantles pulse together"),
V("draws observed essence through heat-sensitive feelers", "pulls visible life force beneath its mantle"),
V("searches with sweeping flame feelers", "reaches with an extended glowing mantle"),
V("cries in a long wet sizzle", "releases a bubbling crackle through its mantle"),
V("pops in sharp hissing bursts", "rasps through a harsh chain of sizzles"));
AddSpecialized(voices, "fire_elemental_snake",
V("kindles flame behind a forked fire tongue", "spreads fire along its blazing coils"),
V("draws flame into banked coils", "smothers fire beneath overlapping ember scales"),
V("gathers with kin through braided burning coils", "joins kin as forked sparks pulse together"),
V("draws observed essence through its split flame tongue", "pulls visible life force along glowing coils"),
V("searches with a flickering forked tongue", "reaches with an opening fiery coil"),
V("cries in a long crackling hiss", "rattles out a wavering chain of pops"),
V("hisses in clipped searing bursts", "snaps its flame tongue through harsh crackles"));
AddSpecialized(voices, "fire_skull",
V("kindles flame inside its hollow mouth", "spreads fire through snapping blazing jaws"),
V("draws flame into empty sockets", "smothers fire beneath its dimming crown"),
V("gathers with kin through synchronized jaw clacks", "joins kin as hollow sockets flare together"),
V("draws observed essence through empty sockets", "pulls visible life force between blazing teeth"),
V("searches with fixed hollow sockets", "reaches with opening jaws"),
V("cries in a hollow fire-fed howl", "cackles through a trembling loose jaw"),
V("clacks out harsh tooth-borne bursts", "barks through a flare of roaring fire"));
AddSpecialized(voices, "ghost",
V("kindles pale flame in a spectral palm", "spreads fire through a wavering aura"),
V("smothers flame inside its translucent form", "dims fire beneath a chilling spectral pulse"),
V("gathers with kin through overlapping outlines", "joins kin as spectral auras mingle"),
V("draws observed essence into its hollow form", "pulls visible life force through a translucent hand"),
V("searches through a wavering outline", "reaches with a spectral hand"),
V("cries in a long airy wail", "moans through a trembling echo"),
V("rasps in clipped hollow syllables", "warbles through a harsh spectral pulse"));
AddSpecialized(voices, "god_finger",
V("kindles flame beneath its rounded tip", "spreads fire with a heated nail pulse"),
V("presses flame beneath its broad tip", "draws fire into a dimming nail"),
V("gathers with kin through fingertip taps", "joins kin as nails pulse together"),
V("draws observed essence through its sensitive tip", "pulls visible life force beneath its nail"),
V("searches with its tip flexing", "reaches with a slowly curling digit"),
V("cries through rapid self-drumming taps", "trembles out a rolling nail-borne rattle"),
V("taps out a harsh clipped sequence", "snaps its nail in sharp repeated bursts"));
AddSpecialized(voices, "greg",
V("kindles flame between rubbing palms", "spreads fire through a hot open-mouthed breath"),
V("smothers flame beneath both broad hands", "blows a forceful breath across the fire"),
V("gathers with kin through matching nasal honks", "joins kin in close shoulder contact"),
V("draws observed essence through spread fingertips", "pulls visible life force into its open mouth"),
V("searches with unblinking eyes", "reaches with both open hands"),
V("cries in a long nasal honk", "wheezes through a trembling throat"),
V("barks blunt syllables through clenched teeth", "snorts a harsh broken cadence"));
AddSpecialized(voices, "jumpy_skull",
V("kindles flame between chattering teeth", "spreads fire through snapping hot jaws"),
V("smothers flame beneath its heavy cranium", "draws fire into hollow sockets"),
V("gathers with kin through rapid jaw clacks", "joins kin as bare craniums rattle together"),
V("draws observed essence through hollow sockets", "pulls visible life force between chattering teeth"),
V("searches with tilted empty sockets", "reaches with an opening jaw"),
V("cries in a hollow rattling shriek", "cackles through uncontrollable jaw clacks"),
V("snaps out a harsh tooth-clacking barrage", "rattles its cranium through clipped bursts"));
AddSpecialized(voices, "living_house",
V("kindles flame within its glowing interior", "spreads fire through heat pulsing from its openings"),
V("smothers flame behind closing shutters", "draws fire into a darkened interior"),
V("gathers with kin through resonant inner bells", "joins kin as windows pulse together"),
V("draws observed essence through open windows", "pulls visible life force into its interior"),
V("searches through swiveling windows", "reaches with an opening doorway"),
V("cries through rattling windows and walls", "releases a long foundation-deep groan"),
V("slams its openings in harsh succession", "rings a sharp booming inner bell"));
AddSpecialized(voices, "living_plants",
V("kindles flame through heating sap", "spreads fire along glowing vines"),
V("smothers flame beneath broad folded leaves", "draws fire into thick cooling sap"),
V("gathers with kin through intertwining roots", "joins kin as leaf pulses synchronize"),
V("draws observed essence through fine root hairs", "pulls visible life force into its central bud"),
V("searches with probing roots", "reaches with a curling vine"),
V("cries in a long rustling rasp", "releases a dry pod-rattling wail"),
V("snaps leaves in a harsh cadence", "rattles dry pods through clipped bursts"));
AddSpecialized(voices, "mush_animal",
V("kindles flame through a hot spore puff", "spreads fire beneath a pulsing cap"),
V("smothers flame beneath its broad damp cap", "quenches fire with a dense cooling spore cloud"),
V("gathers with kin through synchronized gill puffs", "joins kin as broad caps press together"),
V("draws observed essence through porous gills", "pulls visible life force beneath its cap"),
V("searches with a porous snout", "reaches with quick forepaws"),
V("cries in a damp bubbling squeal", "chuffs through rapidly pulsing gills"),
V("snaps flat teeth through harsh squeaks", "puffs clipped rasping bursts from its gills"));
AddSpecialized(voices, "mush_unit",
V("kindles flame in a heated spore puff", "spreads fire beneath its broad cap"),
V("smothers flame under pulsing damp gills", "quenches fire with a dense cooling spore veil"),
V("gathers with kin through shared spore pulses", "joins kin as broad caps touch"),
V("draws observed essence through hanging gills", "pulls visible life force beneath its cap"),
V("searches with trembling fingertips", "reaches with a pale open hand"),
V("cries in a low papery wail", "releases a trembling puff through its gills"),
V("rasps clipped syllables beneath its cap", "snaps out harsh papery puffs"));
AddSpecialized(voices, "necromancer",
V("kindles grave-pale flame in one hand", "spreads fire through cold spectral wisps"),
V("smothers flame beneath a wan magic pulse", "draws fire into circling pale light"),
V("gathers with kin through layered bone-dry whispers", "joins kin as pale auras overlap"),
V("draws observed essence into a raised hand", "pulls visible life force through grave-pale magic"),
V("searches through a floating spectral wisp", "reaches with a pale open hand"),
V("cries in a papery hollow wail", "releases a chorus of rattling whispers"),
V("hisses clipped syllables through pale static", "rasps in a harsh bone-dry cadence"));
AddSpecialized(voices, "plague_doctor",
V("kindles flame through a narrow filtered breath", "spreads fire from a heated gloved palm"),
V("smothers flame beneath both gloved hands", "quenches fire through a cooling filtered breath"),
V("gathers with kin through measured beak clicks", "joins kin as masked heads incline together"),
V("draws observed essence through round mask lenses", "pulls visible life force into the narrow beak"),
V("searches through round dark lenses", "reaches with a gloved hand"),
V("cries in a muffled hollow rasp", "releases a long filtered wheeze"),
V("barks clipped syllables behind the beak", "snaps out harsh muffled sounds"));
AddSpecialized(voices, "printer",
V("kindles flame beneath an overheating print head", "spreads fire through a hot internal pulse"),
V("smothers flame beneath a cooling internal vent", "suppresses fire with a pulsing thermal cutoff"),
V("gathers with kin through synchronized status beeps", "joins kin as indicator lights match"),
V("draws observed essence through its scan bar", "samples visible life force across its glass slit"),
V("searches with a traveling scan light", "reaches with its extending tray"),
V("cries in a wavering electronic whine", "chatters its gears through a broken alarm"),
V("blasts sharp electronic tones", "rattles out a harsh mechanical sequence"));
AddSpecialized(voices, "skeleton",
V("kindles flame inside its hollow rib cage", "spreads fire through snapping bare fingers"),
V("smothers flame beneath interlocked bones", "draws fire into empty sockets"),
V("gathers with kin through matching bone rattles", "joins kin as bare ribs clack together"),
V("draws observed essence through empty sockets", "pulls visible life force into its rib cage"),
V("searches with its hollow gaze", "reaches with a bare jointed hand"),
V("cries in a hollow jaw-flapping wail", "rattles from skull to toes in long pulses"),
V("clacks teeth in a harsh barrage", "snaps finger bones through clipped beats"));
AddSpecialized(voices, "tumor_monster_animal",
V("kindles flame from a heated pulsing nodule", "spreads fire through a searing tendril"),
V("smothers flame beneath a broad fleshy lobe", "draws fire into cooling swollen tissue"),
V("gathers with kin through matching tissue pulses", "joins kin as sensory lobes touch"),
V("draws observed essence through wet nostrils", "pulls visible life force into a pulsing growth"),
V("searches with sensitive nodules", "reaches with a twitching tendril"),
V("cries through several throats at once", "releases a wet overlapping wail"),
V("snaps crowded teeth through harsh gurgles", "barks from several mouths in clipped bursts"));
AddSpecialized(voices, "tumor_monster_unit",
V("kindles flame in a throbbing heated palm", "spreads fire through a searing extra limb"),
V("smothers flame beneath an oversized hand", "draws fire into cooling pulsing tissue"),
V("gathers with kin through synchronized nodules", "joins kin as sensory tendrils touch"),
V("draws observed essence through clustered eyes", "pulls visible life force into a pulsing abdomen"),
V("searches with clustered blinking eyes", "reaches with several open hands"),
V("cries in overlapping throaty pitches", "releases a wet wail from several vents"),
V("barks clipped sounds from a sideways mouth", "snorts through several vents in harsh bursts"));
AddSpecialized(voices, "white_mage",
V("kindles flame in a pearl-bright palm", "spreads fire through cleansing light"),
V("suppresses flame beneath a pale luminous veil", "dims fire within cooling pearl light"),
V("gathers with kin through shared luminous pulses", "joins kin as pale auras overlap"),
V("draws observed essence through an open palm", "pulls visible life force into pearl-white light"),
V("searches through a revealing luminous mote", "reaches with a light-wrapped hand"),
V("cries in a clear sustained ring", "releases a trembling luminous hum"),
V("voices clipped ringing syllables", "flashes sharply through a harsh bright cadence"));
AddSpecialized(voices, "zombie",
V("kindles flame between stiff rubbing hands", "spreads fire through a hot broken-toothed breath"),
V("smothers flame beneath both stiff hands", "presses its cold body against the fire"),
V("gathers with kin through matching groans", "joins kin in close cold contact"),
V("draws observed essence through a ruined nose", "pulls visible life force into its open mouth"),
V("searches with an unbroken stare", "reaches with both stiff hands"),
V("cries through a long crooked-jaw groan", "gurgles in a wavering broken-throat call"),
V("barks hoarse clipped syllables", "snaps broken teeth through a harsh rasp"));
AddSpecialized(voices, "snowman",
V("kindles flame between its cold stick-like limbs", "spreads fire through a heat pulse from its packed body"),
V("smothers flame beneath its packed cold body", "quenches fire with a burst of its own cold powder"),
V("gathers with kin through matching body tremors", "joins kin as packed sides press together"),
V("draws observed essence through its rounded upper body", "pulls visible life force into its packed middle"),
V("searches by rotating its upper body", "reaches with both stick-like limbs"),
V("cries in a powdery body-deep crunch", "releases a long packed-body rumble"),
V("snaps its stick-like limbs in harsh beats", "crunches through a clipped rumbling burst"));
}
}

View file

@ -0,0 +1,441 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddFantasyVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
Add(voices, "UFO",
V("glides in a soundless level line", "banks on a seamless silver rim"),
V("hovers without sway", "holds its lights in a fixed pattern"),
V("spins its rim in a bright calibration", "winks its lower lights in sequence"),
V("draws energy into its hull", "sips a thin charge through its underside"),
V("dims every light and hangs inert", "settles into a low-power hover"),
V("hunts {target} with a narrow scanning beam", "hunts {target} by pulsing its sensor ring"),
V("attacks {target} with a precise lower ray", "attacks {target} with a hot lance"),
V("answers nearby signals with colored flashes", "circles once while broadcasting soft tones"),
V("trills in quick electronic notes", "warbles through a rising chord"),
V("maps its task with scanning light", "aligns its panels over a precision task"));
Add(voices, "alien",
V("bounds forward on springing legs", "scuttles sideways with its torso upright"),
V("crouches low while its eyes keep moving", "folds its long limbs into a compact perch"),
V("taps both hands in a rapid rhythm", "braids its narrow fingers in quick patterns"),
V("nibbles a meal in tiny bites", "draws energy through its clicking mouthparts"),
V("tucks its head between raised shoulders", "curls its limbs around its chest"),
V("hunts {target} with clicking mouthparts", "hunts {target} with darting eyes"),
V("attacks {target} with a hooked wrist", "attacks {target} from springing legs"),
V("touches fingertips and trades soft clicks", "mirrors another's posture in greeting"),
V("chatters in bubbling bursts", "chirps until its throat sac trembles"),
V("sorts material by shape with four quick hands", "fits task material with narrow fingers"));
Add(voices, "angle",
V("glides beneath a mantle of holy radiance", "advances as divine light gathers around it"),
V("stands watch in unwavering celestial brilliance", "holds vigil within pale radiance"),
V("sends brief gleams through its aura", "pulses its radiant presence in a bright cadence"),
V("draws energy into its divine glow", "brightens as holy power fills its presence"),
V("dims to a quiet celestial ember", "rests within a gently fading aura"),
V("hunts {target} through revealing holy light", "hunts {target} as its radiance intensifies"),
V("attacks {target} with a surge of divine light", "attacks {target} in cleansing brilliance"),
V("greets nearby company with a sacred glow", "answers another presence with radiant pulses"),
V("chimes with bright celestial laughter", "laughs as celestial light ripples outward"),
V("casts divine radiance over its labor", "shapes each effort with steady divine light"));
Add(voices, "assimilator",
V("pulls itself forward on braided tendrils", "rolls its shifting bulk in measured surges"),
V("anchors several feelers and studies nearby motion", "compresses into a listening mound"),
V("cycles through borrowed gestures with imperfect timing", "forms and dissolves little grasping hands"),
V("wraps a meal in a clear membrane", "draws energy beneath its rippling surface"),
V("seals itself inside a toughened outer skin", "slows its inner currents to a faint pulse"),
V("hunts {target} with tasting filaments", "hunts {target} through borrowed noses"),
V("attacks {target} with a hardened wedge-limb", "attacks {target} by splitting and snapping shut"),
V("echoes nearby calls in layered voices", "offers a borrowed face that melts into another"),
V("bursts into a chorus of mismatched chuckles", "repeats one bright laugh from several mouths"),
V("weaves task material into useful shapes", "repairs its own surface with matched fibers"));
Add(voices, "civ_crystal_golem",
V("strides with heavy faceted steps", "advances as inner light shifts between joints"),
V("plants both feet and becomes statue-still", "rests broad hands against its angular knees"),
V("refracts its inner light between its palms", "makes colored glints dance across its facets"),
V("draws energy through glowing seams", "feeds energy into its core"),
V("dims its core behind crossed stone arms", "locks each joint and enters a glassy stillness"),
V("hunts {target} by reading vibrations through one fist", "hunts {target} with a prism-bright gaze"),
V("attacks {target} with a massive crystalline forearm", "attacks {target} with a faceted shoulder"),
V("flashes slow colors through its chest", "touches knuckles and shares a resonant hum"),
V("booms with a core-deep resonance", "tinkles from every edge in a bright cascade"),
V("sets a heavy load with unerring weight", "cuts hard material along clean shining planes"));
Add(voices, "cold_one",
V("stalks on stiff frost-rimmed limbs", "skates forward without lifting its feet"),
V("stands rigid while cold vapor leaks between its teeth", "hunches beneath a mantle of hard rime"),
V("carves tiny spirals into its own rime", "grows and snaps an icicle from one fingertip"),
V("crushes a meal between pale jaws", "drinks energy through a whitening palm"),
V("folds into a compact frost-crusted crouch", "goes still beneath a shell of opaque ice"),
V("hunts {target} by feeling warmth through spread fingers", "hunts {target} with a heat-seeking stare"),
V("attacks {target} with frost-rimmed claws", "attacks {target} with a numbing palm"),
V("greets with a breath of glittering vapor", "clicks frozen teeth in a measured exchange"),
V("crackles like ice under strain", "gives a thin laugh of chiming shards"),
V("freezes task material into a firm join", "shapes task material with repeated icy claw strokes"));
Add(voices, "crabzilla",
V("thunders sideways on towering jointed legs", "hauls its armored bulk ahead with earthshaking steps"),
V("settles its vast shell onto folded limbs", "holds both colossal pincers beneath its shell"),
V("clacks its pincers in a booming rhythm", "crosses colossal pincers in a measured display"),
V("pulverizes a meal between grinding plates", "scoops a meal toward hidden mouthparts"),
V("tucks every limb beneath its fortress shell", "rests with eye stalks drawn into armored sockets"),
V("hunts {target} with sweeping eye stalks", "hunts {target} through vibrations in its leg tips"),
V("attacks {target} with a colossal pincer", "attacks {target} with an immense plated claw"),
V("raises both pincers toward another", "clacks a greeting for nearby company"),
V("rattles its shell with a booming clatter", "clacks its mouthparts in rolling bursts"),
V("levels task material with measured pincer taps", "packs material flat beneath a broad claw"));
Add(voices, "crystal_sword",
V("floats point-first in a gleaming rush", "sweeps ahead with its hilt held level"),
V("hangs upright with its point barely lowered", "rests suspended inside a faint prismatic shimmer"),
V("twirls through a rapid sequence of cuts", "bounces colored light from edge to edge"),
V("draws energy along its fuller", "absorbs energy through its jewel-set guard"),
V("sinks point-down into a dormant hover", "dims its facets and stills every tremor"),
V("hunts {target} with its edge turned forward", "hunts {target} with its testing point"),
V("attacks {target} in a clean cutting arc", "attacks {target} with its ringing flat"),
V("salutes by lifting its hilt", "crosses guards and trades a clear ringing note"),
V("sings with a high crystalline peal", "rings out in a bright descending cadence"),
V("trims task material with exact strokes", "scores material using its shining point"));
Add(voices, "demon",
V("strides on smoking hooves", "lunges ahead with wings drawn tight"),
V("squats with claws curled beneath its body", "folds leathery wings around a red-hot core"),
V("flicks its own embers between hooked claws", "snaps its tail through its own sparks"),
V("tears a meal with blackened fangs", "gulps energy until its throat glows"),
V("hangs upside down behind wrapped wings", "dozes in a crouch as smoke curls from its nostrils"),
V("hunts {target} through heat-sensing nostrils", "hunts {target} with horns lowered"),
V("attacks {target} with a burning claw", "attacks {target} with its barbed tail"),
V("butts horns with another in greeting", "shares a red-hot snarl with nearby company"),
V("cackles in a cracked furnace roar", "barks a burst of scorching laughter"),
V("brands task material with clawed sigils", "heats task material with beating wings"));
Add(voices, "dragon",
V("surges forward on vast beating wings", "pads ahead with its plated tail held clear"),
V("coils around its foreclaws and watches", "perches high on folded haunches"),
V("chases its own tail with thunderous wingbeats", "snaps twice at its own wingtip"),
V("rips a meal with serrated teeth", "swallows a meal in one gulp"),
V("curls beneath the shelter of one broad wing", "rests its horned head across crossed forelegs"),
V("hunts {target} through flared nostrils", "hunts {target} with unblinking eyes"),
V("attacks {target} with both hind talons", "attacks {target} with a narrow torrent"),
V("touches brow horns in greeting", "rumbles low while fanning one wing"),
V("laughs in rolling thunder from its chest", "chuffs bright sparks between rolling growls"),
V("moves weighty loads in closed talons", "fuses material with a measured breath"));
Add(voices, "druid",
V("walks with a crooked staff marking each step", "paces lightly beneath a leaf-woven cloak"),
V("leans on the staff and listens", "kneels with both palms pressed down"),
V("braids the cloak's leaf tips around the staff", "coaxes the staff's living grain into curls"),
V("chews a meal in slow bites", "draws energy through measured mouthfuls"),
V("rests beneath the hood with hands in sleeves", "curls around the crooked staff"),
V("hunts {target} through the staff's sensing grain", "hunts {target} with searching root-magic"),
V("attacks {target} with thorny growth", "attacks {target} with grasping vines"),
V("bows the leaf-woven hood toward another", "greets nearby company with a rustling cloak"),
V("chuckles through a rustling hood", "laughs softly as the leaf-woven cloak flutters"),
V("binds task material with fresh fibers", "guides material into an orderly weave"));
Add(voices, "evil_mage",
V("sweeps forward behind a trailing black robe", "glides with a crooked staff held before the face"),
V("stands inside a ring of hovering runes", "hunches over the staff while shadows gather close"),
V("makes its dark sparks chase one another", "shuffles glowing symbols between its hands"),
V("draws energy through clenched teeth", "draws energy through the crooked staff"),
V("reclines in a shell of folded shadow", "dozes upright while the staff keeps watch"),
V("hunts {target} through a circling violet eye", "hunts {target} with crawling symbols"),
V("attacks {target} with crackling violet force", "attacks {target} with the hooked staff"),
V("bows with the face hidden by the hood", "trades layered whispers over clasped sleeves"),
V("snickers behind one raised hand", "laughs in a dry, echoing rasp"),
V("inks task material with a smoking fingertip", "distills murky energy for a waiting task"));
Add(voices, "fairy",
V("zips ahead on shimmering wings", "darts in a loop while its own glow pulses"),
V("hovers with toes tucked beneath a tiny skirt", "perches lightly with wings folded upright"),
V("blows a ring of its own sparkling motes", "loops through its own shimmer in a quick dance"),
V("sips a meal in tiny mouthfuls", "nibbles a meal held in both hands"),
V("folds bright wings around a curled body", "dozes while suspended in a soft glow"),
V("hunts {target} in widening flight circles", "hunts {target} with shimmering wingbeats"),
V("attacks {target} with a needle-thin flash", "attacks {target} with its own sparkling motes"),
V("touches wingtips with another in greeting", "trades spiraling ribbons of its own colored light"),
V("giggles in tiny bell-like bursts", "trills a laugh in quick pulses"),
V("ties task material into delicate loops", "polishes material with its own sparkling motes"));
Add(voices, "fire_elemental",
V("strides as a column of folding flame", "streams forward in licking orange ribbons"),
V("gathers into a steady upright blaze", "burns low around a white-hot center"),
V("flicks sparks into spinning hoops", "splits off a flame that chases its hands"),
V("devours fuel in a sudden flare", "draws energy inward until its core whitens"),
V("banks its body into a bed of embers", "closes around its core in a dim red shell"),
V("hunts {target} by reaching with thin flames", "hunts {target} through trembling tongues"),
V("attacks {target} with a roaring arm of fire", "attacks {target} in a ring of searing force"),
V("mingles its sparks with another in greeting", "bows to nearby company beneath a bright crown"),
V("roars with the pop of burning fuel", "crackles in a rising cascade"),
V("heats material to a visible glow", "seals a join with one white-hot fingertip"));
Add(voices, "fire_elemental_blob",
V("wobbles forward in molten hops", "oozes ahead while flames lick from its crown"),
V("puddles into a quivering orange mound", "holds still as bubbles roll beneath its skin"),
V("pops little fire bubbles from its surface", "splits into two wobbling lobes and rejoins"),
V("rolls fuel into its glowing body", "melts a meal beneath a drooping fold"),
V("flattens into a dim ember-shape", "forms a cooling crust around its liquid center"),
V("hunts {target} with a glowing pseudopod", "hunts {target} with a forked lick of flame"),
V("attacks {target} with a clinging heat-glob", "attacks {target} by expanding its fiery body"),
V("bumps warm sides with another", "waves a small flaming lobe toward nearby company"),
V("gurgles through a popping laugh", "burps a chain of bright crackles"),
V("fills task seams with molten material", "presses its soft heat around a task join"));
Add(voices, "fire_elemental_horse",
V("gallops on hooves of compact flame", "canters with a blazing mane streaming backward"),
V("stands with one ember-bright hoof cocked", "lowers its head as the mane settles to embers"),
V("prances while its own hooves pulse brightly", "tosses its mane in a shower of its own sparks"),
V("crops fuel with glowing teeth", "draws energy through flared nostrils"),
V("folds its legs beneath a banked fiery body", "rests with its muzzle tucked against a warm flank"),
V("hunts {target} with smoke-lined nostrils", "hunts {target} through one sensitive forehoof"),
V("attacks {target} with burning hooves", "attacks {target} with a sweeping tail of flame"),
V("touches glowing muzzles with another", "nickers to nearby company as its mane flickers"),
V("whinnies in a rising furnace note", "snorts a laughing burst of sparks"),
V("hauls a load in a heat-hazed stride", "stamps material firm with controlled hot hooves"));
Add(voices, "fire_elemental_slug",
V("glides on a ribbon of molten glow", "inches forward beneath two wavering flame feelers"),
V("draws into a low smoldering coil", "rests with both feelers dimmed to red points"),
V("waves its feelers through its own curling sparks", "blows bright bubbles from its glowing mantle"),
V("rasps a meal with its heated mouth", "absorbs energy through its broad underside"),
V("seals itself beneath a cooled black crust", "tucks its feelers into a banked orange body"),
V("hunts {target} with sweeping hot feelers", "hunts {target} with heat-sensitive feelers"),
V("attacks {target} with a strip of clinging flame", "attacks {target} with a hot spark"),
V("touches feelers with another", "draws a curling ember-sign toward nearby company"),
V("sizzles in wet, bubbly chuckles", "pops softly along its glowing mantle"),
V("lays a narrow bead across task material", "smooths task joins with its heated foot"));
Add(voices, "fire_elemental_snake",
V("slithers in a swift incandescent coil", "whips forward as a narrow line of flame"),
V("loops around its glowing core", "raises its head above a banked spiral"),
V("chases a spark through its own coils", "ties its blazing body into a loose knot"),
V("swallows fuel that glows down its length", "draws energy through a flickering forked tongue"),
V("curls into a dim ring of embers", "hides its head beneath overlapping fiery coils"),
V("hunts {target} with a split flame tongue", "hunts {target} through sensitive burning coils"),
V("attacks {target} in a searing straight line", "attacks {target} within burning coils"),
V("braids one loop beside another in greeting", "flicks a paired spark toward nearby company"),
V("hisses with a bright crackling cadence", "rattles its tail in popping bursts"),
V("threads heat through task material", "coils around a task join until it fuses cleanly"));
Add(voices, "fire_skull",
V("drifts forward beneath a ragged flame", "bobs ahead with jaws aglow"),
V("hovers with empty sockets fixed ahead", "settles low as its crown burns blue"),
V("spins until its own flame forms a ring", "chatters its jaw to scatter its own sparks"),
V("bites fuel and crushes it into flame", "inhales energy through its hollow nose"),
V("dims its crown and floats jaw-down", "closes its mouth around the last red glow"),
V("hunts {target} with hollow sockets fixed forward", "hunts {target} through snapping teeth"),
V("attacks {target} with blazing jaws", "attacks {target} with a compact fiery bolt"),
V("clacks teeth toward another in greeting", "bumps brows and shares a tongue of flame"),
V("cackles through a loose rattling jaw", "howls with fire roaring from its mouth"),
V("scorches task material with a measured bite", "carries a hot task load between its teeth"));
Add(voices, "ghost",
V("drifts with a trailing translucent hem", "passes forward in a wavering glide"),
V("hangs still with hands folded through its chest", "fades to a faint outline while watching"),
V("loops through its own misty train", "ripples its translucent outline without touching it"),
V("draws energy through its hollow form", "absorbs energy from its own aura"),
V("thins into an almost invisible veil", "folds into a dim floating silhouette"),
V("hunts {target} with one spectral hand cupped", "hunts {target} through its wavering outline"),
V("attacks {target} with a chilling hand", "attacks {target} with a face-stretching wail"),
V("passes one hand through another in greeting", "bows toward nearby company as its outline brightens"),
V("warbles in an airy, echoing laugh", "moans upward into a trembling chuckle"),
V("lifts a task load with unseen pressure", "guides task material without contact"));
Add(voices, "god_finger",
V("walks on its tip in deliberate little hops", "slides upright with the nail leading"),
V("balances rigidly on one rounded tip", "curls slightly and holds a hooked pose"),
V("draws circles with its nail", "taps out an alternating five-beat rhythm"),
V("draws energy through its rounded tip", "absorbs energy through the nail"),
V("lies flat with the nail dimmed", "bends into a relaxed hook and goes still"),
V("hunts {target} with its nail pointed sharply", "hunts {target} through a sensitive fingertip"),
V("attacks {target} with a sudden flick", "attacks {target} with a gleaming nail"),
V("crooks itself toward another in greeting", "taps another tip in quick acknowledgment"),
V("drums a rolling laugh against itself", "wiggles through a silent pantomime of laughter"),
V("nudges task material into exact position", "presses firmly to set finished work"));
Add(voices, "greg",
V("lopes ahead with elbows flung wide", "shuffles sideways in a lopsided gait"),
V("squats on its heels and stares without blinking", "stands slack-jawed with hands dangling"),
V("makes faces at its own waggling fingers", "hops twice and freezes in a crooked pose"),
V("crams a meal between its teeth", "licks every fingertip after a mouthful"),
V("sprawls flat with limbs at mismatched angles", "curls around its knees and snores through its nose"),
V("hunts {target} with abrupt zigzag sniffs", "hunts {target} by peering under its own arm"),
V("attacks {target} with windmilling fists", "attacks {target} with a lunging headbutt"),
V("waves with both hands far too close", "greets by copying every gesture a beat late"),
V("honks out a belly laugh", "wheezes until its shoulders bounce"),
V("stacks task material in uneven columns", "hammers task material in an irregular rhythm"));
Add(voices, "jumpy_skull",
V("boings forward on a springing jaw", "hops in quick arcs with teeth clenched"),
V("balances on its lower teeth and quivers", "sits jaw-first with sockets darting about"),
V("bounces in place to a clacking beat", "snaps at its own rebounding jaw"),
V("catches a meal between chattering teeth", "grinds a meal between its teeth"),
V("rests upside down on the crown of its cranium", "wedges its jaw shut and stops bouncing"),
V("hunts {target} in tight hopping circles", "hunts {target} with one tilted socket"),
V("attacks {target} in a teeth-first arc", "attacks {target} with a ricocheting cranium"),
V("bumps craniums with another", "chatters a greeting toward nearby company"),
V("cackles in rapid jaw-clacking bursts", "rattles with a hollow, breathless guffaw"),
V("pounds task material with its crown", "carries a task load clenched between its teeth"));
Add(voices, "living_house",
V("shuffles forward on creaking foundation stones", "lurches ahead as doors and shutters flap"),
V("settles squarely and braces every corner", "stands with chimney straight and windows fixed ahead"),
V("opens and closes its shutters in rhythm", "rocks its roofline in a slow, creaking dance"),
V("draws fuel through its front door", "feeds a meal into its grinding cellar"),
V("locks its door and dims every window", "sags gently beneath a resting roof"),
V("hunts {target} through swiveling windows", "hunts {target} through a listening chimney"),
V("attacks {target} with a heavy door", "attacks {target} behind a jutting porch"),
V("waves both shutters toward another", "rings an inner bell for nearby company"),
V("rattles every window in a booming laugh", "creaks from cellar to rafters in a long chuckle"),
V("repairs task material with an inner beam", "stacks material with measured foundation steps"));
Add(voices, "living_plants",
V("walks on a braid of probing roots", "pulls itself forward with curling vines"),
V("anchors its roots and lifts every leaf", "folds broad fronds around a knotted stem"),
V("twirls seed pods on thin tendrils", "claps two broad leaves in a crisp rhythm"),
V("draws energy through fine root hairs", "unfurls leaves while absorbing energy"),
V("closes every leaf around its central bud", "sinks into a rooted, slow-pulsing rest"),
V("hunts {target} with pollen-sensitive tendrils", "hunts {target} through wandering roots"),
V("attacks {target} with thorned vines", "attacks {target} behind layered leaves"),
V("entwines tendrils in a slow greeting", "opens a bright bloom toward nearby company"),
V("rustles in a quick leafy chuckle", "shakes dry pods in a rattling laugh"),
V("weaves task material with flexible stems", "binds material with tightening roots"));
Add(voices, "mush_animal",
V("scampers on stubby feet beneath a broad cap", "bounds forward as soft gills puff with each landing"),
V("sits back on its haunches and lowers its cap", "crouches with spongy ears tucked close"),
V("pounces on its own drifting spores", "rolls onto its back and pedals short feet"),
V("nibbles a meal with flat little teeth", "laps a meal with its tongue"),
V("curls beneath its own lowered cap", "nestles into a squat ball with gills closed"),
V("hunts {target} with a porous snout", "hunts {target} through trembling gills"),
V("attacks {target} with its broad cap", "attacks {target} beneath a blinding spore puff"),
V("rubs caps with another in greeting", "sniffs another and chirps through its gills"),
V("squeaks in damp, bubbly bursts", "chuffs until its broad cap wobbles"),
V("packs task material with quick forepaws", "carries a task load balanced on its cap"));
Add(voices, "mush_unit",
V("marches on pale stalk-like legs", "strides with a broad cap tilted forward"),
V("stands with arms folded beneath hanging gills", "tilts its broad cap as the gills pulse"),
V("tosses a spore puff from palm to palm", "tips the broad cap through an exaggerated dance"),
V("chews a meal with a grinding mouth", "drinks a meal in slow mouthfuls"),
V("squats until the cap covers the whole body", "rests upright as the gills pulse slowly"),
V("hunts {target} with a veil of sensing spores", "hunts {target} with tapping fingertips"),
V("attacks {target} with a hardened forearm", "attacks {target} beneath a dense spore cloud"),
V("tips the cap in measured greeting", "presses palms and exchanges a faint spore plume"),
V("chuckles in low, papery puffs", "laughs until spores shake from the gills"),
V("cultivates task material into sturdy panels", "presses material into useful molded shapes"));
Add(voices, "necromancer",
V("paces with a bone-tipped staff clicking beside each step", "glides as its own magic stirs the robe"),
V("bends over a circle of pale runes", "stands rigid while the staff whispers back"),
V("makes finger bones dance across one palm", "conducts a tiny procession of rattling fragments"),
V("draws energy through one raised hand", "draws wan energy through the bone-tipped staff"),
V("sleeps upright inside a ring of orbiting bones", "rests the brow against the staff as pale lights orbit"),
V("hunts {target} through a floating jaw's whispers", "hunts {target} with a cold spectral wisp"),
V("attacks {target} with conjured grasping hands", "attacks {target} with grave-pale force"),
V("greets another with a tap of the staff", "trades layered whispers with nearby company"),
V("laughs in a papery, hollow rasp", "chuckles while its orbiting bones knock together"),
V("threads task material into jointed frames", "inscribes pale commands along material"));
Add(voices, "plague_doctor",
V("hurries with coat tails snapping behind", "steps beneath a long beaked mask"),
V("stands with gloved hands clasped at the chest", "tilts the mask while its beak filters sound"),
V("drums gloved fingers along one sleeve", "balances the long beak above folded gloves"),
V("takes measured bites behind the mask", "draws energy through the narrow beak"),
V("reclines without removing mask or gloves", "dozes seated with both gloves folded"),
V("hunts {target} through the mask's round lenses", "hunts {target} by turning the long beak"),
V("attacks {target} with both gloved hands", "attacks {target} with a thrust of the long beak"),
V("nods toward another and raises one glove", "bows the long beaked mask toward nearby company"),
V("chuckles dryly behind the hollow beak", "lets out a muffled laugh through layered cloth"),
V("measures task material into labeled portions", "sterilizes task material with a controlled flame"));
Add(voices, "printer",
V("trundles forward on humming rollers", "slides along while its paper tray rattles"),
V("idles with a steady green indicator", "pauses as internal gears tick into alignment"),
V("feeds out a strip covered in dancing marks", "whirs through an alternating self-test pattern"),
V("draws ink from a sealed cartridge", "pulls a blank sheet through its turning rollers"),
V("powers down with its tray tucked closed", "dims its display while the print head parks"),
V("hunts {target} with a traveling scan bar", "hunts {target} through its narrow glass slit"),
V("attacks {target} with a rapid sheet volley", "attacks {target} with its snapping tray"),
V("beeps twice and flashes its status light", "exchanges neatly printed greeting slips"),
V("chatters its gears in a mechanical laugh", "chirps a laugh through sequenced tones"),
V("copies precise symbols onto task material", "collates task material into squared stacks"));
Add(voices, "skeleton",
V("clatters forward on bare jointed feet", "strides with loose ribs clicking together"),
V("stands with both hands hooked into its rib cage", "sits in a neatly folded pile of bones"),
V("juggles three knuckles through its ribs", "removes its jaw and makes it chatter by hand"),
V("gnaws a meal with bare teeth", "pours energy through its empty mouth"),
V("stacks its bones into a tidy dormant heap", "leans against its own shin and goes slack"),
V("hunts {target} with empty sockets lowered", "hunts {target} with a detached ear bone"),
V("attacks {target} with a sharpened forearm", "attacks {target} by separating and reassembling"),
V("rattles finger bones toward another", "clicks jaws with nearby company"),
V("cackles with its jaw flapping wide", "shakes from skull to toes in hollow laughter"),
V("sorts task material by length", "fastens material with strips pulled through its ribs"));
Add(voices, "tumor_monster_animal",
V("lopes on uneven limbs beneath pulsing growths", "scrambles forward with one swollen shoulder leading"),
V("huddles low as nodules throb along its back", "rests its heavy head on a cluster of folded limbs"),
V("chases a twitching tendril around its flank", "paws at bubbles moving beneath its hide"),
V("tears a meal with crowded teeth", "draws energy through several puckered mouths"),
V("curls around its largest pulsing mass", "slumps into a pulsing heap of slow contractions"),
V("hunts {target} through a ring of wet nostrils", "hunts {target} with sensitive nodules"),
V("attacks {target} behind a hardened growth", "attacks {target} with several mouths"),
V("nuzzles another with a broad sensory lobe", "trades low pulses through touching growths"),
V("gurgles from several throats at once", "wheezes in a wet, hiccupping laugh"),
V("packs task material with fleshy fibers", "drags material using a hooked extra limb"));
Add(voices, "tumor_monster_unit",
V("lumbers upright on mismatched legs", "pulls a swollen frame forward with an oversized arm"),
V("hunches while clustered eyes blink in sequence", "braces both hands against a pulsing abdomen"),
V("makes two smaller hands wrestle across its chest", "drums a rhythm on hardened nodules"),
V("chews a meal through a sideways mouth", "feeds energy into a pulsing growth"),
V("folds extra limbs around its swollen torso", "rests with every eye closing one after another"),
V("hunts {target} with clustered eyes", "hunts {target} using a thin tasting tendril"),
V("attacks {target} with its oversized fist", "attacks {target} between hardened lobes"),
V("raises a small palm toward another", "touches sensory tendrils in a pulsing greeting"),
V("laughs in overlapping throaty pitches", "snorts through several vents in uneven rhythm"),
V("molds dense tissue around task material", "uses three hands to bind material under tension"));
Add(voices, "white_mage",
V("walks beneath a robe edged in steady light", "glides with a smooth staff held upright"),
V("stands inside a soft ring of ordered sigils", "rests both hands atop a pearl-bright staff"),
V("folds little stars from threads of light", "makes small sparks orbit the staff"),
V("draws energy through an open palm", "draws energy through the staff"),
V("sleeps within a dim shell of pale light", "bows the hood and lets the staff stand guard"),
V("hunts {target} with a searching luminous mote", "hunts {target} through the staff's crystal"),
V("attacks {target} with a shining barrier", "attacks {target} with cleansing light"),
V("offers a pearl glow toward another", "bows as two pale halos briefly overlap"),
V("laughs in a clear, ringing cadence", "chuckles as bright motes bob around the hood"),
V("mends task material with woven light", "purifies material in a pearl-white glow"));
Add(voices, "zombie",
V("shambles forward with one foot dragging", "lurches ahead on stiff, reaching arms"),
V("sways in place with its jaw hanging loose", "slumps forward until a sudden twitch straightens it"),
V("reaches repeatedly for its dangling sleeve", "rocks side to side in an uneven imitation of dancing"),
V("bites into a meal with broken teeth", "gnaws a meal without closing its lips"),
V("collapses in a limp heap", "dozes standing with its forehead pressed down"),
V("hunts {target} through a ruined nose", "hunts {target} with an unbroken forward stare"),
V("attacks {target} with both stiff hands", "attacks {target} with broken teeth"),
V("groans face to face with another", "pats another with a cold, stiff hand"),
V("gurgles through a crooked jaw", "barks a hoarse chuckle"),
V("hauls a load with stiff arms", "presses task material with its full weight"));
Add(voices, "snowman",
V("waddles on a rolling rounded base", "pivots forward as its packed sections sway"),
V("balances its stacked form without swaying", "holds stick-like limbs beside its rounded body"),
V("twirls both stick-like limbs in broad circles", "rotates its rounded sections in opposite directions"),
V("absorbs energy through its packed body", "compacts a meal into its rounded middle"),
V("settles each packed section into a dormant stack", "draws its stick-like limbs against its cold body"),
V("hunts {target} by rotating its rounded upper body", "hunts {target} through pulsing cold-body effects"),
V("attacks {target} with sweeping stick-like limbs", "attacks {target} with a burst of its own packed snow"),
V("waves one stick-like limb toward another", "tips its rounded upper body toward nearby company"),
V("shakes its stacked sections in a powdery chuckle", "crunches through a soft, body-rumbling laugh"),
V("compacts task material with its rounded body", "pushes a load with both stick-like limbs"));
}
}

View file

@ -0,0 +1,459 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddInvertebrateExtendedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddExtended(
voices,
"acid_blob",
V("warbles through fizzing surface bubbles", "ripples its rim in a wet, rising cadence"),
V("folds a budding lobe slowly into a reproductive union", "tightens its surface around a pulsing germ"),
V("etches planting seams with a narrow acidic feeler", "bathes each planting point in a measured secretion"),
V("dusts reproductive grains from one tacky lobe to another", "rolls a pollen film across its adhesive rim"),
V("pinches off a measured bead and absorbs one in return", "opens a surface pocket to barter with pulsing rim-signals"),
V("sweeps a thin pseudopod in search of a catch", "fans a sensing film outward before snapping it inward"),
V("rolls its mass forward in a series of hauling surges", "anchors its rear rim and drags with a broad front lobe"),
V("lays a mild sealing film over {target}", "presses a cool regenerative lobe against {target}"),
V("spreads into a smothering sheet over the flame", "jets damp acidic foam at the flame"),
V("streams away in one stretched ribbon", "retracts every feeler and pours into a rapid glide"),
V("anchors a broad rim and raises a stable central mound", "spreads firm lobes until its mass rests securely"),
V("hardens its leading edge into a rippling guard", "raises a striking lobe charged with corrosive pressure"),
V("tracks each line with a hair-thin surface filament", "pulses paired eye-like spots from mark to mark"),
V("draws loose life-glow through its translucent skin", "cups a fading essence inside a sealed inner bubble"),
V("opens a rear pore and expels a spent acidic bead", "contracts from front to back and releases spent fluid"),
V("sends contradictory ripples around its rim", "splits its leading lobe twice before drawing both halves back"),
V("pulls its mass inward as inner bubbles brighten", "rests wide while restorative pulses thicken its center"),
V("raises an unbidden spire that curls into its own surface", "paddles one lobe against the rhythm of the rest"),
V("slides a silent filament toward {target}", "reaches an opaque surface pocket toward {target}"),
V("bucks as foreign pulses race through its mass", "forms jagged lobes that strike without its usual flow"),
V("drifts in sleep while dim shapes bloom beneath its skin", "replays slow phantom ripples across its resting pool"));
AddExtended(
voices,
"ant_black",
V("stridulates a clipped rhythm through its body plates", "clicks its mandibles beneath a steady antenna beat"),
V("aligns abdomen to abdomen in a brisk reproductive clasp", "circles once with linked feelers before mating"),
V("scores straight planting furrows with its mandibles", "tamps each planting point with all six feet"),
V("combs pollen along its forelegs and antennae", "presses its dusted body against receptive blossoms"),
V("barters with rapid paired feeler taps", "passes and receives with precise mandible grips"),
V("searches for a catch with jaws poised", "waits under still antennae before snapping its mandibles"),
V("locks its jaws on the haul and pulls in a straight course", "braces all six feet and drags without veering"),
V("grooms {target} with fine mouthpart strokes", "presses both antenna tips gently against {target}"),
V("beats at the flame with rapid abdomen sweeps", "scrapes a smothering path forward with its forelegs"),
V("scurries away in a low straight burst", "folds its feelers back and drives all six feet rapidly"),
V("tests its surroundings with brisk antenna taps before stopping", "settles all six feet into a compact ordered stance"),
V("sets its feet square and opens its mandibles", "advances in a disciplined line with antennae level"),
V("follows each mark with alternating feeler taps", "holds still while both antennae read from side to side"),
V("hooks a fading life-thread between its mandibles", "draws the gathered essence along both antennae"),
V("raises its abdomen and releases a compact dropping", "plants its forefeet as its abdomen briefly contracts"),
V("crosses and recrosses a straight path", "taps one antenna rapidly while the other holds rigid"),
V("folds low as energy returns through its six limbs", "grooms each leg in sequence during recovery"),
V("marches backward while its antennae insist forward", "repeatedly opens one mandible and closes the other"),
V("slips flattened antennae and mandibles toward {target}", "tries to pinch {target} before backing away silently"),
V("jerks in broken straight lines under an alien impulse", "snaps its jaws while both feelers curl against its head"),
V("tucks all six feet close as its antennae twitch in sleep", "makes faint marching motions beneath a resting crouch"));
AddExtended(
voices,
"ant_blue",
V("ticks its mouthparts in a measured ascending scale", "draws paired antenna arcs to a precise body hum"),
V("matches alternating feeler strokes before a balanced mating clasp", "joins abdomen tips while all six feet hold a careful stance"),
V("sets planting points at equal intervals with paired jaws", "levels each furrow with alternating forefoot strokes"),
V("maps pollen between crossing antennae and forelegs", "turns in exact angles while brushing reproductive dust onward"),
V("barters with mirrored feeler taps on both sides", "rotates paired mouthparts in a measured give-and-take"),
V("angles its antennae while searching for a catch", "closes both jaws in a precisely timed fishing snap"),
V("sets centered mandibles on the haul and steps backward evenly", "pulls with alternating six-foot braces"),
V("sweeps both antennae symmetrically over {target}", "tends {target} with equal strokes of its paired mouthparts"),
V("fans the flame with alternating wingless body pivots", "presses a measured smothering edge forward with both forelegs"),
V("retreats in exact zigzags with feelers laid back", "sidesteps away through alternating angular turns"),
V("surveys in widening antenna arcs before planting its feet", "settles into alignment with paired forefoot adjustments"),
V("holds a high squared stance with jaws centered", "paces in measured angular steps with mandibles ready"),
V("brackets each line between parallel antennae", "advances both feeler tips across the marks together"),
V("triangulates a loose life-spark between its feelers", "channels gathered essence down paired antennae in matched pulses"),
V("balances high and releases a neat abdominal pellet", "holds every foot fixed as its abdomen contracts"),
V("turns left and right by identical angles without advancing", "draws mismatched symbols with its crossing antennae"),
V("rests on straightened legs as strength pulses in pairs", "folds each limb in mirrored sequence while recharging"),
V("traces an exact circle with only one feeler", "steps in a rigid pattern its body did not choose"),
V("times a reach for {target} between alternating antenna sweeps", "tries to nip {target} before withdrawing in a precise zigzag"),
V("moves in impossible angles as foreign force bends its joints", "crosses both antennae tightly while its feet pace alone"),
V("rests narrow while paired feelers sketch silent patterns", "ticks its feet in symmetrical dream motions"));
AddExtended(
voices,
"ant_green",
V("scrapes its jaws in springing syncopation", "drums raised forelegs beneath a bouncing chirr"),
V("vaults into a hooked reproductive embrace", "links feelers overhead while abdomen tips meet"),
V("cuts planting slits with hooked forefeet", "vaults between planting points and presses them with its abdomen"),
V("sweeps pollen onward with raised forelegs", "hooks reproductive dust into the hairs of its wrists"),
V("barters with mandibles lifted high", "links its forelegs in an arched give-and-take"),
V("poises on folded hind legs while seeking a catch", "hooks downward with both raised forefeet"),
V("loops its forelegs around the haul and bounds backward", "hooks underneath and pulls in springing steps"),
V("clasps {target} gently between hooked wrists", "grooms {target} with elevated mandible strokes"),
V("beats both raised forelegs over the flame", "springs past the flame with broad abdomen sweeps"),
V("vaults away with forelegs tucked over its head", "bounds back in quick doubled leaps"),
V("hooks its forefeet down and settles its weight", "arches its body above six firm leg braces"),
V("raises both forelegs like hooked standards", "bounds forward with mandibles lifted for battle"),
V("holds the marks aloft between its forefeet", "reads each line with one hooked wrist"),
V("catches a life-glimmer between uplifted feelers", "channels gathered essence down its raised forelegs"),
V("rears on four feet and releases from its abdomen", "folds its forelegs overhead as its abdomen contracts"),
V("vaults forward and lands facing the same direction", "grooms one feeler while the other circles wildly"),
V("curls into a high-legged rest as vigor rebounds", "pumps its folded hind legs in a restoring rhythm"),
V("clasps its own antennae and tries to vault beneath them", "holds both forelegs aloft while spinning involuntarily"),
V("hooks one raised foreleg toward {target}", "tries to snag {target} before bounding away"),
V("rears repeatedly as an outside rhythm seizes its legs", "swings its hooked forefeet at empty intervals"),
V("curls around raised forelegs while hind legs twitch", "makes tiny sleeping vaults without leaving its crouch"));
AddExtended(
voices,
"ant_red",
V("clacks wide mandibles in a fierce rolling cadence", "stamps all six feet beneath a hard body rattle"),
V("locks into a forceful reproductive coupling", "circles with jaws spread before abdomen tips join"),
V("tears planting furrows with driving mandible strokes", "rams each planting point with its plated head"),
V("charges among blossoms with dusted body hairs", "scrapes pollen onward using forceful foreleg strokes"),
V("barters between jaws held wide", "seals its give-and-take with a hard antenna strike"),
V("crouches with mandibles open while seeking a catch", "lunges into a sudden six-legged fishing snap"),
V("clamps onto the haul and drives backward without pause", "shoves with head low and legs churning"),
V("braces {target} firmly between its jaws", "tends {target} with rapid mouthpart strokes"),
V("charges the flame with beating forelegs", "drives a smothering body sweep across the flame"),
V("bursts away with jaws still spread", "scrambles backward on splayed feet before turning"),
V("rams its head down before settling on braced feet", "paces with rigid antennae before dropping into a low stance"),
V("plants six feet wide and brandishes open mandibles", "surges into battle in short aggressive bursts"),
V("pins the markings beneath its forefeet", "jabs an antenna along each line in rapid strokes"),
V("seizes a life-flare between its jaws", "drives gathered essence down rigid feelers"),
V("braces low and expels a hard abdominal pellet", "keeps its jaws spread as its abdomen forcefully releases"),
V("charges three directions in quick succession", "locks its jaws open while antennae whip apart"),
V("crouches taut as energy surges back through its legs", "pumps its abdomen in hard restoring pulses"),
V("bites at its own forefeet under a sudden compulsion", "rushes in a tight circle with abdomen raised"),
V("snaps its jaws toward {target}", "tries to clamp {target} before retreating in a rapid burst"),
V("lunges in broken bursts as another will drives it", "clamps and releases its jaws against its own rhythm"),
V("rests low while dream-battles twitch through all six feet", "snaps its mandibles softly in sleep"));
AddExtended(
voices,
"bee",
V("sings through a bright sustained wing hum", "modulates its buzz with pulses of its abdomen"),
V("joins in a brief airborne reproductive coupling", "fans its wings during an abdomen-to-abdomen mating clasp"),
V("scrapes planting points with its forelegs", "presses each planting point using the tip of its abdomen"),
V("brushes pollen from body hairs into packed leg combs", "dusts reproductive grains onward with a vibrating abdomen"),
V("barters with a compact waggle", "gives and receives with precise mouthpart touches"),
V("hovers with forelegs poised while searching for a catch", "dips its legs and rises on a sudden fishing sweep"),
V("hooks its legs around the haul and beats upward", "pulls with wings buzzing at a deep pitch"),
V("fans warm pulsing air over {target}", "grooms {target} with delicate mouthpart strokes"),
V("buffets the flame with concentrated wingbeats", "drives cooling air directly at the flame"),
V("zips away with its abdomen tucked under", "accelerates in a rising line on frantic wings"),
V("tests its surroundings with antennae and circling flights", "settles after repeated abdomen presses against the surface"),
V("curls its abdomen forward and deepens its warning buzz", "holds a rigid hover with legs spread for combat"),
V("walks its forefeet along each line", "reads with both antennae angled over the marks"),
V("draws a life-glow into the pulse of its abdomen", "gathers loose essence through vibrating body hairs"),
V("hangs its abdomen and releases a tiny dropping in flight", "lands, lifts its abdomen, and contracts once"),
V("hovers sideways while its antennae point apart", "starts a waggle sequence and repeatedly breaks the pattern"),
V("rests with wings folded as its body hum steadies", "vibrates flight muscles in a low restorative pulse"),
V("waggles in a pattern that loops against itself", "grooms one wing while the other beats without command"),
V("slips toward {target} on muted wingbeats", "reaches both forelegs toward {target} before darting away"),
V("buzzes at a fractured pitch as its abdomen jerks", "flies in rigid angles under a foreign impulse"),
V("folds its wings while tiny flight tremors cross its body", "waggles faintly in sleep with antennae tucked"));
AddExtended(
voices,
"beetle",
V("rasps hooked feet against its plated sides", "clicks its wing cases in a hollow measured refrain"),
V("opens its wing cases during a close reproductive mounting", "locks hooked feet gently during mating"),
V("furrows planting lines with its hardened brow", "presses planting points beneath its plated body"),
V("brushes pollen onward with hairy forefeet", "parts its wing cases while reproductive dust crosses its back"),
V("barters with taps from both feelers", "takes measured turns with its hooked forefeet"),
V("plants hooked feet and searches for a catch", "snaps its head forward after a still feeler sweep"),
V("wedges its plated back beneath the haul", "grips and drags with forefeet on six braced legs"),
V("presses a smooth wing case against {target}", "tends {target} with careful mouthpart strokes"),
V("beats open wing cases against the flame", "shoves its plated front over the flame"),
V("trundles away with legs pumping beneath sealed cases", "opens its wing cases and bolts on buzzing wings"),
V("tests its footing with hooked feet before settling", "leans its hardened back into a stable resting brace"),
V("lowers its armored brow and spreads all six feet", "opens its wing cases into a broad warrior display"),
V("reads with short feeler sweeps", "pins each line beneath a hooked forefoot"),
V("cups a fading life-light beneath its wing cases", "draws gathered essence through seams in its plated back"),
V("raises its rear plates and releases a compact pellet", "anchors all six feet as its abdomen slowly pushes"),
V("rolls onto its back and pedals without direction", "opens one wing case while keeping the other sealed"),
V("locks its feet and rests as strength returns beneath its shell", "pulses its folded wings in a low restoring rhythm"),
V("rocks on its plated back with legs folded", "repeatedly opens and seals its wing cases without flight"),
V("hooks a folded foreleg toward {target}", "tries to catch {target} before withdrawing with wing cases shut"),
V("clatters as foreign force pries its plates apart", "marches stiffly while its feelers curl inward"),
V("seals its wing cases while sleeping legs slowly pedal", "rocks inside its plated rest through a hollow dream"));
AddExtended(
voices,
"bioblob",
V("warbles through elastic membrane pops", "pulses its rounded skin in a soft resonant sequence"),
V("buds a second pulse within a reproductive membrane join", "mingles inner currents around a tightening germ"),
V("forms shallow planting pockets with rhythmic squeezes", "presses each planting point beneath a rounded membrane dimple"),
V("rolls pollen across its adhesive outer skin", "pulses reproductive dust from one temporary pocket to another"),
V("forms two clear barter chambers in its membrane", "trades with alternating contractions of its surface pockets"),
V("extends a springy membrane tube in search of a catch", "snaps a sensing bulge inward with a whole-body squeeze"),
V("wraps gripping pockets around the haul and heaves", "bounds backward with its membrane held taut"),
V("spreads a warm regenerative film over {target}", "pulses restorative fluid against {target} through a membrane patch"),
V("flattens its damp body across the flame", "pumps cooling fluid through a broad outer blister"),
V("bounds away in rapid whole-body contractions", "stretches forward and recoils into a springing escape"),
V("widens its base and firms the settling membrane", "pulses downward until its rounded body holds steady"),
V("hardens its front into a resilient bulwark", "compresses into a taut spring ready to strike"),
V("forms clear lens-spots that move across each line", "ripples written marks beneath a thin sensing membrane"),
V("draws a life-spark into a glowing inner vesicle", "surrounds gathered essence with concentric pulses"),
V("opens a temporary pore and squeezes out spent matter", "contracts its inner chamber and releases spent fluid"),
V("wobbles between two incompatible shapes", "sends pulses inward when its rim tries to move outward"),
V("draws membrane tight as inner fluid brightens", "rests in a dome while deep restorative pulses recur"),
V("pinches off a bead and repeatedly reels it back", "bounces in place as one inner current reverses"),
V("extends a nearly invisible membrane pocket toward {target}", "tries to fold its reaching membrane over {target}"),
V("jerks into sharp shapes under an alien current", "pops and swells as foreign pulses seize its membrane"),
V("sags into sleep while luminous forms drift inside", "quivers around slow inner dream-currents"));
AddExtended(
voices,
"butterfly",
V("flutters a papery rhythm beneath a faint thoracic hum", "fans broad wings in a slow singing cadence"),
V("joins abdomen tips in a delicate reproductive pairing", "holds a close wing-to-wing mating posture"),
V("scores planting points with slender feet", "presses each planting point beneath the tip of its abdomen"),
V("dusts broad wings and legs with pollen", "unfurls its feeding tube while reproductive grains brush onward"),
V("barters while circling in matched wing arcs", "curls its forelegs in a delicate give-and-take"),
V("skims with feeding tube uncurled while seeking a catch", "dips slender feet and lifts on one broad fishing sweep"),
V("clasps the haul with its legs and laboring wings", "leans its whole flight into the pull"),
V("fans {target} with slow warming wingbeats", "touches {target} gently with its feeding tube tip"),
V("beats broad wings hard across the flame", "folds and opens its wings in repeated smothering strokes"),
V("rises away in steep uneven spirals", "folds its legs tight and drives forward on rapid wingbeats"),
V("tests its footing lightly and comes to rest", "holds its wings upright while its feet establish a steady brace"),
V("spreads its wings into a broad warning plane", "dives to battle with slender legs extended"),
V("walks its feeding tube along written lines", "opens and closes its wings as slender feet track each mark"),
V("catches a life-glimmer between its wing scales", "draws gathered essence along the veins of its wings"),
V("hangs its abdomen and releases a tiny dropping", "holds its wings still as its abdomen briefly contracts"),
V("spirals upward, folds, and drops before opening again", "uncurls its feeding tube toward nothing and recoils"),
V("rests with wings spread as warmth returns through their veins", "pumps its thorax slowly beneath closed wings"),
V("beats left and right wings in opposing rhythms", "loops downward under an unbidden abdominal curl"),
V("settles near {target} with wings concealing its legs", "reaches curled forelegs toward {target} before lifting away"),
V("flaps in rigid jolts as an outside will pulls its abdomen", "folds its wings midflight under a foreign impulse"),
V("sleeps behind closed wings while the edges faintly tremble", "makes slow dream-flights with tucked, twitching legs"));
AddExtended(
voices,
"flower_bud",
V("rustles layered petals in a rising vegetal refrain", "hums through a vibrating hollow stalk"),
V("presses its receptive center into a reproductive bloom", "twines rootlets while pollen reaches its opened core"),
V("parts planting seams with branching root tips", "cups each planting point beneath a leaf"),
V("opens its crown and brushes pollen across receptive petals", "shakes reproductive dust from anther to central folds"),
V("barters by cupping and uncurling paired leaves", "inclines its crown as leaf tips give and receive"),
V("extends a fine root filament in search of a catch", "snaps a curled leaf closed after a patient tremor"),
V("winds rootlets around the haul and contracts its stalk", "braces its base while paired leaves pull"),
V("lays a sap-rich leaf over {target}", "presses regenerative pollen gently onto {target}"),
V("folds damp petals over the flame", "fans broad leaves directly at the flame"),
V("hitches away on frantic root contractions", "draws every petal closed and bends rapidly from danger"),
V("sinks fine roots into a steady settling brace", "opens its crown as its stalk establishes a firm base"),
V("stiffens its stalk and closes petals into a pointed crown", "spreads leaves around a root-braced warrior stance"),
V("traces each line with a curling leaf tip", "turns its crown as root hairs sense each mark"),
V("draws life-light into its receptive center", "channels gathered essence down the veins of its petals"),
V("opens a basal pore and sheds spent fibrous residue", "contracts its root crown and expels dry fibers"),
V("turns its crown between opposing directions", "opens alternating petals while its stalk coils"),
V("roots deeply as sap rises through its stalk", "closes its petals while restorative light pulses at the center"),
V("twines its own leaves around its stalk without cause", "opens one petal repeatedly against the rhythm of the crown"),
V("folds its leaves toward {target} and retracts its roots", "tries to cup {target} between closing petals"),
V("lashes its leaves as foreign sap pulses seize the stalk", "blooms and closes in jagged involuntary bursts"),
V("bows into sleep while dream-petals open inside the bud", "twitches its rootlets beneath a softly pulsing crown"));
AddExtended(
voices,
"fly",
V("buzzes a thin wavering melody on glassy wings", "rubs its wings into a sharp repeating trill"),
V("clasps in a brief reproductive pairing on braced legs", "joins abdomen tips while forefeet drum rapidly"),
V("scratches planting points with bent forelegs", "tamps each planting point with quick six-foot steps"),
V("brushes pollen onward with hairy feet and body", "rubs reproductive dust from forelegs to hind legs"),
V("barters with rapid forefoot drums", "sponges and releases with lowered mouthparts"),
V("hovers in abrupt stops while searching for a catch", "darts downward and snaps back on whining wings"),
V("grips the haul with all six feet and beats backward", "pulls in short bursts of wing speed"),
V("sponges {target} with careful mouthpart presses", "grooms {target} with rapid foreleg strokes"),
V("buffets the flame with whining wingbeats", "darts past the flame in repeated cooling passes"),
V("shoots away through a chain of right-angle turns", "folds its forelegs and accelerates on blurred wings"),
V("samples its footing with each foot before settling", "orbits tightly before bracing on all six legs"),
V("faces forward with wings spread and forelegs raised", "charges into battle in abrupt aerial bursts"),
V("wipes its eyes before tracking each line", "drums bent forefeet along the printed marks"),
V("draws a life-flicker across its many-faceted eyes", "gathers loose essence through vibrating wing veins"),
V("lifts its abdomen and releases a minute dropping", "rubs its forelegs as its abdomen releases"),
V("darts in a square and misses the final turn", "wipes one eye repeatedly while circling on three legs"),
V("rests with wings flat as flight muscles regain their hum", "vibrates its thorax in a low restoring buzz"),
V("loops upside down and hovers there too long", "rubs its hind legs while both forelegs point rigidly ahead"),
V("lands silently beside {target} on padded feet", "reaches all six legs toward {target} before lifting"),
V("jerks through angular flight under a foreign command", "buzzes in broken pulses as its legs grasp at nothing"),
V("sleeps with wings flat while its feet make tiny wiping strokes", "twitches through silent dream-darts"));
AddExtended(
voices,
"garl",
V("rustles papery layers beneath a reedy leaf whistle", "shivers its narrow leaves in a dry descending song"),
V("braids receptive root fibers in a reproductive joining", "parts its layered bulb while pollen settles into its core"),
V("rakes planting seams with fibrous roots", "presses each planting point beneath its layered bulb"),
V("catches pollen among narrow leaves and papery folds", "shakes reproductive dust downward along its stalk"),
V("barters by opening and closing two papery layers", "alternates curled leaf tips in a measured give-and-take"),
V("threads a fine root outward in search of a catch", "jerks its bulb backward when root fibers tighten"),
V("hooks root bundles around the haul and leans away", "wedges its dense bulb behind and drives forward"),
V("binds {target} with a sap-damp layer", "presses pungent regenerative fibers against {target}"),
V("lashes narrow leaves across the flame", "presses its dense damp bulb against the flame"),
V("scrambles away on bunching root fibers", "folds its leaves tight and lurches rapidly aside"),
V("spreads root fibers into a broad settling hold", "stacks its layered bulb firmly above anchored roots"),
V("stiffens narrow leaves into a bristling crown", "swings its dense bulb from a root-braced warrior stance"),
V("runs a leaf tip beneath each line", "parts papery layers as root fibers trace the marks"),
V("draws life-light between its layered skins", "pulls gathered essence down its fibrous roots"),
V("parts its basal layers and expels spent pulp", "tightens its bulb and sheds dry fibers"),
V("winds root fibers in opposite directions", "fans one leaf while every other leaf folds"),
V("rests its bulb low as sap pressure returns", "draws strength inward through tightly coiled roots"),
V("peels one papery layer back and wraps it again", "braids its own leaf tips under an unbidden impulse"),
V("folds dry skins toward {target}", "tries to draw {target} between layered bulb scales"),
V("thrashes its leaves as foreign pressure twists the stalk", "lurches on roots that contract outside its rhythm"),
V("bows its stalk while sleeping roots slowly curl", "rustles inside closed papery layers as it dreams"));
AddExtended(
voices,
"grasshopper",
V("scrapes a bright skipping song from leg against wing", "pulses its hind legs through a rising chirr"),
V("clasps tightly during a balanced reproductive mounting", "joins abdomen tips with hind legs folded close"),
V("kicks planting furrows with spined hind feet", "presses planting points beneath short forefoot stamps"),
V("brushes pollen onward with its body and jointed legs", "springs between pollinating contacts with dusted feet"),
V("barters with alternating forefoot taps", "gives and receives with precise serrated mouthparts"),
V("crouches on folded hind legs while seeking a catch", "springs upward after a sudden fishing snap"),
V("grips the haul with its forefeet and hops backward", "drives forward with both hind feet"),
V("combs {target} with delicate forefoot strokes", "presses its mouthparts carefully against {target}"),
V("kicks across the flame with broad hind-leg sweeps", "leaps past the flame while fanning both wings"),
V("launches away in successive full-length bounds", "folds its feelers back and springs without pause"),
V("tests its footing with deep hind-foot presses", "settles into a stable four-point crouch"),
V("raises on extended hind legs with jaws working", "bounds into battle forefeet-first"),
V("tracks each line with one long feeler", "holds the markings between forefeet while mouthparts tick"),
V("catches a life-spark between extended feelers", "draws gathered essence through a resonant wing pulse"),
V("lifts its abdomen and drops a compact pellet", "folds its hind legs as its abdomen briefly releases"),
V("springs straight up and lands facing backward", "scrapes one broken chirr while both feelers cross"),
V("crouches low as strength coils into its hind legs", "pumps both jumping limbs with slow restoring bends"),
V("kicks one hind leg while the other stays locked", "leaps in place under an unexplained abdominal twitch"),
V("snatches at {target} with folded forefeet", "tries to clasp {target} before bounding away"),
V("launches in jagged bursts under a foreign rhythm", "scrapes a harsh chirr while its hind legs kick alone"),
V("sleeps with long legs folded as tiny jumps twitch within", "moves its mouthparts through a faint dream-chirr"));
AddExtended(
voices,
"lemon_snail",
V("sings through a wet rasp beneath its shell lip", "rocks its shell to a slow foot-pulsed hum"),
V("presses foot to foot in a reciprocal reproductive joining", "touches mating pores beneath crossed feelers"),
V("rasps shallow planting seams with its toothed tongue", "presses planting points beneath the broad front of its foot"),
V("collects pollen on its moist body and feeler tips", "glides reproductive dust across receptive surfaces"),
V("barters with touches from both long feelers", "ripples the front of its foot in a slow give-and-take"),
V("extends its eyestalks while searching for a catch", "casts its head forward and recoils beneath its shell"),
V("sets its muscular foot against the haul and ripples backward", "anchors its shell while the broad foot pushes"),
V("lays a healing trail of mucus over {target}", "presses the soft rim of its foot against {target}"),
V("draws damp mucus over the flame", "swings its shell down in a slow smothering press"),
V("glides away on rapid foot ripples with feelers withdrawn", "pulls its head beneath the shell while sliding aside"),
V("seals its broad foot into a stable settling grip", "tests the boundary with fully extended eyestalks"),
V("rears beneath its shell with all feelers forward", "swings its shell from a firmly anchored warrior stance"),
V("traces each line with the tips of its eyestalks", "rasps lightly beneath the marks with its toothed tongue"),
V("draws a life-glow into the spiral of its shell", "gathers loose essence along its shining mucus trail"),
V("raises its shell and releases a soft waste pellet", "contracts its muscular foot and slowly releases waste"),
V("extends one eyestalk while withdrawing the other", "glides in a circle as its shell tilts the opposite way"),
V("rests half withdrawn as vigor ripples through its foot", "seals close while restorative moisture gathers beneath its shell"),
V("waves crossed feelers while its foot moves backward", "rasps at its own shell lip under a strange impulse"),
V("slides silently toward {target} with feelers tucked", "tries to arch its broad foot over {target}"),
V("twists beneath its shell as foreign pulses seize its foot", "lashes its feelers in movements outside its slow rhythm"),
V("sleeps sealed close while eyestalks twitch within", "rocks its shell slowly as spiral forms fill its dream"));
AddExtended(
voices,
"lil_pumpkin",
V("rattles its hollow ribs beneath a vine-tip rhythm", "whistles through a curling stem in bouncing notes"),
V("twines receptive tendrils into a reproductive joining", "opens its crown as pollen reaches the seeded core"),
V("parts planting seams with forked tendril tips", "rolls its ribbed base over each planting point"),
V("catches pollen on curling vines around its crown", "flicks reproductive dust inward with springing tendrils"),
V("barters by looping and releasing two tendrils", "rocks its ribbed side in a measured give-and-take"),
V("uncurls a thin vine while searching for a catch", "snaps the tendril back into a tight coil"),
V("winds several tendrils around the haul and rolls backward", "braces its ribbed body while coiled vines pull"),
V("wraps a sap-rich tendril around {target}", "presses its soft inner vine gently against {target}"),
V("rolls its broad ribbed body over the flame", "lashes damp vine coils directly at the flame"),
V("bounds away on recoiling tendrils", "rolls rapidly with crown bent and vines tucked"),
V("spreads tendrils into a firm settling lattice", "sets its rounded base while the crown straightens"),
V("stiffens coiled vines around its ribbed body", "butts forward from a tendril-braced warrior stance"),
V("runs a forked vine tip along each line", "tilts its crown while tendrils trace the marks"),
V("draws life-light through its crown into the seeded hollow", "gathers loose essence along curling vine veins"),
V("lifts its base and releases spent fibrous pulp", "contracts its hollow body and expels dry fibers"),
V("rolls forward while every tendril pulls backward", "coils its crown vine around one rib repeatedly"),
V("rests round and still as sap fills each tendril", "pulses its hollow core in a slow restoring rhythm"),
V("ties two of its own vines into a tightening loop", "bounces on its base while the crown twists sideways"),
V("curls broad tendrils toward {target}", "tries to loop its vines around {target} before rolling away"),
V("rattles violently as foreign force plucks its vines", "rolls in broken arcs under an outside impulse"),
V("sleeps on one rib while tendrils curl and uncurl", "echoes soft dream-knocks inside its hollow body"));
AddExtended(
voices,
"sand_spider",
V("drums eight feet in a dry intricate song", "rasps mouthparts beneath alternating leg taps"),
V("locks legs in a careful reproductive embrace", "transfers a mating pulse through paired front appendages"),
V("rakes planting lines with alternating front legs", "tamps planting points with four paired foot presses"),
V("combs pollen through the hairs of its legs", "steps reproductive dust onward across eight contact points"),
V("barters with measured front-foot taps", "alternates folded forelegs in a precise give-and-take"),
V("casts a fine silk line while searching for a catch", "feels along the silk with widely spread feet before jerking back"),
V("binds the haul in silk and pulls with all eight legs", "walks backward while paired feet drag"),
V("lays a sealing silk pad over {target}", "grooms {target} with fine mouthpart strokes"),
V("casts a dense silk sheet over the flame", "beats four pairs of legs in a smothering press"),
V("scuttles away sideways on low-splayed legs", "retracts its front pair and darts in an angular retreat"),
V("anchors silk before folding into a settled crouch", "reads surface tremors through eight feet before settling"),
V("rears on its hind pairs with front legs spread", "pivots sideways in a low fighting stance"),
V("follows each line with alternating front feet", "reads tiny tremors along a taut silk filament"),
V("wraps a life-glimmer in a pulsing silk knot", "draws gathered essence inward through all eight feet"),
V("raises its abdomen and releases a compact dropping", "holds on four feet as its rear briefly contracts"),
V("lifts the wrong leg in every paired sequence", "spins half a turn and freezes with feet crossed"),
V("settles low as vigor returns through eight joints", "flexes each paired leg in a slow restoring wave"),
V("ties a silk loop around its own forelegs", "drums three feet while the other five hold rigid"),
V("casts silk toward {target} with rapid rear pulses", "tries to fold its front legs around {target}"),
V("jerks on stiffened legs as alien tremors command it", "strikes with its front pair outside its usual rhythm"),
V("folds into sleep while feet answer phantom vibrations", "spins a tiny dream-thread beneath its resting body"));
AddExtended(
voices,
"scorpion",
V("clacks both pincers in a hollow antiphonal song", "rattles its plated tail beneath measured claw beats"),
V("clasps pincers during a paired reproductive turning", "joins bodies beneath a carefully arched tail"),
V("shears planting seams with opposing claws", "presses each planting point with the flat of a pincer"),
V("brushes pollen onward between fine pincer hairs", "guides reproductive dust with alternating claw tips"),
V("barters between open pincers", "alternates one claw and the other in a measured give-and-take"),
V("holds one open claw while searching for a catch", "snaps both pincers inward after a tail-balanced pause"),
V("grips the haul with both claws and walks backward", "hooks underneath while eight legs pull"),
V("holds {target} steady in one pincer", "applies a minute regenerative sting to {target}"),
V("beats the flame with broad opposing claws", "presses its plated body low over the flame"),
V("sidesteps away with tail curled tight overhead", "retreats rapidly while both pincers guard its front"),
V("tests its footing with claw tips and walking legs", "lowers its plated body into a settled eight-foot brace"),
V("opens both pincers and poises its tail above", "advances sideways to battle with its plated guard raised"),
V("runs one claw tip beneath each line", "holds the markings between pincers while tail segments count"),
V("catches a life-spark between closing claws", "draws gathered essence down the arch of its tail"),
V("raises its rear plates and releases a compact dropping", "sets all eight feet as its abdomen pushes"),
V("circles its own tail while one claw opens and shuts", "sidesteps left as both pincers insist right"),
V("rests low as strength returns along its plated tail", "folds its claws beneath a slow restorative pulse"),
V("clasps its own tail tip between careful pincers", "walks backward beneath an involuntary claw rhythm"),
V("snaps one claw toward {target} while the other guards", "tries to pinch {target} before withdrawing sideways"),
V("strikes downward as foreign force arches its tail", "clacks its pincers in a rhythm it does not control"),
V("sleeps beneath a lowered tail while claw tips twitch", "dreams of a silent paired turn beneath its arched tail"));
AddExtended(
voices,
"smore",
V("flaps broad layers in a soft stacked refrain", "pipes a thin note through clustered springy stalks"),
V("presses yielding layers into a reproductive joining", "braids ribbonlike leaves as pollen reaches the inner fold"),
V("parts planting seams with bundled stalk tips", "compresses its broad lower layer over each planting point"),
V("catches pollen between broad yielding layers", "flicks reproductive dust onward with ribbonlike leaves"),
V("barters by pinching and opening two soft layers", "alternates bending shoot tips in a gentle give-and-take"),
V("extends a ribbonlike leaf while searching for a catch", "snaps stacked layers shut after a trembling pause"),
V("clamps the haul between broad layers and shuffles backward", "bends bundled stalks into a springing push"),
V("presses a soft sap-filled layer over {target}", "wraps {target} between warm yielding folds"),
V("claps broad layers over the flame", "fans the flame with rapid stacked flaps"),
V("bounds away on compressed springy stalks", "folds its ribbonlike leaves and shuffles rapidly aside"),
V("spreads bundled shoots into a steady settling base", "aligns its stacked crown above a firm fibrous brace"),
V("compresses its layers into a dense springing guard", "raises ribbonlike leaves from a broad warrior stance"),
V("slides a leaf tip beneath each line", "tilts stacked layers as bundled shoots trace the marks"),
V("cups a life-glow between yielding inner folds", "draws gathered essence through its springy stalks"),
V("parts its lowest layers and expels spent fibrous residue", "compresses its crown and sheds soft fibers"),
V("tilts each layer in a different direction", "wraps one ribbonlike leaf around the entire stack"),
V("rests compressed while vigor fills its bending shoots", "slowly expands each layer with a restoring pulse"),
V("claps its upper layers without separating the lower ones", "braids its own leaves under an unbidden bounce"),
V("closes soft layers toward {target}", "tries to pinch {target} between yielding folds"),
V("buckles and springs as foreign force compresses its crown", "flaps unevenly under a pulse outside its body"),
V("settles into sleep while inner layers softly rise and fall", "bounces on folded shoots as muted dreams pulse within"));
}
}

View file

@ -0,0 +1,207 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddInvertebrateSpecializedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddSpecialized(
voices,
"acid_blob",
V("kindles flame beneath a searing pseudopod", "spreads flame with a sweep of its acidic rim"),
V("smothers flame beneath a broad liquid fold", "suppresses flame with jets from its pulsing pores"),
V("pools against its kin in a ring of touching rims", "merges its outline into a visible cluster with kin"),
V("draws the observed life essence through a feeding film", "cups the observed life essence inside a contracting vacuole"),
V("probes for spoils with a hair-thin pseudopod", "reaches for spoils with an opening surface pocket"),
V("burbles as its membrane dimples in rapid waves", "spills a wavering gurgle through its trembling rim"),
V("raises a jagged lobe and spits a sharp wet hiss", "slaps its rim down as surface bubbles crackle"));
AddSpecialized(
voices,
"ant_black",
V("kindles flame with rapid mandible strikes", "spreads flame with straight abdomen sweeps"),
V("smothers flame beneath stamping forefeet", "suppresses flame with rapid abdomen beats"),
V("packs into a straight-bodied cluster with kin", "locks antennae into a visible rank among kin"),
V("draws the observed life essence between closed mandibles", "pulls the observed life essence along both antennae"),
V("probes for spoils with brisk antenna taps", "reaches for spoils with narrowly opened mandibles"),
V("stridulates in clipped pulses as its antennae shiver", "folds low while its mandibles click unevenly"),
V("clacks its mandibles in a hard measured burst", "stamps all six feet beneath rigid antennae"));
AddSpecialized(
voices,
"ant_blue",
V("kindles flame with alternating mandible scrapes", "spreads flame through precise abdomen pivots"),
V("smothers flame with paired forefoot presses", "suppresses flame beneath symmetrical abdomen fans"),
V("forms an angular cluster with evenly spaced kin", "crosses antennae in a visible lattice among kin"),
V("draws the observed life essence between parallel antennae", "channels the observed life essence through paired mouthparts"),
V("probes for spoils with mirrored antenna arcs", "reaches for spoils with both mandibles centered"),
V("ticks its mouthparts as both antennae droop", "draws uneven antenna spirals beneath a thin stridulation"),
V("clicks both mandibles in an exact descending pattern", "cuts rigid angles with its antennae while its feet stamp"));
AddSpecialized(
voices,
"ant_green",
V("kindles flame with hooked foreleg scrapes", "spreads flame with bounding abdomen flicks"),
V("smothers flame beneath crossing forelegs", "suppresses flame with broad sweeps of its raised abdomen"),
V("arches its forelegs across a cluster of kin", "hooks antennae into a visible ring among kin"),
V("draws the observed life essence between uplifted feelers", "pulls the observed life essence down its hooked forelegs"),
V("probes for spoils with one raised foreleg", "reaches for spoils with both mandibles lifted"),
V("scrapes a skipping chirr as its forelegs curl", "bows beneath raised forelegs while its jaws rasp"),
V("flings both hooked forelegs overhead with a harsh chirr", "scrapes its mandibles while its abdomen snaps upward"));
AddSpecialized(
voices,
"ant_red",
V("kindles flame with forceful mandible grinding", "spreads flame with charging abdomen sweeps"),
V("smothers flame beneath pounding forefeet", "suppresses flame with hard full-body swipes"),
V("wedges into a dense cluster with braced kin", "raises spread mandibles inside a visible knot of kin"),
V("draws the observed life essence through parted mandibles", "drags the observed life essence along rigid antennae"),
V("probes for spoils with forceful antenna thrusts", "reaches for spoils with mandibles spread wide"),
V("rattles its body plates as its jaws open and close", "crouches low beneath a broken stridulating rasp"),
V("clashes its mandibles and lashes both antennae", "rears on four feet with a hard abdominal rattle"));
AddSpecialized(
voices,
"bee",
V("kindles flame with a rapid sting scrape", "spreads flame beneath beating wings"),
V("smothers flame with dense wingbeat pulses", "suppresses flame beneath sweeping abdomen fans"),
V("lands in a tight wing-to-wing cluster with kin", "locks legs into a visible hanging cluster with kin"),
V("draws the observed life essence along its unfurled tongue", "pulls the observed life essence between vibrating mouthparts"),
V("probes for spoils with antennae and tongue extended", "reaches for spoils with its forelegs spread"),
V("releases a wavering buzz as its abdomen contracts", "hangs its antennae beneath a broken wing hum"),
V("drives a harsh buzz through flared wings", "curls its stinger forward while its wingbeats rasp"));
AddSpecialized(
voices,
"beetle",
V("kindles flame with scraping mandibles", "spreads flame beneath opening wing cases"),
V("smothers flame under its plated abdomen", "suppresses flame with repeated wing-case claps"),
V("presses wing cases into a plated cluster with kin", "interlocks hooked feet in a visible mound with kin"),
V("draws the observed life essence between its mandibles", "pulls the observed life essence beneath closed wing cases"),
V("probes for spoils with clubbed feelers", "reaches for spoils with hooked forefeet"),
V("rasps its feet along its plates as its feelers sag", "clicks its wing cases through a low uneven tremor"),
V("snaps its wing cases open with a hollow crack", "rakes hooked feet across its plates in a harsh rasp"));
AddSpecialized(
voices,
"bioblob",
V("kindles flame with a hot contracting membrane", "spreads flame through bouncing membrane flicks"),
V("smothers flame beneath an expanding membrane pocket", "suppresses flame with pulsing jets from its pores"),
V("presses its membrane into a quivering cluster with kin", "stacks pulsing lobes in a visible mound among kin"),
V("draws the observed life essence through its translucent membrane", "pulls the observed life essence into a pulsing inner vesicle"),
V("probes for spoils with budding membrane nubs", "reaches for spoils with an expanding ingestion pocket"),
V("warbles through membrane pops as its body sags", "contracts around a low wobbling internal hum"),
V("pops its membrane in a sharp percussive chain", "thrusts a blunt lobe upward through a bubbling rasp"));
AddSpecialized(
voices,
"butterfly",
V("kindles flame with rapid feeding-tube scrapes", "spreads flame beneath fanning wing scales"),
V("smothers flame beneath overlapping wings", "suppresses flame with downward wingbeat fans"),
V("folds wing edges into a visible cluster with kin", "links slender legs in a hanging cluster among kin"),
V("draws the observed life essence along its coiled feeding tube", "pulls the observed life essence between trembling mouthparts"),
V("probes for spoils with its feeding tube uncoiled", "reaches for spoils with its slender forelegs"),
V("flutters in broken pulses as its feeding tube curls", "bows its antennae beneath a thin wing-scale hiss"),
V("lashes its feeding tube through a burst of wingbeats", "claps its wings while its antennae snap outward"));
AddSpecialized(
voices,
"flower_bud",
V("kindles flame with rasping rootlets", "spreads flame with quick petal fans"),
V("smothers flame beneath closing petals", "suppresses flame with broad leaf sweeps"),
V("weaves rootlets into a visible cluster with kin", "presses closed crowns together in a dense cluster of kin"),
V("draws the observed life essence through its root hairs", "pulls the observed life essence into its layered bud"),
V("probes for spoils with uncurling rootlets", "reaches for spoils with cupped lower leaves"),
V("bows its stalk as its petals rustle in broken pulses", "folds its crown inward beneath a papery keening"),
V("snaps its petals wide with a dry crackle", "whips its leaves while its closed crown rasps"));
AddSpecialized(
voices,
"fly",
V("kindles flame with rasping mouthparts", "spreads flame beneath blurred wingbeats"),
V("smothers flame with hammering wing pulses", "suppresses flame beneath sweeping abdominal fans"),
V("hooks legs into a visible buzzing cluster with kin", "packs wing-to-wing inside a tight cluster of kin"),
V("draws the observed life essence through its sponging mouthparts", "pulls the observed life essence between rubbing forefeet"),
V("probes for spoils with forefeet and mouthparts", "reaches for spoils with its sponging tube extended"),
V("buzzes in broken drops as its forelegs cover its eyes", "folds its wings beneath a wavering high whine"),
V("grinds its forefeet beneath a piercing buzz", "flares its wings and spits a jagged wing whine"));
AddSpecialized(
voices,
"garl",
V("kindles flame with fibrous root scrapes", "spreads flame through whipping leaf tips"),
V("smothers flame beneath layered bulb skins", "suppresses flame with dense leaf fans"),
V("braids roots into a visible cluster with kin", "packs layered bulbs into a rustling cluster of kin"),
V("draws the observed life essence through its fibrous roots", "pulls the observed life essence between layered bulb skins"),
V("probes for spoils with fine root fibers", "reaches for spoils with curling leaf tips"),
V("bows its stalk beneath a long papery rustle", "closes its leaves as its bulb layers creak"),
V("lashes its leaves through a dry cutting hiss", "shakes its layered bulb in a hard papery rattle"));
AddSpecialized(
voices,
"grasshopper",
V("kindles flame with scraping hind legs", "spreads flame through forceful wing fans"),
V("smothers flame beneath stamping hind feet", "suppresses flame with downward wing pulses"),
V("folds hind legs into a visible cluster with kin", "crosses feelers inside a tight crouching cluster of kin"),
V("draws the observed life essence between side-working jaws", "pulls the observed life essence along its folded hind legs"),
V("probes for spoils with sweeping feelers", "reaches for spoils with both forefeet"),
V("scrapes a descending chirr as its hind legs fold", "crouches beneath a stuttering wing rattle"),
V("kicks both hind legs through a harsh chirr", "saws a jagged rasp from leg against wing"));
AddSpecialized(
voices,
"lemon_snail",
V("kindles flame with rapid radula strokes", "spreads flame with broad sweeps of its muscular foot"),
V("smothers flame beneath its muscular foot", "suppresses flame with wet mantle contractions"),
V("presses shells into a visible spiral cluster with kin", "overlaps muscular feet in a close cluster of kin"),
V("draws the observed life essence along its rasping radula", "pulls the observed life essence beneath its mantle"),
V("probes for spoils with extended eyestalks", "reaches for spoils with the front of its muscular foot"),
V("withdraws its eyestalks beneath a low shell scrape", "ripples its foot beneath a wavering mantle hiss"),
V("whips both feelers through a wet rasp", "rocks its shell while its radula grates sharply"));
AddSpecialized(
voices,
"lil_pumpkin",
V("kindles flame with rubbing tendril tips", "spreads flame through whipping vines"),
V("smothers flame beneath its ribbed body", "suppresses flame with coiling tendril sweeps"),
V("laces tendrils into a visible cluster with kin", "presses ribbed sides into a tight cluster of kin"),
V("draws the observed life essence through its curling tendrils", "pulls the observed life essence into its hollow core"),
V("probes for spoils with split tendril tips", "reaches for spoils with an uncoiling vine"),
V("droops its crown beneath a hollow internal knock", "curls every tendril as its ribbed body creaks"),
V("snaps its tendrils through a hollow body rattle", "jerks its crown upward while its vines whip"));
AddSpecialized(
voices,
"sand_spider",
V("kindles flame with rasping mouthparts", "spreads flame through rapid foreleg sweeps"),
V("smothers flame beneath four paired leg presses", "suppresses flame with dense silk casts"),
V("interlaces eight legs in a visible cluster with kin", "packs low beneath a lattice of touching legs with kin"),
V("draws the observed life essence through its mouthparts", "pulls the observed life essence along taut silk"),
V("probes for spoils with lifted forelegs", "reaches for spoils with hooked front feet"),
V("folds all eight legs beneath a dry mouthpart tremor", "drums an uneven cadence as its body flattens"),
V("rears four forelegs through a cutting rasp", "strikes its hooked feet together in a hard dry burst"));
AddSpecialized(
voices,
"scorpion",
V("kindles flame with grinding pincer tips", "spreads flame through arcing tail sweeps"),
V("smothers flame beneath closing pincers", "suppresses flame with broad plated-body sweeps"),
V("locks pincers into a visible cluster with kin", "arches tails over a tight cluster of kin"),
V("draws the observed life essence between its pincers", "pulls the observed life essence along its segmented tail"),
V("probes for spoils with open pincer tips", "reaches for spoils with one claw extended"),
V("lowers its tail beneath a wavering pincer clack", "folds its claws inward as its body plates rattle"),
V("snaps both pincers through a hard plated crackle", "lashes its tail overhead while its claws clack"));
AddSpecialized(
voices,
"smore",
V("kindles flame with fibrous stalk scrapes", "spreads flame through flapping crown layers"),
V("smothers flame beneath compressing crown layers", "suppresses flame with broad ribbon-leaf fans"),
V("presses stacked crowns into a visible cluster with kin", "weaves springy stalks through a close cluster of kin"),
V("draws the observed life essence through its fibrous stalks", "pulls the observed life essence between yielding crown layers"),
V("probes for spoils with ribbonlike leaves", "reaches for spoils with opening crown layers"),
V("compresses its crown beneath a soft layered flap", "folds its stalks inward through a wavering rustle"),
V("claps its crown layers in a sharp dry burst", "whips its ribbonlike leaves while its stacked body rattles"));
}
}

View file

@ -0,0 +1,261 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddInvertebrateVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
Add(
voices,
"acid_blob",
V("rolls its leading lobe forward", "pours its mass into another low glide"),
V("holds its rim in a shallow quiver", "settles into a wide motionless pool"),
V("flicks small beads from its rippling edge", "folds two rising lobes over each other"),
V("spreads a thin feeding film across its meal", "draws morsels inward beneath its surface"),
V("flattens until only its skin trembles", "gathers into a low mound and stills"),
V("extends a narrow feeler toward {target}", "streams forward after {target}"),
V("lashes out at {target} with a sudden liquid fold", "rears its front edge at {target} and slaps it down"),
V("touches rims and trades slow surface pulses", "presses close and mirrors another's ripples"),
V("burbles as rings race across its surface", "pops a chain of little bubbles"),
V("pushes a broad lobe steadily at the task", "divides its mass around the task"));
Add(
voices,
"ant_black",
V("keeps a straight course on quick jointed steps", "scurries forward with antennae sweeping"),
V("halts with both feelers angled ahead", "sets all six feet and samples with its antennae"),
V("darts aside and circles back", "crosses and uncrosses its paired forelegs"),
V("clips bites from its meal", "braces its forelegs and rasps at a morsel"),
V("tucks its legs beneath a compact crouch", "lowers its feelers and becomes still"),
V("advances toward {target} with rapid antenna taps", "follows after {target} in tight turns"),
V("locks mandibles on {target} and drives from its hind legs", "ducks low at {target} before snapping its jaws upward"),
V("meets another with brisk feeler strokes", "passes close to another and exchanges antenna taps"),
V("rattles its jaws in a clipped little rhythm", "shivers its feelers through a dry chuckle"),
V("hauls a load with its body pitched forward", "sorts material into a straight row"));
Add(
voices,
"ant_blue",
V("advances in measured steps with wide feeler sweeps", "moves forward in alternating angular turns"),
V("balances high on straightened legs", "pauses to trace a slow arc with each feeler"),
V("pivots in tight loops on alternating feet", "rears and catches its forefeet in a paired clasp"),
V("rotates a morsel between paired mouthparts", "pares bites from its meal"),
V("folds into a narrow resting stance", "rests with its antennae laid along its head"),
V("triangulates toward {target} with alternating feeler taps", "takes an angular zigzag toward {target}"),
V("sidesteps at {target} and pinches from the flank", "sets its feet wide at {target} and closes both jaws"),
V("draws paired symbols with crossing antennae", "paces beside another in matching steps"),
V("ticks its mouthparts in a rising cadence", "taps its forefeet in a quick alternating pattern"),
V("taps each load with both feelers before shifting it", "fits material into a straight line"));
Add(
voices,
"ant_green",
V("bounds forward with its forelegs held overhead", "threads ahead beneath a balanced abdomen"),
V("rests its forelegs across raised mandibles", "stops to groom its feelers with hooked wrists"),
V("spins beneath raised forelegs", "vaults forward and doubles back"),
V("saws at a morsel with its mandibles", "holds a morsel aloft while shaving off bites"),
V("curls around its tucked forelegs", "settles with its legs clasped close to its body"),
V("tests toward {target} with one lifted foreleg", "rushes after {target} with its jaws held open"),
V("swings its raised forelegs at {target}", "hooks at {target} and pulls sideways"),
V("opens its jaws while facing another", "links feelers with another and turns in a brief circle"),
V("scrapes its jaws together in bouncing beats", "drums an alternating pattern with its middle feet"),
V("cuts material into narrow sections", "carries sections of a load one by one"));
Add(
voices,
"ant_red",
V("charges in short bursts with jaws spread", "races forward and brakes on splayed forelegs"),
V("rocks over its braced feet with feelers rigid", "holds a low stance with mandibles parted"),
V("pounces forward and kicks backward", "rushes in tight circles with its abdomen raised"),
V("tears brisk bites from its meal", "pins its meal and bites in rapid strokes"),
V("drops into a tight crouch without relaxing its jaws", "folds its limbs close and rests low"),
V("surges after {target} in rapid bursts", "cuts toward {target} with jaws spread"),
V("lunges at {target} with mandibles wide", "clamps on {target} and twists its whole body"),
V("bumps heads and trades forceful antenna strokes", "marches shoulder to shoulder with another"),
V("clacks its jaws in a rapid rolling burst", "stamps all six feet in a crackling rhythm"),
V("drives a load forward from behind", "grips the task and pulls without pause"));
Add(
voices,
"bee",
V("zips ahead on rapidly beating wings", "bobs forward in a humming flight"),
V("hovers in place with dangling legs", "lands and combs its wings with its hind legs"),
V("loops upward and spirals back down", "dances in tight figures with a wagging abdomen"),
V("unfurls its tongue and draws from a meal", "packs pollen against its hind legs"),
V("folds its wings flat and tucks in its legs", "rests with its head lowered between its forelegs"),
V("angles its feelers toward {target}", "accelerates after {target} with a deepening buzz"),
V("dives at {target} with its abdomen curled beneath it", "buffets at {target} with wings and kicking legs"),
V("touches mouthparts with another in a brief exchange", "faces another while waggling its abdomen"),
V("buzzes in a tumbling uneven trill", "shakes its abdomen through an uneven hum"),
V("brushes pollen into compact bundles", "ferries a gathered load in steady flights"));
Add(
voices,
"beetle",
V("trundles forward beneath closed wing cases", "clambers ahead as its hooked feet lift in sequence"),
V("draws in its legs and lowers its plated back", "stands braced while its feelers make short sweeps"),
V("rolls onto its back and pumps all six legs", "tips onto its side and rocks upright again"),
V("anchors its feet and chews its meal", "works its jaws steadily across a morsel"),
V("seals its wings and settles behind folded legs", "wedges its head low and becomes still"),
V("follows after {target} with its feelers forward", "lumbers toward {target} in a straight line"),
V("rams at {target} with its lowered head", "opens its wing cases at {target} and shoves with all six legs"),
V("knocks feelers against another's plated brow", "circles another and taps shell against shell"),
V("clicks its wing cases in hollow bursts", "rasps its feet against its plated sides"),
V("leans its hardened back into a load", "grips and drags material with hooked forefeet"));
Add(
voices,
"bioblob",
V("inches forward as its front edge swells", "heaves its rounded membrane into a springy roll"),
V("balances as a domed pulse rises and falls", "rests while slow ripples cross its skin"),
V("bounces twice and catches itself in a wide wobble", "pinches off a bead and reels it back inside"),
V("wraps a membrane pocket around each morsel", "draws nutrients inward with a deep contracting pulse"),
V("dims its inner motion and sags into a low mound", "draws its membrane close around a still center"),
V("points a pulsing bulge toward {target}", "bounds after {target} with quick whole-body squeezes"),
V("hardens its front at {target} into a blunt swell", "compresses and springs at {target} as one mass"),
V("joins surfaces and trades alternating pulses", "echoes another's pulse from rim to rim"),
V("warbles through a chain of membrane pops", "jiggles until ripples cross its membrane in rings"),
V("forms gripping pockets around the task", "moves material with alternating squeezes"));
Add(
voices,
"butterfly",
V("floats ahead on broad alternating wingbeats", "loops forward with legs tucked close"),
V("holds its wings upright and still", "opens and closes its wings in slow measured fans"),
V("spirals upward and glides back down", "dips and rises on alternating wingbeats"),
V("uncurls its feeding tube and takes from a meal", "steadies on four legs while drawing nutrients"),
V("folds its wings tight and draws in its legs", "rests behind the narrow line of closed wings"),
V("follows after {target} in rising uneven loops", "glides toward {target} with quick wingbeats"),
V("beats its wings hard at {target}", "veers at {target} and kicks with slender legs"),
V("circles another in paired rising arcs", "rests alongside another with wing edges nearly touching"),
V("flutters in a loose cascade of wingbeats", "bobs through an uneven airy chuckle"),
V("carries a load on its legs", "makes repeated passes over the task"));
Add(
voices,
"flower_bud",
V("hitches its rootlets forward beneath a bending stalk", "leans and draws its stalk after its roots"),
V("holds its closed petals above a steady stalk", "anchors its rootlets and lets its leaves settle"),
V("twirls its stalk until the outer petals fan wide", "bobs its closed crown in quick springing arcs"),
V("presses root hairs outward and draws nutrients in", "cups a morsel beneath its lowest leaves"),
V("folds every petal inward around its center", "bows its crown and slackens its leaves"),
V("angles its crown toward {target}", "pulls its rootlets toward {target} in a tightening curve"),
V("whips its stalk at {target} with its crown closed", "braces its roots at {target} and sweeps its leaves outward"),
V("touches leaf tips and trades a tremor with another", "inclines its crown beside another's petals"),
V("shakes its petals in a crisp papery rattle", "nods through a cascade of rustling leaves"),
V("winds fine roots around the task", "uses paired leaves to lift and place material"));
Add(
voices,
"fly",
V("shoots forward and stops in midair", "skims ahead on blurred, glassy wings"),
V("hovers with its forelegs rubbing together", "holds still and wipes each eye with a bent foreleg"),
V("darts in a square and retraces every turn", "loops upside down before righting in a snap"),
V("sets its feet and sponges at a meal", "lowers its mouthparts for quick repeated tastes"),
V("draws its legs close with wings laid flat", "tucks its legs close and stills its wing buzz"),
V("closes toward {target} by sharp angles", "tracks after {target} with abrupt hovering stops"),
V("slams sideways at {target} with a burst of wing speed", "grapples with {target} while its wings whine"),
V("faces another and drums with its forefeet", "orbits another in close mirrored darts"),
V("buzzes in a broken, hiccupping run", "rubs its wings into a thin trill"),
V("shuttles material in rapid trips", "uses its forefeet to turn the task bit by bit"));
Add(
voices,
"garl",
V("lurches ahead as a layered bulb rocks over its roots", "sets fibrous roots, then hauls its stalk forward"),
V("settles its layered base and holds its stalk upright", "fans its narrow leaves above a rooted pause"),
V("spins on its bulb while loose skins flutter", "whips its leaf tips in alternating circles"),
V("threads fine roots around a meal and draws inward", "parts its papery layers to receive morsels"),
V("closes its leaves around a bowed stalk", "rests its bulb on one side with roots curled beneath"),
V("tilts its stalk toward {target}", "scrambles after {target} on bunching root fibers"),
V("swings its dense bulb at {target} in a low arc", "lashes at {target} with stiff leaves"),
V("braids leaf tips briefly with another's", "presses layered sides together and rustles"),
V("shudders until its dry skins chatter", "flicks its leaves in an alternating crackle"),
V("hooks the task with bundled root fibers", "wedges its layered base behind a load"));
Add(
voices,
"grasshopper",
V("vaults ahead on folded hind legs", "springs forward and lands on braced forefeet"),
V("crouches with its hind legs folded beneath its abdomen", "holds still while its feelers trace broad arcs"),
V("bounds straight up and twists before landing", "kicks both hind legs and leaps after them"),
V("clips bites with side-working jaws", "grips a morsel between its forefeet and chews"),
V("folds its long hind legs tight against its sides", "rests low with feelers laid back"),
V("launches toward {target} in successive long bounds", "leans toward {target} and springs after {target}"),
V("drives both hind feet at {target} in a sharp kick", "leaps at {target} and drops forefeet-first"),
V("crosses feelers with another in alternating taps", "sits beside another and rubs a leg along one wing"),
V("scrapes out a skipping chirr", "pulses its hind legs through an alternating rattle"),
V("kicks loose material into a gathered load", "carries material between its forefeet in short hops"));
Add(
voices,
"lemon_snail",
V("glides forward on a rippling muscular foot", "extends its eyestalks and slides beneath its shell"),
V("rests with its eyestalks half withdrawn", "holds its shell level while the foot stops rippling"),
V("waves both long feelers in crossing loops", "rocks its shell from side to side without advancing"),
V("rasps small strokes across the meal", "pins a morsel beneath the front of its foot"),
V("withdraws beneath the lip of its shell", "seals close with every feeler tucked away"),
V("stretches its eyestalks toward {target}", "glides after {target} with its head extended"),
V("swings its shell sideways at {target}", "rears its head and drives at {target} under its shell"),
V("touches feeler tips and circles shell to shell", "glides alongside another in a close parallel line"),
V("bobs its eyestalks in a slow alternating rhythm", "rocks its shell through a scraping chuckle"),
V("pushes material with the broad front of its foot", "anchors its shell and rasps steadily at the task"));
Add(
voices,
"lil_pumpkin",
V("rolls its ribbed body as a short vine pulls ahead", "scampers on curling tendrils beneath its bobbing crown"),
V("sets its round body down among coiled tendrils", "holds its crown upright while the vine tips rest"),
V("bounces on its rounded base and spins a tendril", "catches one curling vine between two others"),
V("draws a morsel beneath its vine and presses close", "uses a split tendril to guide a morsel inward"),
V("curls every tendril against its ribbed sides", "tips onto one flank and lets its crown droop"),
V("uncurls an extended vine toward {target}", "rolls after {target} with tendrils reaching ahead"),
V("butts its hard rounded body at {target}", "snaps a coiled tendril at {target}"),
V("loops tendrils briefly around another's vine", "rests side by side and taps crowns with another"),
V("rattles its hollow body from within", "bounces as its hollow body knocks"),
V("winds tendrils around the task and pulls", "braces its round body behind a shifting load"));
Add(
voices,
"sand_spider",
V("skates forward on eight low-splayed legs", "scuttles sideways with its body held low"),
V("freezes with each leg bent at a different angle", "settles low while its front legs test faint tremors"),
V("juggles its forefeet in alternating pairs", "spins once on four braced feet"),
V("pins its meal beneath folded forelegs", "works its mouthparts while holding the morsel still"),
V("draws all eight legs into a tight resting knot", "flattens its body and folds its forelegs inward"),
V("feels toward {target} through widely spread feet", "stalks toward {target} in alternating sideways steps"),
V("rears at {target} and strikes with the front pair", "hooks at {target} and pivots sideways"),
V("taps front feet in a measured exchange", "faces another and mirrors each lifted leg"),
V("drums eight feet in a tumbling cadence", "shakes its mouthparts through a dry clicking fit"),
V("draws fine strands around the task", "pulls bound material backward beneath its body"));
Add(
voices,
"scorpion",
V("paces forward with pincers raised and tail balanced", "sidesteps ahead on eight compact legs"),
V("rests low beneath the arch of its tail", "holds both pincers open without a tremor"),
V("passes one pincer beneath the other", "circles its own tail tip in tight steps"),
V("shears a morsel apart between opposing pincers", "holds its meal in one claw and cuts with the other"),
V("lowers its tail and folds its claws beneath its head", "settles with every leg tucked under its plated body"),
V("tests toward {target} with open pincers", "tracks after {target} with its tail poised overhead"),
V("snaps both claws at {target} before driving its tail downward", "snaps one pincer at {target} and counters with the other"),
V("clasps pincers and steps through a paired turn", "touches claw tips in measured alternating taps"),
V("clacks its pincers in a brisk hollow rhythm", "rattles its plated tail in uneven pulses"),
V("grips the task between both claws", "drags material backward with its tail held clear"));
Add(
voices,
"smore",
V("shuffles forward on a bundle of springy stalks", "tilts its stacked crown and steps on bending shoots"),
V("rests its layered crown above folded shoots", "sets its fibrous base and lets each stalk straighten"),
V("bounces its stacked layers in alternating tilts", "twirls a ribbonlike leaf around its crown"),
V("presses one layer around each morsel", "draws nutrients between two yielding layers"),
V("compresses its crown and folds its shoots inward", "settles into a squat stack with leaves tucked close"),
V("leans its upper layer toward {target}", "hurries after {target} on flexing stalks"),
V("springs its stacked body at {target}", "claps two broad layers at {target}"),
V("rests one broad layer against another's crown", "crosses ribbonlike leaves with another"),
V("wobbles until its stacked layers flap together", "rustles its leaves through a bouncing chuckle"),
V("pinches the task between broad yielding layers", "uses bundled stalks to shove material into place"));
}
}

View file

@ -0,0 +1,534 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddMammalExtendedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddExtended(
voices,
"alpaca",
V("hums through a raised muzzle in wavering notes", "sings a soft phrase while its long neck sways"),
V("courts with close humming and a lifted tail", "mates with long legs planted and neck extended"),
V("farms in light, padded steps with split lips busy", "plants and presses with its long neck lowered"),
V("brushes pollen onward through its trailing fleece", "carries pollen along its muzzle and wool"),
V("trades with ears upright and muzzle bobbing", "barters through soft hums and neck dips"),
V("fishes with neck stretched and split lips poised", "fishes with eyes lowered and padded feet held steady"),
V("hauls with fleece bunching above a straight back", "leans forward on padded feet and draws steadily"),
V("heals {target} through delicate split-lip nudges", "kneels and hums while licking {target} gently"),
V("stokes fire with its long neck drawn back", "fans the flames through quick muzzle dips"),
V("flees in long, rocking bounds with fleece flying", "gallops away on padded feet with neck extended"),
V("settles by folding long legs beneath thick fleece", "kneels carefully as padded joints fold under its chest"),
V("stands warrior-straight with neck high and ears fixed", "braces behind a spit and a forward kick"),
V("reads with long neck curved and ears still", "reads line by line through slow, precise head tilts"),
V("gathers life with split lips and careful foot placement", "gathers life with its long neck lowered"),
V("squats on folded hind legs with tail lifted", "relieves itself while balancing on padded feet"),
V("turns its long neck between conflicting directions", "steps sideways as its upright ears swivel unevenly"),
V("recharges kneeling beneath a curtain of fleece", "rests its weight low while its jaw rolls slowly"),
V("pivots stiff-legged as a strange urge takes hold", "stretches its neck forward and paws in short bursts"),
V("steals with soft-footed steps and mobile split lips", "snatches quickly, then retreats behind swaying fleece"),
V("jerks its long neck while its padded feet stamp", "moves in rigid bounds with ears pinned flat"),
V("dreams with folded legs twitching beneath its fleece", "hums faintly as its long neck shifts in sleep"));
AddExtended(
voices,
"armadillo",
V("squeaks a dry tune beneath its plated brow", "sings in clipped chirps while armor bands flex"),
V("courts by circling low and touching pointed snouts", "mates with broad claws braced beneath overlapping armor"),
V("farms by raking in alternating foreclaw strokes", "plants with snout low and shell rocking"),
V("pushes pollen onward with its narrow snout", "carries pollen beneath its plated underside"),
V("trades with quick sniffs and foreclaw taps", "barters from beneath its armored brow"),
V("fishes with broad claws poised and snout extended", "fishes low while armor bands rise with each breath"),
V("hauls backward with digging claws locked down", "pushes steadily behind an armored shoulder"),
V("heals {target} through small snout touches", "heals {target} while keeping broad foreclaws tucked"),
V("stokes fire with short foreclaw scrapes", "fans the flames from beneath its plated brow"),
V("flees in a rapid armored scuttle", "scrambles away with armor bands pumping over short legs"),
V("settles by scraping with broad foreclaws", "turns in a low circle and tucks beneath its shell"),
V("faces battle behind overlapping plates and flexed claws", "holds a warrior crouch with pointed snout forward"),
V("reads with snout tracking side to side", "reads steadily beneath a motionless plated brow"),
V("gathers life through careful sniffs and shallow scrapes", "gathers life with broad claws opening lightly"),
V("raises its armored tail and crouches low", "relieves itself with foreclaws planted wide"),
V("scuttles in crossing circles with snout darting", "halts halfway into a curl and opens again"),
V("recharges curled around its soft underside", "rests low while overlapping bands loosen"),
V("scrabbles abruptly under a strange urge", "rises on hind feet and paddles broad claws"),
V("steals with pointed snout low and claws silent", "hooks away quickly beneath its plated body"),
V("bucks beneath its armor and rakes both claws forward", "uncurls in rigid jolts with snout snapping upward"),
V("dreams curled tightly as armor bands pulse", "scrapes faintly in sleep with one broad foreclaw"));
AddExtended(
voices,
"bandit",
V("sings under the breath with one hand at the throat", "threads a low tune through quick measured breaths"),
V("courts through close gestures and deliberate body turns", "mates with hands braced and hips rocking steadily"),
V("farms in a crouch with quick, exact handwork", "plants through alternating reaches and fingertip presses"),
V("dusts pollen onward with nimble fingertips", "transfers pollen through quick turns of both wrists"),
V("trades through clipped words and counting fingers", "barters with one hand held close"),
V("fishes from a low stance with both hands poised", "fishes with narrowed eyes and still shoulders"),
V("hauls with bent knees and both arms drawing", "shifts its grip through compact hand-over-hand pulls"),
V("heals {target} with fast, precise fingers", "heals {target} with one hand braced and the other pressing"),
V("stokes fire with face turned and forearm raised", "fans the flames through quick wrist turns"),
V("flees through sharp turns and low sprinting steps", "retreats with shoulders tucked and hands close"),
V("settles by lowering one foot and then the other", "crouches with shoulders tucked and hands drawn close"),
V("takes a warrior stance with hands high and knees loose", "advances behind feints and a narrow profile"),
V("reads with one finger marking each line", "reads in quick jumps of narrowed eyes"),
V("gathers life with cupped hands and exact fingertips", "gathers life while shifting between knees and toes"),
V("squats with back turned and shoulders alert", "relieves itself while checking both sides"),
V("cycles through three interrupted gestures", "turns twice with hands hovering at different angles"),
V("recharges in a tight crouch with hands tucked", "rests lightly while breathing through closed lips"),
V("moves under a strange urge through repeated wrist flicks", "paces a tight loop while fingers flex in sequence"),
V("steals with a hooked finger and immediate retreat", "slips close, palms quickly, and turns away"),
V("moves in clipped angles with hands rigidly spread", "jerks upright as each shoulder pulls against the other"),
V("dreams with fingers twitching against folded arms", "makes silent feints while curled in shallow sleep"));
AddExtended(
voices,
"bear",
V("sings in deep pulses through a broad muzzle", "rumbles a tune while massive shoulders sway"),
V("courts upright with muzzle rubbing and heavy huffs", "mates with broad hind paws planted and forepaws braced"),
V("farms through deep scoops of long curved claws", "plants with shoulders rolling behind both paws"),
V("smears pollen onward across its broad muzzle", "carries pollen through thick fur on wide paws"),
V("trades with low grunts and open forepaws", "barters upright on heavy haunches"),
V("fishes with muzzle low and one forepaw hovering", "fishes by swiping with long curved claws"),
V("hauls with jaws set and massive shoulders driving", "drags backward on broad plantigrade paws"),
V("heals {target} with small foreclaw presses", "heals {target} through close muzzle touches"),
V("stokes fire with muzzle lifted and forearms back", "fans the flames with broad furred paws"),
V("flees in a pounding four-pawed gallop", "lumbers away as heavy shoulders rise and fall"),
V("settles by turning its broad body and scraping once", "drops onto its haunches before curling muzzle to paws"),
V("rises warrior-tall with both forepaws spread", "charges behind a roar and rolling shoulders"),
V("reads upright with forepaws held against its chest", "reads through slow sweeps of its broad muzzle"),
V("gathers life between broad cupped paws", "gathers life with claw tips beneath a lowered muzzle"),
V("squats heavily with short tail lifted", "relieves itself on braced hind paws"),
V("swings its broad head through opposing arcs", "rises halfway, drops down, and turns again"),
V("recharges curled densely with paws over muzzle", "rests on its haunches while shoulders slowly slacken"),
V("rocks upright under a strange urge and bats above its chest", "paces heavily while rubbing both forepaws together"),
V("steals with one broad paw and a backward shuffle", "hooks away quickly beneath a lowered muzzle"),
V("rears in stiff jolts with foreclaws spread", "lurches on all fours as its broad head snaps sideways"),
V("dreams with paws kneading and muzzle rumbling", "paddles all four paws while twitching on its side"));
AddExtended(
voices,
"buffalo",
V("sings in a chest-deep bellow beneath curved horns", "rolls a low tune through its beard and broad muzzle"),
V("courts by circling with horned head held broadside", "mates on planted hooves beneath a rising shoulder hump"),
V("farms with broad muzzle low and hooves pressing firmly", "plants through short, horn-guided pushes"),
V("brushes pollen onward through its hanging beard", "carries pollen across its broad muzzle"),
V("trades through deep grunts and measured horn dips", "barters broadside on four hooves"),
V("fishes with nostrils flared and horned brow low", "fishes motionless with beard hanging"),
V("hauls through its neck and massive shoulder hump", "leans forward as broad hooves dig in"),
V("nudges and licks {target} slowly", "heals {target} with curved horns angled aside"),
V("stokes fire with horned brow lowered", "fans the flames with short, heavy head sweeps"),
V("flees in a rolling gallop beneath tossing horns", "thunders away with shoulder hump surging"),
V("settles by folding thick legs under a massive chest", "turns broadside and lowers its horned head"),
V("holds a warrior line with horns level and hooves spread", "drives forward behind its heavy skull"),
V("reads with broad muzzle tracing each line", "reads through slow turns of its horned head"),
V("gathers life using careful muzzle sweeps", "gathers life low beneath its brushing beard"),
V("arches its heavy tail and spreads its hind hooves", "relieves itself beneath a level horned head"),
V("pivots its horned head while hooves step out of rhythm", "starts a charge, checks, and turns broadside"),
V("recharges chest-down with legs folded beneath", "stands ruminating while its shoulder hump settles"),
V("bucks under a strange urge and tosses both horns", "stamps in a tight square with beard swinging"),
V("steals by hooking quickly with its broad muzzle", "edges away behind a shield of curved horns"),
V("lurches in rigid surges with horns sweeping", "stamps unevenly as its heavy head jerks low"),
V("dreams with hooves kicking beneath a heaving chest", "bellows faintly while its horned head shifts"));
AddExtended(
voices,
"capybara",
V("sings in soft whistles through a blunt muzzle", "purrs a bubbling tune with rounded ears flicking"),
V("courts through nose touches and close body circling", "mates on short legs with webbed toes spread"),
V("farms with broad incisors clipping and forefeet pressing", "plants low behind a blunt muzzle"),
V("pushes pollen onward with whiskers spread", "carries pollen across its bobbing blunt nose"),
V("trades through soft whistles and brief muzzle dips", "barters seated squarely on folded feet"),
V("fishes with webbed toes braced and whiskers forward", "fishes with blunt chin held low"),
V("hauls by gripping firmly with broad incisors", "pushes forward on short legs behind a broad chest"),
V("nibbles {target} lightly with broad incisors", "heals {target} with careful forefoot presses"),
V("stokes fire with blunt muzzle tilted away", "fans the flames through short head bobs"),
V("flees in compact bounds on short legs", "scampers away with webbed toes splayed wide"),
V("settles by folding its feet under a barrel body", "turns once and rests its blunt chin low"),
V("faces battle with incisors bared and chest low", "holds a compact warrior crouch on splayed toes"),
V("reads with whiskers brushing close to each line", "reads through small turns of its blunt muzzle"),
V("gathers life with incisors and careful forefeet", "gathers life with whiskers fanned around its muzzle"),
V("raises its short tail and squats on splayed hind toes", "relieves itself with barrel body held level"),
V("bobs between directions while rounded ears flick", "scampers a half-circle and freezes nose-first"),
V("recharges in a square loaf on folded feet", "rests chin-down while its barrel sides slow"),
V("hops repeatedly as a strange urge takes hold", "bobs its blunt head and paddles both forefeet"),
V("steals with a quick incisor grip and low retreat", "nudges close, snatches, and scampers away"),
V("jerks in compact hops with incisors exposed", "paddles stiff forefeet while its blunt head twists"),
V("dreams with webbed toes twitching beneath its body", "whistles faintly as its blunt muzzle bobs"));
AddExtended(
voices,
"cat",
V("sings in rising yowls with whiskers pushed forward", "trills a tune while its tail curls and uncurls"),
V("courts through calling, circling, and cheek presentation", "mates with hind paws planted and tail held aside"),
V("farms with precise paw scrapes and close sniffing", "plants with tucked claws and twitching tail"),
V("brushes pollen onward on silent paws", "carries pollen across whiskers and cheek fur"),
V("trades with measured chirps and one careful paw", "barters seated behind a curling tail"),
V("fishes with body flattened and forepaw hovering", "fishes by striking with unsheathed claws"),
V("hauls backward with teeth set and paws braced", "hooks and draws with curved foreclaws"),
V("licks {target} roughly between gentle paw touches", "heals {target} with whiskers forward and claws tucked"),
V("stokes fire with whiskers drawn back", "fans the flames with its curling tail"),
V("flees in low, elastic bounds with tail streaming", "springs away as hind claws drive hard"),
V("settles by kneading twice and circling tightly", "folds paws beneath its chest and wraps its tail"),
V("takes a warrior crouch with back rippling", "advances sideways with ears flat and claws bare"),
V("reads with pupils tracking steadily across each line", "reads through tiny whiskered head turns"),
V("gathers life with delicate paw hooks", "gathers life while nose and whiskers pulse"),
V("squats with hind legs spread and tail lifted clear", "relieves itself before scraping with both forepaws"),
V("turns after its own tail, then freezes abruptly", "steps toward two directions with ears swiveling apart"),
V("recharges curled nose-to-tail with paws hidden", "rests in a compact loaf while whiskers slacken"),
V("chatters under a strange urge and paws repeatedly", "arches, sidesteps, and lashes its tail without pause"),
V("steals with a silent paw hook and backward spring", "closes its teeth quickly and slips away low"),
V("stalks in rigid steps with pupils stretched wide", "jerks its head sideways while claws open and close"),
V("dreams with paws kneading and tail tip flicking", "chirps asleep as hind legs make tiny pounces"));
AddExtended(
voices,
"cow",
V("sings in long lowing notes through a broad muzzle", "rolls a slow tune beneath a swinging dewlap"),
V("courts with flank sniffing and chin resting across a back", "mates on cloven hooves with tail raised aside"),
V("farms with broad muzzle sweeping and hooves pressing", "plants in slow passes beneath a wide forehead"),
V("sweeps pollen onward across its broad muzzle", "carries pollen on its rough tongue and nose"),
V("trades through low calls and slow forehead dips", "barters while chewing between low signals"),
V("fishes with broad muzzle lowered and nostrils flaring", "fishes on quietly planted cloven hooves"),
V("hauls with broad chest forward and neck straight", "draws steadily as cloven hooves brace"),
V("licks {target} with a broad rough tongue", "heals {target} with its forehead angled aside"),
V("stokes fire with broad muzzle lifted", "fans the flames with slow tail switches"),
V("flees in a heavy gallop with dewlap swinging", "runs away on pounding cloven hooves"),
V("settles by folding its forelegs beneath a broad belly", "turns slowly and lowers its heavy body"),
V("holds a warrior stance with forehead low and hooves wide", "drives ahead behind a swinging horned head"),
V("reads with broad muzzle moving along each line", "reads through slow, square head turns"),
V("gathers life using tongue, muzzle, and careful hooves", "gathers life low beneath a broad forehead"),
V("raises its tail and spreads its hind hooves", "relieves itself while continuing a slow jaw roll"),
V("steps forward and back while its broad head swings", "turns from one side to the other with nostrils flaring"),
V("recharges belly-down while chewing in circles", "rests on folded legs with tail and ears barely moving"),
V("kicks its hind heels under a strange urge", "sidesteps repeatedly with forehead dipping"),
V("steals with a swift tongue curl and muzzle withdrawal", "edges close, closes its broad lips, and backs away"),
V("stamps in uneven beats as its head jerks", "lurches broadside with tail rigid and jaw still"),
V("dreams with cloven hooves twitching under its belly", "lows softly as its broad muzzle shifts"));
AddExtended(
voices,
"dog",
V("sings in rising howls with muzzle lifted", "threads yips into a tune while its tail keeps time"),
V("courts through circling, sniffing, and close tail signals", "mates on braced paws with hindquarters aligned"),
V("farms by digging in alternating forepaw strokes", "plants nose-first with tail held level"),
V("pushes pollen onward with repeated nose passes", "carries pollen across its muzzle with ears forward"),
V("trades through short barks and alternating paw taps", "barters seated upright on its haunches"),
V("fishes with nose low and one forepaw raised", "fishes with a sudden snap after holding still"),
V("hauls with jaws firm and all four paws driving", "pulls backward while shoulders bunch"),
V("licks and nudges {target} carefully", "heals {target} with ears fixed forward"),
V("stokes fire with nose turned and tail lowered", "fans the flames through quick paw strokes"),
V("flees in long bounds with ears swept back", "sprints away as hind paws drive beneath its body"),
V("settles by circling twice and testing with its nose", "scrapes briefly, then folds nose beneath tail"),
V("stands warrior-alert with hackles raised and paws spread", "advances behind bared teeth and braced forelegs"),
V("reads with nose tracing beneath each line", "reads through quick head tilts"),
V("gathers life with nose close and forepaws moving", "gathers life with careful jaw grips and short sniffs"),
V("squats on bent hind legs with tail lifted", "relieves itself while forepaws hold steady"),
V("tilts its head from side to side and circles", "starts forward, wheels back, and sniffs again"),
V("recharges curled tightly with nose beneath tail", "rests flank-down while paws and ears slacken"),
V("chases a strange urge through tight, repeated circles", "bows, springs, and paws in quick succession"),
V("steals with a quick jaw grip and bounding retreat", "slips close nose-first, snatches, and trots away"),
V("moves in stiff lunges with hackles standing", "opens and closes its jaws while its head jerks sharply"),
V("dreams with paws running and muzzle softly yipping", "twitches on its side as its tail taps"));
AddExtended(
voices,
"fox",
V("sings in clear yips through a pointed muzzle", "threads rasping notes while its brush sways"),
V("courts with gekker calls and brush-led circles", "mates on narrow paws with brush lifted aside"),
V("farms through neat forepaw scrapes and precise sniffs", "plants lightly with pointed muzzle low"),
V("brushes pollen onward with its trailing brush", "carries pollen across its narrow muzzle"),
V("trades through quick chirps and delicate paw gestures", "barters seated behind a curled brush"),
V("fishes from a still crouch with ears fixed", "fishes by pouncing forepaws-first"),
V("hauls with narrow jaws set and paws skimming backward", "draws in short pulls beneath a level brush"),
V("nibbles and licks {target} delicately", "heals {target} with pointed ears held forward"),
V("stokes fire with whiskers tucked and brush high", "fans the flames with quick brush sweeps"),
V("flees in light bounds with brush streaming", "darts away on narrow paws through abrupt turns"),
V("settles by circling tightly beneath its own brush", "scrapes with quick forepaws and tucks its muzzle"),
V("takes a warrior crouch with ears flat and brush level", "darts forward behind bared narrow teeth"),
V("reads with pointed muzzle tracking each line", "reads with ears pricked and brush curled close"),
V("gathers life using precise paw taps and muzzle touches", "gathers life lightly with whiskers fanned"),
V("arches its brush and crouches on narrow hind paws", "relieves itself with pointed muzzle held alert"),
V("pivots between sounds with ears pointing apart", "pounces one way, checks, and circles back"),
V("recharges curled beneath its sweeping brush", "rests with pointed muzzle tucked and paws hidden"),
V("springs vertically under a strange urge", "gekker-calls while whipping around after its brush"),
V("steals with a delicate bite and instant sidestep", "slips close on narrow paws and darts away"),
V("stalks in angular jolts with brush rigid", "snaps sideways as its pointed ears flatten"),
V("dreams with narrow paws paddling beneath its brush", "yips faintly while its pointed muzzle twitches"));
AddExtended(
voices,
"goat",
V("sings in broken bleats beneath a lifted chin", "trills nasally while its beard quivers"),
V("courts through horn rubs, sniffs, and raised forequarters", "mates on hard cloven hooves with hind legs braced"),
V("farms with split lips clipping and hooves pressing", "plants through short, horn-guided pushes"),
V("pushes pollen onward with mobile split lips", "carries pollen along its beard and muzzle"),
V("trades through nasal calls and compact horn dips", "barters balanced squarely on hard hooves"),
V("fishes with horizontal pupils fixed and muzzle low", "fishes with forehooves planted close"),
V("hauls with forehead down and cloven hooves gripping", "draws in springing pulls through its narrow chest"),
V("licks {target} with careful lip and tongue strokes", "heals {target} with horns angled along its back"),
V("stokes fire with beard lifted and muzzle back", "fans the flames through compact head tosses"),
V("flees in steep, springing bounds", "scampers away with beard and short tail raised"),
V("settles by placing each hoof and folding narrow legs", "turns once with horns high before kneeling"),
V("stands warrior-ready on stiff legs with horns forward", "rears and drives down behind a compact headbutt"),
V("reads with horizontal pupils following each line", "reads through tiny bearded head tilts"),
V("gathers life with mobile lips and exact hoof placement", "gathers life close beneath its brushing beard"),
V("lifts its short tail and squats on bent hind legs", "relieves itself with forehooves planted together"),
V("hops between positions while horizontal pupils scan", "starts to rear, drops, and turns in place"),
V("recharges chest-down on folded narrow legs", "rests squarely while chewing with a sideways jaw"),
V("rears repeatedly under a strange urge", "twists stiff-legged while tapping its horns together"),
V("steals with split lips and a backward hop", "snatches quickly, then bounds clear on hard hooves"),
V("bucks in rigid bursts with beard snapping", "jerks its horned head while hooves stamp crosswise"),
V("dreams with stiff legs kicking beneath its chest", "bleats softly as its beard and muzzle twitch"));
AddExtended(
voices,
"hyena",
V("sings in whooping pulses through heavy jaws", "cackles a jagged tune beneath rounded ears"),
V("courts through close sniffing and sloping-body circles", "mates with powerful forequarters braced and hindquarters aligned"),
V("farms with crushing jaws and alternating forepaw scrapes", "plants low beneath raised shoulders"),
V("pushes pollen onward with persistent muzzle passes", "carries pollen across its heavy muzzle"),
V("trades through whoops and measured jaw clacks", "barters from a high-shouldered stance"),
V("fishes with heavy head low and rounded ears fixed", "fishes by snapping from braced forequarters"),
V("hauls with jaws locked and shoulders driving", "drags backward as the sloping back tightens"),
V("nibbles {target} carefully with its front teeth", "heals {target} with massive jaws held still"),
V("stokes fire with heavy muzzle turned aside", "fans the flames through powerful forepaw strokes"),
V("flees in an endurance lope with back sloping", "runs away as high shoulders pump steadily"),
V("settles by circling on long forelegs and lowering its jaws", "folds belly-down beneath its raised shoulders"),
V("takes a warrior stance with crushing jaws open", "surges forward behind powerful forequarters"),
V("reads with heavy muzzle moving under each line", "reads while rounded ears remain still"),
V("gathers life with strong forepaws and controlled incisors", "gathers life beneath a lowered heavy neck"),
V("squats with short hindquarters lowered and tail raised", "relieves itself while forelegs stay nearly straight"),
V("lopes a crooked loop and snaps back around", "shifts between crouch and standing as ears swivel"),
V("recharges belly-down with jaws across both paws", "rests on one flank while high shoulders loosen"),
V("cackles under a strange urge and wheels repeatedly", "bounds crookedly while its heavy jaws open and close"),
V("steals with a crushing jaw grip and loping retreat", "creeps in high-shouldered, snatches, and wheels away"),
V("lurches behind rigid forequarters with jaws clacking", "twists its sloping body as the heavy head jerks"),
V("dreams with jaws opening and long forelegs twitching", "whoops faintly while curled beneath raised shoulders"));
AddExtended(
voices,
"monkey",
V("sings in patterned hoots while both hands beat time", "threads chatter into a tune with tail balancing"),
V("courts through grooming gestures and close body displays", "mates with hands braced and long tail held clear"),
V("farms with nimble thumbs turning and pressing", "plants from a squat with both hands"),
V("moves pollen with careful finger-and-thumb pinches", "carries pollen on fingertips while its tail counterbalances"),
V("trades through rapid chatter and open-palmed gestures", "barters by counting across nimble fingers"),
V("fishes in a crouch with one hand hovering", "fishes by snatching while the other hand braces"),
V("hauls with both hands clasped and feet pushing", "draws backward with long tail held straight"),
V("heals {target} with precise fingertips", "heals {target} carefully with both hands while squatting"),
V("stokes fire with quick hands and face turned aside", "fans the flames with open palms"),
V("flees in four-limbed bounds with tail streaming", "scrambles away as hands and feet alternate rapidly"),
V("settles by patting and turning with both hands", "squats low and wraps its long tail close"),
V("takes a warrior crouch with hands spread and teeth bared", "leaps forward behind a slap and grappling reach"),
V("reads with one finger following each line", "reads through quick eye shifts and head tilts"),
V("gathers life through nimble two-handed sorting", "gathers life with precise thumb-and-finger pinches"),
V("squats deep with tail lifted clear", "relieves itself while balancing on feet and one hand"),
V("reaches three ways while its tail counters each turn", "rises on its hind feet, drops, and chatters in place"),
V("recharges curled with hands beneath its chin", "rests in a compact squat while tail wraps close"),
V("claps repeatedly under a strange urge", "leaps and lands while fingers spread and curl"),
V("steals with one quick hand and a tail-balanced retreat", "palms swiftly, then bounds away on all fours"),
V("jerks through broken gestures with fingers splayed", "scrambles in place as head and tail snap opposite ways"),
V("dreams with fingers grasping and tail slowly curling", "chatters softly while hands paddle beneath its chin"));
AddExtended(
voices,
"rabbit",
V("sings in soft honks with nose pulsing rapidly", "chatters a tiny rhythm beneath upright ears"),
V("courts through circling, chin contact, and high leaps", "mates on powerful hind feet with ears laid back"),
V("farms with rapid forepaw scrapes and incisor clips", "plants crouched on folded hind legs"),
V("pushes pollen onward through quick nose-first hops", "carries pollen on its muzzle with ears upright"),
V("trades through nose touches and light forepaw taps", "barters sitting tall on long hind feet"),
V("fishes from a low crouch with ears fixed forward", "fishes with nose rapidly twitching"),
V("hauls with incisors gripping and hind feet pushing", "draws backward through quick, low hops"),
V("licks and nibbles {target} gently", "heals {target} with upright ears held still"),
V("stokes fire with short forepaw scrapes", "fans the flames through quick nose-first hops"),
V("flees in accelerating bounds on long hind feet", "darts away through sharp leaps with ears flattened"),
V("settles by scraping with both forepaws and turning", "folds hind legs beneath a compact loaf"),
V("takes a warrior posture tall on hind feet", "boxes forward with rapid forepaw strikes"),
V("reads with nose tracking beneath each line", "reads while one upright ear swivels"),
V("gathers life with incisors clipping and forepaws pressing", "gathers life from a low hind-leg crouch"),
V("raises its short tail over bent hind legs", "relieves itself in a compact crouch"),
V("hops toward one side while both ears point elsewhere", "freezes, turns, and launches into a second direction"),
V("recharges in a compact loaf with feet hidden", "rests stretched low while long ears settle"),
V("leaps and twists under a strange urge", "darts in tight circles before kicking both hind feet"),
V("steals with one incisor nip and a sudden bound", "edges close nose-first, snatches, and darts away"),
V("jerks through crooked hops with ears rigid", "boxes forward as its nose stops twitching"),
V("dreams with hind feet kicking beneath a compact body", "honks faintly while ears and whiskers twitch"));
AddExtended(
voices,
"raccoon",
V("sings in raspy trills with black forepaws clasped", "chirrs a tune while its ringed tail keeps balance"),
V("courts through face sniffing and two-pawed grooming", "mates on plantigrade paws with ringed tail held aside"),
V("farms with sensitive fingers sifting and turning", "plants while crouched behind a masked face"),
V("moves pollen delicately with both black paws", "carries pollen on sensitive fingers with ringed tail trailing"),
V("trades through chirrs and quick finger counts", "barters sitting upright on plantigrade haunches"),
V("fishes with sensitive forepaws spread and hovering", "fishes by plunging both black paws together"),
V("hauls with fingers hooked and arched back pulling", "draws backward on nimble plantigrade paws"),
V("heals {target} through careful two-pawed touches", "heals {target} fingertip-first beneath its mask"),
V("stokes fire with black paws held back", "fans the flames with its raised ringed tail"),
V("flees in an arched-back gallop with tail streaming", "scampers away on nimble plantigrade paws"),
V("settles by patting around with both sensitive paws", "turns and curls masked muzzle against ringed tail"),
V("stands warrior-upright with black claws spread", "lunges from its haunches behind both grasping paws"),
V("reads with one black finger tracing each line", "reads beneath motionless dark facial markings"),
V("gathers life through two-pawed feeling and precise pinches", "gathers life with sensitive fingers spread"),
V("squats on plantigrade hind paws with ringed tail raised", "relieves itself while both forepaws stay planted"),
V("rubs its paws together, turns, and checks again", "reaches in opposite directions beneath a twitching mask"),
V("recharges curled around its ringed tail", "rests on its side with black forepaws folded"),
V("rubs its forepaws under a strange urge", "rolls and rights itself while ringed tail lashes"),
V("steals with both sensitive paws and a quick tuck", "palms swiftly beneath its chest and scampers away"),
V("jerks upright with black fingers rigidly spread", "paddles both forepaws as its masked head snaps"),
V("dreams with black paws rubbing and ringed tail twitching", "chirrs asleep while sensitive fingers flex"));
AddExtended(
voices,
"rat",
V("sings in thin squeaks while whiskers keep rhythm", "chirps a quick tune between soft incisor bruxes"),
V("courts through whisker contact and rapid close circling", "mates on small hind feet with bare tail extended"),
V("farms by gnawing, scraping, and pressing with pink paws", "plants low behind chisel incisors"),
V("sweeps pollen onward with fanned whiskers", "carries pollen across its pointed muzzle"),
V("trades through rapid squeaks and clasped pink paws", "barters upright with bare tail balancing"),
V("fishes with pointed muzzle low and paws hovering", "fishes by snapping with chisel incisors"),
V("hauls with incisors locked and hind feet driving", "drags backward while bare tail braces each turn"),
V("licks {target} between tiny paw presses", "heals {target} beneath a fan of trembling whiskers"),
V("stokes fire with whiskers pulled back", "fans the flames through rapid forepaw strokes"),
V("flees in a low scurry with bare tail streaming", "darts away through tight turns on close-set feet"),
V("settles by scraping rapidly and curling around its tail", "turns in place before tucking pointed muzzle down"),
V("stands warrior-upright with incisors bared", "rushes low behind whiskers and chisel teeth"),
V("reads with pointed muzzle passing beneath each line", "reads while round ears hold still"),
V("gathers life using pink paws and precise incisor nips", "gathers life with whiskers sweeping both sides"),
V("squats on small hind feet with bare tail lifted", "relieves itself while forepaws hover at its chest"),
V("scurries in two crossing arcs and freezes upright", "turns with whiskers aimed one way and ears another"),
V("recharges curled tightly around its bare tail", "rests belly-down with pointed muzzle on pink paws"),
V("bruxes rapidly under a strange urge and wheels", "clasps its paws while bare tail lashes in circles"),
V("steals with a fast incisor grip and low retreat", "snatches between pink paws and scurries away"),
V("jerks upright with incisors chattering hard", "runs in broken circles as its bare tail stiffens"),
V("dreams with pink paws clasping and tail curling", "squeaks asleep while whiskers pulse rapidly"));
AddExtended(
voices,
"rhino",
V("sings in rough squeals beneath a heavy horn", "rumbles a blunt tune through thick folded lips"),
V("courts through horn-side rubbing and close scenting", "mates on three-toed feet with massive shoulders braced"),
V("farms by pressing with broad lip and heavy feet", "plants through short, horn-led pushes"),
V("sweeps pollen onward with its square lip", "carries pollen across thick folded lips"),
V("trades through rough snorts and slow horn dips", "barters standing square on three-toed feet"),
V("fishes with small ears fixed and broad lip low", "fishes beneath a level horn"),
V("hauls with horn base low and shoulders driving", "leans its folded hide forward on stout legs"),
V("heals {target} through broad-lip nudges", "heals {target} with heavy horn angled aside"),
V("stokes fire with horn and muzzle lifted", "fans the flames through heavy head sweeps"),
V("flees in a pounding charge on three-toed feet", "runs away with folded hide shaking over thick shoulders"),
V("settles by folding stout legs beneath thick hide", "turns heavily and lowers horn and chin"),
V("holds a warrior line with horn level", "charges forward behind massive skull and shoulders"),
V("reads with square lip passing beneath each line", "reads through slow horned head sweeps"),
V("gathers life with broad lip and careful foot pressure", "gathers life low beneath its heavy horn"),
V("raises its short tail and bends thick hind legs", "relieves itself while three-toed feet stay spread"),
V("pivots heavily as small ears point opposite ways", "starts a charge, halts, and swings its horn aside"),
V("recharges flank-down on thick folded hide", "rests with stout legs tucked and horn angled low"),
V("bucks under a strange urge and tosses its horn", "stamps a tight pattern on three-toed feet"),
V("steals with a quick square-lip grip and shoulder turn", "edges close beneath its horn and tramps away"),
V("lurches in rigid charges as its horn snaps sideways", "stamps unevenly beneath twitching folded hide"),
V("dreams with three-toed feet pushing and horn shifting", "rumbles asleep while its thick lips pulse"));
AddExtended(
voices,
"sheep",
V("sings in wavering bleats through a narrow muzzle", "threads soft nasal notes while dense fleece trembles"),
V("courts through woolly cheek rubs and close circling", "mates on narrow hooves with fleece pressed close"),
V("farms with split lip clipping and small hoof presses", "plants beneath a lowered woolly brow"),
V("brushes pollen onward through its fleece", "carries pollen on its muzzle and wool"),
V("trades through short baas and gentle forehead dips", "barters while standing square beneath its fleece"),
V("fishes with narrow muzzle low and ears angled forward", "fishes on close-planted hooves"),
V("hauls with fleece bunching over narrow shoulders", "draws steadily while small hooves brace"),
V("heals {target} through careful muzzle nudges", "heals {target} with woolly forehead angled aside"),
V("stokes fire with fleece held back", "fans the flames through quick muzzle dips"),
V("flees in stiff, bouncing strides with wool shaking", "runs away on narrow hooves beneath dense fleece"),
V("settles by folding slim legs beneath a round fleece", "turns once and tucks muzzle against wool"),
V("takes a warrior stance behind lowered woolly brow", "drives forward from braced hooves with forehead first"),
V("reads with narrow muzzle tracing below each line", "reads while ears angle from the fleece"),
V("gathers life with split lip and delicate hoof placement", "gathers life beneath a curtain of wool"),
V("raises its short tail over bent hind legs", "relieves itself with narrow forehooves together"),
V("steps in a tight square while ears angle apart", "lowers its forehead, checks, and turns again"),
V("recharges round-bodied on folded legs", "rests muzzle-deep against fleece while sides slow"),
V("springs stiff-legged under a strange urge", "thrusts its forehead forward and hops backward"),
V("steals with split lips and a quick woolly turn", "nudges close, grips briefly, and trots away"),
V("bucks in rigid hops with fleece shuddering", "jerks its woolly forehead down as hooves cross"),
V("dreams with narrow hooves twitching beneath fleece", "bleats faintly while its woolly cheek shifts"));
AddExtended(
voices,
"unicorn",
V("sings in clear nickers beneath its spiral horn", "whinnies a bright tune while its long mane ripples"),
V("courts through arched-neck passes and muzzle touches", "mates on bright cloven hooves with horn held high"),
V("farms with precise hoof presses and horn-guided turns", "plants beneath a flowing mane"),
V("pushes pollen onward with mobile lips", "carries pollen along its muzzle beneath a lifted horn"),
V("trades through bell-like nickers and measured head dips", "barters with spiral horn upright"),
V("fishes with horn angled aside and muzzle low", "fishes on motionless cloven hooves"),
V("hauls with arched neck straightening into each pull", "draws steadily while bright hooves brace"),
V("heals {target} through gentle touches of mobile lips", "heals {target} with spiral horn angled past one shoulder"),
V("stokes fire with mane and tail drawn back", "fans the flames through high forehoof strokes"),
V("flees in a light canter with mane streaming", "gallops away beneath a level spiral horn"),
V("settles by folding bright legs and curving horn aside", "turns once before resting beneath its mane"),
V("stands warrior-tall with spiral horn aligned", "surges forward behind high forehooves and lowered horn"),
V("reads with muzzle following beneath each line", "reads through small, poised turns of its horn"),
V("gathers life with mobile lips and exact hoof placement", "gathers life with spiral horn lifted"),
V("raises its flowing tail and bends its hind legs", "relieves itself on balanced cloven hooves"),
V("steps high in crossing directions with ears flicking", "turns its arched neck twice and paws once"),
V("recharges on folded legs with mane draped close", "rests muzzle-low while its spiral horn angles aside"),
V("rears under a strange urge and paws in sequence", "canters a tight ring with mane and tail streaming"),
V("steals with mobile lips and a light backward step", "dips beneath its horn, grips quickly, and canters away"),
V("moves in rigid high steps as its horn jerks", "rears abruptly with mane snapping across its neck"),
V("dreams with bright hooves cantering against folded legs", "nickers asleep while spiral horn and ears shift"));
AddExtended(
voices,
"wolf",
V("sings in a long howl with muzzle raised", "weaves yips into a tune while its chest expands"),
V("courts through muzzle licks, circling, and tail signals", "mates on long braced legs with bushy tail aside"),
V("farms with powerful forepaw scrapes and nose checks", "plants from an efficient, low stance"),
V("pushes pollen onward through steady nose-led passes", "carries pollen across its muzzle with tail level"),
V("trades through low whines and measured muzzle gestures", "barters seated tall on its haunches"),
V("fishes from a flattened crouch with ears fixed", "fishes with a sudden snap after holding still"),
V("hauls with jaws set and long legs driving", "draws backward while shoulders stay level"),
V("licks {target} and nibbles with careful teeth", "heals {target} with ears held forward"),
V("stokes fire with muzzle turned aside", "fans the flames with its bushy tail"),
V("flees in a long, fully extended lope", "runs away with level back and ears swept flat"),
V("settles by circling and scraping with strong forepaws", "folds chest-down with chin between extended paws"),
V("takes a warrior stance with ears forward and jaws open", "rushes ahead from a level-backed crouch"),
V("reads with muzzle tracking under each line", "reads while pointed ears remain fixed"),
V("gathers life with nose close and forepaws precise", "gathers life from a long-legged crouch"),
V("squats on bent hind legs with bushy tail raised", "relieves itself while forelegs remain straight"),
V("fans between directions with nose and ears angled apart", "starts a lope, checks sharply, and circles"),
V("recharges curled tightly beneath its bushy tail", "rests chest-down with chin over long forepaws"),
V("bows and springs repeatedly under a strange urge", "circles in an efficient lope while snapping upward"),
V("steals with a quick jaw grip and silent retreat", "stalks close nose-first, snatches, and lopes away"),
V("paces in rigid lines with hackles lifted", "jerks its muzzle sideways while jaws snap shut"),
V("dreams with long legs running beneath a curled body", "howls faintly while its bushy tail twitches"));
AddExtended(
voices,
"worm",
V("sings as a faint rasp through contracting segments", "pulses a soft rhythm along its bristled underside"),
V("courts by aligning and rippling beside another body", "mates through close segment contact and coordinated contractions"),
V("farms by drawing its front segments forward", "plants through slow, bristle-anchored ripples"),
V("pushes pollen onward through looping body contact", "carries pollen along its segments in forward pulses"),
V("trades by curling close and tapping its tapered front", "barters through measured body pulses"),
V("fishes with its tapered front held motionless", "fishes through a sudden full-body contraction"),
V("hauls by anchoring bristles and shortening its body", "draws backward through wave after muscular wave"),
V("heals {target} through gentle front-segment contact", "heals {target} through tiny controlled contractions"),
V("stokes fire through short front-segment ripples", "fans the flames with its tapered front"),
V("flees through rapid contractions and flattened curves", "crawls away as bristles drive in quick succession"),
V("settles by coiling segment over segment", "sweeps its tapered front once before relaxing"),
V("takes a warrior coil with front segments lifted", "lashes forward from a bristle-anchored curve"),
V("reads by passing its tapered front along each line", "reads through tiny lateral ripples"),
V("gathers life with its mouth opening and controlled pulls", "gathers life through delicate front-segment contractions"),
V("contracts its rear segments and holds still", "relieves itself while the tapered front remains extended"),
V("crawls into a loop and reverses halfway", "points its tapered front one way as the body pulls another"),
V("recharges in a loose coil with bristles relaxed", "lies extended while faint pulses travel end to end"),
V("knots into repeated loops under a strange urge", "lashes and recoils while its rear segments stay fixed"),
V("steals by hooking its front segments and contracting away", "creeps close, grips briefly, and ripples back"),
V("writhes in broken waves with bristles scraping", "stiffens segment by segment before snapping into a coil"),
V("dreams as slow ripples pass along its resting body", "twitches its tapered front while loosely coiled"));
}
}

View file

@ -0,0 +1,240 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddMammalSpecializedVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
AddSpecialized(
voices,
"alpaca",
V("blows through split lips until a small flame kindles", "breathes through split lips to spread the flame"),
V("presses padded feet over the flame", "snuffs flame beneath a dense fold of fleece"),
V("hums and folds into a shoulder-close herd", "threads its long neck among gathered kin"),
V("draws visible life essence up its long neck into parted lips", "pulls glowing life essence through its fleece toward its chest"),
V("probes for spoils with split lips and an extended neck", "reaches for spoils between careful padded feet"),
V("wails through a raised muzzle in wavering breaths", "hums in long pulses with its neck stretched high"),
V("pins its ears, stamps its padded feet, and spits", "jerks its long neck and grinds out a nasal rasp"));
AddSpecialized(
voices,
"armadillo",
V("rakes broad foreclaws together until flame kindles", "fans flame outward with rapid flexes of its armor bands"),
V("curls its plated body over the flame to smother it", "scrapes flame flat beneath overlapping armor"),
V("tucks its plated flank into a shell-close cluster of kin", "presses its plated flank among gathered kin"),
V("draws visible life essence between its claws and under its plates", "pulls glowing life essence along its armor bands toward its chest"),
V("sniffs for spoils with its pointed snout", "hooks toward spoils with one broad foreclaw"),
V("squeals beneath a tightly folded plated brow", "chatters in dry bursts while its armor bands pulse"),
V("hunches behind its plates and rakes both foreclaws", "snaps its pointed snout and chatters through clenched jaws"));
AddSpecialized(
voices,
"bandit",
V("rubs quick palms until flame kindles between them", "cups the flame and spreads it with flicking fingers"),
V("claps both palms over the flame to smother it", "pinches the flame down between quick fingertips"),
V("signals with two fingers and closes ranks with kin", "slips shoulder to shoulder among gathered kin"),
V("draws visible life essence into cupped hands", "pulls glowing life essence along spread fingers toward the chest"),
V("searches for spoils with quick eyes and probing fingers", "reaches toward spoils with one hand held low"),
V("cries out through cupped hands in a sharp broken call", "hunches with mouth open and breath pulsing audibly"),
V("jabs two fingers outward and spits clipped syllables", "sets the jaw, bares the teeth, and hisses through them"));
AddSpecialized(
voices,
"bear",
V("rubs broad forepaws until flame kindles between the pads", "fans flame outward with heavy sweeps of both forepaws"),
V("smothers flame beneath crossed forepaws", "presses a broad muzzle over the flame and huffs it out"),
V("presses its heavy shoulder among gathered kin", "rises among gathered kin and draws them close with broad forepaws"),
V("draws visible life essence between its claws and into its chest", "pulls glowing life essence through its broad muzzle with deep breaths"),
V("sniffs for spoils with its broad muzzle sweeping", "reaches toward spoils with hooked foreclaws"),
V("roars with its muzzle lifted and forepaws spread", "huffs in deep pulses while its shoulders heave"),
V("bares its teeth and pounds both forepaws together", "rears with claws spread and growls in clipped bursts"));
AddSpecialized(
voices,
"buffalo",
V("snorts through broad nostrils until flame kindles beneath its muzzle", "sweeps its horned head to spread the flame"),
V("stamps the flame beneath broad cloven hooves", "presses its heavy muzzle down and snorts the flame out"),
V("pushes shoulder to shoulder into a close herd", "bellows and joins the gathered herd flank-first"),
V("draws visible life essence along its horns into its brow", "pulls glowing life essence through its broad muzzle toward its chest"),
V("sniffs for spoils beneath its horned brow", "reaches toward spoils with its broad muzzle"),
V("bellows with its beard shaking beneath a raised muzzle", "moans in chest-deep pulses while its nostrils flare"),
V("drops its horned brow, stamps, and snorts sharply", "swings its beard and grinds out a deep nasal rumble"));
AddSpecialized(
voices,
"capybara",
V("gnashes broad incisors until flame kindles", "fans flame outward with quick sweeps of its blunt muzzle"),
V("presses webbed forefeet over the flame", "snuffs flame beneath its broad wet muzzle"),
V("whistles and settles flank to flank among kin", "tucks its barrel-shaped body into a compact gathering of kin"),
V("draws visible life essence between its orange incisors", "pulls glowing life essence along its whiskers toward its chest"),
V("sniffs for spoils with whiskers spread", "reaches toward spoils with webbed forefeet"),
V("whistles through a long piercing note", "squeals with its blunt muzzle lifted"),
V("chatters its incisors and stamps both webbed forefeet", "bares broad incisors and barks in short bursts"));
AddSpecialized(
voices,
"cat",
V("scrapes tucked claws until flame kindles", "lashes its tail to fan flame outward"),
V("pats the flame down with rapid sheathed paws", "covers the flame beneath crossed forepaws and snuffs it"),
V("trills and threads into a tail-close gathering of kin", "presses flank to flank among gathered kin"),
V("draws visible life essence along its whiskers into its chest", "pulls glowing life essence between curved claws"),
V("sniffs for spoils with whiskers thrust forward", "reaches toward spoils with one careful paw"),
V("yowls with its jaw wide and whiskers flared", "wails in rising notes with its tail held rigid"),
V("flattens its ears, lashes its tail, and spits", "arches its back and growls through bared teeth"));
AddSpecialized(
voices,
"cow",
V("snorts through broad nostrils until flame kindles beneath its muzzle", "sweeps its broad muzzle to spread the flame"),
V("stamps flame beneath a cloven forehoof", "presses its broad muzzle down and snorts the flame out"),
V("lows and presses flank to flank into the herd", "presses its broad muzzle among gathered kin"),
V("draws visible life essence along its horns into its chest", "pulls glowing life essence through its broad muzzle"),
V("sniffs for spoils with its broad muzzle", "reaches toward spoils with a rough extended tongue"),
V("lows in a long resonant call with its muzzle raised", "moans in deep pulses while its broad throat vibrates"),
V("stamps a cloven hoof and bellows through flared nostrils", "swings its horned head and grinds out a rough lowing"));
AddSpecialized(
voices,
"dog",
V("scrapes its foreclaws until flame kindles", "pants across the flame and fans it outward"),
V("pats the flame down with quick forepaws", "presses its muzzle close and huffs the flame out"),
V("barks and folds into a shoulder-close pack", "presses its nose among gathered kin until flanks touch"),
V("draws visible life essence along its whiskers into its chest", "pulls glowing life essence through its open jaws"),
V("sniffs for spoils with its nose sweeping", "reaches toward spoils with one extended forepaw"),
V("howls with its muzzle lifted and throat stretched", "whines in repeated pulses while its chest trembles"),
V("bares its teeth, stamps, and barks in clipped bursts", "bristles along the spine and growls through a fixed jaw"));
AddSpecialized(
voices,
"fox",
V("scratches narrow claws together until flame kindles", "sweeps its brush to spread the flame"),
V("beats the flame down beneath quick forepaws", "wraps its broad brush over the flame and smothers it"),
V("gekker-calls and slips into a brush-close gathering of kin", "circles once and presses flank to flank among kin"),
V("draws visible life essence along its whiskers into its chest", "pulls glowing life essence through its pointed muzzle"),
V("sniffs for spoils with its pointed muzzle low", "reaches toward spoils with a narrow forepaw"),
V("screams through an open muzzle with its brush rigid", "yips in a rapid chain while its throat pulses"),
V("pins its ears, lashes its brush, and gekkers sharply", "bares narrow teeth and spits a rasping bark"));
AddSpecialized(
voices,
"goat",
V("scrapes hard forehooves together until flame kindles", "snorts through split lips to spread the flame"),
V("stamps the flame beneath hard cloven hooves", "presses its split lips over the flame and snorts it out"),
V("bleats and shoulders into a horn-close herd", "presses its bearded chin among gathered kin"),
V("draws visible life essence along its horns into its brow", "pulls glowing life essence through its split lips toward its chest"),
V("sniffs for spoils beneath its beard", "reaches toward spoils with mobile split lips"),
V("bleats in a long broken call with its jaw trembling", "wails nasally while its beard shakes"),
V("stamps both forehooves and jerks its horns forward", "bares its lower teeth and snorts in clipped bursts"));
AddSpecialized(
voices,
"hyena",
V("grinds heavy teeth until flame kindles", "pants over the flame and fans it outward"),
V("pounds the flame beneath powerful forepaws", "presses its heavy muzzle close and huffs the flame out"),
V("whoops and shoulders into a close clan of kin", "sets its high shoulders among gathered kin and presses flank to flank"),
V("draws visible life essence between massive premolars", "pulls glowing life essence through its broad muzzle into its chest"),
V("sniffs for spoils with its heavy muzzle low", "reaches toward spoils with one powerful forepaw"),
V("whoops in a rising cascade with jaws spread", "cackles in breathless bursts while its shoulders jolt"),
V("raises its shoulders, bares its teeth, and chatters", "snaps its jaws and growls in broken pulses"));
AddSpecialized(
voices,
"monkey",
V("rubs nimble palms until flame kindles between them", "fans flame outward with quick alternating hands"),
V("claps both hands over the flame to smother it", "beats the flame down with flat rapid palms"),
V("hoots and presses shoulder to shoulder among kin", "reaches both arms into a gathering of kin and joins it"),
V("draws visible life essence into cupped hands", "pulls glowing life essence along curled fingers toward its chest"),
V("searches for spoils with quick eyes and probing fingers", "reaches toward spoils with one long arm"),
V("hoots with its mouth rounded and throat pulsing", "shrills in repeated notes while both hands clutch its chest"),
V("bares its teeth, slaps both palms, and chatters", "jabs one hand outward and barks in clipped syllables"));
AddSpecialized(
voices,
"rabbit",
V("gnashes its incisors until flame kindles", "fans flame outward with rapid forepaw strokes"),
V("pats the flame down with quick forepaws", "presses both forepaws over the flame and smothers it"),
V("honks and settles into a flank-close cluster of kin", "tucks its long ears among gathered kin"),
V("draws visible life essence between its incisors", "pulls glowing life essence along its long ears toward its chest"),
V("sniffs for spoils with its nose pulsing", "reaches toward spoils with both small forepaws"),
V("squeals with its ears rigid and mouth open", "honks in repeated breaths while its hind feet tremble"),
V("thumps both hind feet and chatters its incisors", "pins its ears and grinds out a sharp nasal grunt"));
AddSpecialized(
voices,
"raccoon",
V("rubs sensitive forepaws until flame kindles", "fans flame outward with quick sweeps of its ringed tail"),
V("claps black forepaws over the flame to smother it", "beats the flame down beneath nimble plantigrade paws"),
V("trills and presses into a ringed-tail cluster of kin", "feels along nearby flanks and joins gathered kin"),
V("draws visible life essence between sensitive fingers", "pulls glowing life essence along its ringed tail into its chest"),
V("feels and sniffs for spoils with spread black fingers", "reaches toward spoils with both nimble forepaws"),
V("screeches with its pointed muzzle lifted", "trills in broken pulses while its forepaws clutch together"),
V("arches its back, bares its teeth, and chatters", "slaps both forepaws down and growls in rasping bursts"));
AddSpecialized(
voices,
"rat",
V("gnashes orange incisors until flame kindles", "lashes its bare tail to fan flame outward"),
V("pats the flame down with quick pink paws", "coils its bare tail over the flame and smothers it"),
V("squeaks and huddles into a whisker-close knot of kin", "presses its whiskered muzzle among gathered kin"),
V("draws visible life essence along its whiskers into its chest", "pulls glowing life essence between its orange incisors"),
V("sniffs for spoils with whiskers sweeping", "reaches toward spoils with both pink forepaws"),
V("squeals with whiskers flared and incisors bared", "chirps in rapid pulses while its bare tail coils tightly"),
V("bruxes its incisors and lashes its bare tail", "rears with pink paws spread and hisses through bared teeth"));
AddSpecialized(
voices,
"rhino",
V("snorts through thick lips until flame kindles beneath its horn", "sweeps its massive horn to spread the flame"),
V("stamps the flame beneath a broad three-toed foot", "presses its thick muzzle down and snorts the flame out"),
V("grunts and presses thick shoulders into the herd", "presses its folded hide among gathered kin"),
V("draws visible life essence along its horn into its brow", "pulls glowing life essence through its thick lips toward its chest"),
V("sniffs for spoils beneath its heavy horn", "reaches toward spoils with its broad square lip"),
V("squeals with its horn raised and small ears spread", "moans in rough pulses while its thick throat vibrates"),
V("stamps a three-toed foot and blasts a hard snort", "swings its horn and grinds out a chest-deep rasp"));
AddSpecialized(
voices,
"sheep",
V("scrapes narrow forehooves together until flame kindles", "snorts through split lips to spread the flame"),
V("stamps the flame beneath narrow cloven hooves", "presses dense fleece over the flame and smothers it"),
V("bleats and presses fleece to fleece into the flock", "tucks its woolly muzzle among gathered kin"),
V("draws visible life essence along its curled horns", "pulls glowing life essence through its fleece toward its chest"),
V("sniffs for spoils through its woolly muzzle", "reaches toward spoils with a mobile split lip"),
V("bleats in a long wavering call with its jaw trembling", "wails nasally while its dense fleece quivers"),
V("stamps narrow hooves and jerks its curled horns", "bares its lower teeth and grinds out a broken baa"));
AddSpecialized(
voices,
"unicorn",
V("draws a spark down its spiral horn until flame kindles", "sweeps its spiral horn to spread the flame"),
V("presses the flame flat beneath bright cloven hooves", "touches its spiral horn to the flame and snuffs it"),
V("nickers and joins a mane-close herd of kin", "arches its neck among gathered kin until flanks touch"),
V("draws visible life essence along its spiral horn into its brow", "pulls glowing life essence through its flowing mane toward its chest"),
V("searches for spoils with its horn angled low", "reaches toward spoils with mobile lips"),
V("whinnies with its spiral horn raised and throat stretched", "cries in clear ringing notes while its mane trembles"),
V("strikes a cloven forehoof and tosses its spiral horn", "pins its ears and snorts through bared teeth"));
AddSpecialized(
voices,
"wolf",
V("scrapes strong foreclaws until flame kindles", "pants over the flame and fans it outward"),
V("pounds the flame beneath broad forepaws", "presses its muzzle close and huffs the flame out"),
V("howls and folds shoulder to shoulder into the pack", "sets its long-legged flank among gathered kin"),
V("draws visible life essence along its muzzle into its chest", "pulls glowing life essence between its strong jaws"),
V("sniffs for spoils with its nose sweeping low", "reaches toward spoils with one broad forepaw"),
V("howls with its muzzle lifted and throat extended", "whines in repeated breaths while its chest pulses"),
V("raises its hackles, bares its teeth, and growls", "snaps its jaws and barks in hard clipped bursts"));
AddSpecialized(
voices,
"worm",
V("rasps its bristled underside until flame kindles", "whips its front segments to spread the flame"),
V("coils its segmented body over the flame to smother it", "presses contracting segments across the flame and suppresses it"),
V("twines into a close knot of gathered kin", "threads its tapered front between kin and presses segmented bodies together"),
V("draws visible life essence along contracting segments toward its mouth opening", "pulls glowing life essence through rippling body bands"),
V("probes for spoils with its tapered front", "reaches toward spoils by extending its front segments"),
V("rasps in long pulses through contracting segments", "rustles in repeated dry ripples with its front raised"),
V("coils tightly, lashes its front segments, and rasps", "braces its tiny bristles and whips forward with a dry hiss"));
}
}

View file

@ -0,0 +1,303 @@
using System.Collections.Generic;
namespace IdleSpectator;
public static partial class ActivitySpeciesVoiceCatalog
{
private static void AddMammalVoices(Dictionary<string, ActivitySpeciesVoice> voices)
{
Add(
voices,
"alpaca",
V("paces on padded feet with its long neck held upright", "steps lightly while its fleece sways"),
V("stands chewing with its ears turning", "holds still behind a curtain of fleece"),
V("bounds sideways on stiff legs", "nudges and skips in a woolly burst"),
V("clips a bite with split lips", "chews steadily with a rolling jaw"),
V("folds its long legs beneath a fleece-covered body", "rests with its neck curved over tucked legs"),
V("raises its head near {target} and scans with upright ears", "advances toward {target} with its neck stretched high"),
V("lashes out near {target} with a sharp forward kick", "braces its padded feet before {target} and spits"),
V("touches noses beneath a pair of upright ears", "hums softly beside nearby company"),
V("lets out a bright, breathy hum", "burbles while chewing cud"),
V("carries the load on a straight, fleece-lined back", "kneels on padded joints beside the task"));
Add(
voices,
"armadillo",
V("scuttles low beneath overlapping armor bands", "trots with claws ticking under a plated back"),
V("pauses with its pointed snout raised", "sits low while its armored bands settle"),
V("scrabbles in a quick circle with oversized claws", "pops upright and paddles its foreclaws"),
V("roots with a narrow snout and digs out each bite", "laps up morsels between rapid sniffs"),
V("curls its plated body around its soft underside", "dozes with nose and feet tucked under armor"),
V("samples scents near {target} with claws flexed", "searches around {target} with rapid sniffs"),
V("hunkers near {target} behind its shell and drives forward", "swipes at {target} with powerful digging claws"),
V("sniffs along another armored flank", "touches pointed snouts in a brief greeting"),
V("chatters in a dry, rapid burst", "squeaks from beneath its plated brow"),
V("excavates with alternating strokes of broad foreclaws", "pushes loose material aside with its armored shoulder"));
Add(
voices,
"bandit",
V("slips ahead on quiet, measured steps", "keeps low with one hand held close"),
V("leans back and watches through narrowed eyes", "checks each side with short head turns"),
V("rolls one wrist and flexes quick fingers", "practices a feint and a smooth retreat"),
V("takes bites without lowering the guard", "eats quickly with one hand shielding the meal"),
V("sleeps curled tightly with both hands tucked in", "rests lightly with chin lowered to the chest"),
V("tracks movement near {target} from a crouch", "advances toward {target} with quick hands raised"),
V("slashes toward {target} from a low stance and withdraws", "turns aside near {target} and counters with the off hand"),
V("trades a brief hand sign at close range", "leans in to exchange a few short words"),
V("gives a muffled chuckle through closed lips", "snickers and taps two fingers against the chin"),
V("sorts material with quick fingertips", "checks the task with rapid hand movements"));
Add(
voices,
"bear",
V("lumbers forward with heavy shoulders rolling", "advances on broad plantigrade paws"),
V("rises upright and works its broad nose", "sits back on its haunches with forepaws hanging"),
V("clasps both forepaws and rolls onto one shoulder", "rolls onto its back and bats with broad paws"),
V("tears off a bite with strong jaws", "scoops the meal inward with long curved claws"),
V("curls into a dense mound with paws over its muzzle", "settles heavily on its side and slows its breathing"),
V("follows the scent near {target} with muzzle sweeping side to side", "charges toward {target} with nose low"),
V("rears near {target} and brings both forepaws down", "drives at {target} behind a roar and a heavy swipe"),
V("rubs muzzle and shoulder against another broad flank", "sniffs another face with small rounded ears forward"),
V("huffs out a deep, rolling chortle", "grumbles in a sequence of breathy pulses"),
V("hauls with both forepaws and a braced back", "shoves the task onward with massive shoulders"));
Add(
voices,
"buffalo",
V("moves in a heavy rolling stride beneath a horned brow", "trots with its shoulder hump rising and falling"),
V("stands broadside while its tail flicks", "holds its head low and works its jaw"),
V("bucks and twists with all four hooves briefly clear", "bounds forward and tosses its curved horns"),
V("tears off a bite with a wide muzzle", "chews steadily while its beard brushes its chest"),
V("folds its legs beneath a massive chest", "rests flank-down with its horned head upright"),
V("works its broad nostrils near {target} and follows", "pushes toward {target} with muzzle low and horns level"),
V("drops its horned head near {target} and drives forward", "swings its heavy skull at {target} in a short arc"),
V("presses shoulder to shoulder with nearby company", "grooms a nearby hide with slow tongue strokes"),
V("bellows in a deep, chesty rumble", "snorts and answers with a booming grunt"),
V("leans into the load with neck and shoulder hump", "drags steadily while broad hooves brace"));
Add(
voices,
"capybara",
V("pads along on short legs with webbed toes splayed", "ambles forward with a blunt muzzle leading"),
V("sits squarely with half-lidded eyes and rounded ears", "rests its barrel-shaped body on folded feet"),
V("bobs up and scampers in a compact circle", "hops back on short legs and bobs again"),
V("nibbles the meal quickly with broad orange incisors", "chews a bite along one side of the jaw"),
V("lies flat with its blunt chin between its forefeet", "dozes in a compact heap with ears still twitching"),
V("sniffs near {target} in short deliberate bursts", "moves toward {target} with whiskers spread"),
V("bares broad incisors near {target} and lunges low", "braces before {target} and snaps sharply"),
V("touches blunt muzzles and settles beside nearby company", "grooms a nearby coat with careful front teeth"),
V("purrs in a bubbling series of soft clicks", "whistles once and follows with a throaty chuckle"),
V("grips and shifts material with incisors and forefeet", "pushes the task ahead with a broad chest"));
Add(
voices,
"cat",
V("pads forward on silent, tucked claws", "threads ahead with tail held in a supple curve"),
V("sits upright and wraps its tail around neat paws", "freezes with whiskers spread and ears pivoting"),
V("pounces onto its forepaws and bats from side to side", "springs sideways with back arched and tail high"),
V("pins a morsel with one paw and tears it with its teeth", "licks its lips before taking another bite"),
V("curls nose to tail with paws hidden beneath", "kneads twice before folding into a compact curl"),
V("stalks toward {target} with scapulae rising under the coat", "waits near {target} before a sudden pounce"),
V("lashes at {target} with unsheathed foreclaws", "flattens its ears near {target} and strikes rapidly"),
V("greets with an upright tail and a cheek rub", "grooms a nearby coat with rough, measured licks"),
V("chatters out a bright trill", "purrs around a short chirrup"),
V("hooks the task closer with a careful paw", "inspects the work with whiskers forward and tail twitching"));
Add(
voices,
"cow",
V("walks with an unhurried sway on cloven hooves", "steps forward while its broad muzzle bobs"),
V("stands ruminating with its tail switching", "rests its weight on three legs and chews"),
V("kicks up its hind heels in a heavy skip", "dips its broad forehead and skips sideways"),
V("draws in a bite with its rough tongue", "chews cud in slow circular strokes"),
V("folds its legs and settles on a broad belly", "lies on its side with muzzle resting low"),
V("follows the scent near {target} with muzzle extended", "advances toward {target} behind lowered horns"),
V("swings its horned head at {target} and stamps a forehoof", "drives toward {target} with forehead lowered"),
V("licks a nearby neck with a broad rough tongue", "stands flank to flank and exchanges low calls"),
V("moos in a rising, resonant call", "utters a deep lowing chuckle"),
V("leans its broad chest into the load", "pulls steadily with cloven hooves planted"));
Add(
voices,
"dog",
V("trots ahead with nose active and tail balancing each turn", "pads forward in an even four-beat gait"),
V("sits on its haunches with ears trained forward", "waits with head tilted and tail tapping"),
V("bows on its forelegs and bounds sideways", "bounds in a circle with tail sweeping"),
V("holds the meal between both forepaws and gnaws", "bites repeatedly before licking its muzzle"),
V("circles twice and curls with nose beneath tail", "sprawls on its side with paws twitching"),
V("tracks the scent near {target} with nose sweeping low", "surges toward {target} in long bounding strides"),
V("bares its teeth near {target} and lunges from braced forelegs", "snaps at {target}, pivots, and drives in again"),
V("greets with a nose touch and a broadly wagging tail", "sniffs closely before settling alongside"),
V("pants through a breathy, barking chuckle", "lets out a short yip followed by a huff"),
V("carries the task firmly between its jaws", "digs in with forepaws and pulls backward"));
Add(
voices,
"fox",
V("trots lightly with its brush held level", "slips forward on narrow paws with ears pricked"),
V("sits with its brush curled around slender legs", "stands listening while its pointed ears swivel"),
V("pounces high and lands forepaws-first", "whips around after its own sweeping brush"),
V("nips at the meal with a narrow muzzle", "pins the meal beneath one paw and chews"),
V("curls tightly beneath its sweeping brush", "rests with pointed muzzle tucked against its chest"),
V("tilts its head near {target} before pouncing", "stalks toward {target} with ears fixed ahead"),
V("darts at {target} with a quick bite and springs clear", "twists near {target} and snaps from a narrow stance"),
V("touches pointed muzzles and circles with brush raised", "grooms a nearby ear with delicate nibbles"),
V("gekker-calls in a rapid, rasping burst", "lets out a high yip followed by a throaty chatter"),
V("carries material delicately in its jaws", "scrapes at the task with quick alternating forepaws"));
Add(
voices,
"goat",
V("picks a nimble path on hard cloven hooves", "bounds forward with short springing steps"),
V("stands chewing while horizontal pupils scan", "balances squarely with beard stirring beneath its chin"),
V("hops onto stiff legs and twists in place", "rears briefly and taps its horns together"),
V("takes a bite with mobile split lips", "strips off a bite and chews with a sideways jaw"),
V("tucks its legs beneath a narrow, deep chest", "rests chin-down with horns angled back"),
V("tests scents near {target} with quick sniffs", "bounds toward {target} with horns tipped forward"),
V("rears near {target} and crashes down behind its horns", "drives a compact headbutt at {target} from planted hooves"),
V("rubs horn bases against a nearby neck", "nibbles carefully along another coat"),
V("bleats in a broken, chuckling cadence", "snorts and answers with a nasal trill"),
V("pushes with its forehead while hooves grip", "carries a small load between nimble jaws"));
Add(
voices,
"hyena",
V("lopes ahead with high shoulders and a sloping back", "pads forward on powerful forequarters"),
V("stands squarely with rounded ears tracking every sound", "sits back beneath a heavy neck and watches"),
V("bounds in a crooked circle with jaws gaping", "feints forward and wheels away on long forelegs"),
V("cracks a bite with massive premolars", "tears and swallows with rapid jaw strokes"),
V("lies belly-down with heavy jaws across its paws", "curls on one flank beneath raised shoulders"),
V("quarters near {target} with nose low", "paces toward {target} in an endurance lope"),
V("clamps onto {target} with crushing jaws and braces", "rushes at {target} behind powerful shoulders and snaps"),
V("greets with muzzle low and measured flank sniffing", "grooms a nearby coat with short front-tooth nibbles"),
V("whoops and cackles in a rising cascade", "chatters out a breathless, ringing laugh"),
V("drags the task with jaws locked and shoulders driving", "crushes material between broad teeth"));
Add(
voices,
"monkey",
V("scampers on all fours with its long tail balancing", "bounds ahead and reaches down with deft hands"),
V("squats on its haunches and scans with quick head turns", "perches upright while its fingers pick through its coat"),
V("claps its hands and flicks its tail for balance", "leaps, lands, and flicks its tail for balance"),
V("turns the meal with nimble thumbs before biting", "holds a morsel in both hands and nibbles"),
V("curls on its side with hands tucked beneath its chin", "dozes in a compact crouch with tail wrapped close"),
V("searches near {target} with quick eyes and reaching hands", "bounds toward {target} in a four-limbed rush"),
V("grapples with {target} using both hands", "leaps at {target} with a slap before springing back"),
V("picks carefully through a nearby coat", "touches faces and chatters at close range"),
V("hoots through a rapid string of chattering notes", "bares its teeth in a breathy, bouncing chuckle"),
V("turns and fits material with nimble fingers", "carries material clasped against its chest"));
Add(
voices,
"rabbit",
V("bounds forward on long hind feet", "hops in quick arcs with ears held upright"),
V("sits tall with nose pulsing and ears rotating", "crouches low on folded hind legs"),
V("leaps straight up and twists in midair", "darts in a tight circle before kicking out"),
V("clips each bite with sharp front incisors", "nibbles rapidly while its jaw circles"),
V("settles into a compact loaf with feet hidden", "lies stretched out with ears laid along its back"),
V("sniffs near {target} with nose twitching rapidly", "bounds toward {target} in sudden accelerating leaps"),
V("boxes at {target} with rapid forepaw strikes", "kicks toward {target} with both powerful hind feet"),
V("touches noses and settles flank to flank", "grooms a nearby forehead with tiny licks"),
V("honks softly and chatters its teeth", "lets out a bright squeal between quick nose twitches"),
V("scrapes and gathers with alternating forepaws", "carries small material between its incisors"));
Add(
voices,
"raccoon",
V("ambles forward with masked face low and ringed tail trailing", "walks on nimble plantigrade paws with back arched"),
V("sits upright and rubs its sensitive forepaws together", "pauses with black fingers spread and ears forward"),
V("rolls onto one shoulder with both paws raised", "pounces, tumbles, and rights its ringed tail"),
V("feels over each morsel before taking a bite", "holds the meal in both forepaws and chews neatly"),
V("curls around its ringed tail with masked muzzle tucked", "dozes on its side with forepaws folded together"),
V("probes near {target} with sensitive fingers and a pointed nose", "follows the scent toward {target} with marked face low"),
V("grabs at {target} with both forepaws and bites sharply", "rears near {target} and slashes with black claws"),
V("sniffs another marked face and explores a nearby coat with both paws", "sits close and grooms with careful fingerlike claws"),
V("trills through a raspy series of chuckles", "chatters and chirrs beneath its dark facial markings"),
V("sorts and turns material with deft black paws", "pries at the task with sensitive fingers"));
Add(
voices,
"rat",
V("scurries low with naked tail balancing each turn", "trots in quick close steps with whiskers fanned"),
V("sits upright and washes its muzzle between pink paws", "freezes with whiskers trembling and round ears raised"),
V("clasps its forepaws and chatters its incisors", "darts forward, wheels, and flicks its long tail"),
V("holds a morsel in both paws and gnaws with orange incisors", "nibbles in rapid bites while whiskers brush the meal"),
V("curls into a tight ball around its bare tail", "lies belly-down with pointed muzzle on folded paws"),
V("searches near {target} with whiskers sweeping both sides", "scurries toward {target} with nose held low"),
V("lunges at {target} and bites with chisel incisors", "rears near {target} to box rapidly with both forepaws"),
V("touches noses and grooms around a nearby ear", "huddles close while whiskers cross and tails coil"),
V("bruxes its incisors in a soft, crackling chuckle", "squeaks through a rapid series of chirps"),
V("gnaws the task with tireless incisors", "carries material tucked beneath its chin"));
Add(
voices,
"rhino",
V("tramps forward on three-toed feet beneath a heavy horn", "moves with thick shoulders rolling under folded hide"),
V("stands nearly motionless while small ears swivel", "rests its massive head with horn angled low"),
V("bucks into a short heavy trot", "pivots on stout legs and tosses its horn"),
V("crops a bite with a broad square lip", "chews a bite behind thick folded lips"),
V("folds its stout legs and settles onto thick hide", "lies flank-down with horn and chin resting low"),
V("sniffs near {target} with ears flicking independently", "charges toward {target} with horn level"),
V("charges at {target} behind its lowered horn", "swings its massive skull near {target} and stamps forward"),
V("touches horns lightly before standing side by side", "rubs thick shoulder hide against a nearby flank"),
V("snorts in a rough, rumbling burst", "squeals once and follows with a throaty puff"),
V("pushes the load with horn base and broad forehead", "leans its full weight into the task"));
Add(
voices,
"sheep",
V("walks in close steps beneath a thick fleece", "trots with narrow hooves and wool bouncing"),
V("stands chewing with ears angled out from the wool", "settles squarely while its dense fleece rises and falls"),
V("springs forward on stiff legs and lands together", "butts lightly, backs away, and hops again"),
V("crops a bite with a split upper lip", "chews cud in slow sideways turns"),
V("folds its legs beneath a round fleece-covered body", "rests with muzzle tucked against warm wool"),
V("lifts its muzzle near {target} and follows", "advances toward {target} with woolly forehead lowered"),
V("backs away from {target} and drives forward behind curled horns", "braces narrow hooves near {target} and strikes with its forehead"),
V("presses into nearby company until fleeces touch", "nuzzles beneath a nearby woolly cheek"),
V("bleats in a wavering, breathy cadence", "answers with a short nasal baa"),
V("pulls steadily with fleece bunching over its shoulders", "nudges the task ahead with a woolly brow"));
Add(
voices,
"unicorn",
V("canters with a single spiral horn cutting a clean line", "steps high on bright cloven hooves with mane flowing"),
V("stands poised with horn upright and ears angled forward", "rests one hind hoof while its long mane settles"),
V("arches its neck and bounds on light hooves", "rears, paws once, and lands beneath its streaming mane"),
V("takes a bite with mobile lips", "chews slowly beneath the shadow of its spiral horn"),
V("folds its legs and rests with horn angled safely aside", "lies with its muzzle nestled against a flowing mane"),
V("tracks movement near {target} with horn aligned", "surges toward {target} in a light canter"),
V("drives at {target} with spiral horn lowered", "rears near {target} and strikes with both forehooves"),
V("touches muzzles beneath an arched neck", "combs a nearby mane with careful teeth"),
V("nickers in a clear, bell-like trill", "whinnies through a bright rippling cadence"),
V("lifts and guides the task with the base of its horn", "pulls in a balanced stride on cloven hooves"));
Add(
voices,
"wolf",
V("lopes forward with long legs and level back", "trots in an efficient line with tail held low"),
V("stands with ears pricked and nose raised", "sits tall on its haunches and watches"),
V("bows low on the forelegs before bounding sideways", "wrestles with open jaws and careful pawing"),
V("holds the meal between forepaws and tears sideways", "crunches the meal with strong jaws before licking its muzzle"),
V("curls tightly with bushy tail over its nose", "lies chest-down with chin between outstretched paws"),
V("runs toward {target} with nose low and stride lengthening", "fans out near {target} at an efficient lope"),
V("rushes at {target} with jaws open and shoulders braced", "bites at {target}, releases, and circles on quick paws"),
V("greets with muzzle licks and a low sweeping tail", "leans flank-first against nearby company"),
V("pants out a rough, breathy chuff", "breaks into a rising series of yips and howls"),
V("drags the load with jaws set and legs driving", "scrapes and clears with powerful forepaws"));
Add(
voices,
"worm",
V("extends its front segments and draws the rest forward", "crawls in rippling contractions along its bristled underside"),
V("holds its tapered front still while the body contracts", "rests in a loose curve with segments barely shifting"),
V("loops its flexible body and straightens in a quick ripple", "coils tightly before easing straight"),
V("draws the meal into its mouth opening", "rasps at the meal with steady muscular pulls"),
V("settles into a compact coil with segments relaxed", "lies fully extended with only faint body pulses"),
V("probes near {target} with a tapered front and rippling muscles", "crawls toward {target} in slow curves"),
V("whips near {target} with its front segments and recoils", "braces near {target} and lashes forward"),
V("presses along another segmented body", "twines briefly before crawling alongside"),
V("makes a faint rasp through contracting segments", "rustles in a quick sequence of dry body ripples"),
V("pulls loose material backward beneath its body", "works forward by bracing each band of tiny bristles"));
}
}

View file

@ -6,21 +6,67 @@ 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")
|| k.Contains("crying") || k.Contains("just_cried") || k.Contains("swore")
|| k.Contains("madness")) return "social";
if (k.Contains("social") || k.Contains("talk") || k.Contains("trysocialize")) return "social";
if (k.Contains("lover") || k.Contains("breed") || k.Contains("reproduction")
|| k.Contains("desire")) return "lover";
|| 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")
@ -33,43 +79,62 @@ public static class ActivityVerbMap
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")) return "haul";
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("fireman") || k.Contains("blaze")) return "fire";
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.Contains("king_") || k.Contains("leader_")
|| 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.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")) return "warrior";
|| 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")) return "wait";
|| 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")) return "move";
|| 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.Contains("loot") || k.Contains("family_group")) return "gather_life";
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))
|| !string.IsNullOrEmpty(ActivityProse.PatternActionPhrase(key, false))
|| !string.IsNullOrEmpty(key);
return !string.IsNullOrEmpty(Resolve(key));
}
public static List<string> EnumerateLiveTaskIds()
{
return ActivityAssetCatalog.EnumerateLiveTaskIds();
}
public static string[] EnumerateBehaviorBeatKeys()
{
return (string[])BehaviorBeatKeys.Clone();
}
}

View file

@ -88,9 +88,8 @@ public sealed class ProseVoice
public bool BaseIsCiv { get; }
public bool BaseIsHumanoid { get; }
public bool BaseIsAnimal { get; }
public string FlavorKey { get; }
public int FlavorOrdinal { get; }
public string ProfileTag { get; }
public string VoiceKey { get; }
public ActivityVoiceSource Source { get; }
public bool BaseRecoveryExpected { get; }
public bool BaseRecoverySucceeded { get; }
@ -106,9 +105,8 @@ public sealed class ProseVoice
bool baseIsCiv,
bool baseIsHumanoid,
bool baseIsAnimal,
string flavorKey,
int flavorOrdinal,
string profileTag,
string voiceKey,
ActivityVoiceSource source,
bool baseRecoveryExpected,
bool baseRecoverySucceeded)
{
@ -123,9 +121,8 @@ public sealed class ProseVoice
BaseIsCiv = baseIsCiv;
BaseIsHumanoid = baseIsHumanoid;
BaseIsAnimal = baseIsAnimal;
FlavorKey = string.IsNullOrEmpty(flavorKey) ? LiveSpeciesId : flavorKey;
FlavorOrdinal = flavorOrdinal;
ProfileTag = profileTag ?? "";
VoiceKey = voiceKey ?? "";
Source = source;
BaseRecoveryExpected = baseRecoveryExpected;
BaseRecoverySucceeded = baseRecoverySucceeded;
}
@ -144,9 +141,8 @@ public sealed class ProseVoice
false,
false,
false,
speciesId,
0,
"",
ActivityVoiceSource.Unknown,
false,
false);
}

View file

@ -15,11 +15,7 @@ public sealed class ActivityVoiceAuditResult
/// <summary>Exhaustive live-library gates for voice classification and prose fingerprints.</summary>
public static class ActivityVoiceHarness
{
private static readonly string[] FingerprintKeys =
{
"move", "wait", "task_unit_play", "task_eat", "task_sleep",
"task_hunt", "task_attack", "social", "laugh", "work"
};
private static readonly string[] FingerprintKeys = ActivitySpeciesVoice.AuthoredVerbs;
private static readonly string[] AwkwardProseFragments =
{
@ -42,7 +38,30 @@ public static class ActivityVoiceHarness
"patient citrus",
"game",
"through play",
"in play"
"in play",
"blank persistence",
"seared meal",
"sugared meal",
"sweet meal",
"raw meal",
"tough meal",
"patient care",
"with determination",
"playfully",
"with delight",
"cheerful",
"eagerly",
"contentedly",
"stubborn focus",
"stubborn persistence",
"pollinating work",
"fishing task",
"healing task",
"hauling task",
"stealing motion",
"tends the healing",
"works the farm",
"waits over the fishing"
};
private static readonly string[] UngroundedTerrainFragments =
@ -57,16 +76,27 @@ public static class ActivityVoiceHarness
"close to the ground",
"nose to the ground",
"damp play",
"wet quiet"
"wet quiet",
" in water",
" through water",
" underwater",
" on the shore",
" across the field",
" in the field",
" tests the ground",
" gaining ground",
" grounded "
};
public static ActivityVoiceAuditResult RunAudit(string outputDirectory)
{
List<string> ids = ActivityAssetCatalog.EnumerateLiveActorAssetIds();
var rows = new StringBuilder(32768);
rows.AppendLine("id\tbase\tkind\tmodifier\tfamily\tbody\teffective\tecology\tordinal\trecovery\tfingerprint");
rows.AppendLine("id\tbase\tkind\tmodifier\tfamily\tbody\teffective\tecology\tsource\tvoice_key\trecovery\tfingerprint");
int missing = 0;
int missingAuthored = 0;
int orphanAuthored = 0;
int defaults = 0;
int emptyProse = 0;
int leaks = 0;
@ -77,9 +107,18 @@ public static class ActivityVoiceHarness
int vehicleMismatch = 0;
int awkwardProse = 0;
int terrainLeaks = 0;
int variantBaseFail = 0;
int authoredPhraseFail = 0;
int unmappedTasks = 0;
int missingTaskBags = 0;
int routedTasks = 0;
string sample = "";
string vehicleFingerprint = null;
var fingerprints = new Dictionary<string, string>(StringComparer.Ordinal);
var fingerprintsById = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var voicesById = new Dictionary<string, ProseVoice>(StringComparer.OrdinalIgnoreCase);
var liveBases = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var validatedBases = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
for (int i = 0; i < ids.Count; i++)
{
@ -93,6 +132,21 @@ public static class ActivityVoiceHarness
}
ProseVoice voice = ActivityVoiceResolver.Resolve(asset);
voicesById[id] = voice;
if (voice.AssetKind != ActivityAssetKind.Vehicle)
{
liveBases.Add(voice.BaseSpeciesId);
if (voice.Source != ActivityVoiceSource.AuthoredSpecies
|| !ActivitySpeciesVoiceCatalog.HasCompleteVoice(voice.BaseSpeciesId))
{
missingAuthored++;
AddSample(ref sample, id + ":voice-source=" + voice.Source);
}
else if (validatedBases.Add(voice.BaseSpeciesId))
{
authoredPhraseFail += ValidateAuthoredVoice(voice.BaseSpeciesId, ref sample);
}
}
if (voice.EffectiveActionTag == ActivityBodyTag.Default
|| string.IsNullOrEmpty(voice.BaseFamily)
|| voice.BaseFamily == ActivityVoiceFamilies.Default)
@ -125,6 +179,7 @@ public static class ActivityVoiceHarness
int localEmpty;
int localLeaks;
string fingerprint = Fingerprint(id, out localEmpty, out localLeaks);
fingerprintsById[id] = fingerprint;
emptyProse += localEmpty;
leaks += localLeaks;
string awkward = FindAwkwardPhrase(fingerprint);
@ -172,11 +227,72 @@ public static class ActivityVoiceHarness
.Append(voice.BaseBodyTag).Append('\t')
.Append(voice.EffectiveActionTag).Append('\t')
.Append(voice.EcologyTag).Append('\t')
.Append(voice.FlavorOrdinal).Append('\t')
.Append(voice.Source).Append('\t')
.Append(voice.VoiceKey).Append('\t')
.Append(voice.BaseRecoveryExpected ? voice.BaseRecoverySucceeded.ToString() : "n/a").Append('\t')
.Append(fingerprint.Replace('\t', ' ')).Append('\n');
}
foreach (KeyValuePair<string, ProseVoice> pair in voicesById)
{
ProseVoice voice = pair.Value;
if (voice.AssetKind == ActivityAssetKind.Vehicle
|| pair.Key.Equals(voice.BaseSpeciesId, StringComparison.OrdinalIgnoreCase))
{
continue;
}
if (!fingerprintsById.TryGetValue(voice.BaseSpeciesId, out string baseFingerprint)
|| !fingerprintsById.TryGetValue(pair.Key, out string variantFingerprint)
|| variantFingerprint.Equals(baseFingerprint, StringComparison.Ordinal))
{
variantBaseFail++;
AddSample(ref sample, pair.Key + ":same-as-base=" + voice.BaseSpeciesId);
}
}
List<string> authoredIds = ActivitySpeciesVoiceCatalog.AuthoredIds();
for (int i = 0; i < authoredIds.Count; i++)
{
if (!liveBases.Contains(authoredIds[i]))
{
orphanAuthored++;
AddSample(ref sample, authoredIds[i] + ":orphan-voice");
}
}
List<string> taskKeys = ActivityVerbMap.EnumerateLiveTaskIds();
string[] beatKeys = ActivityVerbMap.EnumerateBehaviorBeatKeys();
for (int source = 0; source < 2; source++)
{
int count = source == 0 ? taskKeys.Count : beatKeys.Length;
for (int i = 0; i < count; i++)
{
string taskKey = source == 0 ? taskKeys[i] : beatKeys[i];
string verb = ActivityVerbMap.Resolve(taskKey);
routedTasks++;
if (string.IsNullOrEmpty(verb))
{
unmappedTasks++;
AddSample(ref sample, taskKey + ":unmapped-task");
continue;
}
foreach (string baseId in liveBases)
{
string[] bag = ActivitySpeciesVoiceCatalog.GetBag(
baseId,
verb,
ActivityTerrain.Unknown);
if (bag == null || bag.Length < 2)
{
missingTaskBags++;
AddSample(ref sample, baseId + ":" + taskKey + ":missing-bag=" + verb);
}
}
}
}
int pairFail = PairwiseFailures(ref sample);
bool liveContextOk = VerifyLiveContext(ref sample);
try
@ -191,6 +307,8 @@ public static class ActivityVoiceHarness
bool passed = ids.Count > 50
&& missing == 0
&& missingAuthored == 0
&& orphanAuthored == 0
&& defaults == 0
&& emptyProse == 0
&& leaks == 0
@ -201,6 +319,10 @@ public static class ActivityVoiceHarness
&& vehicleMismatch == 0
&& awkwardProse == 0
&& terrainLeaks == 0
&& variantBaseFail == 0
&& authoredPhraseFail == 0
&& unmappedTasks == 0
&& missingTaskBags == 0
&& pairFail == 0
&& liveContextOk;
return new ActivityVoiceAuditResult
@ -208,6 +330,8 @@ public static class ActivityVoiceHarness
Passed = passed,
Detail = "total=" + ids.Count
+ " missing=" + missing
+ " missingAuthored=" + missingAuthored
+ " orphanAuthored=" + orphanAuthored
+ " defaults=" + defaults
+ " empty=" + emptyProse
+ " leaks=" + leaks
@ -218,12 +342,71 @@ public static class ActivityVoiceHarness
+ " vehicleMismatch=" + vehicleMismatch
+ " awkwardProse=" + awkwardProse
+ " terrainLeaks=" + terrainLeaks
+ " variantBaseFail=" + variantBaseFail
+ " authoredPhraseFail=" + authoredPhraseFail
+ " routedTasks=" + routedTasks
+ " unmappedTasks=" + unmappedTasks
+ " missingTaskBags=" + missingTaskBags
+ " pairFail=" + pairFail
+ " liveContextOk=" + liveContextOk
+ " sample='" + sample + "'"
};
}
private static int ValidateAuthoredVoice(string baseSpeciesId, ref string sample)
{
int failures = 0;
string label = ActivityAssetCatalog.SpeciesDisplayLabel(baseSpeciesId);
for (int i = 0; i < ActivitySpeciesVoice.AuthoredVerbs.Length; i++)
{
string verb = ActivitySpeciesVoice.AuthoredVerbs[i];
string[] bag = ActivitySpeciesVoiceCatalog.GetBag(
baseSpeciesId,
verb,
ActivityTerrain.Unknown);
if (bag == null || bag.Length < 2)
{
failures++;
AddSample(ref sample, baseSpeciesId + ":" + verb + ":incomplete");
continue;
}
for (int p = 0; p < bag.Length; p++)
{
string phrase = bag[p] ?? "";
bool targetMissing = (verb == "hunt" || verb == "fight")
&& phrase.IndexOf("{target}", StringComparison.Ordinal) < 0;
bool contextMissing = !phrase.EndsWith(
"{place_at}{job_as}",
StringComparison.Ordinal);
bool actorLeak = phrase.IndexOf("{actor}", StringComparison.Ordinal) >= 0;
bool speciesLeak = !string.IsNullOrEmpty(label)
&& Regex.IsMatch(
phrase,
@"\b" + Regex.Escape(label) + @"\b",
RegexOptions.IgnoreCase);
string awkward = FindAwkwardPhrase(phrase);
string terrain = FindPhrase(phrase, UngroundedTerrainFragments);
if (targetMissing || contextMissing || actorLeak || speciesLeak
|| !string.IsNullOrEmpty(awkward) || !string.IsNullOrEmpty(terrain))
{
failures++;
AddSample(
ref sample,
baseSpeciesId + ":" + verb + ":" + p
+ ":target=" + !targetMissing
+ ":context=" + !contextMissing
+ ":actor=" + actorLeak
+ ":species=" + speciesLeak
+ ":awkward=" + awkward
+ ":terrain=" + terrain);
}
}
}
return failures;
}
private static string FindAwkwardPhrase(string fingerprint)
{
return FindPhrase(fingerprint, AwkwardProseFragments);
@ -275,6 +458,8 @@ public static class ActivityVoiceHarness
bool ok = ctx.Voice != null
&& ctx.Voice.LiveSpeciesId == (actor.asset.id ?? "")
&& ctx.Voice.EffectiveActionTag != ActivityBodyTag.Default
&& (ctx.Voice.AssetKind == ActivityAssetKind.Vehicle
|| ctx.Voice.Source == ActivityVoiceSource.AuthoredSpecies)
&& ctx.Terrain == expectedTerrain
&& !string.IsNullOrEmpty(line);
if (!ok)

View file

@ -1,40 +0,0 @@
using System;
using System.Collections.Generic;
namespace IdleSpectator;
/// <summary>Thin flavor identities for creatures whose voice should be unmistakable.</summary>
public static class ActivityVoiceProfiles
{
private static readonly Dictionary<string, string> Profiles =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["dragon"] = "dragon",
["fairy"] = "fairy",
["cat"] = "cat",
["dog"] = "dog",
["buffalo"] = "buffalo",
["lemon_snail"] = "lemon_snail",
["human"] = "human",
["elf"] = "elf",
["dwarf"] = "dwarf",
["orc"] = "orc",
["crabzilla"] = "crabzilla",
["god_finger"] = "god_finger",
["greg"] = "greg",
["angle"] = "angle",
["cold_one"] = "cold",
["snowman"] = "cold",
["crystal_sword"] = "crystal"
};
public static string Resolve(string baseSpeciesId)
{
if (string.IsNullOrEmpty(baseSpeciesId))
{
return "";
}
return Profiles.TryGetValue(baseSpeciesId, out string profile) ? profile : "";
}
}

View file

@ -1,15 +1,10 @@
using System;
using System.Collections.Generic;
namespace IdleSpectator;
/// <summary>The only ActorAsset → prose voice classifier.</summary>
public static class ActivityVoiceResolver
{
private static readonly Dictionary<string, int> FlavorOrdinals =
new Dictionary<string, int>(StringComparer.Ordinal);
private static int _ordinalLibraryCount = -1;
public static ProseVoice Resolve(string speciesId)
{
ActorAsset asset = ActivityAssetCatalog.TryGetActorAsset(speciesId);
@ -24,8 +19,6 @@ public static class ActivityVoiceResolver
}
string liveId = liveAsset.id ?? "";
int flavorOrdinal = FlavorOrdinal(liveId);
if (IsVehicle(liveId))
{
return Build(
@ -36,7 +29,6 @@ public static class ActivityVoiceResolver
ActivityBodyTag.Vehicle,
ActivityEcologyTag.Water,
ActivityVoiceFamilies.Special,
flavorOrdinal,
false,
true);
}
@ -66,7 +58,6 @@ public static class ActivityVoiceResolver
effective,
ecology,
family,
flavorOrdinal,
recoveryExpected,
recoverySucceeded);
}
@ -119,7 +110,6 @@ public static class ActivityVoiceResolver
ActivityBodyTag effective,
ActivityEcologyTag ecology,
string family,
int flavorOrdinal,
bool recoveryExpected,
bool recoverySucceeded)
{
@ -128,6 +118,12 @@ public static class ActivityVoiceResolver
ActivityBodyTag baseBody = kind == ActivityAssetKind.Vehicle
? ActivityBodyTag.Vehicle
: ResolveBody(baseAsset, liveAsset, modifier);
bool authored = ActivitySpeciesVoiceCatalog.HasCompleteVoice(baseId);
ActivityVoiceSource source = kind == ActivityAssetKind.Vehicle
? ActivityVoiceSource.Vehicle
: authored
? ActivityVoiceSource.AuthoredSpecies
: ActivityVoiceSource.TaxonomyFallback;
return new ProseVoice(
liveId,
baseId,
@ -140,9 +136,8 @@ public static class ActivityVoiceResolver
baseAsset != null && baseAsset.civ,
baseAsset != null && (baseAsset.is_humanoid || baseAsset.civ),
baseAsset != null && baseAsset.default_animal,
liveId,
flavorOrdinal,
ActivityVoiceProfiles.Resolve(baseId),
authored ? ActivitySpeciesVoiceCatalog.VoiceKey(baseId) : baseId,
source,
recoveryExpected,
recoverySucceeded);
}
@ -416,51 +411,6 @@ public static class ActivityVoiceResolver
|| EqualsIgnore(id, "crystal_sword");
}
private static int FlavorOrdinal(string id)
{
EnsureFlavorOrdinals();
if (!string.IsNullOrEmpty(id) && FlavorOrdinals.TryGetValue(id, out int ordinal))
{
return ordinal;
}
return Math.Abs(StableHash(id)) % 1024;
}
private static void EnsureFlavorOrdinals()
{
List<string> ids = ActivityAssetCatalog.EnumerateLiveActorAssetIds();
if (ids.Count == _ordinalLibraryCount && FlavorOrdinals.Count == ids.Count)
{
return;
}
ids.Sort(StringComparer.Ordinal);
FlavorOrdinals.Clear();
for (int i = 0; i < ids.Count; i++)
{
FlavorOrdinals[ids[i]] = i;
}
_ordinalLibraryCount = ids.Count;
}
private static int StableHash(string value)
{
unchecked
{
uint h = 2166136261;
string s = value ?? "";
for (int i = 0; i < s.Length; i++)
{
h ^= s[i];
h *= 16777619;
}
return (int)(h & 0x7fffffff);
}
}
private static bool EqualsIgnore(string a, string b)
{
return !string.IsNullOrEmpty(a) && a.Equals(b, StringComparison.OrdinalIgnoreCase);

View file

@ -1711,6 +1711,15 @@ public static class AgentHarness
detail = $"pending={have} want={want}";
break;
}
case "pending_discovery_asset":
{
string assetId = ResolveAssetId(cmd);
bool want = string.IsNullOrEmpty(cmd.value) || ParseBool(cmd.value, true);
bool have = SpeciesDiscovery.IsPending(assetId);
pass = have == want;
detail = $"asset={assetId} pending={have} want={want} total={SpeciesDiscovery.PendingCount}";
break;
}
case "pending_interest":
{
int want = ParseCountExpect(cmd, defaultValue: 0);
@ -1848,6 +1857,20 @@ public static class AgentHarness
detail = $"hist='{hist}' needle='{needle}' act={WatchCaption.LastActivityShown} life={WatchCaption.LastLifeShown}";
break;
}
case "dossier_history_not_contains":
{
string needle = string.IsNullOrEmpty(cmd.value) ? cmd.label : cmd.value;
string hist = WatchCaption.LastHistoryJoined ?? "";
if (string.IsNullOrEmpty(hist))
{
hist = WatchCaption.LastHistoryPreview ?? "";
}
pass = !string.IsNullOrEmpty(needle)
&& hist.IndexOf(needle, System.StringComparison.OrdinalIgnoreCase) < 0;
detail = $"hist='{hist}' excludes='{needle}' act={WatchCaption.LastActivityShown} life={WatchCaption.LastLifeShown}";
break;
}
case "activity_count":
{
long id = WatchCaption.CurrentUnitId;
@ -2572,23 +2595,23 @@ public static class AgentHarness
&& beetlePlay.IndexOf(" the beetle", System.StringComparison.OrdinalIgnoreCase) < 0
&& frogPlay.IndexOf(" the frog", System.StringComparison.OrdinalIgnoreCase) < 0
&& rhinoPlay.IndexOf(" the rhino", System.StringComparison.OrdinalIgnoreCase) < 0
&& (beetlePlay.IndexOf("scuttl", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("skitter", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("buzz", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("tiny", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("busy", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("circuit", System.StringComparison.OrdinalIgnoreCase) >= 0)
&& (beetlePlay.IndexOf("leg", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("rocks", System.StringComparison.OrdinalIgnoreCase) >= 0
|| beetlePlay.IndexOf("wing", System.StringComparison.OrdinalIgnoreCase) >= 0)
&& (frogPlay.IndexOf("hop", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("bounc", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("leap", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("splash", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("damp", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("jump", System.StringComparison.OrdinalIgnoreCase) >= 0);
|| frogPlay.IndexOf("pops", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("toe", System.StringComparison.OrdinalIgnoreCase) >= 0)
&& (rhinoPlay.IndexOf("horn", System.StringComparison.OrdinalIgnoreCase) >= 0
|| rhinoPlay.IndexOf("stout", System.StringComparison.OrdinalIgnoreCase) >= 0
|| rhinoPlay.IndexOf("buck", System.StringComparison.OrdinalIgnoreCase) >= 0
|| rhinoPlay.IndexOf("pivot", System.StringComparison.OrdinalIgnoreCase) >= 0);
bool crabLandOk = !string.IsNullOrEmpty(crabLandPlay)
&& crabLandPlay.IndexOf("water", System.StringComparison.OrdinalIgnoreCase) < 0
&& crabLandPlay.IndexOf("wet", System.StringComparison.OrdinalIgnoreCase) < 0
&& (crabLandPlay.IndexOf("scuttl", System.StringComparison.OrdinalIgnoreCase) >= 0
|| crabLandPlay.IndexOf("sidestep", System.StringComparison.OrdinalIgnoreCase) >= 0);
&& (crabLandPlay.IndexOf("claw", System.StringComparison.OrdinalIgnoreCase) >= 0
|| crabLandPlay.IndexOf("pincer", System.StringComparison.OrdinalIgnoreCase) >= 0
|| crabLandPlay.IndexOf("side", System.StringComparison.OrdinalIgnoreCase) >= 0);
bool fishTerrainOk = !string.IsNullOrEmpty(fishLandPlay)
&& !string.IsNullOrEmpty(fishWaterPlay)
&& fishLandPlay.IndexOf("water", System.StringComparison.OrdinalIgnoreCase) < 0

View file

@ -406,7 +406,7 @@ internal static class HarnessScenarios
Step("d23", "age_current", wait: 2f),
Step("d24", "assert", expect: "would_accept_curiosity", value: "true"),
Step("d25", "discovery_drain"),
Step("d26", "assert", expect: "pending_discovery", value: "0"),
Step("d26", "assert", expect: "pending_discovery_asset", value: "false"),
Step("d27", "assert", expect: "presented", asset: "auto", value: "true"),
Step("d28", "director_run", wait: 1.2f),
Step("d29", "assert", expect: "tip_matches_unit"),
@ -486,8 +486,8 @@ internal static class HarnessScenarios
Step("act13d", "assert", expect: "activity_prose_grounding"),
Step("act13e", "assert", expect: "activity_prose_library"),
Step("act13f", "assert", expect: "activity_taxonomy_audit"),
Step("act14", "activity_force", asset: "laughing", label: "Laughing", count: 1),
Step("act14b", "assert", expect: "activity_log_contains", value: "laugh"),
Step("act14", "activity_force", asset: "laughing", label: "Laughing", count: 1, value: "angle"),
Step("act14b", "assert", expect: "activity_log_contains", value: "celestial"),
Step("act14c", "activity_force", asset: "eating", label: "Taking a meal", count: 1),
Step("act15", "activity_force", asset: "farm", label: "Tends the fields", count: 1),
Step("act16", "activity_force", asset: "hunt", label: "Hunts", count: 1, expect: "Barkley"),
@ -507,7 +507,7 @@ internal static class HarnessScenarios
Step("act20b", "assert", expect: "activity_names_colored"),
Step("act20c", "assert", expect: "activity_log_contains", value: "Barkley"),
Step("act21", "assert", expect: "dossier_history_shown", value: "1", label: "min", tier: "activity"),
Step("act22", "assert", expect: "dossier_history_contains", value: "Harness pollen"),
Step("act22", "assert", expect: "dossier_history_not_contains", value: "Harness pollen"),
Step("act23", "assert", expect: "caption_layout_ok"),
Step("act24", "screenshot", value: "hud-activity_idle_smoke.png"),
Step("act25", "wait", wait: 0.55f),

View file

@ -35,6 +35,11 @@ public static class SpeciesDiscovery
public static int PendingCount => Pending.Count;
public static bool IsPending(string assetId)
{
return !string.IsNullOrEmpty(assetId) && Pending.Exists(p => p.AssetId == assetId);
}
public static int DrainedThisSession => _drainedThisSession;
public static void OnSpectatorEnabled()

View file

@ -1,7 +1,7 @@
{
"name": "IdleSpectator",
"author": "dazed",
"version": "0.12.75",
"version": "0.12.84",
"description": "AFK Idle Spectator (I) + Lore (L). Detailed living activity prose by default.",
"GUID": "com.dazed.idlespectator"
}