Source SDK

Source SDK

Not enough ratings
Sistema de respuesta de npc - Motor Source 2013
By H-H-G-M
   
Award
Favorite
Favorited
Unfavorite
Descripción
El Sistema de Respuesta se utiliza para decidir qué línea de discurso (y/o animación) debe utilizar un NPC (o jugador) cuando quiere decir algo, o si debe decir algo en absoluto.

Nota.png Nota: La mayor parte de este artículo se basa en la rama Source 2013. Left 4 Dead Left 4 Dead introdujo un sistema de respuesta reescrito que realiza la mayoría de las mismas funciones, pero tiene diferentes optimizaciones, rutas y utilidades que aún no están completamente documentadas en este artículo. Este sistema mejorado también está disponible en todos los juegos lanzados después de Left 4 Dead, incluyendo Left 4 Dead 2 Left 4 Dead 2 . El código de este sistema está disponible públicamente en las herramientas de autoría de Alien Swarm.

La mayoría de los usuarios del Sistema de Respuesta están destinados a hablar en respuesta a los eventos que se desarrollan en el juego. El habla puede ser desencadenada desde el código o desde las entradas del mapa. La activación del habla implica un concepto de respuesta que se corresponde con las respuestas en el sistema. Los conceptos son categorías de discurso que se utilizan con un evento específico, como por ejemplo que se advierta un peligro (TLK_DANGER) o que se vea un enemigo (TLK_STARTCOMBAT). Mientras que un concepto puede utilizarse solo para un diálogo básico y sencillo, el habla también puede activarse con varios criterios que describen cosas relacionadas con el concepto y/o el estado actual del hablante y el mundo que le rodea. Esto permite crear complejos árboles de diálogo que implican diferentes líneas para diferentes situaciones.

Por ejemplo, npc_alyx en la serie episódica de HL2 habla el concepto TLK_PLAYER_KILLED_NPC cuando el jugador mata a un NPC enemigo. Este concepto tiene criterios adicionales para las condiciones relacionadas con el NPC o la forma en que fue asesinado. Si el jugador mató al PNJ a través de un tiro en la cabeza, el sistema de respuesta elegirá una respuesta que requiere ese criterio, que normalmente resulta en Alyx felicitando el tiro del jugador o comentando que fue un tiro en la cabeza.

El sistema de respuesta normalmente utiliza scripts en el directorio scripts/talker. Cuando recibe un concepto y sus criterios, busca en los scripts de respuesta una regla que coincida con su concepto y criterios. Cuando encuentra una, utiliza la respuesta de esa regla o una selección de respuestas. Una respuesta puede ser un guión de sonido, una frase o incluso una escena coreografiada.

A pesar de las ventajas, la mayoría de los NPCs no utilizan este sistema por defecto. Por ejemplo, el npc_pigeon sólo utiliza soundscripts por defecto y no utiliza el Sistema de Respuesta.

Aquí hay una lista rápida de lugares donde se usa el Sistema de Respuesta:

En Half-Life 2 Half-Life 2 , la mayoría de los NPCs acompañantes del jugador (ciudadanos, Alyx, etc.) utilizan el Sistema de Respuesta para el habla de los NPCs.
En Team Fortress 2 Team Fortress 2 , todas las clases utilizan el Sistema de Respuesta para los comandos de voz y las respuestas de burla.
En la serie Left 4 Dead Left 4 Dead 2 Left 4 Dead, todos los supervivientes utilizan el Sistema de Respuesta para responder a las acciones de los jugadores y a los eventos del mundo.
En Portal 2 Portal 2, Atlas y P-body (los robots del modo cooperativo) utilizan el Sistema de Respuesta para los gestos de burla.
En Counter-Strike: Global Offensive Counter-Strike: Global Offensive , todos los personajes de los jugadores utilizan el Sistema de Respuesta y llevan la cuenta de las respuestas que ya han sido utilizadas.
En Half-Life: Alyx Half-Life: Alyx , ver HLALYX:Response_rules.txt.
Código: El Sistema de Respuesta se utiliza normalmente en las clases derivadas de CBaseFlex con la clase de plantilla CAI_ExpresserHost<>, que se implementa automáticamente en CAI_BaseActor. Todos los NPCs y jugadores ya derivan de CBaseFlex, por lo que normalmente sólo querrás usar CAI_ExpresserHost<>, pero el Sistema de Respuesta puede ser usado de forma más limitada en cualquier entidad usando la función DispatchResponse(), que es como funciona env_speaker. GetResponseSystem() se puede utilizar para hacer que los conceptos busquen un árbol de sistema de respuesta específico y debe ser anulado si usted está planeando utilizar
Propósito
El Sistema de Respuesta fue creado para que los NPCs, jugadores, etc. utilicen un sistema unido y robusto para gestionar el habla. No sólo permite a los desarrolladores y escritores crear complejos árboles de diálogo, sino que también permite a los modders modificar o añadir fácilmente nuevas locuciones al juego sin tener que escribir código o modificar un archivo BSP, a la vez que tienen un control total sobre cómo y cuándo se utilizará el habla.

Este sistema se utiliza mejor para el habla que sale del sistema de IA, ya que esas líneas se pronunciarán muchas veces a lo largo de un juego. (Por ejemplo, los ciudadanos dicen algo cuando recargan su arma. Muchos ciudadanos recargarán sus armas durante el transcurso del juego).

Aquí hay un ejemplo de un árbol de diálogo complejo de un NPC que utiliza el Sistema de Respuesta:

Acabo de matar a un enemigo.
¿He usado una escopeta?
"¡Come la escopeta!"
¿Estaba el enemigo muy cerca?
"¡Te has acercado demasiado!"
"¡Gracias por acercarte!"
¿Era el enemigo un npc_headcrab?
"¡No vas a coger mi cabeza!"
"¡Odio a los cangrejos de la cabeza!"
También puedes utilizar combinaciones de criterios.

¿Utilicé una escopeta contra un npc_headcrab muy cerca de mí?
"¡Te acercaste demasiado a mi escopeta, headcrab!"
También puedes controlar líneas individuales para que no se repitan durante un tiempo determinado, o para que no se repitan nunca.
Estructura
Nota: "Criterio" es la forma singular de "Criterio".
El Sistema de Respuesta se compone de cuatro piezas fundamentales: Conceptos, Criterios, Reglas y Grupos de Respuesta. La forma en que se utilizan es la siguiente:

Un NPC solicita una línea de habla para un concepto de habla.
Por ejemplo, digamos que nuestro PNJ solicita una línea de habla para el concepto TLK_SHOT. Un PNJ habla este concepto cada vez que es disparado por un enemigo.
El PNJ reúne un montón de criterios que reflejan el estado actual del PNJ y otros datos relevantes sobre el estado del mundo. Muchos conceptos también tienen modificadores, que son criterios exclusivos de conceptos específicos que suelen reflejar el evento en sí.
Cuando el PNJ solicita una línea para el concepto TLK_SHOT, el juego reúne la salud actual del PNJ, etc. como parte del conjunto de criterios por defecto. Luego, añade los modificadores del concepto, que pueden incluir el tipo de enemigo que le disparó, la cantidad de daño que recibió, etc.
El concepto y los criterios se pasan al sistema de respuesta del PNJ, que normalmente es una única instancia global compartida por todos los PNJ.
El sistema de respuesta busca en su gran lista de reglas.
Cada regla contiene una lista de criterios que se comprueba con los criterios reunidos por el PNJ. En esta fase, el concepto se trata como un criterio de alta prioridad.
Cada regla recibe una puntuación basada en el número de criterios que son verdaderos. Si al menos un criterio está marcado como obligatorio y no se cumple, la regla nunca será elegida. La mayoría de los criterios se establecen como obligatorios, pero los que no lo son simplemente aumentan la puntuación de la regla.
En nuestro ejemplo de TLK_SHOT, puede haber varias reglas TLK_SHOT que contengan diferentes líneas. Una regla podría contener criterios que comprueben si el PNJ está muy cerca del enemigo que le disparó. Otra regla podría comprobar si fue un tipo específico de enemigo el que le disparó (como un Soldado de Combinación). Otra regla podría comprobar si el PNJ tiene <25% de su salud después del disparo.
El Sistema de Respuesta puntúa todas las reglas de su lista y elige la que tiene la puntuación más alta. La regla que puntúa más alto especifica un grupo de respuesta.
Un grupo de respuesta es simplemente una lista de posibles respuestas, cada una de las cuales puede ser una línea de discurso y/o una animación. Se selecciona una respuesta en función de la configuración del grupo de respuestas y de las respuestas individuales. Cuando se elige una respuesta válida, el PNJ reproduce la respuesta.
En nuestro ejemplo TLK_SHOT, digamos que la regla <25% de salud fue elegida. Esta regla tendría un grupo de respuestas que podría contener una lista de líneas como "¡Un disparo más como ese, y estoy acabado!", "¡Oh hombre, estoy en problemas!", o "¡Necesito atención médica por aquí!"
Otra regla para TLK_SHOT podría comprobar si el enemigo que les dispara es un soldado del Combinado y apuntar a un grupo de respuesta con líneas como "¡Ese soldado del Combinado me tiene inmovilizado!" o "¡Ayúdame con este soldado!". Otra regla podría comprobar si el enemigo es una cañonera Combine y apuntar a un grupo con "¡Esa cañonera me está pateando el culo!" y "¡Que alguien me ayude a derribar esa cañonera antes de que me mate!".
Si ninguna regla coincide con los criterios dados (o el grupo de respuesta elegido no se repite y se ha agotado), el PNJ no dice nada.

Conceptos

Un concepto es una cadena que representa la razón de alto nivel para el intento de habla del personaje. Hay un conjunto de conceptos definidos dentro del código que serán llamados automáticamente, pero un concepto es técnicamente sólo un criterio especial de alto nivel que los personajes tienen en cuenta. No están ligados a nada y puedes crear los tuyos propios libremente en el archivo de respuesta. Puedes invocar conceptos en el código o con la entrada DispatchResponse o SpeakResponseConcept de un actor.

Aquí hay una lista de algunos de los conceptos NPC predefinidos utilizados en Half-Life 2:
TLK_HELLO //Cuando me encuentro con el jugador por primera vez. TLK_IDLE //Cuando he estado inactivo durante un tiempo. TLK_USE //Cuando el jugador trata de +USE. TLK_PLPUSH //Cuando el jugador me empuja. TLK_STARE //Cuando el jugador me mira fijamente durante un rato. TLK_DANGER //Cuando percibo algo cercano que es peligroso (por ejemplo, una granada). TLK_WOUND //Cuando he recibido daño. TLK_HIDEANDRELOAD //Cuando decido esconderme y recargar mi arma. TLK_PLYR_PHYSATK //Cuando me golpea un objeto lanzado por el jugador.
No todos los PNJs hablan todos los conceptos, y no todos los PNJs hablan conceptos en las mismas circunstancias. Ver la lista de conceptos de respuesta para una lista completa.

Conjunto de criterios

Los criterios son un conjunto de condiciones que contienen datos relacionados con el estado actual del hablante y las circunstancias del concepto cada vez que se realiza un intento de habla. Puede interpretarse como un conjunto de KeyValues. Aquí hay un ejemplo de un conjunto de criterios creado por un npc_alyx que está intentando hablar porque acaba de matar a su enemigo actual:

concept = TLK_ENEMY_DEAD //El concepto que el NPC está tratando de hablar. map = d3_c17_07 //El nombre del mapa actual. classname = npc_alyx //El nombre de la clase del PNJ que habla. name = alyx //El nombre del objetivo del PNJ que habla. health = 75 //La salud del PNJ que habla. healthfrac = 0.9375 //La salud del NPC que habla, como una fracción del máximo del NPC. (la salud máxima de npc_alyx es 80 por defecto) El nivel de habilidad actual. skill.cfg = 1 // El nivel de habilidad o resistencia actual. timesinceseenplayer = 0.090000 //La cantidad de tiempo desde que el PNJ que habla ha visto al jugador. distancetoenemy = 312.639679 //La distancia del PNJ que habla a su enemigo actual. activity = ACT_RUN //La actividad de animación que el PNJ que habla está ejecutando. npcstate = [NPCState::Combat] //El estado de la IA del PNJ que habla. enemy = npc_combine_s //El nombre de clase del enemigo actual del PNJ que habla. speed = 79.235 //La velocidad de movimiento del PNJ que habla. weapon = weapon_alyxgun //El arma actual del PNJ que habla. distancetoplayer = 211.240692 //La distancia del PNJ que habla al jugador. seeplayer = 1 //Si el PNJ que habla puede o no ver al jugador. seenbyplayer = 0 //Si el PNJ que habla está o no dentro de la vista del jugador. readiness = agitated //El nivel de preparación del PNJ que habla. playerhealth = 100 //La salud actual del jugador. playerhealthfrac = 1.000 //La salud actual del jugador, como una fracción del máximo del jugador. playerweapon = weapon_shotgun //El arma actual del jugador. playeractivity = ACT_WALK //La actividad de animación que el jugador está realizando. playerspeed = 0.000 //La velocidad de movimiento del jugador.
.
Este concepto no tiene ningún modificador por defecto. Todos los criterios de la lista anterior son generales y se reúnen para cada concepto.

Criterios como los de la lista anterior pueden ser comprobados por la lista de criterios de una regla, y utilizados para tomar decisiones sobre qué grupo de respuesta utilizar para el concepto deseado. Por ejemplo:

El criterio enemigo podría utilizarse para elegir la respuesta adecuada al concepto TLK_ENEMY_DEAD. En lugar de hacer una declaración general, Alyx podría decir "¡Me ocupé de ese soldado!" o "¡Me ocupé de ese cangrejo de la cabeza!".
El campo healthfrac podría utilizarse para elegir una línea "¡Uf, estuvo cerca!" si su salud era <20% cuando acabó con su enemigo.
El campo distancetoenemy podría usarse para elegir diferentes líneas para cuando matara a su enemigo a larga o corta distancia. Por ejemplo, "¡Esos tipos dan miedo cuando se acercan tanto!" o "No es fácil acertarles a esa distancia".
Aunque los criterios listados arriba son generales y no específicos de un concepto, los criterios siempre variarán bajo diferentes circunstancias y puede que no siempre estén disponibles (por ejemplo, los PNJs que no están en combate no tendrán criterios de enemigo o distancia a enemigo). Además, los creadores de mapas pueden añadir criterios adicionales a NPCs específicos, o a todos los NPCs del juego. Ver #Contextos de respuesta para más información.
Criterios de la norma
Las reglas tienen una lista de criterios que se comprueban con el conjunto de criterios del personaje. Cuando se puntúa una regla, cada criterio se comprueba con los datos dados, y la regla recibe puntos por los criterios que coinciden con éxito. La cantidad de puntos que un criterio gana para la regla está determinada por el peso del criterio.

Los criterios se definen dentro de los archivos de script (ver más abajo). Se utiliza el siguiente formato:
criterion <criterion name> <key to check> <desired value> <optional: weight X> <optional: required>

Los parámetros son los siguientes

nombre del criterio
El nombre del criterio. No debe coincidir con un criterio existente.
clave a comprobar
La clave dentro del conjunto de criterios del personaje que este criterio comprobará.
valor deseado
El valor deseado de la clave dentro del conjunto de criterios. Puede adoptar varias formas:
Valores numéricos: "0", "1" o "100".
Valores numéricos inversos: "!=0" coincidiría si el valor no es igual a 0.
Valor de cadena: "npc_alyx", "weapon_alyxgun", o "npc_combine_s".
Valor de enumeración: "[NPCState::Combat]".
Rangos:
">0" : Coincide si el valor es mayor que 0.
"<=0,5" : Coincide si el valor es menor o igual a 0,5.
">10,<=50" : Coincide si el valor es mayor que 10 y menor o igual que 50.
">0,<[NPCState::Alert]" : Coincide si el valor es mayor que 0 y menor que el valor de la enumeración para NPCState::Alert.
Nota: No admite comodines por defecto.
peso X
Un parámetro opcional, donde X es la cantidad de puntos que vale este criterio si coincide. Si no se especifica, el criterio vale 1 punto por defecto.
requerido
Un parámetro opcional que indica que este criterio es necesario para que las reglas que lo contienen puedan ser utilizadas. Si un criterio requerido no coincide con éxito, las reglas que lo contienen puntúan 0 y se saltan inmediatamente. La mayoría de los criterios utilizan este parámetro.
Algunos ejemplos de Half-Life 2:

  • Esto define un criterio llamado PlayerNear, que comprueba que el jugador está a menos de 500 unidades del NPC que habla.
criterion "PlayerNear" "distancetoplayer" "<500" required
Esto define un criterio llamado IsCitizen, que comprueba que el NPC que habla es un npc_citizen.
criterion "IsCitizen" "classname" "npc_citizen" "required"
  • Esto define un criterio llamado IsMap_d3_c17_12, que comprueba que el juego está actualmente en d3_c17_12.bsp. Útil para hacer que todos los ciudadanos de un mapa digan líneas diferentes a las de otros mapas.
criterion "IsMap_d3_c17_12" "map" "d3_c17_12" "required"
  • Esto define un criterio llamado IsBob, que comprueba que el NPC que habla tiene un nombre de objetivo de "bob". Este es un ciudadano único en el juego, y este criterio facilita que diga líneas únicas.
criterion "IsBob" "targetname" "bob" required
Consejo: Un concepto es un criterio que casi siempre tiene un peso de 5.

Reglas

Una regla contiene una lista de criterios y al menos un grupo de respuesta. La regla recibe puntos por cada uno de los criterios que coincida con el conjunto de criterios del orador. La regla con mayor puntuación se dirige a uno de sus grupos de respuesta, que se utiliza para determinar el discurso exacto que utilizará el PNJ. Las reglas se definen dentro de los archivos de script (ver más abajo). Se utiliza el siguiente formato:
rule <rule name> { criteria <criterion name 1> [optional: <criterion name 2> <criterion name 3> etc.] response <response group name> [optional: <response group name 2> etc.] [optional: matchonce] [optional: applyContext <data>] }

Los parámetros son los siguientes

  • rule name : El nombre de la regla. No debe coincidir con una regla existente.
  • criteria : La lista de criterios con los que la regla debe puntuar.
  • response : La lista de grupos de respuesta que deben ser elegidos si esta regla tiene la puntuación más alta.
  • matchonce : Un parámetro opcional que, si se especifica, hace que esta regla se desactive una vez que ha sido elegida una vez.
  • applyContext : Un parámetro opcional que aplica un contexto de respuesta. Véase #Contextos de respuesta para más información.
Por ejemplo, el siguiente texto define una regla llamada CitizenTalkStare. ConceptTalkStare es un criterio que comprueba que el concepto que el NPC que habla quiere hablar es "TLK_STARE". IsCitizen es un criterio que comprueba que el PNJ que habla es un ciudadano. NPCIdle es un criterio que comprueba que el estado del PNJ es "NPCState::Idle". Si esta regla tiene la puntuación más alta, el grupo de respuesta que se utilizará es CitizenTalkStare.

rule CitizenTalkStare { criteria ConceptTalkStare IsCitizen NPCIdle response CitizenTalkStare }

Tenga en cuenta que el nombre de la regla y el nombre del grupo de respuesta pueden ser idénticos porque los nombres de las reglas sólo tienen que ser únicos entre las reglas, y los nombres de los grupos de respuesta sólo son únicos entre los grupos.
Grupos de respuesta
Un grupo de respuesta contiene un conjunto de posibles respuestas, junto con algunos datos opcionales que definen cómo deben utilizarse las respuestas. Cuando un grupo de respuesta es elegido por una regla, se elige una respuesta de la lista y se le devuelve al interlocutor para que la utilice. Los grupos de respuesta se definen dentro de los archivos de script (ver más abajo). Se utiliza el siguiente formato:
response <response name> { [optional: permitrepeats] [optional: sequential] [optional: norepeat] <response type> <response> <optional: ...> <response type> <response> <optional: ...> <response type> <response> <optional: ...> }

Los parámetros del grupo de respuesta son los siguientes:

permitrepeats : Si se especifica, se permite repetir las respuestas de este grupo. Si no se especifica, el comportamiento por defecto es utilizar todas las respuestas de la lista antes de repetir ninguna,
secuencial : Si se especifica, las respuestas se utilizarán en el orden en que aparecen en el grupo. Si no se especifica, el comportamiento por defecto es elegir aleatoriamente las respuestas de la lista.
norepeat : Si se especifica, una vez que se hayan reproducido todas las respuestas de la lista, el grupo de respuestas se desactivará. Las reglas que elijan este grupo de respuestas no devolverán ninguna respuesta al interlocutor.
Respuestas
La respuesta es la respuesta real que selecciona el sistema y que luego utiliza el interlocutor. Un grupo de respuestas puede incluir tantas respuestas como se desee, siendo cada una de ellas de uno de los siguientes tipos:

speak : La respuesta es un guión sonoro o un archivo de audio sin procesar.
sentence : La respuesta es un nombre de frase de sentences.txt.
scene : La respuesta es un archivo .vcd. Para más información, consulte Implementación de la coreografía.
response : La respuesta es una referencia a otro grupo de respuesta que debe ser seleccionado en su lugar.
print : La respuesta es algún texto que debería imprimirse en la posición del orador en el revelador 1 (utilizado para las respuestas de marcador de posición).
Nota: <Mapbase> Mapbase reemplaza esto con mensajes de pantalla tipo game_text por defecto.
entityio (en todos los juegos desde Left 4 Dead)[confirmar] : La respuesta es un evento de E/S que se dispara en una entidad específica con el altavoz como activador. El formato es entityio "<nombre> <input> <param>". Esto es diferente de las respuestas de seguimiento, que se tratan con más detalle más adelante.
Parámetros de retardo de la respuesta
Cada respuesta admite una serie de parámetros opcionales.

nodelay : Una vez terminada la respuesta, el interlocutor puede volver a hablar inmediatamente.
defaultdelay : Después de que la respuesta haya terminado, el orador no podrá hablar durante una cantidad aleatoria, entre 2,8 y 3,2 segundos.
delay X : Después de que la respuesta haya terminado, el orador no podrá hablar durante X segundos. X[/b] también puede ser un rango, por ejemplo "5,5,7,5".
Weapon delay X[/b] : Cuando la respuesta comienza, el orador no disparará su arma durante seconds X[/b]. Sólo está disponible en los aliados NPC de HL2 por defecto.
speakonce : Impide que la respuesta se utilice más de una vez.
odds X : Si se especifica, cuando se elige esta respuesta, hay una probabilidad de que el orador no diga nada en lugar de decir la respuesta. El odds es un (0-100)% de probabilidad de anular la respuesta, lo que significa que un odds de 25 da un 25% de probabilidad de no decir nada.
respeakdelay : Si se especifica, esta respuesta no podrá utilizarse a menos que el concepto no haya sido pronunciado en al menos X segundos. X también puede ser un rango, por ejemplo "5,5,7,5"
soundlevel : Si se especifica, se utilizará este nivel de sonido para la respuesta en lugar del predeterminado SNDLVL_TALKING.
displayfirst : Si se especifica, esta respuesta debe utilizarse primero (ignora el parámetro de peso).
displaylast : Si se especifica, esta respuesta debe utilizarse en último lugar (ignora el parámetro de peso).
weight : Si se especifica, se utiliza para ponderar la selección de las respuestas en la lista. Por defecto, todas las respuestas tienen un peso de 1. Tenga en cuenta que las respuestas no se repetirán hasta que se hayan elegido todas las demás, lo que significa que una vez elegidas todas las respuestas de peso elevado, el sistema sólo contará las respuestas de menor peso. Esto se puede contrarrestar con permitrepeats.
noscene : Impide que el sistema de respuesta cree una escena autogenerada para una respuesta de habla.
stop_on_nonidle : Cuando la respuesta es hablada, detiene la escena cuando el NPC entra en un estado no inactivo. En Source 2013, solo funciona en mods episódicos de HL2 en respuestas de escena.
predelay : Cuando se elige la respuesta, no se habla hasta que hayan pasado X segundos. Sólo funciona en las respuestas de escena. X también puede ser un rango, por ejemplo "5.5,7.5"
Por ejemplo, el siguiente grupo de respuestas es utilizado por los ciudadanos para responder al concepto TLK_STARE. Los ciudadanos utilizarán las respuestas de la lista en el orden en el que aparecen (debido al parámetro secuencial). Cada respuesta, al ser elegida, hace que el PNJ deje de hablar durante un tiempo aleatorio entre 10 y 20 segundos.

response "CitizenTalkStare" { sequential scene "scenes/npc/$gender01/doingsomething.vcd" delay "10,20" scene "scenes/npc/$gender01/getgoingsoon.vcd" delay "10,20" scene "scenes/npc/$gender01/waitingsomebody.vcd" delay "10,20" }
Script files
El /scripts/talker/response_rules.txt es el archivo de script base que contiene todos los criterios, reglas y grupos de respuesta utilizados por el Sistema de Reglas de Respuesta. El archivo también puede incluir otros archivos usando la palabra clave #include, que le permite dividir limpiamente las reglas de acuerdo a NPC, mapa, etc. Tenga en cuenta que algunas entidades, como el env_speaker, especifican sus propios archivos de script que contienen un subconjunto de los criterios, reglas y grupos de respuesta para que la entidad los utilice.
Ver scripts/talker/terminal_pa.txt para un ejemplo utilizado por el anuncio de la terminal en la estación de tren.
Contextos de respuesta
Los contextos de respuesta son como criterios establecidos por el mapeador. Se establecen a través de los "Contextos de Respuesta" (ResponseContext) keyvalue o la entrada AddContext en el siguiente formato: key:value;key:value;key:value;.. y así sucesivamente.

Para hacer: Sección única sobre contextos de respuesta, ¡hay más cosas que aclarar sobre los contextos de respuesta!
Respuestas de seguimiento
Left 4 Dead introdujo los seguimientos "followups", eventos que ocurren después de la respuesta. Se activan como parámetros de respuesta similares a las probabilidades, el retardo, etc.

Código: El código para el sistema de seguimiento está disponible en el SDK de Alien Swarm, junto con el resto del sistema de respuesta reescrito.
fire : Dispara una entrada a través del sistema de E/S con el altavoz como activador y llamador. El formato es fire <target> <input> <delay>. No admite parámetros.
then : Provoca el envío de otra respuesta en una entidad. El formato es then <target> <concept> <contextos de respuesta> <delay>. Se utiliza para hacer que los personajes respondan dinámicamente entre sí.
Nota: Un retardo negativo hace que el seguimiento se envíe X cantidad de tiempo después de que el orador comience a hablar, en lugar de cuando haya terminado de hablar.
Se pueden utilizar algunos nombres de destino únicos:

self : La entidad que habla la respuesta.
subject : Utiliza el nombre de la entidad que se encuentra en el contexto "Subject" del orador, si existe. El juego establece esto para las respuestas info_remarkable.
de : Utiliza el nombre de la entidad que se encuentra en el contexto "De" del orador, si existe. El juego establece esto al nombre del encuestado de seguimiento anterior, permitiendo que los seguimientos reboten hacia adelante y hacia atrás.
any : Se envía a cualquier encuestado válido dentro del rango almacenado en rr_followup_maxdist (1800 por defecto).
all : Se envía a todos los encuestados válidos dentro del rango almacenado en rr_followup_maxdist (1800 por defecto).
Nota: Los contextos "Asunto" y "De" sólo almacenan nombres de entidades, así que ten cuidado cuando haya varios objetivos potenciales con el mismo nombre.

Response _c1m4startelevator4bCoach { scene "scenes/Coach/WorldC1M4B01.vcd" then mechanic _c1m4startelevator5a foo:0 -2.313 //Hijo, tienes un trato. scene "scenes/Coach/WorldC1M4B02.vcd" then mechanic _c1m4startelevator5a foo:0 -5.790 //¡Ja, ja! ¡Todo el camino a Nueva Orleans! Nena, eso suena como un PLAN. scene "scenes/Coach/WorldC1M4B05.vcd" then mechanic _c1m4startelevator5b foo:0 -6.334 //Normalmente no haría esto. Pero en estas circunstancias, creo que al Sr. Gibbs, Jr. no le importará. scene "scenes/Coach/WorldC1M4B10.vcd" then mechanic _c1m4startelevator5b foo:0 -2.685 //Forgive us Jimmy, but we need your car. }
Uso de reglas de respuesta avanzadas
El Sistema de Respuesta puede utilizarse de muchas maneras avanzadas y especializadas. Aquí hay algunos consejos y trucos para el uso avanzado del sistema:

Disparo de respuestas personalizadas con DispatchResponse
Absolutamente cualquier cosa puede ser pasada a un NPC como un concepto de respuesta, siempre y cuando se encuentre en algún lugar de los archivos de script. No estás limitado a los conceptos TLK_* predefinidos de la IA.
Por ejemplo, puedes querer que los NPCs de un grupo que mira hablen conceptos de respuesta de felicitación cuando un jugador resuelve con éxito parte de un puzzle.
Los aliados del jugador en HL2 también tienen una entrada SpeakResponseConcept con un manejo y condiciones más avanzadas.
Consulta los scripts de respuesta para Alyx en EP1/EP2 o los scripts de respuesta para los supervivientes de L4D para ver más ejemplos de uso del sistema de respuesta avanzado.
Notas
  • Para poder utilizar el sistema de Reglas de Respuesta, un NPC debe derivar de la clase CAI_BaseActor.
  • Ver los archivos scripts/talker/npc_*.txt para ejemplos de reglas de respuesta de NPCs específicos.

  • El archivo scripts/talker/response_rules.txt es el manifiesto del sistema de reglas de respuesta.
  • Si añades nuevos archivos de script de reglas de respuesta para tu nuevo NPC, asegúrate de #incluirlo al final del archivo scripts/talker/response_rules.txt.
Ver también
Español
  • Concepto
  • Criterio
  • Contexto
  • Regla
  • Respuesta

inglés
  • Concept
  • Criterion
  • Context
  • Rule
  • Response

Si es necesario lo traduciré, de lo contrario ve a el foro de valve con los conceptos en inglés que quizás se entiendan mejor de esa forma para un comando.