Каталог




Главная » Блоги » Модификации » Как создавать моды для Сталкера.


Как создавать моды для Сталкера.




Sabira



Статус: Offline


Добавлено: 11 декабря 2011
Просмотров: 10987 | Комментарии: 7

Понравилось: 5 пользователям


Чтобы делать качественные моды, нужно по крайней мере иметь представление по программированию на языке C++ вот первый урок.
1. В уроке мы рассмотрим простые математические операции: сложение, вычитание, умножение и деление.

На примере простого калькулятора.

# include <iostream>
# include <clocale>
using namespace std;

int main ()
{
setlocale (LC_CTYPE, "Russian");
float x; //где тип float указывает нам, что используется число с плавающей точкой
float y;
char o; // тип сhar - переменной о присваивается какой либо символ
char d;
do
{
cout << "Правила использования: число операция число" << endl;
cin >> x >> o >> y ;
cout << x << o << y;
float r; // переменная в которой мы храним результат наших вычислений
switch (o)
{
case '+':
r = x + y;
break;
case '-':
r = x - y;
break;
case '*':
r = x * y;
break;
case '/':
r = x / y;
break;
}
cout << "=" << r << endl;
cout << "Продолжить (y/n)" << endl;
cin >> d;
}
while (d == 'y');
}

И так что мы с Вами имеем: цикл do с выходом по условию while, то есть пока переменная d равна у цикл будет выполнятся, иначе программа закончит свою работу, обратите внимание что переменная d должна быть инициализирована до начала цикла, иначе при повторном вычислении программа ее не увидит.
Циклы предназначены для многократного выполнения какого-либо блока.
В С++ существуют три вида циклов: for, while, do...while. Все они имеют сходную структуру и характерные особенности: инициализация счётчика цикла, проверка условия цикла, увеличение счётчика цикла.
2. Цикл For:
-----------------
#include <iostream> // подключим стандартную С++ библиотеку ввода/вывода
#include <clocale> // установим поддержку языковых пакетов

using namespace std; // указывает на использование стандартного простанства имен С++ (STD)

int main()
{
setlocale(LC_CTYPE,"Russian"); // подключим русский язык для отображения в консоли

cout << "Я собираюсь съесть мороженое"<< endl;
for (int i = 1; i < = 10; ++i)
{
cout << "Мороженое: " << i << endl;
}
cout << "ОЙ... Очень холодное " << endl;
cin.get();
}

В скобках после ключевого слова for находятся три выражения:

Инициализирующее. Оно предназначено для инициализации счётчика цикла. В нашем случае еденицей.
Условие проверки цикла. Здесь находится операция отношения. Если она возвращает единицу, то выполняется тело цикла, если возвращает ноль, то выполняется первый оператор стоящий за закрывающей фигурной скобкой.
В начале цикла переменная i равна единице, происходит проверка во втором выражении и т.к. выражение возвращает единицу (i действительно меньше десяти), то выполняется тело цикла. после того как выполнилось тело цикла, выполняется третье выражение.
Выражение инкрементирования (увеличения) счётчика цикла. В этом выражении мы можем изменить значение счётчика. Здесь мы видим новую операцию:
++i // i = i + 1
Операция обозначаемая двойным плюсом называется операцией инкремента и просто увеличивает значение переменной на единицу. От этой операции и происходит название языка C++.
После того как выполнилось выражение инкремента счётчика, снова выполняется второе выражение. На этот раз i равна двум. И выражение снова вернёт единицу, а значит тело цикла выполнится снова.
Это краткий первый урок по C++
======================================================================

Создание нового квеста:
---------------------------------

1. Сами квесты содержатся в файлах типа tasks_*****.xml
Откроем файл gamedata\config\gameplay\tasks_escape.xml. Структура – все тот же XML.
Для примера исследуем уже существующий квест:
<game_task id="esc_help_wounded_from_raid" prio="485">
<title>esc_help_wounded_from_raid</title>
<objective>
<text>esc_help_wounded_from_raid_0</text>
<icon>ui_iconsTotal_esc_help_wounded_from_raid</icon>
<function_complete>escape_tasks.task_fox_complete</function_complete>
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
<article>esc_fox_help</article>
</objective>
<objective>
<text>esc_help_wounded_from_raid_1</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>escape_fox_heal</infoportion_complete>
<infoportion_fail>esc_dogs_return</infoportion_fail>
</objective>
<objective>
<text>esc_help_wounded_from_raid_2</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>escape_stalker_done</infoportion_complete>
</objective>
</game_task>

Более обобщенно:
<game_task id="esc_help_wounded_from_raid" prio="485">
</game_task>
Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = "" задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание.
<title>esc_help_wounded_from_raid</title>
Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml.
<function_complete>escape_tasks.task_fox_complete</function_complete>
Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются.
<infoportion_complete>escape_fox_heal</infoportion_complete>
Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion.
<infoportion_fail>esc_dogs_return</infoportion_fail>
Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion.
<map_location_type hint="esc_fox">green_location</map_location_type>
Создает указатель на карте с подсказкой esc_fox и типом green_location.
<object_story_id>Escape_stalker_from_raid</object_story_id>
Указывает на sid из файла gamedata\config\game_story_ids.ltx
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>

Автоматически устанавливает данную подзадачу в положение «Выполнено», если у игрока есть данный info_portion. //!!!!!!Не уверена – не пользовалась не разу.
<text>esc_help_wounded_from_raid_0</text>
----------------------------------------------------------------------------------------------------
Задание для диалогов:

<game_task id="new_task">
<title>Поговорить с Волком</title>
<objective>
<text>Вернуться к Сидорычу</text>
<map_location_type hint="escape_trader">blue_location</map_location_type>
<object_story_id>Escape_Trader</object_story_id>
<infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
<objective>
<text>Поговорить с Волком</text>
<icon>ui_iconsTotal_find_item</icon>
<map_location_type hint="volk">green_location</map_location_type>
<object_story_id>Escape_novice_lager_volk</object_story_id>
<infoportion_complete>player_talked_with_wolf</ infoportion_complete>
</objective>
<objective>
<text>Вернуться к Сидорычу</text>
<map_location_type hint="escape_trader">blue_location</map_location_type>
<object_story_id>Escape_Trader</object_story_id>
<infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
</game_task>
Конечно можно и по другому, но это оптимальный вариант.Продолжим!

Теперь скелет диалога квеста:
------------------------------------------
<dialog id = "volk_new_quest">
<has_info>new_task_started</has_info>
<dont_has_info>player_talked_with_wolf</dont_has_info>
<dont_has_info> player_complete_new_task </dont_has_info>
<phrase_list>
<phrase id = "0">
<text>esc_volk_new_quest_0</text>
<next>1</next>
</phrase>
<phrase id = "1">
<text>esc_volk_new_quest_1</text>
<give_info>player_talked_with_wolf</give_info>
<next>2</next>
</phrase>
<phrase id = "2">
<text>esc_volk_new_quest_2</text>
<action>dialogs.break_dialog</action>
</phrase>

</phrase_list>
</dialog>

<dialog id = "esc_trader_new_quest">
<dont_has_info>player_complete_new_task</dont_has_info>
<dont_has_info>player_talked_with_wolf</dont_has_info>
<phrase_list>
<phrase id = "0">
<text>esc_trader_new_quest_0</text>
<next>1</next>
</phrase>
<phrase id = "1">
<text>esc_trader_new_quest_1</text>
<give_info>new_task_started</give_info>
<next>2</next>
</phrase>
<phrase id = "2">
<text>esc_trader_new_quest_2</text>
<action>dialogs.break_dialog</action>
</phrase>

</phrase_list>
</dialog>

<dialog id = "esc_trader_new_quest_complete">
<dont_has_info>player_complete_new_task</dont_has_info>
<phrase_list>
<phrase id = "0">
<text>esc_trader_new_quest_complete_0</text>
<next>1</next>
</phrase>
<phrase id = "1">
<text>esc_trader_new_quest_complete_1</text>
<give_info>player_complete_new_task</give_info>
<next>2</next>
</phrase>
<phrase id = "2">
<text>esc_trader_new_quest_complete_2</text>
<action>dialogs.break_dialog</action>
</phrase>
</phrase_list>
</dialog>
<code>
Все «скелеты» добавляем в файл dialogs_escape.xml. Между <game_dialogs> и <dialog id=...>!
Теперь переходим в файл character_desc_escape.xml
Ищем там NPC с <tt>id = "escape_trader"</tt> и добавляем два новых <tt><actor_dialog></actor_dialog></tt>:
<code>
<actor_dialog>esc_trader_new_quest_complete </actor_dialog>
<actor_dialog>esc_trader_new_quest </actor_dialog>

Там же ищем NPC с id = "esc_wolf" и добавляем один актёр_диалог:
<actor_dialog> volk_new_quest </actor_dialog>
Внимание: <actor_dialog> является диалогом, который активируется самим игроком по желанию. А <start_dialog> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен.
Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде:
<string id="esc_trader_new_quest_complete_0">
<text>Все, я выполнил поручение Волка!</text>
</string>
<string id="esc_trader_new_quest_complete_1">
<text>Молодец, Меченый. На тебя можно положиться.</text>
</string>
<string id="esc_trader_new_quest_complete_2">
<text>Рад был помочь, Сидорыч.</text>
</string>
<string id="esc_trader_new_quest_0">
<text> Здравствуй, Сидорыч! Есть работенка?</text>
</string>
<string id="esc_trader_new_quest_1">
<text>О, неужели заглянул к нам на огонек, Меченый? Ладно… ближе к телу… эээ, к делу. У меня к тебе следующая
просьба: сбегай к Волку, у него что-то намечалось.</text>
</string>
<string id=" esc_trader_new_quest_2">
<text>Без проблем! Уже бегу.</text>
</string>
<string id="esc_volk_new_quest_0">
<text>Здорово, Волк. Меня тут Сидорыч послал, говорит у тебя работа есть.</text>
</string>
<string id="esc_volk_new_quest_1">
<text>Привет, Меченый. Верь ты ему больше, этому старому маразматику! Все спокойно сейчас. Так что иди к нему и
скажи, что все хорошо.</text>
</string>
<string id="esc_volk_new_quest_2">
<text>Все, ухожу.</text>
</string>

Всё ! Вы создали диалог.
Для чего всё это? Да для того, чтобы молодые мододелы сами могли "писать" и учиться делать моды. Если будет желание, напишите мне в ЛС и я продолжу "обучение"


Всего комментариев: 7

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











Ответ на жалобу смотрите в разделе жалоб