Перейти к содержимому




Различные уроки.

Сталкер Модостроение

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 54

#41
Call of Pripyat

Call of Pripyat

    Сталкер

  • альтернативный текст
  • Разработчики
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    06-June 20
  • 326 Cообщений
  • Пропуск №: 36577


Репутация: 799 Постов: 326
  • Страна проживания:Россия
  • Реальное имя:Игорь
  • Пол:Мужчина
  • Город:Чита

Различные уроки, советы, подсказки.

Каждый, может выложить свои уроки по модостроению.

 

Структура главных папок и файлов



...\S.T.A.L.K.E.R\gamedata\anims – папка содержит исполнительные файлы эффектов (например от аномалий).

...\S.T.A.L.K.E.R\gamedata\config – папка содержит основные конфигурационные файлы (т. е. большинство настроек игры)

...\S.T.A.L.K.E.R\gamedata\meshes – содержит модели игровых предметов и персонажей...

...\S.T.A.L.K.E.R\gamedata\scripts – папка со скриптами (рабочими файлами содержащими в себе наборы функций) – основная папка, отвечающая за ответные действия игры и действия производимых игроком в игре.

...\S.T.A.L.K.E.R\gamedata\shaders – папка содержит в себе конфигурационные файлы шейдеров.

...\S.T.A.L.K.E.R\gamedata\sounds – здесь находятся все звуки игры (разложены по своим каталогам и папкам)

...\S.T.A.L.K.E.R\gamedata\spawns – содержит файл спавна – очень важный файл – не трогать без нужды!!!

...\S.T.A.L.K.E.R\gamedata\textures – содержит разложенные по каталогам и папкам текстуры используемые в игре.

Теперь разберем папки в каталоге «config»

...\S.T.A.L.K.E.R\gamedata\config\creatures - содержит массу конфигурационных файлов, в основном отвечающих за взаимодействие Главного героя игры (в дальнейшем ГГ) и прочего окружения в игре и ТТХ самого ГГ.

...\S.T.A.L.K.E.R\gamedata\config\gameplay – содержит конфиг. файлы персонажей игры (НПС) отвечающие за внешний вид, статус, снаряжение.
Файлы: character_desc_ххх (где ххх – название локации) и character_desc_general (отвечает за зомбированного персонажа).
Также содержит файлы диалогов и профилей НПС.

…\S.T.A.L.K.E.R\gamedata\config\misc – конфиг.файлы торговцев (папки с именами торговцев), артефактов, брони, квестовых предметов, уникальных предметов, файл отвечающий за награды за автозадания, файл эффектов (алкоголизма, ранения, ПНВ и прочих)...

…\S.T.A.L.K.E.R\gamedata\config\mp – среди прочих содержит важный файл mp_ranks – отвечающий за выпадение оружия и патронов из рук ГГ и НПС – без прописывания добавляемого в игру оружия в этот файл при выпадении нового оружия из рук ГГ\НПС будут следовать вылеты.

…\S.T.A.L.K.E.R\gamedata\config\text\rus – содержит файлы описаний всего и вся находящегося в игре (брони, артефактов, оружия, предметов и прочего).

…\S.T.A.L.K.E.R\gamedata\config\weapons – содержит конфиг.файлы оружия и боеприпасов используемых в игре.

…\S.T.A.L.K.E.R\gamedata\config\weathers – содержит конфиг.файлы настройки погоды на локациях.

Теперь немного подробнее о файлах.

...\S.T.A.L.K.E.R\gamedata\config\misc:

Папка amk_artefacts – содержит конфиг. файлы модификатов (модифицированых артефактов).

Папка shop_ххх (ххх – имя торговца) – содержит конфиг.файлы ассортимента торговца.

amk_mod_outfits – содержит секции конфигов костюмов от АМК-тайм.

artefacts - содержит секции конфигов артефактов.

items - содержит секции конфигов предметов.

monster_items - содержит секции конфигов частей монстров

outfit - содержит секции конфигов костюмов.

postprocess - содержит секции конфигов пост. процессов (например: ПНВ).

quest_items - содержит секции конфигов квестовых предметов.

task_manager - содержит секции наград за автоквесты.

unique_items - содержит секции конфигов уникального оружия и костюмов.



#42
Call of Pripyat

Call of Pripyat

    Сталкер

  • альтернативный текст
  • Разработчики
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    06-June 20
  • 326 Cообщений
  • Пропуск №: 36577


Репутация: 799 Постов: 326
  • Страна проживания:Россия
  • Реальное имя:Игорь
  • Пол:Мужчина
  • Город:Чита

Делаем своего ГГ побогаче, подробное описание для новичков.

 

Есть один очень простой способ добавления денег.
Открываете блокнотом файл

 character_desc_escape.xml (gamedata/config/gameplay)

и ищете строку:

спускаетесь чуть ниже и увидите строчку:

 

Копируете эту строчку и открываете файл

character_desc_general.xml: 

(в той же папке):
и ищите:

спускайтесь чуть ниже к строчке:
0 в конце этой строчки жмёте Enter (сделайте пустую строчку между 0 и actors\hero\stalker_novice)
и просто вставьте строчку

 

Теперь у вас столько же денег сколько и у Сидрыча, то есть бесконечно.

 

 

Мародёрствуем! Съём денег с трупов.

 

Нам понадобится файл

 'treasure_manager.script'

В этом файле находим такие строки:

--' Юзание инициатора (возможность выдать тайник)

function CTreasure:use(npc)
printf("TREASURE USE")
После строки --printf("TREASURE USE")-- пишем

if (npc and db.actor) then
lootmoney.lootmoney(npc)
end

 

У нас должно выйти
 

--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
printf("TREASURE USE")

if (npc and db.actor) then
lootmoney.lootmoney(npc)
end

 


Теперь создаём файл lootmoney.script и в нём пишем
 

function lootmoney(npc)
if npc ~= nil and not string.find(npc:section(),"arena") and npc:character_community()~="arena_enemy" then
local money = npc:money()
if money ~= nil and money ~=0 then
local deadmoney = money

local npc_rank
npc_rank = ranks.get_obj_rank_name(npc)
if npc_rank ~= nil then
if npc_rank == "novice" and deadmoney >=400 then deadmoney=math.random(25,400)
elseif npc_rank == "experienced" and deadmoney >=500 then deadmoney=math.random(50,500)
elseif npc_rank == "veteran" and deadmoney >=600 then deadmoney=math.random(100,600)
elseif npc_rank == "master" and deadmoney >=700 then deadmoney=math.random(200,700)
end
end
local news_texti = "\\n%c[255,255,0,0]Мёртвый сталкер: %c[default]"..npc:character_name().."\\n%c[255,255,0,0]Обнаружено денег: %c[default]"..game.translate_string(tostring(deadmoney).."руб.")
db.actor:give_game_news(news_texti, "ui\\ui_iconsTotal", Frect():set(0,0,83,47), 1, 4000)
db.actor:give_money(deadmoney)
game_stats.money_quest_update(deadmoney)
npc:give_money(-money)
game_stats.money_quest_update(-money)
end
end
end

 

 

 

 

Спавним ГГ в другом месте Зоны

 

Чтобы заспавнить ГГ на другой локации нам понадобится распакованный all.spawn.
После того как распаковали all.spawn, находим файл

alife_l01_ecape.ltx

 И открываем его с помощью блокнота. В этом файле ищем вот такие строки:

[63]
; cse_abstract properties
section_name = actor
name = level_prefix_actor_0001
position = -246.726303100586,-24.7932605743408,-134.433868408203
direction = 0.00431653670966625,-1.39625442028046,-0.00068671052576974
s_flags = 0x29

; cse_alife_object properties
game_vertex_id = 4
distance = 0.699999988079071
level_vertex_id = 11713
object_flags = 0xffffffbf
custom_data = <
[dont_spawn_character_supplies]

[spawn]
wpn_binoc
device_torch
END

; cse_visual properties
visual_name = actors\hero\stalker_novice

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =

upd:health = 1
upd:timestamp = 0x75732029
upd:creature_flags = 0x70
upd:position = -246.726303100586,-24.7932605743408,-134.433868408203
upd:o_model = 0
upd:o_torso = -1.39625442028046,0.00431653670966625,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0

; cse_alife_trader_abstract properties
money = 40
trader_flags = 0
character_profile = actor

; cse_ph_skeleton properties

; cse_alife_creature_actor properties

upd:actor_state = 0xd20
upd:actor_accel_header = 0
upd:actor_accel_data = 0
upd:actor_velocity_header = 0
upd:actor_velocity_data = 0
upd:actor_radiation = 0
upd:actor_weapon = 110
upd:num_items = 0

Для спавна ГГ на другой локации нам надо удалить эти строки из

alife_l01_ecape.ltx

 И поместить в файл того уровня, в который необходимо.
Теперь нам нужно прописать новые координаты не только в строках:
position

 

 

Квест по поиску и возвращению предмета.

 

Создадим квест по поиску АК74У.
Для начала нужно создать диалог, сделаем его у Волка:

Заходим в

gamedata\config\gameplay\dialogs_escape.xml

 И в самом конце до строчки пишем:

esc_kill_bandits_quest_done
escape_volk_ak74u_start
escape_volk_ak74u_quest_0
1
escape_volk_ak74u_quest_1
2
3
escape_volk_ak74u_quest_2
escape_volk_ak74u_start
new_life.spawn_ak74u
escape_volk_ak74u_quest_3
dialogs.break_dialog

new_life.escape_volk_ak74u_have
escape_volk_ak74u_have
escape_volk_ак74u_done

escape_volk_ak74u_quest_completed_0
1
escape_volk_ak74u_quest_completed_1
2
escape_volk_ak74u_quest_completed_2
escape_volk_ak74u_done
new_life.give_volk_ak74u
3

escape_volk_ak74u_quest_completed_3
new_life.complete_volk_quest

Теперь нужно прописать эти диалоги Волку, для этого заходим в

gamedata\config\gameplay\character_desc_escape.xml 

И находим профиль Волка(он называется esc_wolf), перед строкой пишем:

escape_volk_ak74u_quest
escape_volk_ak74u_quest_completed

Нам понадобятся два диалога: 1 для получения квеста, 2 для передачи автомата.

- Это название диалога

esc_kill_bandits_quest_done - эта строка означает что квест появится только если получен инфопоршень esc_kill_bandits_quest_done

escape_volk_ak74u_start - эта строка означает что если получен инфопоршень escape_volk_ak74u_start , то этот диалог больше не появится.

escape_volk_ak74u_quest_0 - это ссылка на текст фразы меченого

1 - это ссылка на текст с id= 1 , а id= 1 это escape_volk_ak74u_quest_1 (ссылка на текст Волка)

2
3 - эти две строчки означают что идет разветвление диалога

escape_volk_ak74u_start - выдача инфопоршня, после которого начинается квест

new_life.spawn_ak74u - функция вызываемая из скрипта new_life, в данном случае спаунится предмет AK74У

dialogs.break_dialog - функция отвечающая за выход из диалога

Во втором диалоге есть строка new_life.escape_volk_ak74u_have - она отвечает за появление диалога если выполняется функция
escape_volk_ak74u_have

Теперь нужно сделать текст диалога на русском языке, для этого заходим в gamedata\config\tex\rus\stable_dialogs_escape.xml и в нём пишем следующее(в конце перед ):


Здорова Волк, для меня есть какая-нибудь работа?


Да, есть одно дело: вобщем шёл сюда в лагерь к Сидырычу, решил пройти через тоннель чтоб воякам денег не платить, а там собак было штук десять. Ну я начал отстреливаться, где-то шестерых убил и патроны кончились, пришлось АКСУ выкинуть, чтоб от стаи собак убежать. Таки лежит там наверно АКСУ. \nНу как, возьмёшься? Только осторожней там, после последнего выброса появились в тоннеле перещающиеся аномалии электра.
Да, я как раз буду рядом проходить, конечно принесу...

Нет, Волк, сам туда иди...
Привет, Волк, ну как оно?...

Сидор водку не даёт, хе хе, а так всё хорошо.
Вот, нашел я твой АКСУ.

Эх спасибо тебе Меченый, вот держи, может на что-нибудь хватит.
Итак, диалог готов, теперь нужно сделать сам квест, для этого заходим в gamedata\config\gameplay\tasks_escape.xml и в самом конце пишем:
Найти потерянный АКСУ
Найти потерянный АКСУ
ui_iconsTotal_weapons
escape_volk_ak74u_done
tex_escape_volk_ak74u


Найти АКСУ
new_life.escape_volk_ak74u_have
escape_volk_ak74u_have


Принести АКСУ Волку
blue_location
Escape_novice_lager_volk
escape_volk_ak74u_done

- id квеста

Найти потерянный АКСУ - название квеста

Найти потерянный АКСУ - тоже название квеста))

ui_iconsTotal_weapons - иконка задания

escape_volk_ak74u_done - квест будет выполнен, если был получен инфопоршень escape_volk_ak74u_done

tex_escape_volk_ak74u - ссылка на текстовый файл с описанием задания

Найти АКСУ - название подзадачи

new_life.escape_volk_ak74u_have - проверка на наличие предмета

escape_volk_ak74u_have если функция new_life.escape_volk_ak74u_have выполнилась, то выдаётся инфопоршень escape_volk_ak74u_have и выполняется подзадача

Принести АКСУ Волку - название второй подзадачи

blue_location - указатель на Волка

Escape_novice_lager_volk - id Волка в Файле gamedata\config\game_story_ids.ltx

escape_volk_ak74u_done - если будет получен этот инфопоршень, то выполнится подзадача и соответственно сам квест

Нужно сделать инфопоршни, заходим в gamedata\config\gameplay\info_l01escape.xml и в нём в конце до строчки пишем:

escape_volk_ak74u

Теперь нужно сделать описание квеста, заходим в gamedata\config\gameplay\storyline_info_escape.xml и пишем в конце:
ui\ui_icon_equipment
tex_escape_volk_ak74u

Сделаем описание на русском, заходим в stable_dialogs_escape.xml и в конце до строки пишем:


Волк попросил принести потерянный в туннеле АКСУ

Теперь создадим скриптовый файл new_life в gamedata\scripts\new_life.script и пишем:

function spawn_ak74u()
amk.spawn_item("wpn_ak74u",vector():set(-78.85,-1.29,154.74),163,189935) -- спавн ak74u в тоннеле на кордоне
end

function escape_volk_ak74u_have()
return sak.have_item_namber("wpn_ak74u",1) ~= false -- проверка на нахождение предмета в рюкзаке
end

function give_volk_ak74u(first_speaker, second_speaker) -- передача предмета
sak.out_item_namber("wpn_ak74u", 1)
end

function complete_volk_quest(first_speaker, second_speaker) -- получение награды
dialogs.relocate_money(second_speaker, 1500, "in")
end

Чтобы эти скрипты заработали, нужно создать файлы amk.script и sak.script, в аmk.script пишем

function spawn_item(spawn_item, pos, gv,lv)
if gv==nil then gv=db.actor:game_vertex_id() end
if lv==nil then lv=db.actor:level_vertex_id() end
return alife():create(spawn_item, pos, lv, gv)
end

function remove_item_from_inventory(remove_item,npc)
if npc==nil then npc=db.actor end
if remove_item~=nil then
-- npc:mark_item_dropped(remove_item)
alife():release(alife():object(remove_item:id()), true)
return true
end
return false
end

В sak.script пишем

local items_count=0
local itemin=nil

function have_item_namber(itm,need_namber)
local actor=db.actor
items_count=0
itemin=itm
actor:iterate_inventory(cheking_item,actor)
if items_count>=need_namber then
return true
else
return false
end
end
function cheking_item(actor,item)
local items=item:section()
if items==itemin then
items_count=items_count+1
end
end
function create_items(npc,section,number)
for i=1,number do
alife():create(section,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id())
end
end
local reloc_params={}
local stalk
function out_item_namber(itm_section,need_number)
reloc_params.itm_section=itm_section
reloc_params.itm_cnt=need_number
reloc_params.itm_cnt_found =0
db.actor:iterate_inventory(checkout_items_count,db.actor)
reloc_params.itm_cnt_found=0
if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then
db.actor:iterate_inventory(out_items_count,db.actor)
end
news_manager.relocate_item(db.actor, "out", itm_section)
reloc_params={}
end
function relocate_item_namber(stalker,itm_section,need_number)
stalk=stalker
reloc_params.itm_section=itm_section
reloc_params.itm_cnt=need_number
reloc_params.itm_cnt_found=0
db.actor:iterate_inventory(checkout_items_count,db.actor)
reloc_params.itm_cnt_found=0
if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then
db.actor:iterate_inventory(reloc_items_count,db.actor)
end
news_manager.relocate_item(db.actor, "out", itm_section)
reloc_params={}
end
function checkout_items_count(actor,item)
if item.section and item:section()==reloc_params.itm_section then
reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1
end
end
function reloc_items_count(actor,item)
if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found
То, что отображается в игре (название)


То, что отображается в игре (описание)

3. Находим в папке gamedata/meshes/actors/soldier файл stalker_military_black.ogf делаем его
копию и переназываем её как хочется.
Например в stalker_military_white.ogf

Открываем её блокнотом и находим это:

act\act_stalker_military_1.

Меняем на любой текст, но главное чтобы символов было столько же, иначе модель не будет работать. Меняем например на это:
_ct_stalker_military

4.Делаем тоже самое с stalker_comander_suit.ogf(gamedata/meshes/equipments).
Получаем stalker_comander_suit_white.ogf

5.Создаём текстуру с названием _ct_stalker_military.dds (можно взять готовую из любого текстурного мода и переназвать как надо.

6.Прописываем в продажу торговцу и радуемся.

 

 



#43
Call of Pripyat

Call of Pripyat

    Сталкер

  • альтернативный текст
  • Разработчики
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    06-June 20
  • 326 Cообщений
  • Пропуск №: 36577


Репутация: 799 Постов: 326
  • Страна проживания:Россия
  • Реальное имя:Игорь
  • Пол:Мужчина
  • Город:Чита

Диалоги.

 

Хоть с кем хоть с вояками только нужно сделать их либо нейтралами либо другами! а то они будут и стрелять и говорить одновременно а это тупо не правда ли? И так приступим:

Теория

1) Списки веток диалогов содержатся в файлах вида

gamedata/config/gameplay/character_desc_*.xml

Это, например:

character_desc_zombied.xml character_desc_stalker.xml character_desc_garbage.xml ...
Файлы character_desc_*.xmlможно сравнить со стволом дерева диалогов. В них перечисляется названия прикрепляемых веток диалогов

Например вот список веток диалога с Сидоровичем взятый из файла

 character_desc_escape.xml
escape_trader_start_dialog
escape_trader_talk_info
escape_trader_jobs
tm_trader_dialog
tm_trader_reward
escape_trader_done_blockpost_box
В свою очередь каждая ветка диалога также может ветвится.
2) Ветвление диалогов прописывается уже в других файлах.
Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml Возьмем оттуда, например, ветвление escape_trader_jobs.
Ветвление имеет довольно большие масштабы, поэтому приведу только часть:
escape_dialog.trader_has_talk_info_wr
tutorial_end
escape_trader_talk_info_1
100
99
9995
...
escape_trader_talk_info_0
1
Здесь …- это проверка выполнения условия. Ветка появится в диалоге, только если условие выполняется. Конкретно escape_dialog.trader_has_talk_info_wr из ветки escape_trader_talk_info - это обращение к функции trader_has_talk_info_wr, находящейся в файле скрипте gamedata/scripts/escape_dialog.script

Функция выглядит так:

function trader_has_talk_info_wr( trader, actor )
return true
end
То есть, судя по его структуре,
escape_dialog.trader_has_talk_info_wr выполняется всегда, т.к. функция всегда возвращает истину и пропускается в списк реплик.

Но для конкретной ветки может быть несколько precondition и других условий.

Далее, tutorial_end - это еще одна проверка, на этот раз на наличие у игрока так называемых infoportions, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена.

Более детально мы это разберем в конце статьи.
А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например:
escape_trader_talk_info_0
1
Это основа ветки escape_trader_talk_info.
Важно! В любой основной ветке любого диалога фраза будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге.
1 - это ссылка на вытекающую фразу
:
escape_trader_talk_info_1
100
99
9995

В свою очередь 100, 99, 9995 это ссылки на фразы веточки растущие из фразы .
3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml
Есть несколько вопросов.
Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут
целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного
могу о ближайших окрестностях, где сам ходил.
Эти строки содержат тексты для фраз и
Итого диалоги разложены по трем, а то и более файлам.
Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так:

1
2
...
11
12
...
1 - Это возврат к фразе №1 (зацикливание)
111

Практика

Добавим в диалог с Сидоровичем ветку своего собственного изготовления.

Например такую:

Меченый: Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?
Сидорович: Чего?!
Меченый: Ты их совсем, совсем не кормишь?
Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то
мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.

Для этого:

1) В файле gamedata/config/gameplay/character_desc_escape.xml в конце списка веток для trader припишем свою ветку с произвольным названием. Это будет, например,

escape_trader_letat_gusi.

Т.е у нас получится так:
...
escape_trader_start_dialog
escape_trader_talk_info
escape_trader_jobs
tm_trader_dialog
tm_trader_reward
escape_trader_done_blockpost_box
escape_trader_letat_gusi

…

Записываем изменения, с этим файлом пока всё.

2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml

Диалогу:
Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые?
Сидорович: Чего?!!
Меченый: Ты их совсем, совсем не кормишь?
Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то
мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.

Будет соответствовать такая структура:

1
escape_trader_letat_gusi_1
2
escape_trader_letat_gusi_2
3
escape_trader_letat_gusi_3

Условия наличия ветки в диалоге можно взять из ветки .

Т.е берем условия escape_dialog.trader_has_talk_info_wr и tutorial_end. Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже.

В итоге у нас получилась такая структура:

escape_dialog.trader_has_talk_info_wr
tutorial_end

escape_trader_letat_gusi_0
1
escape_trader_letat_gusi_1
2
escape_trader_letat_gusi_2
3
escape_trader_letat_gusi_3

Её нужно вставить в любом месте между dialog id'ами других веток в файле dialogs_escape.xml. Главное - не промахнутся и засунуть именно между, а не внутрь одного из dialog id.

После сохранения внесенных изменений с файлом dialogs_escape.xml все.

3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml

Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию:
Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?
Чего?!
Ты их совсем, совсем не кормишь?
В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше
антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился...
Шутник.

В любом месте между уже существующими string id. После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось.
Дополнительно

Внимание! После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие:
escape_dialog.trader_has_talk_info_wr

Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:

function trader_has_talk_info_wr( trader, actor )
return true
end
Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например:

escape_dialog.trader_alredy_give_job

Всё. Мы научились писать простые диалоги. 

 

 



#44
Call of Pripyat

Call of Pripyat

    Сталкер

  • альтернативный текст
  • Разработчики
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    06-June 20
  • 326 Cообщений
  • Пропуск №: 36577


Репутация: 799 Постов: 326
  • Страна проживания:Россия
  • Реальное имя:Игорь
  • Пол:Мужчина
  • Город:Чита

Новое шмотьё у ГГ при старте.

Находим по пути

gamedata\configs\gameplay\character_desc_general.xml

в этом файле находим строчку

Actor

[spawn] \n
device_torch \n
wpn_binoc \n
wpn_knife \n
detector_simple \n
helm_respirator \n
stalker_outfit \n

и после них добавляем например
wpn_ak74 = 1 \n это означает что при старте игры у вас будет обычный калаш
и точно также добавляем любой предмет.

 

 

Спавн НПС.

Для того, чтобы создать нового НПС нам понадобятся координаты нужного места, где и будет заспаунен наш NPC.

Возьмём Кордон, лагерь новичков. Можете снять координаты сами, а можете взять мною уже снятые: (-218.20,-20.2,-145.63),35362,47). Далее. Создаём файл в папке gamedata/scripts файл, скажем esc_unik_npc.script. В нём создаём функцию. Код:

function esc_unik_npc () alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47) end

Теперь мы в файле npc_profile.xml (в папке gameplay) добавляем нашего НПС. Код:

Trader escape_trader

esc_unik_npc esc_unik_npc

storyline_eliminate_gunslinger

Выглядеть это будет так:

storyline_eliminate_gunslinger
esc_unik_npc.esc_unik_npc

Однако мы не прописали самого НПС, как личность В файле character_desc_escape.xml (gamedata/gameplay) добавляем: Код:

GENERATE_NAME_bandit ui_npc_u_stalker_bandit_3 esc_wolf_bio

esc_otbrosi_1 dolg stalker_terrain

367 -60

characters_voice\human_01\monolith\ -1

actors\bandit\stalker_bandit_3 [spawn] \n

wpn_groza \n

ammo_9x39_pab9 \n

1. include "gameplay\character_items.xml" \n
2. include "gameplay\character_food.xml"

1. include "gameplay\character_criticals_3.xml"

1. include "gameplay\character_dialogs.xml"

Правда тут получится у нас долговец в одежде бандита и говорящего голосом монолитовца xD Всё сохроняем. НПС готов.

Но так же можно добавить нашему НПС диалог) Если хотяте сделать нашему НПС своё имя то в файле stable_bio_name.xml (gamedata/config/text/rus) добавляем: Код:

Факер-мазафакер
А в файле сharacter_desc_escape.xml (gamedata/gameplay) находим нашего уже прописаного НПС и вставляем в секцию (у нас в ней написано GENERATE_NAME_bandit) esc_unik_npc 

 

 



#45
Call of Pripyat

Call of Pripyat

    Сталкер

  • альтернативный текст
  • Разработчики
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    06-June 20
  • 326 Cообщений
  • Пропуск №: 36577


Репутация: 799 Постов: 326
  • Страна проживания:Россия
  • Реальное имя:Игорь
  • Пол:Мужчина
  • Город:Чита

Отношения между всеми.

В этой статье я научу вас делать мутантов или враждебных сталкеров друзьями.
Для этого откроем файл game_relations.ltx. Путь: gamedata/config/creatures. Теперь сделаем, например, бандитов друзьями. Найдем в файле game_relations.ltx таблицу [communities_relations]. В ней мы видим отношения группировок друг к другу и Актеру, также отношение Актера к группировке. По некоторым причинам не могу вставить эту таблицу. Но цифра отношения прописывается на пересечении, как в Морском бою.
Это где-то так:

[communities_relations]
|actor | ... |bandit |
====================================================...
actor = ... -5000
...
bandit = -5000 ....

Теперь вот эти две цифры мы заменим на 5000, убрав запятую, мы должны будем отодвинуть 5000 на 1 пробел вправо:

[communities_relations]
|actor | ... |bandit |
====================================================...
actor = ... 5000
...

bandit = 5000 ....

Также стоит учесть, если вы открываете файл Блокнотом, отношение Бандитов к Актеру будет не прямо под актером, а левее, НО НЕ правее. Сохраняем. Заходим в игру. Бандиты - друзья.
Также их можно сделать нейтралами, написав ноль, но надо отодвинуть 0 на столько пробелов вправо, сколько вы убрали знаков из начального числа. В данном случае -5000, то есть надо отодвинуть 0 вправо на 4 пробела.
Чтобы не было неясностей типа отношение хорошее, а они мне враги, ставьте в отношении группировки к Актеру одинаковым с отношением Актера к группировке. Так можно проделать с любой группировкой.

Теперь разберемся с мутантами. Откроем все тот же game_relations.ltx. Где-то в самом низу видим таблицу [monster_relations]
По аналогии, как и с группировками ставим цифры (с теми же пробелами вправо), только тут нельзя ставить -5000 и т.д. Здесь друг - это "1", нейтрал - "0", враг - "-1", злейший враг - "-2".
Не забывайте прописать как отношение Актера к мутанту, так и отношение мутанта к актеру.
Примечание: Актер - это actor.

 

 

Проводника в ТЧ.

Теория
В ТЧ есть единственный момент, когда в результате диалога с НПС, ГГ перемещается. Это диалог с "О-Сознанием". После отказа от вступления, ГГ перемещается на АЭС2. Если использовать эту функцию, можно создать в ТЧ проводника.
Примечание: Проводник не будет перемещаться вместе с вами, как в ЗП. Вы будете перемещаться в одиночку, как в ЧН.
Практика
Для этого:
1). Для этого в gamedata\scripts находим файл dialogs_aes.script. В нём имеется следующая функция:

Код:
function osoznanie_decline(npc, actor)
db.actor:disable_info_portion("oso_init_dialog")
npc:stop_talk()
actor:stop_talk()
xr_effects.enable_ui(db.actor, nil)
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")

db.actor:set_actor_position(point:point(0))
local dir = look:point(0):sub(point:point(0))
db.actor:set_actor_direction(-dir:getH())

end

2). Копируем эту функцию, допустим, в escape_dialog из директории gamedata\scripts
3). Обратите внимание на вот этот фрагмент из функции: db.actor:disable_info_portion("oso_init_dialog"). Здесь функция ссылается на инфопоршень, но на Кордоне данный инфопоршень не прописан.
4). Тогда переименовываем данный инфопоршень так, как вам удобно, например db.actor:disable_info_portion("esc_init_dialog"). Примечание: Название инфопоршня это "esc_init_dialog" (то ,что за скобками, переименовывать не надо). Затем добавляем инфопоршень в файл info_101escape.xml из директории gamedata\config\gameplay. В этом файле добавляем следующее:
5). Итак, функция есть, инфопоршень тоже есть. Теперь нужны координаты. Обратите внимание на следующий фрагмент функции:

Код:
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")

Здесь функция ссылается на определённые координаты на АЭС2. Но нам нужны координаты на Кордоне. Для этого открываем way_101_escape.ltx и там дописываем пути. Например вот так:

Код:
[mon_jump_esc8_look]
points = p0
p0:name = wp00
p0:position = -239.110947,-19.788391,-134.999161
p0:game_vertex_id = 8
p0:level_vertex_id = 16191

[mon_jump_esc8_walk]
points = p0
p0:name = wp00
p0:position = -238.017761,-19.888292,-140.161987
p0:game_vertex_id = 47
p0:level_vertex_id = 17468

Всё пути есть. Только теперь в функции, переименуйте фрагмент:

Код:
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")

На фрагмент:

Код:
local point = patrol("mon_jump_esc8_walk")
local look = patrol("mon_jump_esc8_look")

Теперь осталось только привязать всё это к диалогу. Я взял диалог с Кузнецовым.
Открываем файл dialogs_escape.xml и находим следующие строки:

Код:

dialogs.is_not_wounded

esc_bridge_soldiers_start_12
13

Это фраза "Мне надо дальше". Сюда вставляем активизацию нашей функции. Получется следующее:

Код:

dialogs.is_not_wounded

esc_bridge_soldiers_start_12
escape_dialog.osoznanie_decline Здесь следующая структура: Название_скрипта. Название_функции
13

Вот, собственно и всё. Теперь после фразы "Мне надо дальше" вы переместитесь к бункеру Сидоровича.

Я делал также но чуток исправил:

Код:
function osoznanie_decline(npc, actor)
--Поршень не нужен, он всёравно удаляется
npc:stop_talk()
actor:stop_talk()
xr_effects.enable_ui(db.actor, nil)
local point = patrol("mon_jump_aes2_walk")
local look = point -- указать можно только один путь

db.actor:set_actor_position(point:point(0))
local dir = look:point(0):sub(point:point(0))
db.actor:set_actor_direction(-dir:getH())

end

 



#46
_Crazy Gamer_

_Crazy Gamer_

    Сталкер

  • альтернативный текст
  • Модераторы сайта
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    15-October 20
  • 1357 Cообщений
  • Пропуск №: 36666


Репутация: 2229 Постов: 1357
  • Страна проживания:Украина
  • Реальное имя:Николай
  • Пол:Мужчина
  • Город:Киев - Оболонь

Видеоуроки по программе X-Ray SDK 0.4, SDK 0.7, и другие.
 

 

 



#47
_Crazy Gamer_

_Crazy Gamer_

    Сталкер

  • альтернативный текст
  • Модераторы сайта
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    15-October 20
  • 1357 Cообщений
  • Пропуск №: 36666


Репутация: 2229 Постов: 1357
  • Страна проживания:Украина
  • Реальное имя:Николай
  • Пол:Мужчина
  • Город:Киев - Оболонь

 

 

 

 

 

Новые уроки

 

 

ERROR: Invalid faces исправляем ошибку

 

 

Делаем анимированную текстуру для костра

 

 

Автор: Genior



#48
Гость_Paul_Fox_*

Гость_Paul_Fox_*
  • альтернативный текст
  • Бродяги

КПК - Сталкера
  • Регистрация:
    --
  • Пропуск №: 0


Репутация: Репутация:
Видеоуроки по программе X-Ray SDK 0.4, SDK 0.7, и другие.
Привет Сергей! Не открываются спойлеры двух первых ссылок в твоём посте #6:
1) LevelEditor
2) Учимся SDK 0.7 и 3DsMax
А Андрей Непряхин - мой давний друг. И Модератор может заругать за то что тут сразу не указан автор данного видео.
Поправь ПЖ, мой пост потом удалят. (DEL) 
 
Прикрепленный файл  Андрей.png   91.27К   скачиваний 4
 

(18 October 2020 - 19:56):
Исправил.

Сообщение отредактировал Paul_Fox: 18 October 2020 - 19:13


#49
_Crazy Gamer_

_Crazy Gamer_

    Сталкер

  • альтернативный текст
  • Модераторы сайта
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    15-October 20
  • 1357 Cообщений
  • Пропуск №: 36666


Репутация: 2229 Постов: 1357
  • Страна проживания:Украина
  • Реальное имя:Николай
  • Пол:Мужчина
  • Город:Киев - Оболонь

Paul_Fox, У меня нет прав к редактированию :wacko:


(18 October 2020 - 19:57):
Ничем не могу помочь пока. Надо ждать ГА.


#50
Димасик

Димасик

    Сталкер

  • альтернативный текст
  • Старожилы

КПК - Сталкера
  • Регистрация:
    13-September 20
  • 105 Cообщений
  • Пропуск №: 36642


Репутация: 78 Постов: 105
  • Страна проживания:Россия
  • Реальное имя:Дмитрий
  • Пол:Мужчина
  • Город:Ухта
Как отослать сообщение Меченому на ПДА

Сложность: Легко

 

Файлы: Любой стандартный диалог

 

1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:

 

news_manager.send_tip - это сама функция, которая отсылает сообщение.

"%c[255,255,128,128] - это цвет сообщения, идет по моему по цветам RGB.

 

%c[default] - это конец кода цвета сообщения, дальше текст идёт в стандартном цвете.

\n - это перенос на другую строчку.

 

2. В любой диалог пишем функцию:

<action>ваше_название_скрипта.ваш_текст</action>
<action>ваше_название_скрипта.ваш_текст</action>
Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13, пишем:
<action>ваше_название_скрипта.ваш_текст</action>
Теперь после того как поговорите с Доктором (NLC5) на ПДА придёт сообщение с вашим текстом.

function ваш_текст(first_speaker, second_speaker)
    news_manager.send_tip(db.actor, "%c[255,255,128,128]ПРИМЕР:\n%c[default]ВАШ ТЕКСТ", nil, nil, 30000)
end
function ваш_текст(first_speaker, second_speaker)
    news_manager.send_tip(db.actor, "%c[255,255,128,128]ПРИМЕР:\n%c[default]ВАШ ТЕКСТ", nil, nil, 30000)
end

 

 

Создание тайника

Сложность: Средне

Файлы: spawn_sections.ltx, devices.ltx, любой стандартный диалог.

 

Для того, чтобы замерить координаты можно воспользоваться аддончиком Position Informer. (В теме инструментарий для мододелов)

1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:

 

function ваше_название_функции()                   --/ название функции

alife():create(section,position,levelvertex,gamevertex)   --/ вписываем свои координаты

end

function ваше_название_функции()                   --/ название функции

alife():create(section,position,levelvertex,gamevertex)   --/ вписываем свои координаты

end

 

2. В папке config/scripts создаём файл m_taynik.ltx и пишем в него:

[spawn] --/ Это то, что появится в тайнике
предмет
предмет
предмет
предмет
предмет
[spawn] --/ Это то, что появится в тайнике
предмет
предмет
предмет
предмет
предмет

3. Открываем файл spawn_sections.ltx из папки gamedata/config/creatures и пишем:

[m_taynik]:ваш_текст
visual = equipments\item_rukzak
radius = 1
custom_data = scripts\m_taynik.ltx
[m_taynik]:ваш_текст
visual = equipments\item_rukzak
radius = 1
custom_data = scripts\m_taynik.ltx

4. Открываем файл devices.ltx и пишем:

[ваш_текст] --/ название секции
GroupControlSection    = spawn_group
discovery_dependency =
$spawn                 = "devices\inventory box"
class                = O_INVBOX
cform                = skeleton
visual                = physics\box\expl_dinamit.ogf
script_binding      = bind_physic_object.init
[ваш_текст] --/ название секции
GroupControlSection    = spawn_group
discovery_dependency =
$spawn                 = "devices\inventory box"
class                = O_INVBOX
cform                = skeleton
visual                = physics\box\expl_dinamit.ogf
script_binding      = bind_physic_object.init

5. Пихаем в любой диалог функцию спавна:

<action>ваше_название_скрипта.ваше_название_функция</action>
<action>ваше_название_скрипта.ваше_название_функция</action>
Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13, пишем:
<action>ваше_название_скрипта.ваше_название_функции</action>
Теперь после того как поговорите с Доктором (NLC5) по заданным координатам появится рюкзак.

 

Создание уникального костюма

Cложность: Легко

Файлы: unique_items.ltx

Создание костюма, который например является модификацией существующего.

 

1. Открываем файл unique_items.ltx (gamedata/config/misc) и в конец файла пишем:

[любой_текст_m1]:novice_outfit           ;Модифицированный костюм
$spawn                              = "outfit\uniq\любой_текст_m1"
inv_name                    = название в конфиге
inv_name_short                    = название в конфиге
description                    = описание в конфиге
cost                        = 3000
health_restore_speed                = 0.0004
bleeding_restore_speed                = -0.002
inv_grid_x                    = 12
inv_grid_y                    = 21
[любой_текст_m1]:novice_outfit           ;Модифицированный костюм
$spawn                              = "outfit\uniq\любой_текст_m1"
inv_name                    = название в конфиге
inv_name_short                    = название в конфиге
description                    = описание в конфиге
cost                        = 3000
health_restore_speed                = 0.0004
bleeding_restore_speed                = -0.002
inv_grid_x                    = 12
inv_grid_y                    = 21
Тут прописаны отличия от самого костюма. В данном случае от novice_outfit
inv_name - название
inv_name_short - название
description - описание
cost - цена
health_restore_speed - скорость восстановления здоровья когда одет этот костюм
bleeding_restore_speed - скорость уменьшения кровотечения
inv_grid_x и inv_grid_y - иконка.

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

 

 

Создание абсолютно нового костюма

Как создать абсолютно новый костюм с уникальным визуалом.

Сложность: Тяжело

1. Открываем outfit.ltx (gamedata/config/misc)

Копируем секцию например СКАТ-10М в конец файла и редактируем:

[ваше_название_костюма]:outfit_base
GroupControlSection    = spawn_group
discovery_dependency =
$spawn             = "outfit\ваше_название_костюма"
;$prefetch         = 32
class            = E_STLK
cform           = skeleton
visual          = equipments\ваше_название_костюма
actor_visual    = actors\soldier\ваша_модель.ogf
ef_equipment_type    = 4
inv_name            = ваше_название_костюма_в_конфиге
inv_name_short        = ваше_название_костюма_в_конфиге
description            = ваше_название_костюма_описание_в_конфиге
inv_weight            = 16.0    ;Вес костюма
slot                = 6
inv_grid_width        = 2       ;Координаты иконки
inv_grid_height        = 3
inv_grid_x            = 18
inv_grid_y            = 17
full_icon_name        = npc_icon_militaryspec_outfit
cost                = 48000        ;Стоимость костюма
full_scale_icon        = 10,6    ;иконка сталкера в костюме в полный рост
immunities_sect        = ваше_название_костюма_immunities ;указывает на секцию с параметрами
; MEDIUM RESISTANCE
burn_protection                 = 0.5
strike_protection                 = 0.5
shock_protection                 = 0.5
wound_protection                = 0.5
radiation_protection             = 0.5
telepatic_protection             = 0.5
chemical_burn_protection         = 0.5
explosion_protection             = 0.5
fire_wound_protection              = 0.5
bones_koeff_protection =    armor_helmet_damage
[ваше_название_костюма_immunities]  ;коэффициенты иммунитета самого костюма
burn_immunity                = 0.004 
strike_immunity                = 0.003
shock_immunity                = 0.003
wound_immunity                = 0.005
radiation_immunity            = 0.00
telepatic_immunity            = 0.00
chemical_burn_immunity        = 0.003
explosion_immunity            = 0.004
fire_wound_immunity            = 0.006
[ваше_название_костюма]:outfit_base
GroupControlSection    = spawn_group
discovery_dependency =
$spawn             = "outfit\ваше_название_костюма"
;$prefetch         = 32
class            = E_STLK
cform           = skeleton
visual          = equipments\ваше_название_костюма
actor_visual    = actors\soldier\ваша_модель.ogf
ef_equipment_type    = 4
inv_name            = ваше_название_костюма_в_конфиге
inv_name_short        = ваше_название_костюма_в_конфиге
description            = ваше_название_костюма_описание_в_конфиге
inv_weight            = 16.0    ;Вес костюма
slot                = 6
inv_grid_width        = 2       ;Координаты иконки
inv_grid_height        = 3
inv_grid_x            = 18
inv_grid_y            = 17
full_icon_name        = npc_icon_militaryspec_outfit
cost                = 48000        ;Стоимость костюма
full_scale_icon        = 10,6    ;иконка сталкера в костюме в полный рост
immunities_sect        = ваше_название_костюма_immunities ;указывает на секцию с параметрами
; MEDIUM RESISTANCE
burn_protection                 = 0.5
strike_protection                 = 0.5
shock_protection                 = 0.5
wound_protection                = 0.5
radiation_protection             = 0.5
telepatic_protection             = 0.5
chemical_burn_protection         = 0.5
explosion_protection             = 0.5
fire_wound_protection              = 0.5
bones_koeff_protection =    armor_helmet_damage
[ваше_название_костюма_immunities]  ;коэффициенты иммунитета самого костюма
burn_immunity                = 0.004 
strike_immunity                = 0.003
shock_immunity                = 0.003
wound_immunity                = 0.005
radiation_immunity            = 0.00
telepatic_immunity            = 0.00
chemical_burn_immunity        = 0.003
explosion_immunity            = 0.004
fire_wound_immunity            = 0.006

2. Открываем файл string_table_outfits.xml из папки (gamedata/config/text/rus) и в конец файла пишем:

<string id="ваше_название_костюма_в_конфиге">
        <text>То, что отображается в игре (название)</text>
    </string>
    <string id="ваше_название_костюма_описание_в_конфиге">
        <text>То, что отображается в игре (описание)</text>
    </string>
<string id="ваше_название_костюма_в_конфиге">
        <text>То, что отображается в игре (название)</text>
    </string>
    <string id="ваше_название_костюма_описание_в_конфиге">
        <text>То, что отображается в игре (описание)</text>
    </string>

3. Находим в папке gamedata/meshes/actors/soldier файл stalker_military_black.ogf делаем его копию и переименовываем её как хочется, например в stalker_military_white.ogf. Открываем её блокнотом и находим это: act\act_stalker_military_1. Меняем на любой текст, но главное чтобы символов было столько же, иначе модель не будет работать. Меняем например на это: _ct_stalker_military.

 

4. Делаем тоже самое с stalker_comander_suit.ogf (gamedata/meshes/equipments) - получаем stalker_comander_suit_white.ogf

 

5. Создаём текстуру с названием _ct_stalker_military.dds (можно взять готовую из любого текстурного мода и переназвать как надо.

 

6.Прописываем в продажу торговцу и радуемся.

 

 

Диалоги. Часть 1

Сложность: Легко

Как сделать простой диалог.

1. Открываем, например файл dialogs_escape.xml (gamedata/config/gameplay) и пишем в конец:

<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
            </phrase>
        </phrase_list>
    </dialog>
Это скелет диалога. В нём будут написаны все инфопоршни и actions.
<dialog id="test_dialog"> - это название диалога, которое нужно будет написать НПС.
<phrase id="0"> - номер фразы.
<text>test_dialog_0</text> - это текст фразы.
<next>?</next> - переход к фразе.
2. Теперь нужно написать тексты диалога. Заходим в файл stable_dialogs_bar.xml (gamedata/config/text/rus) и пишем в конце:
<string id="test_dialog_0">
        <text>Это тестовый диалог</text>
    </string>
    <string id="test_dialog_1">
        <text>Угу.</text>
    </string>
<string id="test_dialog_0">
        <text>Это тестовый диалог</text>
    </string>
    <string id="test_dialog_1">
        <text>Угу.</text>
    </string>
<string id="test_dialog_0"> - это то, на что ссылается скелет диалога.
<text>Это тестовый диалог</text> - собственно текст.

3. Теперь нужно прописать этот диалог НПС. Например Бармену. Открываем файл character_desc_bar.xml и находим секцию Бармена. Она идёт самой первой.

После всех <actor_dialog>???</actor_dialog>, прописываем свой:

<actor_dialog>test_dialog</actor_dialog>

 

 

Диалоги. Часть 2

Сложность: Средне

Как создать диалог посложнее.

Как создать диалог с разными вариантами ответов.

Как создать диалог который исчезнет после прочтения.

1. Открываем, например файл dialogs_escape.xml (gamedata/config/gameplay) и пишем в конец:

<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
            </phrase>
        </phrase_list>
    </dialog>
<next>2</next> и <next>3</next> - это возможные ответы Меченого.
2. Теперь нужно написать тексты диалога. Заходим в файл stable_dialogs_bar.xml (gamedata/config/text/rus) и пишем в конце:
<string id="test_dialog_0">
        <text>Как дела?</text>
    </string>
    <string id="test_dialog_1">
        <text>Нормально, а у тебя?</text>
    </string>
    <string id="test_dialog_2">
        <text>Нормально</text>
    </string>
    <string id="test_dialog_3">
        <text>Хреново.</text>
    </string>
<string id="test_dialog_0">
        <text>Как дела?</text>
    </string>
    <string id="test_dialog_1">
        <text>Нормально, а у тебя?</text>
    </string>
    <string id="test_dialog_2">
        <text>Нормально</text>
    </string>
    <string id="test_dialog_3">
        <text>Хреново.</text>
    </string>
3. Чтобы этот диалог не появлялся, пишем инфопоршень. Например в файле info_l01escape.xml, пишем:
<info_portion id="test_pogovoril"></info_portion>
<info_portion id="test_pogovoril"></info_portion>
4. Дописываем инфопоршень в скелет диалога:
<dialog id="test_dialog">
<dont_has_info>test_pogovoril</dont_has_info>
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
      <give_info>test_pogovoril</give_info>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
      <give_info>test_pogovoril</give_info>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
<dont_has_info>test_pogovoril</dont_has_info>
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
      <give_info>test_pogovoril</give_info>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
      <give_info>test_pogovoril</give_info>
            </phrase>
        </phrase_list>
    </dialog>
<dont_has_info>test_pogovoril</dont_has_info> - если ГГ получил инфопоршень, диалог не показывать.
<give_info>test_pogovoril</give_info> - дать ГГ инфопоршень.

Получается, что когда ГГ скажет любую из 2 фраз, диалог больше не появится.

 

Диалоги. Часть 3

Сложность: Сложно

Как сделать разные action в диалогах.

 

1. Создаём обычный диалог:

<dialog id="test_dialog">
<dont_has_info>test_pogovoril</dont_has_info>
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
        <next>4</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
            </phrase>
            <phrase id="4">
                <text>test_dialog_4</text>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
<dont_has_info>test_pogovoril</dont_has_info>
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
        <next>4</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
            </phrase>
            <phrase id="4">
                <text>test_dialog_4</text>
            </phrase>
        </phrase_list>
    </dialog>
C такими текстами:

<string id="test_dialog_0">
        <text>Я тестю функции.</text>
    </string>
    <string id="test_dialog_1">
        <text>Ок, какую?</text>
    </string>
    <string id="test_dialog_2">
        <text>Дать деньги</text>
    </string>
    <string id="test_dialog_3">
        <text>Дать ПМ</text>
    </string>
    <string id="test_dialog_4">
        <text>Заспавнить ПМ</text>
    </string>
<string id="test_dialog_0">
        <text>Я тестю функции.</text>
    </string>
    <string id="test_dialog_1">
        <text>Ок, какую?</text>
    </string>
    <string id="test_dialog_2">
        <text>Дать деньги</text>
    </string>
    <string id="test_dialog_3">
        <text>Дать ПМ</text>
    </string>
    <string id="test_dialog_4">
        <text>Заспавнить ПМ</text>
    </string>
2.Создаём свой скрипт в папке gamedata/script например test.script и пишем в него 3 функции:

function dat_dengi(first_speaker, second_speaker)
    dialogs.relocate_money(second_speaker, 3000, "in")
end
function dat_dengi(first_speaker, second_speaker)
    dialogs.relocate_money(second_speaker, 3000, "in")
end
Это функция отдачи денег ГГ. На месте 3000 любое число. На месте dat_dengi любое название.

function dat_item(first_speaker, second_speaker)
    dialogs.relocate_item_section(second_speaker, "wpn_pm", "in")
end
function dat_item(first_speaker, second_speaker)
    dialogs.relocate_item_section(second_speaker, "wpn_pm", "in")
end
Это функция отдачи предмета ГГ. На месте wpn_pm любой предмет. На месте dat_item любое название.

function spawn_item_or_monster_or_stalker()
alife():create("wpn_pm",vector():set(pos),lvid,gvid)
end
function spawn_item_or_monster_or_stalker()
alife():create("wpn_pm",vector():set(pos),lvid,gvid)
end
Это функция спавна чего либо. На месте wpn_pm любой предмет,монстр или сталкер. На месте (pos),lvid,gvid) любые координаты. На месте spawn_item_or_monster_or_stalker любое название.
Так же функция может быть одна, но с несколькими действиями. Например:
function all(first_speaker, second_speaker)
    dialogs.relocate_money(second_speaker, 3000, "in")
    dialogs.relocate_item_section(second_speaker, "wpn_pm", "in")
    alife():create("wpn_pm",vector():set(pos),lvid,gvid)
end
function all(first_speaker, second_speaker)
    dialogs.relocate_money(second_speaker, 3000, "in")
    dialogs.relocate_item_section(second_speaker, "wpn_pm", "in")
    alife():create("wpn_pm",vector():set(pos),lvid,gvid)
end
Значит что одновременно ГГ дадут 3000 рублей, ПМ и по заданным координатам заспавнится ПМ.

3. Впишем функции в диалог:

<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
        <next>4</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
                <action>test.dat_dengi</action>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
                <action>test.dat_item</action>
            </phrase>
            <phrase id="4">
                <text>test_dialog_4</text>
                <action>test.spawn_item_or_monster_or_stalker</action>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
        <next>4</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
                <action>test.dat_dengi</action>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
                <action>test.dat_item</action>
            </phrase>
            <phrase id="4">
                <text>test_dialog_4</text>
                <action>test.spawn_item_or_monster_or_stalker</action>
            </phrase>
        </phrase_list>
    </dialog>

Это значит что после после фразы <text>test_dialog_2</text> ГГ дадут 3000руб. А после после фразы <text>test_dialog_3</text>, ГГ дадут ПМ. И после после фразы <text>test_dialog_3</text>, заспавнится ПМ

 

Диалоги. Часть 4

Cложность: Сложно.

Как сделать разные precondition в диалогах.

 

Прекондишоны - это проверки на появление диалога

1. Создаём обычный диалог:

<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
            </phrase>
        </phrase_list>
    </dialog>
C такими текстами:
<string id="test_dialog_0">
        <text>Тест прекондишонов.</text>
    </string>
    <string id="test_dialog_1">
        <text>Какой?</text>
    </string>
    <string id="test_dialog_2">
        <text>Эта фраза появляется если у ГГ есть ??? рублей.</text>
    </string>
    <string id="test_dialog_3">
        <text>Эта фраза появляется если у ГГ есть ??? предмет.</text>
    </string>
<string id="test_dialog_0">
        <text>Тест прекондишонов.</text>
    </string>
    <string id="test_dialog_1">
        <text>Какой?</text>
    </string>
    <string id="test_dialog_2">
        <text>Эта фраза появляется если у ГГ есть ??? рублей.</text>
    </string>
    <string id="test_dialog_3">
        <text>Эта фраза появляется если у ГГ есть ??? предмет.</text>
    </string>

2. Создаём свой скрипт в папке gamedata/script например test.script и пишем в него 3 функции-прекондишона:

function has_money_???()

  local money = math.floor(200 *
xr_statistic_freeplay.get_freeplay_statistic():get_found_pda_discount())
  return db.actor:money()>=money
end
function has_money_???()
  local money = math.floor(200 *
xr_statistic_freeplay.get_freeplay_statistic():get_found_pda_discount())
  return db.actor:money()>=money
end
Это функция проверки количества денег ГГ. На месте 200 любое число.
На месте has_money_??? любое название.

function has_item(task, objective)
    if db.actor ~= nil then
        return db.actor:object("wpn_pm") ~= nil
    end
    return false
end
function has_item(task, objective)
    if db.actor ~= nil then
        return db.actor:object("wpn_pm") ~= nil
    end
    return false
end
Это функция проверки наличия какого либо предмета у ГГ. На месте wpn_pm любой предмет. На месте has_item любое название.

3.Впишем функции в диалог:

<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
        <precondition>test.has_money???</precondition>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
        <precondition>test.has_item</precondition>
            </phrase>
        </phrase_list>
    </dialog>
<dialog id="test_dialog">
        <phrase_list>
            <phrase id="0">
        <text>test_dialog_0</text>
        <next>1</next>
            </phrase>
            <phrase id="1">
                <text>test_dialog_1</text>
        <next>2</next>
        <next>3</next>
            </phrase>
            <phrase id="2">
                <text>test_dialog_2</text>
        <precondition>test.has_money???</precondition>
            </phrase>
            <phrase id="3">
                <text>test_dialog_3</text>
        <precondition>test.has_item</precondition>
            </phrase>
        </phrase_list>
    </dialog>
Это значит что фраза <text>test_dialog_2</text> появится если у ГГ есть 200рублей
Это значит что фраза <text>test_dialog_3</text> появится если у ГГ есть ПМ.



#51
Гость_Рыж_*

Гость_Рыж_*
  • альтернативный текст
  • Бродяги

КПК - Сталкера
  • Регистрация:
    --
  • Пропуск №: 0


Репутация: Репутация:

Как можно создать артефакт Ликвидатор, который ликвидирует аномалии? :sm27:



#52
_Crazy Gamer_

_Crazy Gamer_

    Сталкер

  • альтернативный текст
  • Модераторы сайта
  • Клуб - reaktor

КПК - Сталкера
  • Регистрация:
    15-October 20
  • 1357 Cообщений
  • Пропуск №: 36666


Репутация: 2229 Постов: 1357
  • Страна проживания:Украина
  • Реальное имя:Николай
  • Пол:Мужчина
  • Город:Киев - Оболонь

Знаю способ на ТЧ.

 

Как прописать нужный предмет в продажу и про "мелкие" траблы солянки из за которых кто-то не может пройти сюжетную линию. Отдельное спасибо MAV.

 

Рассмотрим на примере Сидоровича.
Все файлы торговцев находятся в папках
gamedata\config\misc\ shop_ник_торговца
в случае с Сидоровичем - это папка
gamedata\config\misc\shop_sidr
Чтобы прописать предмет в продажу, необходимо отредактировать 2 файла:
sidr_supl.ltx - тут указывается количество предметов, появляющихся при открытии диалога торговли и вероятность их появления
sidr_trade.ltx - тут указывается диапазон колебания цены предмета при открытии диалога

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

В каждом файле торговца есть одна или более секций, определяющие ассортимент торговца до или после наступления какого-то игрового события. Названия секций заключены в квадратные скобки []

У Сидоровича 2 секции

[…_start] - ассортимент при начале игры
[…_after_fabric] - ассортимент после приноса флешки Шустрого
Соответственно, добавлять предметы нужно в ту секцию, которая соответсвует вашей сюжетной линии в игре. Можно добавлять сразу во все секции - хуже не станет.

Чтобы добавить предмет, ниже названия секции добавляете строчку такого вида:
"название предмета" = число1, число2
(не забываем ставить пробелы до и после = и после запятой)
В файле sidr_supl.ltx
число1 - количество предметов
число2 - вероятность их появления (от 0 до 1, кратное 0.1)

В файле sidr_trade.ltx
число1 - минимальный коэффициент цены
число2 - максимальный коэффициент цены
При открытии диалога цена предмета будет случайной, равной "реальной цене" * на случайное число в диапазоне от минимального до максимального коэффициента. Коэффициент может быть меньше и больше 1.

Внимание! Десятичный разделитель в каждом числе должен быть "точкой", а не "запятой".

И напоследок - в файле sidr_trade.ltx нужно в соответствующей секции проверить нет ли "вашего" предмета с пометкой ;NO TRADE . Если есть - то эту строчку удалите.

Пример: чтобы добавить в продажу 5 артефактов Медуза по цене от 0.1 до 0.5 реальной цены,

1. в файл sidr_supl.ltx
после строчки [supplies_after_fabric]
дописываем строчку
af_medusa = 5, 1

2. в файл sidr_trade.ltx
после строчки [trader_after_fabric_sell]
дописываем строчку
af_medusa = 0.1, 0.5

3. удаляем строчку
af_medusa ;NO TRADE

Сохраняем файлы, перезагружаем игру и бежим покупать у Сидора артефакты.



Квестовые предметы

 

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

Описание практически всех квестовых предметов находятся в файлах ***.ltx, в названиях которых есть items, основные из них: items.ltx , quest_items.ltx , unique_items.ltx , arhara_items.ltx.

Пример - прописывание в продажу ПДА Фраера, его название - fraer_pda. Описание ПДА Фраера находится в файле quest_items.ltx, вот с него и начнем - находится он в папке - gamedata - config - misc файл quest_items.ltx
Делаем копию этого quest_items.ltx и убираем её куда нибудь, позже она нам понадобится.
Затем открываем оставшийся файл quest_items.ltx и ищем строки
[fraer_pda]:identity_immunities
...... (много всего разного) .....
quest_item = true

и меняем quest_item = true на quest_item = false
закрываем этот файл и соглашаемся с изменениями.
При поиске описания друго предмета - ищем аналогичную строчку
[название_предмета]:identity_immunities

Теперь прописываем пда в торговлю, как описано выше.

Закрываем, сохраняем, запускаем Солянку, идем к торговцу и в продаже у него должен быть пда фраера, покупаем его, затем сохраняем игру и выходим из нее, закрывае короче игру. И теперь нам нужна копия файла quest_items.ltx, которую мы сделали в начале, этот файл надо вернуть на место, то есть в gamedata - config - misc.

Теперь запускаем игру и идем отдавать этот пда или что там надо с ним сделать по квесту.
Если описание предмета находится в ином файле, например - в arhara_items.ltx, то вместо quest_items.ltx копируем, исправляем и восстанавливаем "наш" файлописания.
За это описание благодарю коллег denton77 и Uglan59 - я лишь немного подправил и добавил их подробные разъяснения.

 

 

Названия
af_medusa - медуза
af_cristall_flower каменный цветок
af_night_star ночная звезда
af_vyvert выверт
af_gravi грави
af_gold_fish золотая рыбка
af_blood кровь камня
af_mincer_meat ломоть мяса
af_soul душа
af_electra_sparkler бенгальский огонь
af_electra_flash вспышка
af_electra_moonlight лунный свет
af_rusty_thorn колючка
af_rusty_kristall кристальная колючка
af_rusty_sea-urchin морской еж
af_ameba_slime слизь
af_ameba_slug слизняк
af_ameba_mica слюда
af_drops капля
af_fireball огненный шар
af_cristall кристалл
af_dummy_glassbeads мамины бусы
af_dummy_pellicle пленка
af_dummy_battery батарейка
af_dummy_dummy пустышка
af_dummy_spring пружина
af_fuzz_kolobok колобок
af_buliz булыжник
af_spirit_1 капля души
af_spirit_2 огненная душа
af_spirit_3 кристальная душа
af_spirit_4 кристальная душа Бенгала
af_cry_1 слезы электры
af_cry_2 слезы огня
af_cry_3 слезы химеры
af_babka_1 бабкины бусы
af_babka_2 бусы прабабки
af_babka_3 бусы бабки бюрера
af_babka_4 бусы прабабки бюрера
af_pudd_1 огненная пустышка
af_pudd_2 яркая пустышка
af_pudd_3 лунная пустышка
af_pudd_4 пудинг
af_dik_1 дикобраз
af_dik_2 электрический дикобраз
af_dik_3 сопливый дикобраз
af_dik_4 каменный дикобраз
af_kol_1 стальной колобок
af_kol_2 титановый колобок
af_kol_3 алмазный колобок
af_kol_4 младший брат гиганта
af_armor_1 шкура
af_armor_2 чешуя
af_armor_3 панцирь
af_armor_4 скальп контролера
af_simbion симбион
af_dummy_battery_red рубиновая батарейка
af_dummy_spring_red рубиновая пружина
af_dummy_pellicle_red рубиновая пленка
af_medusa_green изумрудная медуза
af_vyvert_green изумрудный выверт
af_blood_green изумрудная кровь камня
af_caterpillar плазменная Гусеница
af_arhara_globus погремушка
gold_art золотой Ломоть
art_acumm Черная энергия

 

Арты для квестов
mutant_flesh_eye глаз псевдоплоти
mutant_boar_leg копыто кабана
mutant_dog_tail хвост собаки
mutant_psevdodog_tail хвост псевдопса
mutant_krovosos_jaw челюсть кровососа
mutant_burer_hand рука бюрера
mutant_zombie_hand рука зомби
mutant_snork_leg нога снорка
mutant_face_tushkano голова тушкано
mutant_hand_kontroler рука контролера
mutant_poltergeist_glas глаз полтергейста
mutant_psevdogigant_hand рука псевдогиганта
mutant_tail_cat хвост кошки
mutant_chimera_kogot коготь химеры
mutant_fracture_hand рука излома
mutant_spleen_rat селезенка крысы
mutant_krovosos_red_jaw красные челюсти кровососа
mutant_burer_red_hand красная рука бюрера
red_mozg красный мозг контролера

 

 

Или скачай это



#53
Гость_Рыж_*

Гость_Рыж_*
  • альтернативный текст
  • Бродяги

КПК - Сталкера
  • Регистрация:
    --
  • Пропуск №: 0


Репутация: Репутация:

_Crazy Gamer_

Спасибо, хорошее пособие. :sm16:

Но в нём нет создания Ликвидатора или чего-нибудь подобного против аномалий. Я думаю, что в свойства какого-нибудь известного артефакта нужно добавить информацию о ликвидации аномалий. Попробую поковырять свойства артефактов методом тыка. :sm9:



#54
Мерцающий

Мерцающий

    Агент Матрицы

  • альтернативный текст
  • Разработчики
  • Клуб - reaktor
  • Завсегдатай - больше 1 год на сайте
КПК - Сталкера
  • Регистрация:
    14-December 13
  • 777 Cообщений
  • Пропуск №: 9774


Репутация: 2194 Постов: 777
  • Страна проживания:Россия
  • Реальное имя:Андрей
  • Пол:Мужчина
  • Город:Екатеринбург

Рыж, в Солянке есть арт Компас, он удаляет аномалии, есть рубиновые арты, удаляющие конкретные аномалии. В ОП-2.1 есть еще Чёрная дыра. Это где можно посмотреть навскидку. 



#55
Romero

Romero

    Сталкер

  • альтернативный текст
  • Нейтралы
  • Пользователь

КПК - Сталкера
  • PipPipPipPip
  • Регистрация:
    10-March 16
  • 1244 Cообщений
  • Пропуск №: 22374


Репутация: 2475 Постов: 1244
  • Страна проживания:Россия
  • Реальное имя:Владимир
  • Пол:Мужчина
  • Город:Владивосток

Рыж,  В "Альтернативе" был Ликвидатор.





Темы с аналогичными тегами: Сталкер, Модостроение


реклама на сайте подключена

Использование материалов сайта только с разрешения Администрации LENA_D!
Или с указанием прямой ссылки на источник. 2010 © bar-reaktor.stalker-worlds.ru
Не забывай о нас. Мы всегда рады тебе!!!

Рейтинг Ролевых Ресурсов - RPG TOP