Refactor activity prose and action handling for improved clarity and consistency. Updated various action templates in ActivityProse to enhance readability and context. Adjusted ActivityActionComposer and ActivityActionLexicon for better phrasing in actions. Enhanced ActivityClauseAssembler to refine combat-related suffixes. Incremented version in mod.json to reflect these updates.

This commit is contained in:
DazedAnon 2026-07-15 02:53:49 -05:00
parent 88a0c38c00
commit 7439b3e7e6
7 changed files with 240 additions and 167 deletions

View file

@ -142,7 +142,7 @@ public static class ActivityActionComposer
{
if (bag == null || bag.Length == 0)
{
return "moves through the living moment{place_at}{job_as}";
return "moves along{place_at}{job_as}";
}
if (bag.Length == 1)

View file

@ -37,51 +37,51 @@ public static class ActivityActionLexicon
case ActivityModifier.Elemental:
return verb switch
{
"move" => new[] { "surges onward in a living blaze{place_at}", "flows ahead with elemental force{place_at}" },
"wait" => new[] { "holds in a wavering elemental pause{place_at}", "burns steadily while waiting{place_at}" },
"play" => new[] { "flares through a wild game{place_at}", "dances in playful elemental arcs{place_at}" },
"eat" => new[] { "feeds the inner flame{place_at}", "draws in fuel with bright appetite{place_at}" },
"sleep" => new[] { "dims into a banked rest{place_at}", "settles into a low elemental glow{place_at}" },
"hunt" => Targeted(hasTarget, "surges after {target}{place_at}", "hunts {target} in a trail of heat{place_at}", "searches for prey in flickering sweeps{place_at}", "hunts with elemental focus{place_at}"),
"fight" => Targeted(hasTarget, "crashes into {target} with elemental force{place_at}", "flares against {target}{place_at}", "fights in a storm of living heat{place_at}", "clashes with elemental fury{place_at}"),
"move" => new[] { "surges ahead in a trail of flame{place_at}", "flows forward in a rolling blaze{place_at}" },
"wait" => new[] { "flickers in place{place_at}", "burns steadily while waiting{place_at}" },
"play" => new[] { "flares and darts through a wild game{place_at}", "dances in playful arcs of flame{place_at}" },
"eat" => new[] { "feeds the inner flame{place_at}", "draws fuel into the flames{place_at}" },
"sleep" => new[] { "dims into a banked rest{place_at}", "settles into a low, steady glow{place_at}" },
"hunt" => Targeted(hasTarget, "surges after {target}{place_at}", "hunts {target} in a trail of heat{place_at}", "searches for prey in flickering sweeps{place_at}", "hunts as flames flicker and rise{place_at}"),
"fight" => Targeted(hasTarget, "crashes into {target} in a burst of flame{place_at}", "flares against {target}{place_at}", "fights in a storm of sparks{place_at}", "clashes amid sparks and flame{place_at}"),
"laugh" => new[] { "crackles with bright laughter{place_at}", "flares in a laughing burst{place_at}" },
_ => GenericBag(verb, hasTarget)
};
case ActivityModifier.Mush:
return verb switch
{
"move" => new[] { "shuffles onward in soft fungal steps{place_at}", "spreads along with mycelial patience{place_at}" },
"wait" => new[] { "rests in spore-soft quiet{place_at}", "waits while faint spores drift{place_at}" },
"play" => new[] { "puffs through an odd little game{place_at}", "spores about in playful motion{place_at}" },
"move" => new[] { "shuffles ahead in soft, uneven steps{place_at}", "creeps forward as spores drift{place_at}" },
"wait" => new[] { "rests while spores drift around it{place_at}", "waits while faint spores drift{place_at}" },
"play" => new[] { "puffs through an odd little game{place_at}", "bobs about in playful bursts of spores{place_at}" },
"eat" => new[] { "feeds through the damp earth{place_at}", "draws a slow meal from decay{place_at}" },
"sleep" => new[] { "settles into a damp fungal rest{place_at}", "folds into mycelial quiet{place_at}" },
"sleep" => new[] { "settles into a damp, quiet rest{place_at}", "folds down among drifting spores{place_at}" },
_ => GenericBag(verb, hasTarget)
};
case ActivityModifier.Tumor:
return verb switch
{
"move" => new[] { "pulses onward in malignant motion{place_at}", "lurches ahead with invasive purpose{place_at}" },
"wait" => new[] { "throbs in unsettling stillness{place_at}", "holds a malignant pause{place_at}" },
"move" => new[] { "pulses forward as its mass shifts{place_at}", "lurches ahead in uneven surges{place_at}" },
"wait" => new[] { "throbs in unsettling stillness{place_at}", "quivers without moving on{place_at}" },
"play" => new[] { "writhes through a grotesque game{place_at}", "pulses with uncanny playfulness{place_at}" },
"eat" => new[] { "feeds with consuming hunger{place_at}", "absorbs a meal into the growing mass{place_at}" },
"fight" => Targeted(hasTarget, "lashes into {target} with malignant force{place_at}", "surges against {target}{place_at}", "fights with invasive fury{place_at}", "clashes in a malignant rush{place_at}"),
"eat" => new[] { "feeds with consuming hunger{place_at}", "absorbs food into the growing mass{place_at}" },
"fight" => Targeted(hasTarget, "lashes into {target} with terrible force{place_at}", "surges against {target}{place_at}", "fights in a thrashing fury{place_at}", "clashes in a violent rush{place_at}"),
_ => GenericBag(verb, hasTarget)
};
case ActivityModifier.Alien:
return verb switch
{
"move" => new[] { "glides onward with unfamiliar ease{place_at}", "tracks ahead in precise alien motion{place_at}" },
"wait" => new[] { "observes in unreadable stillness{place_at}", "holds an unfamiliar watch{place_at}" },
"play" => new[] { "probes the moment in curious play{place_at}", "experiments with a strange little game{place_at}" },
"hunt" => Targeted(hasTarget, "tracks {target} with alien focus{place_at}", "closes on {target} in eerie silence{place_at}", "scans for prey{place_at}", "hunts by unfamiliar instinct{place_at}"),
"fight" => Targeted(hasTarget, "strikes at {target} with alien precision{place_at}", "clashes with {target} in strange motion{place_at}", "fights with unreadable purpose{place_at}", "attacks in a precise rush{place_at}"),
"move" => new[] { "glides ahead without a sound{place_at}", "tracks a precise, unfamiliar course{place_at}" },
"wait" => new[] { "observes in unreadable stillness{place_at}", "stands motionless and watches{place_at}" },
"play" => new[] { "tests each movement like a game{place_at}", "experiments with a strange little game{place_at}" },
"hunt" => Targeted(hasTarget, "tracks {target} without a sound{place_at}", "closes on {target} in eerie silence{place_at}", "scans for prey{place_at}", "hunts by unfamiliar instinct{place_at}"),
"fight" => Targeted(hasTarget, "strikes at {target} with uncanny precision{place_at}", "clashes with {target} in sudden bursts{place_at}", "fights with unreadable intent{place_at}", "attacks in a precise rush{place_at}"),
_ => GenericBag(verb, hasTarget)
};
case ActivityModifier.Construct:
return verb switch
{
"move" => new[] { "advances in measured constructed steps{place_at}", "shifts onward with deliberate precision{place_at}" },
"wait" => new[] { "idles in rigid watchfulness{place_at}", "holds a perfectly measured pause{place_at}" },
"move" => new[] { "moves in measured, jointed steps{place_at}", "shifts forward with deliberate precision{place_at}" },
"wait" => new[] { "idles in rigid watchfulness{place_at}", "stays motionless, mechanisms quiet{place_at}" },
"play" => new[] { "tests a playful sequence of motions{place_at}", "turns precise movement into a game{place_at}" },
"eat" => new[] { "takes in fuel with mechanical care{place_at}", "replenishes what keeps it moving{place_at}" },
"sleep" => new[] { "powers down into quiet rest{place_at}", "settles into a dormant stillness{place_at}" },
@ -98,26 +98,26 @@ public static class ActivityActionLexicon
{
return body switch
{
ActivityBodyTag.Canine => new[] { "pads onward with lifeless purpose{place_at}", "sniffs and shambles through the living world{place_at}" },
ActivityBodyTag.Feline => new[] { "slinks onward in deathly quiet{place_at}", "pads ahead with hollow patience{place_at}" },
ActivityBodyTag.Insect => new[] { "skitters onward in deathly little steps{place_at}", "crawls ahead with hollow purpose{place_at}" },
ActivityBodyTag.Plant => new[] { "creeps onward in withered motion{place_at}", "drags dead growth through the living world{place_at}" },
ActivityBodyTag.Dragon => new[] { "lumbers onward with ancient deathly weight{place_at}", "advances like ruin given motion{place_at}" },
ActivityBodyTag.Bird => new[] { "flutters onward on lifeless wings{place_at}", "hops ahead in ragged deathly motion{place_at}" },
_ => new[] { "shambles onward through the living world{place_at}", "drifts along in restless undeath{place_at}" }
ActivityBodyTag.Canine => new[] { "pads ahead with a stiff, uneven gait{place_at}", "sniffs the ground and shambles on{place_at}" },
ActivityBodyTag.Feline => new[] { "slinks ahead in eerie silence{place_at}", "pads forward with stiff precision{place_at}" },
ActivityBodyTag.Insect => new[] { "skitters ahead on stiff little legs{place_at}", "crawls forward in twitching bursts{place_at}" },
ActivityBodyTag.Plant => new[] { "creeps ahead in withered motion{place_at}", "drags dead growth across the ground{place_at}" },
ActivityBodyTag.Dragon => new[] { "lumbers ahead with the weight of a fallen giant{place_at}", "advances like ruin given motion{place_at}" },
ActivityBodyTag.Bird => new[] { "flutters ahead on lifeless wings{place_at}", "hops forward in ragged, uneven motions{place_at}" },
_ => new[] { "shambles forward over uneven ground{place_at}", "drifts along in restless undeath{place_at}" }
};
}
return verb switch
{
"wait" => new[] { "waits in hollow stillness{place_at}", "holds a restless undeath pause{place_at}" },
"play" => new[] { "lurches through a strange game{place_at}", "toys with the moment in hollow cheer{place_at}" },
"eat" => new[] { "feeds with deathless hunger{place_at}", "tears into a meal with hollow appetite{place_at}" },
"wait" => new[] { "waits in hollow stillness{place_at}", "stands in restless silence{place_at}" },
"play" => new[] { "lurches through a strange game{place_at}", "mimics a game with jerking motions{place_at}" },
"eat" => new[] { "feeds with deathless hunger{place_at}", "tears into a meal with endless hunger{place_at}" },
"sleep" => new[] { "slumps into a hollow rest{place_at}", "goes still in restless undeath{place_at}" },
"hunt" => Targeted(hasTarget, "shambles after {target}{place_at}", "hunts {target} with hollow hunger{place_at}", "hunts with deathless hunger{place_at}", "searches for prey without rest{place_at}"),
"fight" => Targeted(hasTarget, "presses against {target} without fear{place_at}", "clashes with {target} in deathly fury{place_at}", "fights with hollow force{place_at}", "presses on without giving ground{place_at}"),
"fight" => Targeted(hasTarget, "lunges at {target} without fear{place_at}", "clashes with {target} in relentless fury{place_at}", "fights without fear or hesitation{place_at}", "presses on without giving ground{place_at}"),
"laugh" => new[] { "groans in a broken laugh{place_at}", "makes a hollow sound of laughter{place_at}" },
"social" => Targeted(hasTarget, "lingers near {target} in uneasy silence{place_at}", "shares a hollow moment with {target}{place_at}", "seeks company in deathly quiet{place_at}", "lingers among the living{place_at}"),
"social" => Targeted(hasTarget, "lingers near {target} in uneasy silence{place_at}", "stands beside {target} without a word{place_at}", "seeks company in deathly quiet{place_at}", "lingers among the living{place_at}"),
_ => GenericBag(verb, hasTarget)
};
}
@ -129,11 +129,11 @@ public static class ActivityActionLexicon
{
return verb switch
{
"move" => new[] { "advances with ancient patience{place_at}", "moves as if the world should make way{place_at}" },
"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}", "takes a meal with ancient hunger{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}", "hunts {target} with ancient focus{place_at}", "circles in search of prey{place_at}", "hunts with ancient appetite{place_at}"),
"hunt" => Targeted(hasTarget, "descends on {target}{place_at}", "watches {target} from above{place_at}", "circles in search of prey{place_at}", "hunts across a wide range{place_at}"),
_ => null
};
}
@ -153,9 +153,9 @@ public static class ActivityActionLexicon
{
return verb switch
{
"move" => new[] { "glides onward with patient citrus calm{place_at}", "eases ahead in a slow leafy trail{place_at}" },
"play" => new[] { "loops through a patient little game{place_at}", "sways into slow, cheerful play{place_at}" },
"eat" => new[] { "feeds with quiet citrus appetite{place_at}", "takes a slow, careful meal{place_at}" },
"move" => new[] { "glides ahead at an unhurried pace{place_at}", "follows a slow, winding trail{place_at}" },
"play" => new[] { "turns in slow, playful circles{place_at}", "sways through a gentle game{place_at}" },
"eat" => new[] { "nibbles through a meal slowly{place_at}", "takes a slow, careful meal{place_at}" },
_ => null
};
}
@ -164,7 +164,7 @@ public static class ActivityActionLexicon
{
return verb switch
{
"move" => new[] { "pads softly through the living world{place_at}", "slinks along with private purpose{place_at}" },
"move" => new[] { "pads softly along{place_at}", "slinks ahead, watching the way{place_at}" },
"play" => new[] { "bats and twists through a private game{place_at}", "springs into sudden playful leaps{place_at}" },
_ => null
};
@ -174,8 +174,8 @@ public static class ActivityActionLexicon
{
return verb switch
{
"move" => new[] { "trudges onward with grounded strength{place_at}", "ambles ahead in heavy steady steps{place_at}" },
"play" => new[] { "frolics with heavy earnest energy{place_at}", "stomps through a clumsy game{place_at}" },
"move" => new[] { "trudges onward with steady weight{place_at}", "ambles ahead in slow, heavy steps{place_at}" },
"play" => new[] { "charges about in rough play{place_at}", "stomps through a clumsy game{place_at}" },
_ => null
};
}
@ -184,8 +184,8 @@ public static class ActivityActionLexicon
{
return verb switch
{
"move" => new[] { "strides sideways with colossal purpose{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 living siege{place_at}", "fights with city-shaking force{place_at}", "clashes like a living fortress{place_at}"),
"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
};
}
@ -199,33 +199,33 @@ public static class ActivityActionLexicon
{
return body switch
{
ActivityBodyTag.Humanoid => new[] { "walks onward with quiet purpose{place_at}", "wanders ahead at an easy pace{place_at}" },
ActivityBodyTag.Canine => new[] { "trots along without hurry{place_at}", "roams ahead with curious paws{place_at}" },
ActivityBodyTag.Feline => new[] { "pads softly through the living world{place_at}", "slinks along at an easy pace{place_at}" },
ActivityBodyTag.Bird => new[] { "flutters onward through the air{place_at}", "hops and wings along nearby{place_at}" },
ActivityBodyTag.Humanoid => new[] { "walks along, taking in the surroundings{place_at}", "wanders ahead at an easy pace{place_at}" },
ActivityBodyTag.Canine => new[] { "trots along without hurry{place_at}", "roams ahead with nose to the ground{place_at}" },
ActivityBodyTag.Feline => new[] { "pads softly along{place_at}", "slinks ahead at an easy pace{place_at}" },
ActivityBodyTag.Bird => new[] { "flutters onward through the air{place_at}", "hops and flaps along nearby{place_at}" },
ActivityBodyTag.Insect => new[] { "scuttles along without hurry{place_at}", "skitters across the ground{place_at}" },
ActivityBodyTag.Arachnid => new[] { "skitters onward on many legs{place_at}", "creeps ahead with careful steps{place_at}" },
ActivityBodyTag.Amphibian => new[] { "hops onward through the living world{place_at}", "bounces along in damp springy steps{place_at}" },
ActivityBodyTag.Aquatic => new[] { "glides through the water{place_at}", "swims onward with fluid ease{place_at}" },
ActivityBodyTag.Reptile => new[] { "slides along without hurry{place_at}", "creeps forward with cool patience{place_at}" },
ActivityBodyTag.Livestock => new[] { "ambles along without hurry{place_at}", "wanders with heavy steady steps{place_at}" },
ActivityBodyTag.Plant => new[] { "creeps along with patient plant motion{place_at}", "eases forward in slow leafy steps{place_at}" },
ActivityBodyTag.Fungi => new[] { "drifts along in soft fungal steps{place_at}", "spreads onward with patient motion{place_at}" },
ActivityBodyTag.Protist => new[] { "oozes onward without hurry{place_at}", "pulses along through the living world{place_at}" },
ActivityBodyTag.Machina => new[] { "advances in measured machine steps{place_at}", "tracks onward with precise motion{place_at}" },
ActivityBodyTag.Mythic => new[] { "drifts along with mythic calm{place_at}", "moves with otherworldly purpose{place_at}" },
ActivityBodyTag.Gregalia => new[] { "gregs onward through the living world{place_at}", "wanders in restless greg motion{place_at}" },
ActivityBodyTag.Amphibian => new[] { "hops from patch to patch{place_at}", "bounces along in damp, springy steps{place_at}" },
ActivityBodyTag.Aquatic => new[] { "glides through the water{place_at}", "swims onward with easy strokes{place_at}" },
ActivityBodyTag.Reptile => new[] { "slides along without hurry{place_at}", "creeps forward close to the ground{place_at}" },
ActivityBodyTag.Livestock => new[] { "ambles along without hurry{place_at}", "wanders in slow, heavy steps{place_at}" },
ActivityBodyTag.Plant => new[] { "creeps along as stems and leaves sway{place_at}", "eases forward in slow, leafy steps{place_at}" },
ActivityBodyTag.Fungi => new[] { "drifts along in soft, uneven steps{place_at}", "spreads forward as spores trail behind{place_at}" },
ActivityBodyTag.Protist => new[] { "oozes onward without hurry{place_at}", "pulses along in slow ripples{place_at}" },
ActivityBodyTag.Machina => new[] { "moves ahead in measured steps{place_at}", "tracks a precise course{place_at}" },
ActivityBodyTag.Mythic => new[] { "drifts forward as if barely touching the ground{place_at}", "moves with an uncanny grace{place_at}" },
ActivityBodyTag.Gregalia => new[] { "lopes onward with an uneven gait{place_at}", "wanders in twitchy, restless steps{place_at}" },
ActivityBodyTag.Primate => new[] { "lopes onward with nimble curiosity{place_at}", "moves ahead in quick clever steps{place_at}" },
ActivityBodyTag.Rodent => new[] { "scurries onward without hurry{place_at}", "pads ahead in quick little steps{place_at}" },
ActivityBodyTag.Ursid => new[] { "lumbers onward with steady weight{place_at}", "pads ahead in heavy unhurried steps{place_at}" },
ActivityBodyTag.Seal => new[] { "slides onward with sleek ease{place_at}", "glides ahead through the wet paths{place_at}" },
ActivityBodyTag.Procyonid => new[] { "pads onward with busy curiosity{place_at}", "scampers ahead with clever purpose{place_at}" },
ActivityBodyTag.Seal => new[] { "slides forward on its belly{place_at}", "bounds ahead with a sleek, rolling motion{place_at}" },
ActivityBodyTag.Procyonid => new[] { "pads onward, nosing around{place_at}", "scampers ahead in nimble steps{place_at}" },
ActivityBodyTag.Hyaenid => new[] { "lopes onward with rough confidence{place_at}", "trots ahead in rangy strides{place_at}" },
ActivityBodyTag.Armadillo => new[] { "trundles onward close to the ground{place_at}", "scurries ahead in armored little steps{place_at}" },
ActivityBodyTag.Crawler => new[] { "writhes onward through the living world{place_at}", "crawls ahead without hurry{place_at}" },
ActivityBodyTag.Crawler => new[] { "writhes forward across the ground{place_at}", "crawls ahead without hurry{place_at}" },
ActivityBodyTag.Cold => new[] { "moves onward in a breath of cold{place_at}", "drifts ahead with wintry calm{place_at}" },
ActivityBodyTag.Crystal => new[] { "glides onward with crystalline precision{place_at}", "moves ahead in bright rigid steps{place_at}" },
ActivityBodyTag.Crab => new[] { "scuttles sideways through the living world{place_at}", "sidesteps onward with armored purpose{place_at}" },
ActivityBodyTag.Crystal => new[] { "glides onward with crystalline precision{place_at}", "moves in stiff, glittering steps{place_at}" },
ActivityBodyTag.Crab => new[] { "scuttles sideways across the ground{place_at}", "sidesteps onward behind a hard shell{place_at}" },
_ => GenericBag(verb, hasTarget)
};
}
@ -237,18 +237,18 @@ public static class ActivityActionLexicon
ActivityBodyTag.Canine => new[] { "tumbles about in lively play{place_at}", "bounds and wrestles through play{place_at}" },
ActivityBodyTag.Feline => new[] { "bats and twists through a private game{place_at}", "plays with sudden leaps{place_at}" },
ActivityBodyTag.Bird => new[] { "flutters through playful arcs{place_at}", "hops and wings about in play{place_at}" },
ActivityBodyTag.Insect => new[] { "scuttles about in tiny play{place_at}", "darts through a quick little game{place_at}" },
ActivityBodyTag.Arachnid => new[] { "skitters through a restless game{place_at}", "toys with the moment on many legs{place_at}" },
ActivityBodyTag.Insect => new[] { "scuttles through a tiny game{place_at}", "darts about in quick bursts of play{place_at}" },
ActivityBodyTag.Arachnid => new[] { "skitters through a restless game{place_at}", "darts about on many legs{place_at}" },
ActivityBodyTag.Amphibian => new[] { "hops about in damp play{place_at}", "bounces through a lively game{place_at}" },
ActivityBodyTag.Aquatic => new[] { "splashes through play in the water{place_at}", "weaves playful arcs through the wet{place_at}" },
ActivityBodyTag.Reptile => new[] { "slides through a low game{place_at}", "plays with slow coiled energy{place_at}" },
ActivityBodyTag.Livestock => new[] { "stomps about in clumsy play{place_at}", "frolics with heavy earnest energy{place_at}" },
ActivityBodyTag.Plant => new[] { "sways through a slow game{place_at}", "turns the moment into leafy play{place_at}" },
ActivityBodyTag.Aquatic => new[] { "splashes through play in the water{place_at}", "darts and circles in play{place_at}" },
ActivityBodyTag.Reptile => new[] { "slides and coils in play{place_at}", "plays in slow, winding motions{place_at}" },
ActivityBodyTag.Livestock => new[] { "stomps about in clumsy play{place_at}", "frolics in heavy, eager bursts{place_at}" },
ActivityBodyTag.Plant => new[] { "sways through a slow game{place_at}", "twists and rustles in play{place_at}" },
ActivityBodyTag.Primate => new[] { "clambers through a clever game{place_at}", "plays with nimble mischief{place_at}" },
ActivityBodyTag.Rodent => new[] { "scampers through a tiny game{place_at}", "darts about in quick play{place_at}" },
ActivityBodyTag.Ursid => new[] { "rolls through a heavy game{place_at}", "plays with lumbering cheer{place_at}" },
ActivityBodyTag.Crawler => new[] { "loops through a low little game{place_at}", "writhes about in restless play{place_at}" },
_ => new[] { "makes a game of the moment{place_at}", "plays with easy living energy{place_at}" }
_ => new[] { "finds a way to amuse itself{place_at}", "plays with restless enthusiasm{place_at}" }
};
}
@ -257,14 +257,14 @@ public static class ActivityActionLexicon
return body switch
{
ActivityBodyTag.Insect => new[] { "holds still in a tiny pause{place_at}", "waits with antennae alert{place_at}" },
ActivityBodyTag.Amphibian => new[] { "crouches in a damp pause{place_at}", "waits in springy stillness{place_at}" },
ActivityBodyTag.Feline => new[] { "settles into a watchful crouch{place_at}", "waits with quiet patience{place_at}" },
ActivityBodyTag.Amphibian => new[] { "crouches low and waits{place_at}", "sits still, ready to spring{place_at}" },
ActivityBodyTag.Feline => new[] { "settles into a watchful crouch{place_at}", "waits without looking away{place_at}" },
ActivityBodyTag.Canine => new[] { "waits with alert ears{place_at}", "holds a restless pause{place_at}" },
ActivityBodyTag.Aquatic => new[] { "hovers in the water and waits{place_at}", "holds still in the wet quiet{place_at}" },
ActivityBodyTag.Aquatic => new[] { "hovers in the water and waits{place_at}", "drifts almost motionless{place_at}" },
ActivityBodyTag.Bird => new[] { "perches and waits{place_at}", "holds a light watchful pause{place_at}" },
ActivityBodyTag.Plant => new[] { "holds a rooted pause{place_at}", "waits in leafy quiet{place_at}" },
ActivityBodyTag.Machina => new[] { "idles in a watchful hold{place_at}", "waits through a measured pause{place_at}" },
_ => new[] { "waits in watchful quiet{place_at}", "holds still through a living pause{place_at}" }
ActivityBodyTag.Plant => new[] { "holds a rooted pause{place_at}", "stands still with leaves barely stirring{place_at}" },
ActivityBodyTag.Machina => new[] { "idles in a watchful hold{place_at}", "stays still and scans the surroundings{place_at}" },
_ => new[] { "waits in watchful quiet{place_at}", "stands quietly and watches{place_at}" }
};
}
@ -272,12 +272,12 @@ public static class ActivityActionLexicon
{
return body switch
{
ActivityBodyTag.Canine => Targeted(hasTarget, "hunts {target} with keen nose{place_at}", "closes on {target} through the living world{place_at}", "hunts with keen nose{place_at}", "stalks prey through the living world{place_at}"),
ActivityBodyTag.Feline => Targeted(hasTarget, "hunts {target} with silent focus{place_at}", "stalks {target} with patient care{place_at}", "hunts with silent focus{place_at}", "stalks prey with quiet patience{place_at}"),
ActivityBodyTag.Canine => Targeted(hasTarget, "hunts {target} with nose to the ground{place_at}", "follows {target}'s trail{place_at}", "follows the scent of prey{place_at}", "hunts with nose to the ground{place_at}"),
ActivityBodyTag.Feline => Targeted(hasTarget, "hunts {target} in silence{place_at}", "stalks {target} from cover{place_at}", "hunts without making a sound{place_at}", "stalks prey from cover{place_at}"),
ActivityBodyTag.Bird => Targeted(hasTarget, "hunts {target} from above{place_at}", "circles after {target}{place_at}", "hunts from above{place_at}", "circles after prey{place_at}"),
ActivityBodyTag.Insect => Targeted(hasTarget, "scuttles after {target}{place_at}", "hunts {target} with tiny focus{place_at}", "hunts with tiny predatory focus{place_at}", "scuttles after prey{place_at}"),
ActivityBodyTag.Reptile => Targeted(hasTarget, "slides after {target}{place_at}", "hunts {target} with cold patience{place_at}", "hunts with cold patience{place_at}", "stalks prey in a low slide{place_at}"),
_ => Targeted(hasTarget, "hunts {target} through the living world{place_at}", "closes on {target} with careful focus{place_at}", "hunts through the living world{place_at}", "stalks prey with careful steps{place_at}")
ActivityBodyTag.Insect => Targeted(hasTarget, "scuttles after {target}{place_at}", "darts toward {target}{place_at}", "searches for prey in quick bursts{place_at}", "scuttles after prey{place_at}"),
ActivityBodyTag.Reptile => Targeted(hasTarget, "slides after {target}{place_at}", "creeps closer to {target}{place_at}", "waits low for prey to approach{place_at}", "stalks prey close to the ground{place_at}"),
_ => Targeted(hasTarget, "pursues {target}{place_at}", "closes in on {target}{place_at}", "searches for prey{place_at}", "moves quietly on the hunt{place_at}")
};
}
@ -286,12 +286,12 @@ public static class ActivityActionLexicon
"fight" => Targeted(hasTarget, "fights {target} in a fierce clash{place_at}", "trades blows with {target}{place_at}", "fights with fierce resolve{place_at}", "clashes without giving ground{place_at}"),
"eat" => body switch
{
ActivityBodyTag.Canine => new[] { "eats with eager appetite{place_at}", "tears into a meal{place_at}" },
ActivityBodyTag.Feline => new[] { "eats with neat focus{place_at}", "takes a careful meal{place_at}" },
ActivityBodyTag.Insect => new[] { "feeds with tiny industry{place_at}", "eats in quick little bites{place_at}" },
ActivityBodyTag.Plant => new[] { "drinks in a slow meal{place_at}", "feeds with quiet plant appetite{place_at}" },
ActivityBodyTag.Canine => new[] { "gulps down a meal{place_at}", "tears into a meal{place_at}" },
ActivityBodyTag.Feline => new[] { "eats in small, careful bites{place_at}", "takes its time over a meal{place_at}" },
ActivityBodyTag.Insect => new[] { "nibbles rapidly at a meal{place_at}", "eats in quick little bites{place_at}" },
ActivityBodyTag.Plant => new[] { "draws nourishment slowly{place_at}", "feeds without moving from the spot{place_at}" },
ActivityBodyTag.Livestock => new[] { "grazes with steady appetite{place_at}", "settles in to feed{place_at}" },
_ => new[] { "settles in to take a proper meal{place_at}", "eats with focused appetite{place_at}" }
_ => new[] { "sits down to eat{place_at}", "finishes a meal{place_at}" }
},
"sleep" => body switch
{
@ -299,14 +299,14 @@ public static class ActivityActionLexicon
ActivityBodyTag.Feline => new[] { "curls into a neat sleep{place_at}", "settles into quiet rest{place_at}" },
ActivityBodyTag.Bird => new[] { "tucks into sleep{place_at}", "roosts into rest{place_at}" },
ActivityBodyTag.Aquatic => new[] { "drifts into rest in the water{place_at}", "settles into wet quiet{place_at}" },
ActivityBodyTag.Plant => new[] { "settles into leafy rest{place_at}", "goes still in plant quiet{place_at}" },
ActivityBodyTag.Plant => new[] { "settles into leafy rest{place_at}", "goes completely still{place_at}" },
_ => new[] { "settles into deep sleep{place_at}", "rests after the day's demands{place_at}" }
},
"social" => Targeted(hasTarget, "shares a living moment with {target}{place_at}", "talks and lingers with {target}{place_at}", "seeks company nearby{place_at}", "socializes among whoever is near{place_at}"),
"social" => Targeted(hasTarget, "spends time with {target}{place_at}", "talks and lingers with {target}{place_at}", "looks for company{place_at}", "lingers near others{place_at}"),
"laugh" => new[] { "laughs aloud and lets the mood carry{place_at}", "breaks into open laughter{place_at}" },
"sing" => body == ActivityBodyTag.Bird
? new[] { "sings out on light wings{place_at}", "fills the air with bright song{place_at}" }
: new[] { "sings out for whoever will hear{place_at}", "lifts a living song{place_at}" },
: new[] { "sings out for whoever will hear{place_at}", "raises a clear song{place_at}" },
_ => GenericBag(verb, hasTarget)
};
}
@ -320,7 +320,7 @@ public static class ActivityActionLexicon
"fish" => new[] { "works the water for fish{place_at}", "casts for a catch from the deck{place_at}" },
"trade" => new[] { "carries trade across the water{place_at}", "makes a measured trading run{place_at}" },
"haul" => new[] { "takes cargo aboard{place_at}", "settles the load for passage{place_at}" },
_ => new[] { "works steadily upon the water{place_at}", "continues its voyage with quiet purpose{place_at}" }
_ => new[] { "continues working on the water{place_at}", "keeps steadily to its course{place_at}" }
};
}
@ -328,31 +328,31 @@ public static class ActivityActionLexicon
{
return verb switch
{
"farm" => new[] { "tends the fields with patient care{place_at}{job_as}", "works the soil through the living day{place_at}{job_as}" },
"farm" => new[] { "tends the fields with patient care{place_at}{job_as}", "works the soil from row to row{place_at}{job_as}" },
"haul" => new[] { "unloads {carrying} after a long haul{place_at}{job_as}", "delivers {carrying} into storage{place_at}" },
"pollinate" => new[] { "works the blossom with careful industry{place_at}", "pollinates the flower in a living rhythm{place_at}" },
"fish" => new[] { "works the water for fish{place_at}{job_as}", "fishes with patient focus{place_at}" },
"pollinate" => new[] { "works carefully among the blossoms{place_at}", "moves steadily from flower to flower{place_at}" },
"fish" => new[] { "works the water for fish{place_at}{job_as}", "waits patiently for a bite{place_at}" },
"heal" => Targeted(hasTarget, "tends carefully to {target}{place_at}", "works to heal {target}{place_at}", "tends wounds with careful hands{place_at}", "works patiently to recover{place_at}"),
"fire" => new[] { "fights the blaze with urgent care{place_at}", "battles fire before it spreads{place_at}" },
"flee" => new[] { "flees from danger in a living rush{place_at}", "retreats before danger closes in{place_at}" },
"work" => new[] { "works with focused craft{place_at}{job_as}", "labors through the task at hand{place_at}{job_as}" },
"flee" => new[] { "bolts away from danger{place_at}", "retreats before danger closes in{place_at}" },
"work" => new[] { "works steadily at the task{place_at}{job_as}", "labors through the task at hand{place_at}{job_as}" },
"trade" => new[] { "trades and bargains{place_at}{job_as}", "haggles through a careful deal{place_at}" },
"settle" => new[] { "settles civic business{place_at}{job_as}", "attends to belonging and place{place_at}" },
"warrior" => Targeted(hasTarget, "holds formation against {target}{place_at}", "drills for war near {target}{place_at}", "holds warrior discipline{place_at}", "keeps formation ready{place_at}"),
"settle" => new[] { "handles civic business{place_at}{job_as}", "sees to matters around the settlement{place_at}" },
"warrior" => Targeted(hasTarget, "holds formation against {target}{place_at}", "drills for war near {target}{place_at}", "stands ready for battle{place_at}", "keeps formation ready{place_at}"),
"read" => new[] { "reads with quiet attention{place_at}", "studies the page{place_at}{job_as}" },
"lover" => Targeted(hasTarget, "draws close to {target}{place_at}", "shares a tender moment with {target}{place_at}", "follows the pull of kinship{place_at}", "seeks a living bond{place_at}"),
"lover" => Targeted(hasTarget, "draws close to {target}{place_at}", "shares a tender moment with {target}{place_at}", "follows the pull of kinship{place_at}", "seeks companionship{place_at}"),
"gather_life" => new[] { "gathers with kin{place_at}", "moves among the group{place_at}" },
"move" => new[] { "wanders without hurry through the living world{place_at}", "roams nearby with quiet purpose{place_at}" },
"wait" => new[] { "waits in watchful quiet{place_at}", "holds still through a living pause{place_at}" },
"play" => new[] { "plays with restless living energy{place_at}", "turns the moment into a game{place_at}" },
"eat" => new[] { "settles in to take a proper meal{place_at}", "eats with focused appetite{place_at}" },
"move" => new[] { "wanders without hurry{place_at}", "roams nearby, looking around{place_at}" },
"wait" => new[] { "waits in watchful quiet{place_at}", "stands still and watches{place_at}" },
"play" => new[] { "finds a way to amuse itself{place_at}", "turns idle time into a game{place_at}" },
"eat" => new[] { "sits down to eat{place_at}", "finishes a meal{place_at}" },
"sleep" => new[] { "settles into deep sleep{place_at}", "rests after the day's demands{place_at}" },
"hunt" => Targeted(hasTarget, "hunts {target} through the living world{place_at}", "closes on {target} with careful focus{place_at}", "hunts through the living world{place_at}", "stalks prey with careful steps{place_at}"),
"hunt" => Targeted(hasTarget, "pursues {target}{place_at}", "closes in on {target}{place_at}", "searches for prey{place_at}", "moves quietly on the hunt{place_at}"),
"fight" => Targeted(hasTarget, "fights {target} in a fierce clash{place_at}", "trades blows with {target}{place_at}", "fights with fierce resolve{place_at}", "clashes without giving ground{place_at}"),
"social" => Targeted(hasTarget, "shares a living moment with {target}{place_at}", "talks and lingers with {target}{place_at}", "seeks company nearby{place_at}", "socializes among whoever is near{place_at}"),
"social" => Targeted(hasTarget, "spends time with {target}{place_at}", "talks and lingers with {target}{place_at}", "looks for company{place_at}", "lingers near others{place_at}"),
_ => hasTarget
? new[] { "sets about " + verb.Replace('_', ' ') + " with {target}{place_at}", "turns to " + verb.Replace('_', ' ') + " near {target}{place_at}" }
: new[] { "sets about " + verb.Replace('_', ' ') + " through the living moment{place_at}", "turns to " + verb.Replace('_', ' ') + " with quiet purpose{place_at}" }
? new[] { "attends to " + verb.Replace('_', ' ') + " with {target}{place_at}", "works on " + verb.Replace('_', ' ') + " near {target}{place_at}" }
: new[] { "attends to " + verb.Replace('_', ' ') + "{place_at}", "works through " + verb.Replace('_', ' ') + "{place_at}" }
};
}

View file

@ -118,21 +118,27 @@ public static class ActivityClauseAssembler
return "";
}
if (action.IndexOf("fight", StringComparison.OrdinalIgnoreCase) >= 0
// An action that already names the observed target or reads as combat-aware
// does not need a second, generic combat suffix.
if (action.IndexOf("{target}", StringComparison.Ordinal) >= 0
|| action.IndexOf("fight", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("clash", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("attack", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("blow", StringComparison.OrdinalIgnoreCase) >= 0)
|| action.IndexOf("blow", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("hunt", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("stalk", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("strike", StringComparison.OrdinalIgnoreCase) >= 0
|| action.IndexOf("close on", StringComparison.OrdinalIgnoreCase) >= 0)
{
return "";
}
if (ctx.TargetIsActor && !string.IsNullOrEmpty(ctx.TargetName)
&& action.IndexOf("{target}", StringComparison.Ordinal) < 0)
if (ctx.TargetIsActor && !string.IsNullOrEmpty(ctx.TargetName))
{
return " while locked on {target}";
return " while keeping {target} in sight";
}
return " under combat pressure";
return " while danger presses close";
}
private static bool HasJobOrRole(ActivityContext ctx)

View file

@ -36,9 +36,9 @@ public static class ActivityProse
},
["hunt"] = new[]
{
"{actor} hunts {target} through the living world{place_at}",
"{actor} stalks {target} with careful steps{place_at}",
"{actor} closes on {target}{place_at}"
"{actor} pursues {target}{place_at}",
"{actor} stalks {target} from cover{place_at}",
"{actor} closes in on {target}{place_at}"
},
["BehAttackActorHuntingTarget"] = new[]
{
@ -66,15 +66,15 @@ public static class ActivityProse
},
["eat"] = new[]
{
"{actor} settles in to take a proper meal{place_at}{job_as}",
"{actor} breaks hunger with whatever can be found{place_at}",
"{actor} eats with focused appetite{place_at}"
"{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} settles in to take a proper meal{place_at}{job_as}",
"{actor} breaks hunger with whatever can be found{place_at}",
"{actor} eats with focused appetite{place_at}"
"{actor} sits down to eat{place_at}{job_as}",
"{actor} finds something to eat{place_at}",
"{actor} finishes a meal{place_at}"
},
["sleep"] = new[]
{
@ -90,9 +90,9 @@ public static class ActivityProse
},
["random_move"] = new[]
{
"{actor} wanders without hurry through the living world{place_at}",
"{actor} roams nearby, taking in the moment{place_at}",
"{actor} drifts along with no urgent errand{place_at}"
"{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[]
{
@ -216,14 +216,14 @@ public static class ActivityProse
},
["job"] = new[]
{
"{actor} seeks honest work among the living{place_at}",
"{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 with practical hope{place_at}",
"{actor} looks for a city job among open posts{place_at}",
"{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[]
@ -276,13 +276,13 @@ public static class ActivityProse
},
["trade"] = new[]
{
"{actor} trades goods with careful eye{place_at}{job_as}",
"{actor} barters through the market's press{place_at}",
"{actor} is on a trade run with full purpose{place_at}"
"{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} fishes the waters with patient focus{place_at}{job_as}",
"{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}"
},
@ -302,12 +302,12 @@ public static class ActivityProse
{
"{actor} laughs aloud and lets the mood carry{place_at}",
"{actor} bursts into laughter without restraint{place_at}",
"{actor} is laughing through the moment{place_at}"
"{actor} keeps laughing until short of breath{place_at}"
},
["happy_laughing"] = new[]
{
"{actor} laughs with bright, unguarded joy{place_at}",
"{actor} is laughing happily among the living{place_at}",
"{actor} laughs happily among nearby company{place_at}",
"{actor} chuckles aloud until the mood softens{place_at}"
},
["just_laughed"] = new[]
@ -324,9 +324,9 @@ public static class ActivityProse
},
["task_unit_play"] = new[]
{
"{actor} plays with restless, living energy{place_at}",
"{actor} turns the moment into play{place_at}",
"{actor} amuses themselves without apology{place_at}"
"{actor} finds a way to amuse itself{place_at}",
"{actor} turns idle time into play{place_at}",
"{actor} plays with restless enthusiasm{place_at}"
},
["just_played"] = new[]
{
@ -466,8 +466,8 @@ public static class ActivityProse
if (string.IsNullOrEmpty(template))
{
template = "{actor} sets about " + LowerFirst(HumanizeKey(key))
+ " through the living moment{place_at}{job_as}";
template = "{actor} attends to " + LowerFirst(HumanizeKey(key))
+ "{place_at}{job_as}";
if (string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(rawFact))
{
template = GerundSentence(rawFact);
@ -682,7 +682,7 @@ public static class ActivityProse
if (k.StartsWith("find_"))
{
return "{actor} looks for " + HumanizeKey(k.Substring("find_".Length))
+ " through the living world" + clauses;
+ clauses;
}
if (k.StartsWith("decide_"))
@ -694,7 +694,7 @@ public static class ActivityProse
if (k.StartsWith("build_"))
{
return "{actor} builds " + HumanizeKey(k.Substring("build_".Length))
+ " with focused craft" + clauses;
+ " with steady hands" + clauses;
}
if (k.StartsWith("boat_"))
@ -710,8 +710,8 @@ public static class ActivityProse
if (k.StartsWith("socialize_"))
{
return hasTarget
? "{actor} socializes and shares the moment with {target}" + clauses
: "{actor} socializes among whoever is near" + clauses;
? "{actor} spends time with {target}" + clauses
: "{actor} looks for company" + clauses;
}
if (k.StartsWith("sexual_reproduction") || k.StartsWith("asexual_reproduction"))
@ -724,14 +724,14 @@ public static class ActivityProse
if (k.StartsWith("child_"))
{
return "{actor} " + LowerFirst(HumanizeKey(k.Substring("child_".Length)))
+ " with youthful energy" + clauses;
+ " eagerly" + clauses;
}
if (k.StartsWith("ant_") || k.StartsWith("bee_") || k.StartsWith("ufo_")
|| k.StartsWith("dragon_") || k.StartsWith("worm_"))
{
return "{actor} " + LowerFirst(HumanizeKey(StripCreaturePrefix(k)))
+ " in their own strange way" + clauses;
+ clauses;
}
if (k.StartsWith("task_unit_"))
@ -752,8 +752,8 @@ public static class ActivityProse
if (k.Contains("play") && !k.Contains("display"))
{
return hasTarget
? "{actor} plays with {target} through the moment" + clauses
: "{actor} plays with restless living energy" + clauses;
? "{actor} plays with {target}" + clauses
: "{actor} finds a way to amuse itself" + clauses;
}
if (k.Contains("wait"))
@ -769,14 +769,14 @@ public static class ActivityProse
if (k.Contains("idle") || k.Contains("random_move") || k.EndsWith("_move")
|| k.Contains("walking"))
{
return "{actor} wanders without hurry through the living world" + clauses;
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} fights with urgent focus" + clauses;
: "{actor} braces for a fight" + clauses;
}
if (k.Contains("heal") || k.Contains("cure"))
@ -788,7 +788,7 @@ public static class ActivityProse
if (k.Contains("eat") || k.Contains("food"))
{
return "{actor} settles in to take a proper meal" + clauses;
return "{actor} sits down to eat" + clauses;
}
if (k.Contains("farm") || k.Contains("harvest") || k.Contains("forag")
@ -803,7 +803,7 @@ public static class ActivityProse
|| k.Contains("claim") || k.Contains("fire"))
{
return "{actor} " + LowerFirst(HumanizeKey(k))
+ " with full purpose" + clauses;
+ clauses;
}
return null;
@ -848,12 +848,12 @@ public static class ActivityProse
{
if (rest.Contains("fish"))
{
return "fishes from the boat with patient focus";
return "fishes from the boat and waits for a bite";
}
if (rest.Contains("trade"))
{
return "trades by boat along the water roads";
return "carries trade goods by boat";
}
if (rest.Contains("dock") || rest.Contains("return"))
@ -873,10 +873,10 @@ public static class ActivityProse
if (rest.Contains("idle"))
{
return "idles aboard while the water holds still";
return "waits aboard between trips";
}
return LowerFirst(HumanizeKey(rest)) + " aboard with seafarer's care";
return LowerFirst(HumanizeKey(rest)) + " aboard";
}
private static string StripCreaturePrefix(string k)
@ -890,7 +890,7 @@ public static class ActivityProse
const string clauses = "{place_at}{job_as}";
if (rest == "play")
{
return "{actor} plays with restless living energy" + clauses;
return "{actor} finds a way to amuse itself" + clauses;
}
if (rest == "wait")
@ -900,18 +900,18 @@ public static class ActivityProse
if (rest == "walk")
{
return "{actor} walks with easy purpose through the world" + clauses;
return "{actor} walks at an easy pace" + clauses;
}
if (rest.Contains("social"))
{
return hasTarget
? "{actor} socializes and shares the moment with {target}" + clauses
: "{actor} socializes among whoever is near" + clauses;
? "{actor} spends time with {target}" + clauses
: "{actor} looks for company" + clauses;
}
return "{actor} " + LowerFirst(HumanizeKey(rest))
+ " through the living moment" + clauses;
+ clauses;
}
/// <summary>
@ -974,7 +974,7 @@ public static class ActivityProse
if (IsGerundPhrase(body))
{
return "{actor} is " + LowerFirst(body)
+ " through the living moment{place_at}{job_as}";
+ "{place_at}{job_as}";
}
// Already a short verb phrase - still give it place/job room.

View file

@ -21,6 +21,27 @@ public static class ActivityVoiceHarness
"task_hunt", "task_attack", "social", "laugh", "work"
};
private static readonly string[] AwkwardProseFragments =
{
"under combat pressure",
"through the living world",
"through the living moment",
"in a living rush",
"living energy",
"proper meal",
"focused appetite",
"careful focus",
"constructed steps",
"spores about",
"gregs onward",
"through the wet",
"quiet purpose",
"deathly little steps",
"mythic calm",
"otherworldly purpose",
"patient citrus"
};
public static ActivityVoiceAuditResult RunAudit(string outputDirectory)
{
List<string> ids = ActivityAssetCatalog.EnumerateLiveActorAssetIds();
@ -36,6 +57,7 @@ public static class ActivityVoiceHarness
int aquaticFalsePositive = 0;
int collisions = 0;
int vehicleMismatch = 0;
int awkwardProse = 0;
string sample = "";
string vehicleFingerprint = null;
var fingerprints = new Dictionary<string, string>(StringComparer.Ordinal);
@ -86,6 +108,12 @@ public static class ActivityVoiceHarness
string fingerprint = Fingerprint(id, out localEmpty, out localLeaks);
emptyProse += localEmpty;
leaks += localLeaks;
string awkward = FindAwkwardPhrase(fingerprint);
if (!string.IsNullOrEmpty(awkward))
{
awkwardProse++;
AddSample(ref sample, id + ":awkward=" + awkward);
}
if (voice.AssetKind == ActivityAssetKind.Vehicle)
{
@ -144,6 +172,7 @@ public static class ActivityVoiceHarness
&& aquaticFalsePositive == 0
&& collisions == 0
&& vehicleMismatch == 0
&& awkwardProse == 0
&& pairFail == 0
&& liveContextOk;
return new ActivityVoiceAuditResult
@ -159,12 +188,28 @@ public static class ActivityVoiceHarness
+ " aquaticFalsePositive=" + aquaticFalsePositive
+ " collisions=" + collisions
+ " vehicleMismatch=" + vehicleMismatch
+ " awkwardProse=" + awkwardProse
+ " pairFail=" + pairFail
+ " liveContextOk=" + liveContextOk
+ " sample='" + sample + "'"
};
}
private static string FindAwkwardPhrase(string fingerprint)
{
string text = fingerprint ?? "";
for (int i = 0; i < AwkwardProseFragments.Length; i++)
{
string phrase = AwkwardProseFragments[i];
if (text.IndexOf(phrase, StringComparison.OrdinalIgnoreCase) >= 0)
{
return phrase;
}
}
return "";
}
private static bool VerifyLiveContext(ref string sample)
{
try

View file

@ -2454,6 +2454,21 @@ public static class AgentHarness
1,
out string kingCombatLine,
out _);
ActivityProse.Format(
ActivityKind.TaskStart,
"task_hunt",
ActivityContext.ForHarness(
"Gogith",
"Boortkin",
"human",
place: "Thasthuk",
isKing: true,
inCombat: true),
"Hunting",
107,
1,
out string huntCombatLine,
out _);
bool farmerOk = !string.IsNullOrEmpty(farmerLine)
&& farmerLine.IndexOf("young", System.StringComparison.OrdinalIgnoreCase) >= 0
@ -2471,8 +2486,14 @@ public static class AgentHarness
bool kingOk = !string.IsNullOrEmpty(kingCombatLine)
&& kingCombatLine.IndexOf("king", System.StringComparison.OrdinalIgnoreCase) >= 0
&& (kingCombatLine.IndexOf("combat", System.StringComparison.OrdinalIgnoreCase) >= 0
|| kingCombatLine.IndexOf("locked on", System.StringComparison.OrdinalIgnoreCase) >= 0
|| kingCombatLine.IndexOf("keeping", System.StringComparison.OrdinalIgnoreCase) >= 0
|| kingCombatLine.IndexOf("Barkley", System.StringComparison.OrdinalIgnoreCase) >= 0);
bool huntPressureOk = !string.IsNullOrEmpty(huntCombatLine)
&& huntCombatLine.IndexOf("Boortkin", System.StringComparison.OrdinalIgnoreCase) >= 0
&& huntCombatLine.IndexOf("Thasthuk", System.StringComparison.OrdinalIgnoreCase) >= 0
&& huntCombatLine.IndexOf(
"under combat pressure",
System.StringComparison.OrdinalIgnoreCase) < 0;
// Taxonomy manner divergence without SpeciesOverrides (rhino vs beetle vs frog).
ActivityProse.Format(
@ -2523,10 +2544,11 @@ public static class AgentHarness
|| frogPlay.IndexOf("damp", System.StringComparison.OrdinalIgnoreCase) >= 0
|| frogPlay.IndexOf("jump", System.StringComparison.OrdinalIgnoreCase) >= 0);
pass = farmerOk && minerOk && divergeOk && kingOk && taxDiverge;
pass = farmerOk && minerOk && divergeOk && kingOk && huntPressureOk && taxDiverge;
detail =
$"farmerOk={farmerOk} minerOk={minerOk} divergeOk={divergeOk} kingOk={kingOk} taxDiverge={taxDiverge} "
+ $"farmer='{farmerLine}' miner='{minerLine}' king='{kingCombatLine}' "
$"farmerOk={farmerOk} minerOk={minerOk} divergeOk={divergeOk} kingOk={kingOk} "
+ $"huntPressureOk={huntPressureOk} taxDiverge={taxDiverge} "
+ $"farmer='{farmerLine}' miner='{minerLine}' king='{kingCombatLine}' hunt='{huntCombatLine}' "
+ $"beetle='{beetlePlay}' frog='{frogPlay}' rhino='{rhinoPlay}'";
break;
}

View file

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