Maturity: Draft. How Cyberpunk 2077's NPCs react to V (stimuli, the reaction manager, crowd fear, look-at and facial reactions), how an NPC picks and plays a generic voice line, which of those lines could plausibly comment on V, what a script can read about V's appearance, V's car and the district, what existing mods already do here, and how a mod could add reactions and text-only barks. Consolidated on 27 September 2026 from the decompiled 2.31 script bundle (final.redscripts SHA-256 2119046f…ee86, redscript-cli 0.5.31), the game's voiceset scenes and English subtitle files serialised with WolvenKit CLI 9.0.1 in a private scratch folder, WolvenKit's generated type definitions (11720772), the Modding Docs at be2f44ee, and four installed mods read in place. Nothing on this page has runtime evidence yet. Grades follow the knowledge rules: source decompiled game scripts, mod scripts or type definitions; resource game resources we serialised; wiki Modding Docs; hypothesis not yet established.
This page answers: can NPCs notice how V looks and what V drives, and react through the game's own reaction, voice and subtitle systems? The product idea and its feasibility note are in the alive ideas register.
Sources
| Source | Version studied | Used for |
|---|---|---|
| Game scripts (decompiled bundle) | 2.31 | ReactionManagerComponent, stimuli, GameObject.PlayVoiceOver, subtitle and chatter controllers, PlayerPuppet.IsNaked, equipment, district and vehicle records |
Voiceset scenes base\ | 2.31, 529 scenes | Trigger names, randomised lines, dialog-line parameters |
English voiceset subtitles base\ | 2.31, 525 files, 16,356 entries | Line text by string id (paraphrased here, never quoted at length) |
| WolvenKit type definitions | 11720772 | locVoiceTag, locVoiceTagListResource, audioVoiceTagAppearanceMapping, entInjectVoiceTagEvent, questPlayVoiceset_ |
| Modding Docs | be2f44ee | modding-guides/ (chromoxolon, September 2026); modding-guides/ |
| Street Sense (Nexus 28989) | installed 5.2.2 | Clothing-driven crowd reactions and scores |
| Responsive NPCs (Nexus 14800) | installed 0.26 | Clothing, district, wealth and vehicle-aware reactions |
| Responsive V (Nexus 22694) | installed 1.4 | Patching a voiceset scene at load |
| Audioware (Nexus 12001) | installed 1.8.0 | Script-built subtitle lines, custom audio with subtitles |
Game-script citations are paths inside the decompiled bundle. Installed-mod citations are paths inside each mod's folder in the mod manager (mods/). Who made each mod and what it taught us is in the community credits.
1. The short answers
- The game already has one appearance reaction. When a crowd NPC does its proximity look-at and V wears nothing in the legs, inner-chest and outer-chest slots, it pulls a disgusted face and plays its "being followed" line instead of a greeting source
core/,components/ scriptComponents/ reactionComponent.script:2853-2858 cyberpunk/. Everything else about V's look is ignored.player/ player.script:5404-5409 - Crowd voice lines are chosen by trigger name, not by content.
GameObject.PlayVoiceOver(npc, n"greeting", …)queues aSoundPlayVowith that name asvoContextsourcecore/. Each generic voice is aentity/ gameObject.script:743-770 .scenewhose entry points carry the same names (greeting,bump,fear_, …) and lead through a random node to one of about two lines resource. So an NPC can only "say something about V" if its own voice happens to have such a line under a trigger we can fire.foll - A few such lines exist. About 15 of the 538 civilian greeting lines comment on V's looks (compliments on style, face or attractiveness; one "you need a new wardrobe"; one "look what the cat dragged in"), each in one specific voice resource. None comments on a car.
- Text-only barks are easy and look native. A script can build a
scnDialogLineData(text, speaker, typeOverHead, duration) and post it to the UI blackboard; the chatter controller draws it above the NPC like any vanilla overhead line sourcecyberpunk/, AudiowareUI/ subtitles/ baseSubtitlesControllers.script:120-212 r6/.scripts/ Audioware/ Codeware.reds:47-66 - Everything the assessment needs is readable from script: worn and displayed items with their tags, hidden slots, V's body gender, the observer's archetype visual tags (
anim_,Posh anim_, …) and affiliation, V's mounted vehicle record (manufacturer, type, UI data) and its damage level, and the current district record source. There is no wealth or class attribute on districts or vehicles source; that has to come from data we derive.Lowlife - Two installed mods already do a rule-based version (Street Sense, Responsive NPCs). Both classify clothing through tags or hand-kept item lists and reuse the vanilla
greeting,bumpandfear_triggers with a matching facial reaction source. Their limits (random line content, curated per-mod item lists) are exactly what XF Studio's resolver can improve.foll
2. The reaction pipeline
Arrows
- Stimulus: broadcast or direct stim (65 types) arrow to ReactionManagerComponent on the NPC
- ReactionManagerComponent on the NPC arrow to Reaction preset rules: stim type to output (LookAt, Bump, WalkAway, Flee ...)
- Reaction preset rules: stim type to output (LookAt, Bump, WalkAway, Flee ...) arrow to Behaviour reaction or crowd fear stage
- Player proximity (Crowds profile) and LookedAt events arrow to Proximity look-at: head/eyes on V
- Proximity look-at: head/eyes on V arrow to TriggerFacialLookAtReaction: facial idle + voice trigger
- TriggerFacialLookAtReaction: facial idle + voice trigger arrow to PlayVoiceOver(npc, trigger name)
- PlayVoiceOver(npc, trigger name) arrow to Voiceset scene entry point to random dialog line
- Voiceset scene entry point to random dialog line arrow to Audio + lipsync + overhead subtitle
Mermaid source
flowchart LR
A["Stimulus: broadcast or direct stim (65 types)"] --> B["ReactionManagerComponent on the NPC"]
B --> C["Reaction preset rules: stim type to output (LookAt, Bump, WalkAway, Flee ...)"]
C --> D["Behaviour reaction or crowd fear stage"]
E["Player proximity (Crowds profile) and LookedAt events"] --> F["Proximity look-at: head/eyes on V"]
F --> G["TriggerFacialLookAtReaction: facial idle + voice trigger"]
G --> H["PlayVoiceOver(npc, trigger name)"]
H --> I["Voiceset scene entry point to random dialog line"]
I --> J["Audio + lipsync + overhead subtitle"]
2.1 Stimuli and presets source
- A stimulus is a
StimuliEvent: source object and position, radius, aStim_, visual or audio propagation, and one of 65Record gamedataStimTypevalues (fromAimingAt,BumpandCrimeWitnesstoVehicleHorn,WeaponDisplayedandWhistle) sourcecore/,events/ stimuliEvents.script:1-60 orphans.script(enum gamedataStimType). The set is a fixed enum, so a mod cannot add a stim type; it can only send existing ones. - Stims are sent by the
StimBroadcasterComponent:TriggerSingleBroadcast, the staticBroadcastStim(obj, type, radius)andSendDrirectStimuliToTarget(sic) sourcecore/,components/ stimBroadcasterComponent.script reactionComponent.script:3395-3430. - Each NPC's
ReactionManagerComponentmaps a stim to aReactionOutputthrough its preset'sRule_s (Record GetRules,GetReactionOutput) sourcereactionComponent.script:1519-1600. Outputs are the 24gamedataOutputvalues (LookAt,TurnAt,Bump,WalkAway,BackOff,Reprimand,CallPolice,Flee,Panic, …); priorities come fromReactionOutput.<name>records sourcereactionComponent.script:3441-3447. Presets are typed (Civilian_,Neutral Civilian_,Passive Ganger_,Aggressive Police_,Passive Child,NoReaction, … 27 in all) source. - A
LookAtoutput makes the NPC grunt (stlh_) and look at the source if it is in front sourcecurious_ grunt reactionComponent.script:1664-1680. ScriptedReactionSystemonly counts fleeing NPCs and picks one police caller sourcecore/; the reaction logic lives per NPC.systems/ reactionSystem.script:2-85 - Crowd NPCs keep a fear stage (
Relaxed,Stressed,Alarmed,Panic) and their own crowd handling (HandleCrowdReaction,OnCrowdReaction) that playsfear_,beg fear_and similar triggers sourcerun reactionComponent.script:2323-2760.
2.2 Proximity look-at and the facial reaction source
This is the path that matters for "NPCs notice V":
- When V enters an NPC's
Crowdsproximity profile,OnPlayerProximityStartEventchecksCanTriggerExpressionLookAtand, if V is in front within 45°, starts a look-at; two seconds laterOnProximityLookatEventcallsTriggerFacialLookAtReactionif V is still in front sourcereactionComponent.script:5210-5262. CanTriggerExpressionLookAtrefuses NPCs in combat or alerted, ragdolling, blinded, withNoReactionorFollowerpresets, bosses, those in a reaction sequence or alarmed/panicking, in lore animations, busy, asleep or in braindance workspots, in dialogue or scenes, or not on autonomous AI sourcereactionComponent.script:2919-2960.TriggerFacialLookAtReactionpicks a facial reaction and a voice trigger sourcereactionComponent.script:2835-2874:- outside a crowd: facial category 3, idle 1, trigger
greeting; - V armed (or forced fear): category 3, idle 10 (fear), no line;
- V naked (
IsNaked): category 3, idle 7 (disgust), triggerfear_, look-at held;foll - otherwise a random personality from nine (
SelectFacialEmotion) sets the facial idle, and the trigger isgreeting. Vendors never speak here. AMapLookAtVOtable that pairs personalities with triggers exists but is not called sourcereactionComponent.script:3504-3537.
- outside a crowd: facial category 3, idle 1, trigger
- The facial reaction is
AnimFeature_applied withFacialReaction { category, idle } AnimationControllerComponent.ApplyFeatureToReplicate(npc, n"FacialReaction", …), and reset after a cooldown sourcereactionComponent.script:2869-2917. The personality table gives the known idles: category 3 idle 1 aggressive, 5 joy or funny, 7 disgust, 8 shock or surprise, 10 fear, 3 sad; category 1 idle 3 curiosity sourcereactionComponent.script:3456-3502. The clips are the generic NPC emotion idles (facial expressions). - Standing too close in front of an NPC repeatedly ("comfort zone") forces the fear face and sends a
CrowdIllegalActionstim back to the NPC sourcereactionComponent.script:3380-3435.
IsNaked reads the gameplay items (GetActiveItem on Legs, OuterChest, InnerChest), not what is drawn source player.script:5404-5409. A V dressed in gameplay slots but showing nothing through the wardrobe is not "naked" to the game, and a wardrobe outfit over empty slots is. What is actually drawn is readable too (§5).
2.3 Look-at from script source
ActivateReactionLookAt builds a LookAtAddEvent targeting V's pla_ slot with style and optional repeat, duration and upper-body parts; DeactiveLookAt removes it source reactionComponent.script:3539-3670. It refuses in combat and during lore animations. The same event type is how AMM aims a character's eyes and head (poses).
3. How an NPC picks and plays a voice line
Arrows
- NPC appearance name arrow to Voice tag, e.g. civ_low_f_31_enus_15_sml ("audioVoiceTagAppearanceMapping")
- Voice tag, e.g. civ_low_f_31_enus_15_sml arrow to Voiceset .scene ("locVoiceTagListResource: voiceTag to voicesetScenePath")
- PlayVoiceOver(npc, n'greeting') arrow to SoundPlayVo voContext = greeting
- SoundPlayVo voContext = greeting arrow to Voiceset .scene
- Voiceset .scene arrow to Entry point 'greeting' to random node
- Entry point 'greeting' to random node arrow to Dialog line: locstring id, lipsync names, overHead style
- Dialog line: locstring id, lipsync names, overHead style arrow to Audio by locstring id, lipsync animation, chatter bubble
Mermaid source
flowchart LR
A["NPC appearance name"] -->|"audioVoiceTagAppearanceMapping (hypothesis)"| B["Voice tag, e.g. civ_low_f_31_enus_15_sml"]
B -->|"locVoiceTagListResource: voiceTag to voicesetScenePath"| C["Voiceset .scene"]
D["PlayVoiceOver(npc, n'greeting')"] --> E["SoundPlayVo voContext = greeting"]
E --> C
C --> F["Entry point 'greeting' to random node"]
F --> G["Dialog line: locstring id, lipsync names, overHead style"]
G --> H["Audio by locstring id, lipsync animation, chatter bubble"]
3.1 Voicesets are scenes resource
- The game ships 529 generic voiceset scenes (
sceneCategoryTag: voiceset) underbase\(civilian low, mid, high, homeless, prostitutes and others; gangs; NCPD; security; mercs; a few named characters) resource. Each has one actor, entry points named after triggers,open_ world\ voicesets\ voInfopairs (inVoTrigger→outVoTriggersuch asgreeting→greeting_, with durations), and a screenplay store of dialog lines resource.var_ 1 - A trigger's entry point leads to a
scnRandomizerNode(equal weights) whose outputs are section nodes, each holding onescnDialogLineEventwithvisualStyle: overHead, avoContextand avoExpression, pointing to a screenplay line (locstringId, male and female lipsync animation names, gender mask) resource. - The trigger names match the names scripts pass to
PlayVoiceOverexactly (greeting,bump,fear_,foll fear_,beg fear_,run stlh_, …), so the voice context selects the entry point [resource + source; the native lookup itself is a hypothesis].curious - Civilians share a small vocabulary:
greeting(522 scenes),bump(511),phone_/start phone/phone_(501),end fear_/run fear_/beg fear_(275), the security reprimandsfoll rep_(≈270), stealth* stlh_and combat barks resource. There is no trigger for compliments, stares, outfits or cars.* - Subtitle entries are keyed by string id and have a female and a male variant chosen by V's gender (for example "look at her" / "look at him") resource. Voiced audio and lipsync come from the same string id and the voice's lipsync set (Modding Docs lipsync guide wiki).
3.2 From NPC to voiceset
locVoiceTagListResource(extension.voicetags) listslocVoiceTag { voiceTag, voicesetScenePath, id, isApuc }[source: WolvenKit types]. Named characters setvoiceTagin TweakDB (jackie,panam, …) wiki; crowdCharacterrecords in the REDmod TweakDB sources do not resource.audioVoiceTagAppearanceMappinglists groups of appearance names with candidate voice tags [source: WolvenKit types]. That this is how crowd NPCs get a voice from their appearance is the likely reading hypothesis.entInjectVoiceTagEvent { voiceTagName, forceInjection }andcommunityVoiceTagInitializercan set a voice tag at run time or from a community spawn [source: WolvenKit types].- Quest graphs can play a voiceset trigger directly (
questPlayVoiceset_: puppet,NodeType voicesetName, overriding context, expression and visual style) [source: WolvenKit types].
3.3 Lines that could comment on V resource
Census of the civilian greeting entry points (269 civilian voices, 538 lines, 500 distinct texts):
| Kind | Count | Examples (voice, string id; paraphrased) |
|---|---|---|
| Compliment on looks or style | ≈10 | civ_ 1922672978275344388 (a child admiring V's outfit); civ_ 1949184078459297796 (V has style); civ_ 1948838854256091140 (calls V gorgeous); civ_ 1948863777079336964; civ_ 1949169821449576452 (gendered: pretty / handsome); civ_ 1922697659841781764 (gendered); civ_ 1948819995004362756 (V's face); civ_ 1882070430938308612 |
| Put-down of looks | 2 | civ_ 1954532098822938628 (V needs a new wardrobe, names a fashion brand); civ_ 1954539339500265476 (look what the cat dragged in) |
| "Why are you staring" | ≈10 | civ_ 1954504293389213700; civ_ 1949012166571581440 |
| Car or vehicle comment | 0 | none in any civilian greeting |
- Each voice's greeting randomiser picks between its two lines, so even the right voice says the compliment only half the time resource.
- The
fear_lines that the naked reaction plays are "stop following me" lines (tour guide, stop tailing me, I'm broke) resource: they fit only loosely.foll - Car comments would need new lines. The voiced route is a consenting voice actor or text only; cloning the original actors' voices is ruled out (alive ideas).
4. Text-only barks and subtitles source
- Subtitle and chatter controllers listen to the UI blackboard
UIGameData.ShowDialogLine,HideDialogLine(byCRUID) andHideDialogLineByData, each a variant holding an array sourcebaseSubtitlesControllers.script:120-252. - A line is
scnDialogLineData { id: CRUID, text, type, speaker, speakerName, isPersistent, duration }(animportonlystruct scripts can fill) sourceorphans.script:44905-44926. Line types includeRegular,Holocall,OverHead,OverHeadAlwaysVisible,RadioandNarratorsourceorphans.script:7396-7410. - The chatter controller draws
OverHeadlines above the speaker when the speaker is set and is not V or a vehicle, the scene tier is below 3, no main dialogue blocks broadcasts, and V is within 150 m (20 m in tighter scene tiers);OverHeadAlwaysVisibleskips those checks. Players can switch chatter off in the subtitle settings sourcecyberpunk/.UI/ subtitles/ chattersControllers.script:1-10, 175-206 - Audioware does exactly this for its sounds: it builds the struct with
CreateCRUID, posts[line]toShowDialogLineand hides it by id after the duration source Audiowarer6/,scripts/ Audioware/ Codeware.reds:47-66 Callback.reds:1-12. Localised text can come from ArchiveXLlocalization: onscreens:files, as Responsive NPCs ships source Responsive NPCsarchive/.pc/ mod/ responsive_ npcs.archive.xl - A text bark therefore costs no audio and no voice rights, respects the player's chatter setting, and looks like the vanilla overhead chatter source. Without audio or lipsync the NPC's mouth does not move hypothesis; a facial reaction plus look-at covers most of that.
5. What a script can read
| Fact | How | Grade |
|---|---|---|
| Gameplay items per slot | EquipmentSystem.GetData(player).GetActiveItem(area) | source |
| What is drawn | GetActiveVisualItem, IsSlotHidden, IsSlotOverriden, GetSlotOverridenVisualItem, GetActiveWardrobeSet in cyberpunk/; EquipmentEx outfits through its own API (both installed mods read it) | source |
| Item tags | TweakDBInterface.GetItemRecord(id).TagsContains(tag); iterating Tags() with for crashes per Street Sense's note, so it uses TagsContains | source |
| Nudity (vanilla) | PlayerPuppet.IsNaked(): no gameplay item in legs, outer or inner chest | source |
| V's body gender | GetResolvedGenderName() (Street Sense notes GetGender() returns empty on the player) | source |
| Observer's social archetype | npc.MatchVisualTag(n"anim_ and 20 more (anim_, anim_, anim_, anim_, anim_, anim_, anim_, anim_, anim_, anim_, …); the game uses them to pick locomotion styles | source cyberpunk/ |
| Observer's faction and preset | Character_, the reaction preset type, IsCharacterCivilian(), IsVendor() | source |
| V's vehicle | GetMountedVehicle(player) or VehicleComponent.GetVehicle; Vehicle_: Manufacturer, Type (car, bike), VehicleUIData (production year, horsepower, mass, info text), Affiliation, DisplayName, Tags | source core/, orphans.script (Vehicle_) |
| Car condition | VehicleComponent.m_ 0–3 (from destruction ≤50 %, ≤25 %, near zero), also on the Vehicle.DamageState blackboard | source core/ |
| Car price | Only vehicle-shop offers carry a price (VehicleOffer_ → PurchaseOffer.Price()); how an offer names its vehicle was not found in script | source; the link is a hypothesis |
| District | PreventionSystem → DistrictManager.GetCurrentDistrict() → District_: Type (district and subdistrict enum), ParentDistrict, Gangs, CrimeMultiplier, PreventionPreset, IsQuestDistrict; the UI's UI_ blackboard | source core/ |
| District wealth | none in the record | source |
6. What existing mods do
| Mod | What it does | How | What it teaches |
|---|---|---|---|
| Street Sense | Clothing changes detection and crowd reactions: revealing, positive, intimidating, fear and annoyed outfits, weighted by V's gender and street cred | Scans equipped and EquipmentEx outfit items on slot changes; classifies each by TweakXL tags (Revealing, Intimidating, FearReaction, PositiveReaction, AnnoyedReaction) or a JSON list of 361 mod item-record prefixes, because ArchiveXL dynamic items "eat" TweakXL tags; per class a distance, chance, trigger (stlh_, greeting, bump, fear_) and facial idle | source r6/, r6/ |
| Responsive NPCs | NPCs react to clothing affiliation, a "buck naked" V, a broke V near posh NPCs (disgust), cyberpsychosis, gang vehicles and district | Replaces or wraps several ReactionManagerComponent methods (OnLookedAtEvent, bump and crowd handling); reads NPC anim_ visual tags and affiliation; listens to UI_ for the district | source r6/, PlayerPuppetOverrides.reds:1-200 |
| Responsive V | V answers NPCs with her own voiced lines | Codeware Resource/ callback on V's voiceset scene; swaps the scene's graph, entry points and screenplay for its own and retargets a section's line at run time; a commented draft detects civilian voiceset scenes by sceneCategoryTag | source r6/, responsivev_ |
| Audioware | Audio framework: custom sounds from YAML manifests or scripts, with subtitles | Its own audio backend (RED4ext); subtitles through the UI blackboard as in §4 | source r6/, Callback.reds |
Both reaction mods reuse only vanilla triggers, so what an NPC actually says is whatever its voice's greeting or bump line happens to be source. Street Sense's hand-kept list of mod item records is the per-mod approach XF Studio's architecture contract rules out.
7. How a mod could add reactions
- Hook the existing moment. Wrap
ReactionManagerComponent.TriggerFacialLookAtReaction(orOnProximityLookatEvent) with redscript@wrapMethod, which works on private methods: Responsive NPCs wraps the privateInitialiazeand replaces the privateCheckStalkandHandleCrowdReactionof the same class sourceReactionComponentOverrides.reds:587-1040. The vanilla gating, cooldowns, look-at and reset already apply; the wrapper decides whether V's appearance overrides the vanilla choice [source: the vanilla methods]. A scriptable system could instead poll nearby NPCs, at higher cost and with none of the gating hypothesis. - Choose a face and a look.
AnimFeature_with the idles in §2.2 andFacialReaction ActivateReactionLookAtwithrepeatfor a stare source. - Say something:
- Text bark (§4): cheapest, no rights questions, localisable source.
- A vanilla line in the NPC's own voice: add entry points (for example
xfs_) to civilian voiceset scenes atcompliment Resource/, each leading to lines that voice already has and that fit the context (the census in §3.3, extended by tagging lines offline).PostLoad PlayVoiceOver(npc, n"xfs_then plays with the right voice and lipsync, and silently does nothing for voices without one [hypothesis: Responsive V proves scene patching at load; whether the voiceset system accepts new entry-point names needs a game test].compliment") - New voiced lines: a
voiceovermap.jsonregistered through ArchiveXLlocalization: vomaps:ties a.wemto a string id in a scene wikimodding-guides/; Audioware plays arbitrary audio with subtitles source. Both need consenting voices. Extracting and repacking vanilla VO, as some dialogue mods do, redistributes game audio and is not a route for XF mods.quest/ adding-a-custom-voiceline-to-a-scene.md
8. Design implications for XF Studio
- The assessment layer should read what is drawn, not gameplay slots: wardrobe, hidden slots and EquipmentEx outfits. The Studio's clothing resolver already knows the drawn garments, their visual tags and what they hide (worn clothing), which gives coverage ("revealing") from data instead of a curated list.
- "Fancy" or "shabby" can come from data the game already has: item quality and tags, the garment's resolved materials, the vehicle manufacturer and UI data. District wealth can be derived from the crowd itself: the share of
anim_/Posh anim_/MidCorp anim_againstNightlife anim_/Lowlife anim_/Homeless anim_NPCs near V, which follows the game's own population data instead of a hand-written district table [hypothesis: needs a sample in game].Junkie - The observer matters as much as V: a posh NPC and a lowlife should read the same outfit differently;
anim_tags, affiliation and preset type are the inputs source.* - Lines from data too: an offline pass could tag all 14,003 distinct voiceset lines by what they could plausibly be about (looks, style, staring, weather, …) with evidence, so the in-game mod ships only a table of (voice, trigger, string id), never audio.
Open questions
- Does the voiceset system accept a new entry-point name added at
Resource/, or does it cache entry names natively?PostLoad - Which resource holds the crowd appearance → voice tag mapping, and can a script read an NPC's current voice tag?
- Does a script-built
OverHeadline on an NPC show reliably in open world (distance, scene tier, chatter setting), and does it collide with the NPC's own voiced chatter? - Where does a vehicle offer name its vehicle, and do all player vehicles have an offer (gifts and quest cars do not appear in shops)?
- Do
anim_visual tag shares around V actually separate rich and poor districts?* - Does
IsNakedalso trigger other vanilla behaviour (for example in scenes or vendors) that an XF reaction should respect?
In-game test asks
Not scheduled; for a later session once a prototype exists: walk into a Japantown crowd (a) naked, (b) with the prototype's "revealing" outfit, (c) in a luxury car and a wrecked one in Kabuki and Charter Hill; capture the chatter bubbles, facial reactions and log lines the prototype writes.
Related pages
NPC direction · Facial expressions · Worn clothing · Photo-mode poses · Runtime access · World and streaming · Alive ideas