Ru/Response System: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
No edit summary
No edit summary
 
Line 24: Line 24:
* А что касаемо {{hla|4}} - посмотрите отдельную статью {{L|HLALYX:Response_rules.txt}}.
* А что касаемо {{hla|4}} - посмотрите отдельную статью {{L|HLALYX:Response_rules.txt}}.


{{ModernCodenote|The Response System is normally used on classes derived from <code>CBaseFlex</code> with the <code>CAI_ExpresserHost<></code> template class, which is automatically implemented on <code>CAI_BaseActor</code>. All NPCs and players already derive from <code>CBaseFlex</code>, so you'd usually just want to use <code>CAI_ExpresserHost<></code>, but the Response System can be used in a more limited way on any entity using the <code>DispatchResponse()</code> function, which is how {{ent|env_speaker}} works. <code>GetResponseSystem()</code> can be used to make concepts search a specific response system tree and must be overridden if you are planning on using <code>DispatchResponse()</code> without <code>CAI_ExpresserHost<></code>.}}
{{ModernCodenote|Система Реагирования обычно используется для классов, полученных из <code>CBaseFlex</code> с шаблонным классом <code>CAI_ExpresserHost<></code>, которая автоматически реализуется на <code>CAI_BaseActor</code>. Все NPC и игроки уже являются производными от <code>CBaseFlex</code>, так что обычно вы просто хотите использовать <code>CAI_ExpresserHost<></code>, но систему Response можно использовать более ограниченно для любой сущности с помощью функции <code>DispatchResponse()</code>, именно так работает {{ent|env_speaker}}. <code>GetResponseSystem()</code> может использоваться для поиска концептов в конкретном дереве системы ответов и должен быть переопределен, если вы планируете использовать <code>DispatchResponse()</code> без <code>CAI_ExpresserHost<></code>.}}


==Задача==
==Задача==
Line 51: Line 51:
{{note|'Criterion' - это форма единственного числа от 'Criteria'.}}
{{note|'Criterion' - это форма единственного числа от 'Criteria'.}}


В Response System'е имеются четыре составные части: '''Концепты (Concepts)''', '''Критерии (Criteria)''', '''Правила (Rules)''', и '''Группа ответов (Response Groups)'''. И вот каким образом они используются:
В Response System'е имеются четыре составные части: '''Концепты (Concepts)''', '''Критерии (Criteria)''', '''Правила (Rules)''', и '''Группы реакций (Response Groups)'''. И вот каким образом они используются:
#NPC запрашивает реплику для '''концепции''' речи.
#NPC запрашивает реплику для '''концепции''' речи.
#*''Например, наш NPC запрашивает строку речи для концепции <code>TLK_SHOT</code>. NPC произносит эту концепцию всякий раз, когда в него стреляет враг.''
#*''Например, наш NPC запрашивает строку речи для концепции <code>TLK_SHOT</code>. NPC произносит эту концепцию всякий раз, когда в него стреляет враг.''
Line 110: Line 110:
  playerspeed            = 0.000                  Текущий момент скорости игрока.
  playerspeed            = 0.000                  Текущий момент скорости игрока.


This concept does not have any modifiers by default. All criteria in the above list are general and gathered for each concept.
По умолчанию у этой концепции нет модификаторов. Все критерии в приведенном выше списке являются общими и собираются для каждой концепции.


Criteria such as the ones in the list above can be checked by a rule's list of criteria, and used to make decisions about which response group to use for the desired concept. For instance:
Критерии, подобные приведенным в списке, можно проверить по списку критериев правила и использовать для принятия решения о том, какую группу ответов использовать для нужной концепции. Например:


*The ''enemy'' criterion could be used to pick the right response to the TLK_ENEMY_DEAD concept. Instead of making a general statement, Alyx could say "I took care of that soldier!" or "I took care of that headcrab!".
*Критерий ''enemy'' можно использовать для выбора правильной реакции на концепцию TLK_ENEMY_DEAD. Вместо того чтобы делать общие заявления, Аликс может сказать: "Я позаботилась о том солдате!" или "Я позаботилась о том хедкрабе!".
*The ''healthfrac'' field could be used to choose a "Phew, that was close!" line if her health was <20% when she finished off her enemy.
*Поле ''healthfrac'' можно использовать для выбора строки "Фух, это было близко!", если здоровье Аликс было <20%, когда она прикончила врага.
*The ''distancetoenemy'' field could be used to choose different lines for when she killed her enemy at long or short range. i.e. "Those guys are scary when they get that close!" or "It's not easy hitting 'em at that range."
*Поле ''distancetoenemy'' Поле можно использовать для выбора разных реплик, когда она убивает врага на дальнем или ближнем расстоянии. Например, "Эти парни пугают, когда подходят так близко!" или "Нелегко попасть в них на таком расстоянии".


Even though the criteria listed above are general and not concept-specific, the criteria will always vary under different circumstances and might not always be available (i.e. NPCs that aren't in combat won't have ''enemy'' or ''distancetoenemy'' criteria). Additionally, mapmakers can append extra criteria to specific NPCs, or to all NPCs in the game. See {{L|Context|Response contexts}} for more info.
Несмотря на то, что перечисленные выше критерии являются общими и не зависят от конкретной концепции, они всегда будут меняться в зависимости от обстоятельств и не всегда могут быть доступны (например, у NPC, которые не находятся в бою, не будет критериев ''enemy'' или ''distancetoenemy''). Кроме того, составители карт могут добавлять дополнительные критерии к определенным NPC или ко всем NPC в игре. Подробнее см. в разделе {{L|Context|Response contexts}}.


===Rule Criteria===
===Критерии правил===
Rules have a list of criteria that are tested against the character's criteria set. When a rule is scored, each criterion is checked against the given data, and the rule receives '''points''' for criteria that successfully match. The amount of points a criterion earns for the rule is determined by the criterion's '''weight'''.
Правила содержат список критериев, которые проверяются на соответствие набору критериев персонажа. Когда правило оценивается, каждый критерий проверяется по заданным данным, и правило получает '''очки''' за критерии, которые успешно совпали. Количество очков, которое критерий зарабатывает для правила, определяется его '''весом'''.


Criteria are defined inside the script files (see below). The following format is used:
Критерии задаются в файлах сценариев (см. ниже). Используется следующий формат:
  criterion <criterion name> <key to check> <desired value> <optional: weight X> <optional: required>
  criterion <criterion name> <key to check> <desired value> <optional: weight X> <optional: required>


The parameters are as follows:
Параметры следующие:
;criterion name
;criterion name
:The name of the criterion. Must not match an existing criterion.
:Имя критерия. Не должно совпадать с уже существующими!
;key to check
;key to check
: The key within the character's criteria set that this criterion will check.
: Значение в наборе критериев персонажа, которое проверяется этим критерием.
;desired value
;desired value
: The desired value of the key within the criteria set. This can take multiple forms:
: Желаемое значение ключа в наборе критериев. Оно может принимать различные формы:
:*Numeric values: "0", "1", or "100".
:*Числовые значения: "0", "1", or "100".
:*Inverse Numeric values: "!=0" would match if the value is not equal to 0.
:*Обратные числовые значения: "!=0" будет соответствовать любое значение, не равное нулю.
:*String value: "npc_alyx", "weapon_alyxgun", or "npc_combine_s".
:*Строковое значение: "npc_alyx", "weapon_alyxgun", или "npc_combine_s".
:*{{L|Enumeration|Enumerated}} value: "[NPCState::Combat]".
:*{{L|Enumeration|Перечисления}} и их значения: "[NPCState::Combat]".
:*Ranges:  
:*Диапазоны:  
:**">0" : Match if the value is greater than 0.
:**">0" : Соответствует, если значение больше "0".
:**"<=0.5" : Match if the value is less than, or equal to, 0.5.
:**"<=0.5" : Соответствует, если значение меньше или равно "0,5".
:**">10,<=50" : Match if the value is greater than 10 and less than, or equal to, 50.
:**">10,<=50" : Соответствует, если значение превышает "10" и если значение не превышает или равно "50".
:**">0,<[NPCState::Alert] : Match if the value is greater than 0 and less then the value of enumeration for NPCState::Alert.
:**">0,<[NPCState::Alert] : Соответствует, если значение больше "0" и меньше значения перечисления для NPCState::Alert.
:{{note|Does not support wildcards by default.}}
:{{note|По умолчанию не поддерживает подстановочные знаки.}}
;weight X
;weight X
: An optional parameter, where X is the amount of points this criterion is worth if it matches. If unspecified, criterion are worth 1 point by default.
: Необязательный параметр, где X - это количество очков, которое начисляется этому критерию, если он совпадает. Если параметр не указан, то по умолчанию критерий оценивается в 1 балл.
;required
;required
: An optional parameter that states that this criterion is required for rules containing it to be used at all. If a required criterion does not match successfully, rules containing it score 0 and are immediately skipped. Most criteria use this parameter.
: Необязательный параметр, указывающий, что этот критерий необходим для того, чтобы содержащие его правила вообще использовались. Если обязательный критерий не совпадает, правила, содержащие его, получают 0 баллов и сразу же пропускаются. Большинство критериев используют этот параметр.


И вот некоторые примеры из ''Half-Life 2'':
И вот некоторые примеры из ''Half-Life 2'':
Line 160: Line 160:
{{tip|Концепция - это критерий, который почти всегда имеет вес 5.}}
{{tip|Концепция - это критерий, который почти всегда имеет вес 5.}}


===Rules===
===Правила===
A '''rule''' contains a list of criteria and at least one response group. The rule receives points for each of the criteria that successfully matches the speaker's criteria set. The highest scoring rule will direct to one of its response groups, which is used to determine the exact speech the NPC will use.  
Правило содержит список критериев и по крайней мере одну группу ответов. Правило получает очки за каждый критерий, который успешно соответствует набору критериев говорящего. Правило, набравшее наибольшее количество очков, направляет в одну из своих групп ответов, которая используется для определения точной речи NPC.  
Rules are defined inside the script files (see below). The following format is used:
Правила задаются в файлах сценариев (см. ниже). Используется следующий формат:
<pre>
<pre>
rule <rule name>
rule <rule name>
Line 172: Line 172:
}
}
</pre>
</pre>
The parameters are as follows:
Параметры следующие:
*'''rule name''' : The name of the rule. Must not match an existing rule.
*'''rule name''' : Имя правила.
*'''criteria''' : The list of criteria the rule should score with.
*'''criteria''' : Список критериев, по которым правило должно оцениваться.
*'''response''' : The list of response groups that should be chosen if this rule scores the highest.
*'''response''' : Список групп ответов, которые должны быть выбраны, если это правило набрало наибольшее количество баллов.
*'''matchonce''' : An optional parameter which, if specified, causes this rule to be deactivated once it has been chosen once.
*'''matchonce''' : Необязательный параметр, указание которого приводит к деактивации этого правила после того, как оно было выбрано один раз.
*'''applyContext''' : An optional parameter which applies a {{L|Context|response context}}.
*'''applyContext''' : Необязательный параметр, который применяет {{L|Context|"контекст" ответов}}.


For example, the following text defines a rule called ''CitizenTalkStare''. ''ConceptTalkStare'' is a criterion that checks to make sure the '''concept''' the speaking NPC wants to speak is "TLK_STARE". ''IsCitizen'' is a criterion that checks to make sure the speaking NPC is a {{L|npc_citizen|citizen}}. ''NPCIdle'' is a criterion that checks to make sure the NPC's state is "NPCState::Idle". If this rule scores highest, the response group that will be used is ''CitizenTalkStare''.
Например, следующий текст определяет правило под названием ''CitizenTalkStare''. ''ConceptTalkStare'' - это критерий, который проверяет, что '''концепция''', которую хочет произнести говорящий NPC, является '''TLK_STARE'''. ''IsCitizen'' - критерий, проверяющий, что говорящий NPC является {{L|npc_citizen|ситизеном}}. ''NPCIdle'' - критерий, проверяющий, что состояние NPC равно «NPCState::Idle». Если это правило набирает наибольшее количество баллов, то будет использована группа ответа ''CitizenTalkStare''.
<pre>
<pre>
rule CitizenTalkStare
rule CitizenTalkStare
Line 187: Line 187:
}
}
</pre>
</pre>
Note that the rule name and the response group name can be identical because rule names need only be unique amongst rules, and response groups names only unique amongst groups.
Обратите внимание, что имя правила и имя группы ответа могут быть одинаковыми, поскольку имена правил должны быть уникальными только среди правил, а имена групп ответа - только среди групп.


===Response Groups===
===Группы реакций===
A '''response group''' contains a set of possible '''responses''', along with some optional data that defines how the responses should be used. When a response group is chosen by a rule, a response is chosen from the list and given back to the speaker to use.
'''Группы реакций''' содержат в себе всевозможного рода '''реагирования''' вместе с некоторыми необязательными данными, определяющими, как эти ответы должны использоваться. Когда группа ответов выбирается правилом, ответ выбирается из списка и передается говорящему для использования.
Response groups are defined inside the script files (see below). The following format is used:
Группы ответов определяются в файлах скриптов (см. ниже). Используется следующий формат:
<pre>
<pre>
response <response group name>
response <response group name>
Line 204: Line 204:
}
}
</pre>
</pre>
The response group parameters are as follows:
Параметры группы реагирований следующие:
*'''permitrepeats''' : If specified, responses in this group are allowed to repeat. If unspecified, the default behavior is to use all responses in the list before repeating any,
*'''permitrepeats''' : Если указано, ответы в этой группе разрешено повторять. Если не указано, то по умолчанию используются все ответы в списке, прежде чем повторить какой-либо из них,
*'''sequential''' : If specified, responses will be used in the order they're listed in the group. If unspecified, the default behavior is to randomly choose responses from the list.
*'''sequential''' : Если указано, ответы будут использоваться в том порядке, в котором они перечислены в группе. Если не указано, то по умолчанию ответы будут выбираться из списка случайным образом.
*'''norepeat''' : If specified, once all responses in the list have been played, the response group will be disabled. Any rules that choose this response group will return no response to the speaker.
*'''norepeat''' : Если указано, то после воспроизведения всех ответов в списке группа ответов будет отключена. Все правила, выбравшие эту группу ответов, не будут возвращать спикеру никакого ответа.


====Responses====
====Ответы====
The '''response''' is the actual response which is selected by the system and then used by the speaker. A response group can list as many responses as desired, with each response being one of the following types:
'''Ответ (Response)''' - это фактический ответ, который выбирается системой и затем используется динамиком. В группе ответов может быть перечислено столько ответов, сколько необходимо, причем каждый ответ может быть одного из следующих типов:


*'''speak''' : The response is a {{L|Soundscripts|soundscript}} or raw audio file.
*'''speak''' : Ответ в виде {{L|Soundscripts|звукового скрипта}} или сырого аудиофайла.
*'''sentence''' : The response is a sentence name from {{ent|sentences.txt}}.
*'''sentence''' : Ответ в виде sentence строчки. Указывается имя фразы/предложения из {{ent|sentences.txt}}.
*'''scene''' : The response is a <code>.vcd</code> file. See {{L|Choreography Implementation}} for more information.
*'''scene''' : Ответ формата файла <code>.vcd</code>. Чтобы больше узнать про реализацию хореографических сцен, ознакомьтесь с {{L|Choreography Implementation|этой статьёй}}.
*'''response''' : The response is a reference to another response group which should be selected instead.
*'''response''' : Ответ представляет собой ссылку на другую группу ответов, которая должна быть выбрана вместо него.
*'''print''' : The response is some text that should be printed at the speaker's position in <code>developer 1</code> (used for placeholder responses). {{note|{{mapbase|4.1}} replaces this with {{ent|game_text}}-like screen messages by default.}}
*'''print''' : Этот ответ представляет собой текст, который должен быть напечатан на месте диктора при <code>developer 1</code> (используется как временный заменитель полноценного ответа). {{note| В {{mapbase|4.1}} это было заменено на {{ent|game_text}} - как экранные сообщения по умолчанию.}}
*'''entityio''' {{since|{{asw}}}}{{confirm}}{{also|{{mapbase}}}} : The response is an {{L|Inputs and Outputs|I/O event}} which fires on a specific entity with the speaker as the activator. The format is <code>entityio "<name> <input> <param>"</code>. This is different from followup responses, which are covered in more detail farther below.
*'''entityio''' {{since|{{asw}}}}{{confirm}}{{also|{{mapbase}}}} : Ответ как {{L|Inputs and Outputs|I/O событие}}, которое посылается определённой сущности на карте как активатор. Формат вида: <code>entityio "<name> <input> <param>"</code>. Это отличается от последующих ответов, которые более подробно рассматриваются ниже.
*'''vscript''' {{only|{{mapbase}}}} : The response is a line of {{L|VScript}} code that runs from the scope of the speaker.
*'''vscript''' {{only|{{mapbase}}}} : Ответ в виде {{L|VScript}} кода, которая проходит через говорящего.
*'''vscript_file''' {{only|{{mapbase}}}} : The response is a path to a VScript file that runs from the scope of the speaker.
*'''vscript_file''' {{only|{{mapbase}}}} : Ответ как это путь к файлу VScript, который запускается из области видимости говорящего.


====Post-response delay parameters====
====Параметры задержки после ответа====
Each response supports a variety of optional parameters.
Each response supports a variety of optional parameters.


**'''nodelay''' : After the response has finished, the speaker is allowed to speak again immediately.
**'''nodelay''' : После завершения ответа говорящий может сразу вновь заговорить.
**'''defaultdelay''' : After the response has finished, the speaker won't be allowed to speak for a random amount, between 2.8 & 3.2 seconds.
**'''defaultdelay''' : После завершения ответа говорящий не сможет говорить в течение произвольного времени - от "2,8" до "3,2" секунды.
**'''delay X''' : After the response has finished, the speaker won't be allowed to speak for X seconds. X can also be a range, e.g. "5.5,7.5"
**'''delay X''' : После завершения ответа говорящий не сможет говорить в течение заданного времени X в секундах. X также может быть диапазоном, например, "5.5,7.5"
*'''weapondelay X''' : When the response starts, the speaker will not fire their weapon for X seconds. Only available on HL2 NPC allies by default.
*'''weapondelay X''' : После начала ответа говорящий не будет стрелять из своего оружия в течение X секунд. По умолчанию доступно только для NPC-союзников HL2.
*'''speakonce''' : Prevents the response from being used more than once.
*'''speakonce''' : Предотвращает использование ответа более одного раза.
*'''odds X''' : If specified, then when this response is chosen, there is a chance the speaker will say nothing instead of saying the response. The odds is a (0-100)% chance of canceling the response, meaning an odds of 25 gives a 25% chance of saying nothing.
*'''odds X''' : Если указано, то при выборе этого ответа есть вероятность, что говорящий вместо ответа ничего не скажет. Шанс - это (0-100)% вероятности отмены ответа, то есть коэффициент 25 дает 25 % вероятности того, что говорящий ничего не скажет.
*'''respeakdelay''' : If specified, this response may not be used unless the concept hasn't been spoken in at least X seconds. X can also be a range, e.g. "5.5,7.5"
*'''respeakdelay''' : Если указано, этот ответ не может быть использован, если концепция не была озвучена в течение как минимум X секунд. X также может быть диапазоном, например, "5.5,7.5".
*'''soundlevel''' : If specified, this soundlevel should be used for the response instead of the default SNDLVL_TALKING.
*'''soundlevel''' : Если указано, этот уровень звука (soundlevel) должен использоваться для ответа вместо стандартного SNDLVL_TALKING.
*'''displayfirst''' : If specified, this response should be used first (ignores the weight parameter).
*'''displayfirst''' : Если указано, то этот ответ должен использоваться первым (игнорируется параметр weight).
*'''displaylast''' : If specified, this response should be used last (ignores the weight parameter).
*'''displaylast''' : Если указано, этот ответ должен использоваться последним (игнорируется параметр weight).
*'''weight''' : If specified, used to weight the selection of the responses in the list. By default, all responses have a weight of 1. Please note that responses won't be repeated until all of the other responses have been chosen, meaning once all of the high-weight responses are chosen, the system will only count the responses of less weight. This can be counteracted with '''permitrepeats'''.
*'''weight''' : Если указано, используется для определения веса при выборе ответов в списке. По умолчанию все ответы имеют вес "1". Обратите внимание, что ответы не будут повторяться до тех пор, пока не будут выбраны все остальные ответы, то есть после выбора всех ответов с большим весом система будет учитывать только ответы с меньшим весом. Этому можно противостоять с помощью '''permitrepeats'''.
*'''noscene''' : Stops the Response System from creating an auto-generated scene for a '''speak''' response.
*'''noscene''' : Запрещает системе ответа создавать автоматически генерируемую сцену для ответа '''говорить'''.
*'''stop_on_nonidle''' : When the response is spoken, stop the scene when the NPC enters a non-idle state. In Source 2013, only works in HL2 episodic mods on '''scene''' responses.
*'''stop_on_nonidle''' : Когда ответ произнесен, остановите сцену, когда NPC перейдет в неактивное состояние. В Source 2013 работает только в эпизодических модах HL2 на реакциях '''scene'''.
*'''predelay''' : When the response is chosen, it won't actually be spoken until X seconds have passed. Only works on '''scene''' responses. X can also be a range, e.g. "5.5,7.5"
*'''predelay''' : Когда ответ выбран, он не будет произнесен до истечения X секунд. Работает только для ответов '''scene'''. X также может быть диапазоном, например, "5.5,7.5".


For example, the following response group is used by {{L|npc_citizen|citizens}} to respond to the TLK_STARE concept. Citizens will use the responses in the list in the order they're listed (due to the ''sequential'' parameter). Each response, when chosen, stops the NPC from talking for a random amount of time between 10 & 20 seconds.
Например, следующая группа ответов используется {{L|npc_citizen|гражданскими}} для ответа на концепцию TLK_STARE. Граждане будут использовать ответы из списка в том порядке, в котором они перечислены (из-за параметра ''sequential''). Каждый ответ, когда он выбран, останавливает разговор NPC на случайный промежуток времени между 10 и 20 секундами.
<pre>
<pre>
response "CitizenTalkStare"
response "CitizenTalkStare"
Line 250: Line 250:
</pre>
</pre>


==Script files==
==Файлы скриптов==
The <code>/scripts/talker/response_rules.txt</code> is the base script file that contains all the criteria, rules, and response groups used by the Response Rules System. The file can also include other files using the '''#include''' keyword, which allows you to cleanly divide the rules up according to NPC, map, and so on.
Файл <code>/scripts/talker/response_rules.txt</code> - это базовый скрипт, содержащий все критерии, правила и группы ответов, используемые системой Response Rules System'ой. Файл также может включать в себя другие файлы с помощью ключевого слова '''#include''', что позволяет четко разделить правила на NPC, карты и так далее.
Note that some entities, like the {{L|env_speaker}}, specify their script files that contain a subset of the criteria, rules, and response groups for the entity to use. See <code>scripts/talker/terminal_pa.txt</code> for an example used by the terminal announcement at the train station.
Обратите внимание, что некоторые сущности, например {{L|env_speaker}}, указывают свои файлы сценариев, содержащие подмножество критериев и правил, и группы ответов для использования сущностью. Ознакомьтесь с <code>scripts/talker/terminal_pa.txt</code> как пример, используемый в объявлении терминала на железнодорожном вокзале.


==Followup responses==
==Followup responses==
Line 283: Line 283:
</pre>
</pre>


==Advanced response rules usage==
==Использование расширенных правил реагирования==
The Response System can be used in many advanced and specialized ways. Here's a few tips and tricks for advanced usage of the system:
Система реагирований может быть использована во многих продвинутых и специализированных направлениях. Вот несколько советов и приемов для расширенного использования системы:


;Firing custom responses with <code>DispatchResponse</code>
;Получение пользовательских ответов с помощью <code>DispatchResponse</code>
:Absolutely anything can be passed to an NPC as a response concept, so long as it is to be found somewhere in the script files. You aren't limited to the AI's predefined TLK_* concepts at all.
:В качестве концепции ответа NPC можно передать абсолютно все, что угодно, лишь бы это было найдено в файлах сценария. Вы не ограничены предопределенными концептами TLK_* ИИ.
:''For example'', you might want NPCs from a onlooking group to speak congratulatory response concepts when a player successfully solves part of a puzzle.
:''Например'', вы можете захотеть, чтобы NPC из группы зрителей произносили поздравительные речи, когда игрок успешно решает часть головоломки.
:Player allies in HL2 also have a <code>SpeakResponseConcept</code> input with more advanced handling and conditions.
:У союзников игрока в HL2 также есть вход <code>SpeakResponseConcept</code> с более продвинутой обработкой и условиями.


See the response scripts for Alyx in EP1/EP2 or the response scripts for the L4D survivors for more examples of advanced response system usage.
Смотрите скрипты ответа для Аликс в EP1/EP2 или скрипты ответа для выживших в L4D для других примеров использования продвинутой системы ответа.


==Debugging==
==Debugging==
Line 299: Line 299:
* Для того, чтобы возможность использовать Response Rules, NPC должен быть основан на класса {{L|CAI_BaseActor}}.
* Для того, чтобы возможность использовать Response Rules, NPC должен быть основан на класса {{L|CAI_BaseActor}}.
* Рекомендуется просмотреть файлы <code>scripts/talker/npc_*.txt</code> как примеры использования специфичных правил ответа NPC.
* Рекомендуется просмотреть файлы <code>scripts/talker/npc_*.txt</code> как примеры использования специфичных правил ответа NPC.
* <code>scripts/talker/response_rules.txt</code> - это манифест-файл системы правил ответов. Если вам необходимо добавить правила реагирования для вашего уникального NPC, убедитесь что вы включили вашего NPC в манифест ('''#include''' в конце файлы <code>scripts/talker/response_rules.txt</code>).
* <code>scripts/talker/response_rules.txt</code> - это манифест-файл системы правил ответов. Если вам необходимо добавить правила реагирования для вашего уникального NPC, убедитесь что вы включили вашего NPC в манифест ('''#include''' в конце файла <code>scripts/talker/response_rules.txt</code>).


==See also==
==See also==

Latest revision as of 07:07, 20 October 2024

Under construction.png
This page is actively undergoing a major edit.
As a courtesy, please do not edit this while this message is displayed.
If this page has not been edited for at least several hours to a few days, please remove this template. This message is intended to help reduce edit conflicts; please remove it between editing sessions to allow others to edit the page.

The person who added this notice will be listed in its edit history should you wish to contact them.

Info content.png
This page needs to be translated.
This page either contains information that is only partially or incorrectly translated, or there isn't a translation yet.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.(en)

Система Реакций/Реагирования (Response System) используется для того, чтобы решить, какую реплику (и/или анимацию) следует использовать NPC (или игроку), когда они хотят что-то сказать, и стоит ли вообще что-то говорить.

Note.pngПримечание:Большая часть этой статьи основана на ветке Source 2013. В Left 4 Dead Left 4 Dead появилась переписанная система ответов, которая выполняет большинство тех же функций, но имеет различные оптимизации, пути и утилиты, которые еще не полностью задокументированы в этой статье. Эта улучшенная система также доступна во всех играх, выпущенных после Left 4 Dead, включая Left 4 Dead 2 Left 4 Dead 2. Код этой системы находится в открытом доступе по адресу Alien Swarm - SDK Alien Swarm Authoring Tools. (также в Mapbase)

Большинство пользователей системы Response System должны говорить в ответ на события, происходящие в игре. Речь может быть вызвана кодом или вводом данных с карты. Триггерная речь включает в себя реакцию концепт, которая соответствует реакциям в системе. Концепты - это категории речи, используемые в связи с определенным событием, например, с тем, что была замечена опасность (TLK_DANGER) или был увиден враг (TLK_STARTCOMBAT). Хотя концепт можно использовать отдельно для базового и простого диалога, речь также может быть вызвана различными Критериями которые описывают вещи, связанные с концепцией и/или текущим состоянием говорящего и окружающего его мира. Это позволяет создавать сложные диалоговые деревья, включающие разные реплики для разных ситуаций.

Например, npc_alyx в эпизодах серии Half-Life 2 использует концепт TLK_PLAYER_KILLED_NPC - когда игрок убивает враждебного NPC. Этот концепт является дополнительным критерием для условий, относящийся к NPC или способом, как был убит NPC. Если игрок убил NPC выстрелом в голову, система реагирования подберет ответ, включающий такой критерий, и в таком случае Аликс будет хвались игрока за точность или отметит убийство врага выстрелов голову.

По стандарту система реагирований использует скрипты, находящиеся по пути scripts/talker относительно GameInfo.txt. Получив концепцию и её критерии, он ищет в сценариях ответов правило, соответствующее концепции и критериям. Когда правило найдено, он использует его ответ или выбор ответов. Такой ответ может быть как звуковым скриптом(en), как заготовленной sentence(en) фразой, так и хореографической сценой(en).

Несмотря на преимущества, большинство NPC не используют эту систему по умолчанию. Например, npc_pigeon голубь по умолчанию использует только звуковые скрипты и не использует систему ответов.

Краткий перечень, где используется система реагирования:

  • В Half-Life 2 Half-Life 2 большинство NPC-компаньонов (ситизены(en), Аликс(en), и т.д.) используют систему правил реагирования для NPC.
  • В Team Fortress 2 Team Fortress 2 все классы используют систему реагирования для голосовых команд и ответных колкостей.
  • В Серия игр Left 4 DeadСерия игр Left 4 Dead Серия игр Left 4 Dead все выжившие используют систему реагирования, чтобы отвечать на действия игроков и события в мире.
  • В Portal 2 Portal 2 Атлас и P-body (роботы в совместном режиме) используют систему реагирования для дразнящих жестов.
  • В Counter-Strike: Global Offensive Counter-Strike: Global Offensive все персонажи игроков используют систему ответов и следят за тем, какие ответы уже были использованы.
  • А что касаемо Half-Life: Alyx Half-Life: Alyx - посмотрите отдельную статью HLALYX:Response_rules.txt(en).
Cpp.pngКод:Система Реагирования обычно используется для классов, полученных из CBaseFlex с шаблонным классом CAI_ExpresserHost<>, которая автоматически реализуется на CAI_BaseActor. Все NPC и игроки уже являются производными от CBaseFlex, так что обычно вы просто хотите использовать CAI_ExpresserHost<>, но систему Response можно использовать более ограниченно для любой сущности с помощью функции DispatchResponse(), именно так работает env_speaker. GetResponseSystem() может использоваться для поиска концептов в конкретном дереве системы ответов и должен быть переопределен, если вы планируете использовать DispatchResponse() без CAI_ExpresserHost<>.

Задача

Система Response System была создана для того, чтобы NPC, игроки и т.д. использовали единую и надежную систему управления речью. Она не только позволяет разработчикам и сценаристам создавать сложные диалоговые деревья, но и позволяет моддерам легко изменять или добавлять новую речь в игру без необходимости писать код или изменять BSP-файл, сохраняя при этом полный контроль над тем, как и когда будет использоваться речь.

Эту систему лучше всего использовать для речи, исходящей от системы ИИ, поскольку эти реплики будут произноситься много раз на протяжении всей игры. (например, граждане говорят что-то, когда перезаряжают оружие).

Вот пример сложного диалога с NPC, использующего систему ответов:

  • Я только что убил врага.
  • Использовал дробовик?
  • "Съешь свинца!"
  • Был ли враг достаточно близко?
  • "Не так близко!"
  • "Спасибо что подошел!"
  • "Ты не получишь мою бошку!"
  • "Ненавижу хедкрабов!"

Вы также можете использовать комбинации различных критериев.

  • Использовал ли я дробовик против npc_headcrab, который был достаточно близко ко мне?
  • "Отойди от моей пушки, хедкраб!"

Вы также можете управлять отдельными строками, чтобы они не повторялись в течение определенного времени или вообще не повторялись.

Структура

Note.pngПримечание:'Criterion' - это форма единственного числа от 'Criteria'.

В Response System'е имеются четыре составные части: Концепты (Concepts), Критерии (Criteria), Правила (Rules), и Группы реакций (Response Groups). И вот каким образом они используются:

  1. NPC запрашивает реплику для концепции речи.
    • Например, наш NPC запрашивает строку речи для концепции TLK_SHOT. NPC произносит эту концепцию всякий раз, когда в него стреляет враг.
  2. NPC собирает кучу критериев, отражающих текущее состояние NPC и другие важные данные о состоянии мира. Многие концепции также имеют модификаторы - критерии, уникальные для конкретных концепций, которые обычно отражают само событие.
    • Когда NPC запрашивает концепт TLK_SHOT, игра собирает текущее здоровье NPC (например) как часть набора критериев по умолчанию. Затем он добавляет модификаторы концепции, которые могут включать тип врага, который в них стрелял, количество полученного урона и т.д.
  3. Концепт и Критерии передаются в систему ответа NPC, которая обычно представляет собой один глобальный экземпляр, общий для всех NPC.
  4. Теперь система реагирования просматривает большой список правил.
    • Каждое такое правило содержит в себе список критериев, которые который проверяется на соответствие критериям, собранным NPC. Обратите внимание, что на этом этапе концепция рассматривается как высокоприоритетный критерий.
    • Каждое правило получает оценку, основанную на том, сколько критериев верны. Если хотя бы один критерий отмечен как 'обязательный' и не выполнен, правило никогда не будет выбрано. Большинство критериев являются обязательными, но критерии, которые не являются обязательными, просто повышают оценку правила.
      • Для нашего TLK_SHOT может содержаться несколько TLK_SHOT правил, которые имеют различные реплики. Одно правило может содержать критерий, проверяющий насколько близок к NPC враг, который стрелял в него. Другое может проверять, выстелил ли в NPC враг особо класса сущности (как пример, Солдат Альянса). Ещё одно - уровень здоровья NPC (например, осталось ли у NPC хотя бы 25% уровня его здоровья после выстрела.)
  5. Система реагирования оценивает все правила в своем списке и выбирает то, которое набрало наибольшее количество баллов. Правило, набравшее наибольшее количество баллов, определяет группу реагирования.
  6. Группа ответов - это лишь список заготовленных заранее ответов, каждый из которых (ответов) может бы, например, репликой и/или анимацией (как в случае использования хореографической сцены). Один ответ выбирается на основе настроек группы ответов и отдельных ответов. Когда выбран правильный ответ, NPC воспроизводит его.
    • Давайте для нашего примера концепта TLK_SHOT сделаем правило, смотрящее за уровнем здоровья NPC (если у NPC меньше 25% его здоровья). У этого правила есть группа ответа, которая может содержать список реплик вроде «Ещё один такой выстрел, и мне конец!», «О, Боже, я в беде!» или «Мне нужна медицинская помощь!».
    • Другое правило для TLK_SHOT может проверить, является ли стреляющий в них враг Солдатом Альянса, и указать на группу ответа с репликами вроде «Этот солдат Альянса прижал меня к земле!» или «Помогите мне с этим солдатом!». Другое правило может проверять, не является ли враг Штурмовиком Альянса, и указывать на группу с репликами «Этот корабль надирает мне задницу!» и «Кто-нибудь, помогите мне уничтожить этот корабль, пока он меня не убил!».
  7. Если ни одно правило не соответствует заданным критериям (или выбранная группа ответов не повторяется и исчерпана), NPC вообще никак уникально не отреагирует.

Концепты

Концепты (Concepts) - это обозначение формата string(en) который представляет собой высокоуровневую причину попытки речи персонажа. В коде определен набор концептов, которые будут вызываться автоматически, но технически концепт - это просто специальный высокоуровневый критерий, который персонажи отслеживают. Они ни к чему не привязаны, и вы можете свободно создавать свои собственные в файле ответа. Вы можете вызывать концепции в коде или с помощью Input команды DispatchResponse или SpeakResponseConcept(en) НПС.

Вот список некоторых предопределенных концепций NPC, используемых в Half-Life 2:

TLK_HELLO		Когда я впервые увидел игрока.
TLK_IDLE		Когда я долго бездействую.
TLK_USE		        Когда игрок применил +USE ко мне.
TLK_PLPUSH		Когда игрок толкнул меня.
TLK_STARE		Когда игрок долгое время смотрит (буквально, пялиться) на меня.
TLK_DANGER		Когда я понимаю, что рядом со мной опасная обстановка (например, граната).
TLK_WOUND		Когда я получил урон.
TLK_HIDEANDRELOAD	Когда я решу спрятаться и перезарядить пистолет.
TLK_PLYR_PHYSATK	Когда в меня попадает предмет, брошенный игроком.

Не все NPC говорят на всех концептах, и не все NPC говорят на концептах при одинаковых обстоятельствах. Полный список см. в список концепций реагирования(en).

Набор Критериев

Критерии - это набор условий, которые содержат данные, связанные с текущим состоянием говорящего и обстоятельствами концепции, когда предпринимается попытка речи. Его можно интерпретировать как набор KeyValues(en). Вот пример набора критериев, созданного npc_alyx, которая пытается говорить, потому что только что убила своего текущего врага:

concept                = TLK_ENEMY_DEAD          Концепт, которое пытается озвучить NPC.
map                    = d3_c17_07               Название текущей карты.
classname              = npc_alyx                Класс сущности (classname(en)) говорящего NPC.
name                   = alyx                    Имя (targetname(en)) говорящего NPC.
health                 = 75                      Текущий уровень здоровья говорящего NPC.
healthfrac             = 0.9375                  Здоровье говорящего NPC, как доля от максимального здоровья NPC (по умолчанию максимальное здоровье npc_alyx равно 80).
skill.cfg              = 1                       Текущий уровень скила.
timesinceseenplayer    = 0.090000                Количество времени, прошедшее с тех пор, как говорящий NPC видел игрока.
distancetoenemy        = 312.639679              Расстояние от говорящего NPC до его текущего врага.
activity               = ACT_RUN                 Анимация, которую выполняет говорящий NPC.
npcstate               = [NPCState::Combat]      Состояние ИИ говорящего NPC.
enemy                  = npc_combine_s           Класс сущности classname(en), выступающей врагом говорящего NPC.
speed                  = 79.235                  Момент скорости говорящего NPC.
weapon                 = weapon_alyxgun          Текущее оружие, которое держит в руках говорящий NPC.
distancetoplayer       = 211.240692              Расстояние от говорящего NPC до игрока.
seeplayer              = 1                       Видит ли говорящий NPC игрока или нет.
seenbyplayer           = 0                       Находится ли говорящий NPC в поле зрения игрока.
readiness              = agitated                Уровень readiness(en) говорящего NPC.
playerhealth           = 100                     Текущий уровень здоровья игрока.
playerhealthfrac       = 1.000                   Текущее здоровье игрока, как доля от его максимального уровня.
playerweapon           = weapon_shotgun          Текущее оружие, которое держит игрок.
playeractivity         = ACT_WALK                Анимация, которую выполняет игрок.
playerspeed            = 0.000                   Текущий момент скорости игрока.

По умолчанию у этой концепции нет модификаторов. Все критерии в приведенном выше списке являются общими и собираются для каждой концепции.

Критерии, подобные приведенным в списке, можно проверить по списку критериев правила и использовать для принятия решения о том, какую группу ответов использовать для нужной концепции. Например:

  • Критерий enemy можно использовать для выбора правильной реакции на концепцию TLK_ENEMY_DEAD. Вместо того чтобы делать общие заявления, Аликс может сказать: "Я позаботилась о том солдате!" или "Я позаботилась о том хедкрабе!".
  • Поле healthfrac можно использовать для выбора строки "Фух, это было близко!", если здоровье Аликс было <20%, когда она прикончила врага.
  • Поле distancetoenemy Поле можно использовать для выбора разных реплик, когда она убивает врага на дальнем или ближнем расстоянии. Например, "Эти парни пугают, когда подходят так близко!" или "Нелегко попасть в них на таком расстоянии".

Несмотря на то, что перечисленные выше критерии являются общими и не зависят от конкретной концепции, они всегда будут меняться в зависимости от обстоятельств и не всегда могут быть доступны (например, у NPC, которые не находятся в бою, не будет критериев enemy или distancetoenemy). Кроме того, составители карт могут добавлять дополнительные критерии к определенным NPC или ко всем NPC в игре. Подробнее см. в разделе Response contexts(en).

Критерии правил

Правила содержат список критериев, которые проверяются на соответствие набору критериев персонажа. Когда правило оценивается, каждый критерий проверяется по заданным данным, и правило получает очки за критерии, которые успешно совпали. Количество очков, которое критерий зарабатывает для правила, определяется его весом.

Критерии задаются в файлах сценариев (см. ниже). Используется следующий формат:

criterion <criterion name> <key to check> <desired value> <optional: weight X> <optional: required>

Параметры следующие:

criterion name
Имя критерия. Не должно совпадать с уже существующими!
key to check
Значение в наборе критериев персонажа, которое проверяется этим критерием.
desired value
Желаемое значение ключа в наборе критериев. Оно может принимать различные формы:
  • Числовые значения: "0", "1", or "100".
  • Обратные числовые значения: "!=0" будет соответствовать любое значение, не равное нулю.
  • Строковое значение: "npc_alyx", "weapon_alyxgun", или "npc_combine_s".
  • Перечисления(en) и их значения: "[NPCState::Combat]".
  • Диапазоны:
    • ">0" : Соответствует, если значение больше "0".
    • "<=0.5" : Соответствует, если значение меньше или равно "0,5".
    • ">10,<=50" : Соответствует, если значение превышает "10" и если значение не превышает или равно "50".
    • ">0,<[NPCState::Alert] : Соответствует, если значение больше "0" и меньше значения перечисления для NPCState::Alert.
Note.pngПримечание:По умолчанию не поддерживает подстановочные знаки.
weight X
Необязательный параметр, где X - это количество очков, которое начисляется этому критерию, если он совпадает. Если параметр не указан, то по умолчанию критерий оценивается в 1 балл.
required
Необязательный параметр, указывающий, что этот критерий необходим для того, чтобы содержащие его правила вообще использовались. Если обязательный критерий не совпадает, правила, содержащие его, получают 0 баллов и сразу же пропускаются. Большинство критериев используют этот параметр.

И вот некоторые примеры из Half-Life 2:

  • Определение критерия, названное PlayerNear, обозначает, что расстояние от игрока до говорящего NPC должно составлять хотя бы 500 юнитов.
criterion "PlayerNear" "distancetoplayer" "<500" required
  • Определение критерия, названное IsCitizen, обозначает, что класс говорящего NPC должен быть npc_citizen.
criterion "IsCitizen" "classname" "npc_citizen" "required"
  • Определение критерия, названное IsMap_d3_c17_12, обозначает, что текущая игра проходит на карте в названием d3_c17_12.bsp. Пригодится для того, чтобы заставить всех сущностей одной карты произносить реплики, отличные от других карт.
criterion "IsMap_d3_c17_12" "map" "d3_c17_12" "required"
  • Здесь определяется критерий IsBob, который проверяет, назван ли NPC как "bob" ("targetname" "bob"). Это уникальный гражданин в игре, и этот критерий позволяет легко заставить его произносить уникальные реплики.
criterion "IsBob" "targetname" "bob" required
Tip.pngСовет:Концепция - это критерий, который почти всегда имеет вес 5.

Правила

Правило содержит список критериев и по крайней мере одну группу ответов. Правило получает очки за каждый критерий, который успешно соответствует набору критериев говорящего. Правило, набравшее наибольшее количество очков, направляет в одну из своих групп ответов, которая используется для определения точной речи NPC. Правила задаются в файлах сценариев (см. ниже). Используется следующий формат:

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>]
}

Параметры следующие:

  • rule name : Имя правила.
  • criteria : Список критериев, по которым правило должно оцениваться.
  • response : Список групп ответов, которые должны быть выбраны, если это правило набрало наибольшее количество баллов.
  • matchonce : Необязательный параметр, указание которого приводит к деактивации этого правила после того, как оно было выбрано один раз.
  • applyContext : Необязательный параметр, который применяет "контекст" ответов(en).

Например, следующий текст определяет правило под названием CitizenTalkStare. ConceptTalkStare - это критерий, который проверяет, что концепция, которую хочет произнести говорящий NPC, является TLK_STARE. IsCitizen - критерий, проверяющий, что говорящий NPC является ситизеном(en). NPCIdle - критерий, проверяющий, что состояние NPC равно «NPCState::Idle». Если это правило набирает наибольшее количество баллов, то будет использована группа ответа CitizenTalkStare.

rule CitizenTalkStare
{
   criteria     ConceptTalkStare IsCitizen NPCIdle
   response     CitizenTalkStare
}

Обратите внимание, что имя правила и имя группы ответа могут быть одинаковыми, поскольку имена правил должны быть уникальными только среди правил, а имена групп ответа - только среди групп.

Группы реакций

Группы реакций содержат в себе всевозможного рода реагирования вместе с некоторыми необязательными данными, определяющими, как эти ответы должны использоваться. Когда группа ответов выбирается правилом, ответ выбирается из списка и передается говорящему для использования. Группы ответов определяются в файлах скриптов (см. ниже). Используется следующий формат:

response <response group name>
{
   [optional: permitrepeats]
   [optional: sequential]	  
   [optional: norepeat]		  

   <response type> <response> <optional: ...>
   <response type> <response> <optional: ...>
   <response type> <response> <optional: ...>
}

Параметры группы реагирований следующие:

  • permitrepeats : Если указано, ответы в этой группе разрешено повторять. Если не указано, то по умолчанию используются все ответы в списке, прежде чем повторить какой-либо из них,
  • sequential : Если указано, ответы будут использоваться в том порядке, в котором они перечислены в группе. Если не указано, то по умолчанию ответы будут выбираться из списка случайным образом.
  • norepeat : Если указано, то после воспроизведения всех ответов в списке группа ответов будет отключена. Все правила, выбравшие эту группу ответов, не будут возвращать спикеру никакого ответа.

Ответы

Ответ (Response) - это фактический ответ, который выбирается системой и затем используется динамиком. В группе ответов может быть перечислено столько ответов, сколько необходимо, причем каждый ответ может быть одного из следующих типов:

  • speak : Ответ в виде звукового скрипта(en) или сырого аудиофайла.
  • sentence : Ответ в виде sentence строчки. Указывается имя фразы/предложения из sentences.txt.
  • scene : Ответ формата файла .vcd. Чтобы больше узнать про реализацию хореографических сцен, ознакомьтесь с этой статьёй(en).
  • response : Ответ представляет собой ссылку на другую группу ответов, которая должна быть выбрана вместо него.
  • print : Этот ответ представляет собой текст, который должен быть напечатан на месте диктора при developer 1 (используется как временный заменитель полноценного ответа).
    Note.pngПримечание: В Mapbase Mapbase это было заменено на game_text - как экранные сообщения по умолчанию.
  • entityio (Во всех играх начиная с Alien Swarm)[подтвердить](также в Mapbase) : Ответ как I/O событие(en), которое посылается определённой сущности на карте как активатор. Формат вида: entityio "<name> <input> <param>". Это отличается от последующих ответов, которые более подробно рассматриваются ниже.
  • vscript (только в Mapbase) : Ответ в виде VScript(en) кода, которая проходит через говорящего.
  • vscript_file (только в Mapbase) : Ответ как это путь к файлу VScript, который запускается из области видимости говорящего.

Параметры задержки после ответа

Each response supports a variety of optional parameters.

    • nodelay : После завершения ответа говорящий может сразу вновь заговорить.
    • defaultdelay : После завершения ответа говорящий не сможет говорить в течение произвольного времени - от "2,8" до "3,2" секунды.
    • delay X : После завершения ответа говорящий не сможет говорить в течение заданного времени X в секундах. X также может быть диапазоном, например, "5.5,7.5"
  • weapondelay X : После начала ответа говорящий не будет стрелять из своего оружия в течение X секунд. По умолчанию доступно только для NPC-союзников HL2.
  • speakonce : Предотвращает использование ответа более одного раза.
  • odds X : Если указано, то при выборе этого ответа есть вероятность, что говорящий вместо ответа ничего не скажет. Шанс - это (0-100)% вероятности отмены ответа, то есть коэффициент 25 дает 25 % вероятности того, что говорящий ничего не скажет.
  • respeakdelay : Если указано, этот ответ не может быть использован, если концепция не была озвучена в течение как минимум X секунд. X также может быть диапазоном, например, "5.5,7.5".
  • soundlevel : Если указано, этот уровень звука (soundlevel) должен использоваться для ответа вместо стандартного SNDLVL_TALKING.
  • displayfirst : Если указано, то этот ответ должен использоваться первым (игнорируется параметр weight).
  • displaylast : Если указано, этот ответ должен использоваться последним (игнорируется параметр weight).
  • weight : Если указано, используется для определения веса при выборе ответов в списке. По умолчанию все ответы имеют вес "1". Обратите внимание, что ответы не будут повторяться до тех пор, пока не будут выбраны все остальные ответы, то есть после выбора всех ответов с большим весом система будет учитывать только ответы с меньшим весом. Этому можно противостоять с помощью permitrepeats.
  • noscene : Запрещает системе ответа создавать автоматически генерируемую сцену для ответа говорить.
  • stop_on_nonidle : Когда ответ произнесен, остановите сцену, когда NPC перейдет в неактивное состояние. В Source 2013 работает только в эпизодических модах HL2 на реакциях scene.
  • predelay : Когда ответ выбран, он не будет произнесен до истечения X секунд. Работает только для ответов scene. X также может быть диапазоном, например, "5.5,7.5".

Например, следующая группа ответов используется гражданскими(en) для ответа на концепцию TLK_STARE. Граждане будут использовать ответы из списка в том порядке, в котором они перечислены (из-за параметра sequential). Каждый ответ, когда он выбран, останавливает разговор NPC на случайный промежуток времени между 10 и 20 секундами.

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"
}

Файлы скриптов

Файл /scripts/talker/response_rules.txt - это базовый скрипт, содержащий все критерии, правила и группы ответов, используемые системой Response Rules System'ой. Файл также может включать в себя другие файлы с помощью ключевого слова #include, что позволяет четко разделить правила на NPC, карты и так далее. Обратите внимание, что некоторые сущности, например env_speaker(en), указывают свои файлы сценариев, содержащие подмножество критериев и правил, и группы ответов для использования сущностью. Ознакомьтесь с scripts/talker/terminal_pa.txt как пример, используемый в объявлении терминала на железнодорожном вокзале.

Followup responses

Left 4 Dead Left 4 Dead introduced "followups", events which occur following the response. They are triggered as response parameters similar to odds, predelay, etc.

Cpp.pngКод:The code for the followup system is available in the Alien Swarm SDK(en), along with the rest of the rewritten response system. (также в Mapbase)
  • fire : Fires an input through the I/O system with the speaker as the activator and caller. Format is fire <target> <input> <delay>. Does not support parameters.
  • then : Causes another response to be dispatched on an entity. Format is then <target> <concept> <response contexts> <delay>. Used for making characters dynamically respond to each other.
Note.pngПримечание:A negative delay causes the followup to be dispatched X amount of time after the speaker starts speaking, as opposed to when they're finished speaking.

A few unique targetnames can be used:

  • self : The entity speaking the response.
  • subject : Uses the entity name found in the speaker's "Subject" context, if it exists. The game sets this for info_remarkable responses.
  • from : Uses the entity name found in the speaker's "From" context, if it exists. The game sets this to the name of the previous followup respondent, allowing followups to bounce back and forth.
  • any : Dispatched to any valid respondent within the range stored in rr_followup_maxdist (1800 by default).
  • all : Dispatched to all valid respondents within the range stored in rr_followup_maxdist (1800 by default).
Note.pngПримечание:The "Subject" and "From" contexts only store entity names, so be careful when there are multiple potential targets with the same name!

Пример из Left 4 Dead 2 в coach.txt:

Response _c1m4startelevator4bCoach
{
	scene "scenes/Coach/WorldC1M4B01.vcd"  then mechanic _c1m4startelevator5a foo:0 -2.313 //Son, you got a DEAL.
	scene "scenes/Coach/WorldC1M4B02.vcd"  then mechanic _c1m4startelevator5a foo:0 -5.790 //Ha HA! All the way to New Orleans! Baby, that sounds like a PLAN.
	scene "scenes/Coach/WorldC1M4B05.vcd"  then mechanic _c1m4startelevator5b foo:0 -6.334 //Normally I wouldn't do this. But in these circumstances, I think Mr. Gibbs, Jr. ain't gonna mind.
	scene "scenes/Coach/WorldC1M4B10.vcd"  then mechanic _c1m4startelevator5b foo:0 -2.685 //Forgive us Jimmy, but we need your car.
}

Использование расширенных правил реагирования

Система реагирований может быть использована во многих продвинутых и специализированных направлениях. Вот несколько советов и приемов для расширенного использования системы:

Получение пользовательских ответов с помощью DispatchResponse
В качестве концепции ответа NPC можно передать абсолютно все, что угодно, лишь бы это было найдено в файлах сценария. Вы не ограничены предопределенными концептами TLK_* ИИ.
Например, вы можете захотеть, чтобы NPC из группы зрителей произносили поздравительные речи, когда игрок успешно решает часть головоломки.
У союзников игрока в HL2 также есть вход SpeakResponseConcept с более продвинутой обработкой и условиями.

Смотрите скрипты ответа для Аликс в EP1/EP2 или скрипты ответа для выживших в L4D для других примеров использования продвинутой системы ответа.

Debugging

Нужно сделать: rr_debugresponses(en)

Замечания

  • Для того, чтобы возможность использовать Response Rules, NPC должен быть основан на класса CAI_BaseActor(en).
  • Рекомендуется просмотреть файлы scripts/talker/npc_*.txt как примеры использования специфичных правил ответа NPC.
  • scripts/talker/response_rules.txt - это манифест-файл системы правил ответов. Если вам необходимо добавить правила реагирования для вашего уникального NPC, убедитесь что вы включили вашего NPC в манифест (#include в конце файла scripts/talker/response_rules.txt).

See also

External links