Чтобы делать качественные моды, нужно по крайней мере иметь представление по программированию на языке 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>
Всё ! Вы создали диалог. Для чего всё это? Да для того, чтобы молодые мододелы сами могли "писать" и учиться делать моды. Если будет желание, напишите мне в ЛС и я продолжу "обучение"
|