Интересный способ рандомной привязки визуалов к профилям НПС
Материал из S.T.A.L.K.E.R. Inside Wiki
Теория
В этой заметке я расскажу о том, как назначить нескольким профилям неписей разные визуалы, которые рандомно распределяться для каждого профиля.
Для примера возьмём деревню новичков из ТЧ. Находим в файле gamedata/config/gameplay/character_desc_escape.xml профили новичков обитающих в деревне возле бункера Сидоровича:<!-- - - - - - - - STALKER NOVICE - - - - - - - --> <specific_character id="esc_stalker_novice_default1" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_2</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>140</rank> <reputation>12</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_01\newbie\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_2</visual> <supplies> [spawn] \n wpn_bm16 \n ammo_12x70_buck \n #include "gameplay\character_items.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default2" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_2</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>127</rank> <reputation>-8</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_01\newbie\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_2</visual> <supplies> [spawn] \n wpn_pm \n ammo_9x18_fmj = 1 \n device_torch \n #include "gameplay\character_items.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default3" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_3</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>214</rank> <reputation>9</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_01\stalker\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_3</visual> <supplies> [spawn] \n wpn_bm16 \n ammo_12x70_buck \n #include "gameplay\character_items.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default4" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_3</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>175</rank> <reputation>8</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_01\stalker\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_3</visual> <supplies> [spawn] \n wpn_pm \n ammo_9x18_fmj = 1 \n #include "gameplay\character_items.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default5" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_4</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>268</rank> <reputation>-10</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_02\newbie\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_4</visual> <supplies> [spawn] \n wpn_bm16 \n ammo_12x70_buck \n device_torch \n #include "gameplay\character_items.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default6" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_4</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>133</rank> <reputation>6</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_02\newbie\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_4</visual> <supplies> [spawn] \n wpn_bm16 \n ammo_12x70_buck \n #include "gameplay\character_items.xml" \n #include "gameplay\character_drugs.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default9" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_5</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>224</rank> <reputation>18</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_02\stalker\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_5</visual> <supplies> [spawn] \n wpn_pm \n ammo_9x18_fmj = 1 \n #include "gameplay\character_items.xml" \n #include "gameplay\character_drugs.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character> <!-- - - - - - - - - - - - - - - --> <specific_character id="esc_stalker_novice_default10" team_default = "1"> <name>GENERATE_NAME_stalker</name> <icon>ui_npc_u_green_stalker_5</icon> <bio>esc_stalker_novice_bio</bio> <class>esc_stalker_novice</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>58</rank> <reputation>-2</reputation> <money min="200" max="600" infinitive="0"/> <snd_config>characters_voice\human_02\stalker\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\novice\green_stalker_5</visual> <supplies> [spawn] \n wpn_pm \n ammo_9x18_fmj = 1 \n device_torch \n #include "gameplay\character_items.xml" \n #include "gameplay\character_drugs.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> #include "gameplay\character_dialogs.xml" </specific_character>
Нас интересуют теги <visual> </visual> - в них указывается название профиля. Как видно из представленных выше профилей, каждому отдельному профилю строго присвоен свой визуал. Всегда ли уместна такая точность? У нас есть группа профилей НПС и несколько визуалов подходящих этой группе профилей, можно предположить, что не важно какому именно НПС присвоеться определённый визуал. Проще говоря, в игре, все новички в деревне одинаковые, только куртки разные у них и нам не важно какая именно куртка будет на том или ином мужике. Мы выбираем нужные нам визуалы для какой то группы НПС (из gamedata/meshes/actors) даём визуалам любое одинаковое имя, после имени ставим знак подчёркивания и цифру или число. Пример:
name_1.ogf name_2.ogf mame_24.ogf
Затем в нужных профилях НПС в тегах <visual> </visual> пишем имя которое задавали нашим визуалам. В примере выше, имя визуалов было name , в этом случае теги заполняются примерно так: <visual>actors\novice\name</visual>. Таким образом визуалы рандомно распределятся по каждому профилю.
Отработанный пример на деревне новичков.
Находим профили новичков в файле gamedata/config/gameplay/character_desc_escape.xml, (их профили были вынесены, в этом уроке выше). И мы, например, скачали 5 новых визуалов которые привяжем к новичкам. Нам бы пришлось каждый раз прописывать отдельный визуал в каждом профиле, но мы поступим по другому, для начала мы переименуем скаченные визуалы таким образом:
esc_novichok_1.ogf esc_novichok_2.ogf esc_novichok_3.ogf esc_novichok_4.ogf esc_novichok_5.ogf
Закидываем эти визуалы, например сюда: gamedata\meshes\actors\novice Прописываем во всех профилях новичков визуал таким образом: <visual>actors\novice\esc_novichok</visual> сохраняем, начинаем новую игру, приходим в деревню, видим наших новичков в новых визуалах.
Несколько слов
Возможно кто то создавал подобную статью, я не видел даже похожего, если что сильно не ругайте. Таким образом возможно задавать несколько визуалов не только группе, но и одному НПС, факт в том что распределение визуалов рандомно и при начале новой игры НПС скорее всего поменяют визуал. Это может пригодиться для сюжетных модов которые имеют разветвлённый сюжет и рассчитаны не на одно прохождение, проходя такой мод второй раз с начала, игрок не только узнаёт альтернативную ветку развития сюжета но и встречает знакомых НПС в других визуалах, что усиливает ощущения альтернативности - фактически играет в новый мод. Такое явление я проверял в ТЧ в других аддонах не гарантирую работу. В будущем возможно проверю такой эффект на именах предметов, оружия и тд.