Игровые Форумы - Показать сообщение отдельно - Уроки по коддингу.
Показать сообщение отдельно
Старый 24.03.2007, 11:55   #6
BGTeam
 
 Аватар для Kopcap
 
Отсутствует :(

Регистрация: 17.10.2006
Адрес: Пермь
Сообщения: 3,808

Репутация: 2512   Добавить отзыв для Kopcap

По умолчанию

Итак наконец я добрался до написания уроков!

Урок №5
«Кодинг квестов»



Итак значит все квесты в К3 могут кодяться в разных местах. Можно это делать чисто через диалоги, но у этого способа очень много минусов, поэтому мы его рассматривать не будем.
Мы рассмотрим вариант кодинга квестов в файле Quest/quest_reaction.c(можно ещё это делать в story_line.c, но в этом файле делается основная сюжетная линия, и поэтому не будет перемешивать код)
Значит открываем файл quest_reaction.cи идем в самый низ… там сначала делаем комментарий:
////////////////////////////////////////////////////////////////
///////////////Квест такой-то делал тот-то//////////////////////
////////////////////////////////////////////////////////////////
А дальше пишем уже знакомое всем

Код:
 
Case“имя кейса”:
Собственно тело кейса……
Break;
Далее все будет делаться через эти конструкции…
Теперь разберем какой-нибудь уже сделанный квест.
Рассмотрим квест «Конвоир» (2 квест сюжетки)

Квест начинается у губернатора Ла-вега, значит смотрим его файл диалога… LaVega_Hovernor_dialog.c
Среди прочего кода там находим строчки…

Код:
 
link.l3 ="Нет, ли у вас какого-нибудь поручения для молодого капитана?";
link.l3.go ="quest_guard";
дальше ищем case quest_guard там идет продолжение диалога, просматриваем его и видим

Код:
 
case "begin_quest":
NextDiag.CurrentNode = NextDiag.TempNode; 
DialogExit(); 
AddDialogExitQuest("begin_quest"); //// нас интересует вот эта строка в ней происходит запуск кейса begin_quest из файла quest_reaction …
break;
далее идем в файл quest_reaction иищем там case begin_quest

вот он

Код:
 
case "begin_quest":
AddQuestRecord("quest_guard", "1"); // здесь происходит запись в судовой журнал.. (все записи судового журнала находятся в resource\ini\texts\russian\questbook\quests_texts.txt)
ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "LaVega_town", "Goto", "Goto21")); // здесь идет помещение персонажа с ИД MatteusDull в город ЛА-вега в локатор goto 21 
Characters[GetCharacterIndex("LaVega_Hovernor")].Dialog.CurrentNode = "SecondTime"; // прописываем какой-диалог будет с нами говорить губернатор при следующей с ним встреей (этим мы убрали возможность взять квест много раз…)
break;
далее по квесту мы должны поговрить с матеуссом ….. значит смотрим его диалог MatteusDull_dialog.c
итак сейчас нас там интересует кейс exit…..

Код:
 
case "Exit": 
AddDialogExitQuest("go_to_ship_Matteus"); // запусккейсаизквест_реактиона
AddQuestRecord("quest_guard","ship"); // запись в судовой журнал
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
опять идем в квест_реатион и видим там это…

Код:
 
case "go_to_ship_Matteus": 
LAi_SetActorType(characterFromID("MatteusDull")); // прописываем тип актера Матеусу 
LAi_ActorRunToLocator(characterFromID("MatteusDull"), "reload", "reload1_back", "reload_Matteus", -1); // заставляем его бежать на пристань.. после чего запускается сразу кейс reload_Matteus
AddPassenger(pchar, characterFromID("MatteusDull"), false); // добавляем его в пассажиры 
// я слегка укоротил это кейс потому что нашел там один косяк…=) ну ладно об этом пока не будем 
break;
теперь смотрим кейс reload_Matteus

Код:
 
case "reload_Matteus": 
ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "Matteus_deck", "Goto", "goto6")); // перемещаем Матеуса в локацию Matteus_deck
pchar.quest.reloadPITER.win_condition.l1 = "location";
pchar.quest.reloadPITER.win_condition.l1.location = "Montserrat";
pchar.quest.reloadPITER.win_condition = "reload_PiterBlake_to_Matteus_deck"; // а вот в этих 3 строчках написано, что когда ГГ окажется около острова Монтсерат запустить кейс
reload_PiterBlake_to_Matteus_deck
break;
теперь смотрим далее на этот кейс

Код:
 
case "reload_PiterBlake_to_Matteus_deck":
DoReloadFromSeaToLocation("Matteus_deck", "goto", "goto9"); // здесь происходит релаод ГГ с моря в локацию
LAi_SetActorType(characterFromID("MatteusDull")); //делаем Матеуса актером
LAi_ActorDialog(characterFromID("MatteusDull"), Pchar, "", 1, 1); 
// заставляем его начать диалог с ГГ Characters[GetCharacterIndex("MatteusDull")].Dialog.CurrentNode = "ship"; // прописываем какой именно дилаог должен начать маттеус
Break;
Далее идем опять в диалог маттеуса там смотрим его и т.д. и оттуда есть несколько вариантов развития
Вот они….(это уже опять вернулись в квест_реактион)
Это в случае если с Матеусом не договорились и с ним начинается бой
Код:
 
case "kill_Matteus0": 
LAi_SetWarriorType(CharacterFromID("MatteusDull")); // тип воина для Матеуса 
LAi_group_MoveCharacter(CharacterFromID("MatteusDull"), "enemy"); //помещаем его в группу враги
LAi_group_FightGroups("enemy", LAI_GROUP_PLAYER, true); // начинаем бой между группой враги и группой ГГ (то есть между Матеусом и ГГ) 
LAi_SetFightMode(pchar, true); // боевой режим для ГГ RemovePassenger(Pchar,CharacterFromID("MatteusDull")); // удаляем Матеуса из пассажиров
LAi_QuestDelay("kill_Matteus1", 1.0); // запускаем следующий кейс через 1 секунду 
break;
Код:
 
case "kill_Matteus1":
Pchar.quest.kill_Matteus_next.win_condition.l1 = "NPC_Death";
Pchar.quest.kill_Matteus_next.win_condition.l1.character = "MatteusDull";
PChar.quest.kill_Matteus_next.win_condition = "kill_Matteus2";
// Здесь описано, что после убийства матеуса запутситься кейс kill_Matteus2
break;
Код:
 
case "kill_Matteus2":
AddQuestRecord("quest_guard","kill_Matteus0"); // опятьзапись всудовойжурнал…
QuestToSeaLogin_PrepareLoc("Montserrat", "reload", "reload_3", false);
QuestToSeaLogin_Launch(); // а эти 2 строчки нужны для того, чтобы ГГ вернулся назад в море
//доделать!!!! вариант квеста после убийства чувака ( а этот комментарий я оставлю без комментариев=)))
break;
это был 1 вариант когда ГГ убивал Матеуса…..
теперь рассмотрим 2 продолжение квеста.. это кейс shore_dialog_Montserrat, который запускается опять же таки из диалога с матеусом…

Код:
 
case "shore_dialog_Montserrat":
ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "Montserrat_shore", "Goto", "goto2")); // перемещаем матеуса в бухту
DoReloadCharacterToLocation("Montserrat_shore","goto","goto1"); // перемещаем ГГ в бухту
LAi_QuestDelay("shore_dialog_Montserrat_next", 1.0); // запускаем следующий кейс
LAi_SetActorType(characterFromID("MatteusDull")); // типа актера для Матеуса
Characters[GetCharacterIndex("MatteusDull")].Dialog.CurrentNode = "shore_dialog"; // диалог для Матеуса
break;
далее наичнаем диалог между ГГ и матеусом….

Код:
 
case "shore_dialog_Montserrat_next": 
LAi_ActorDialog(characterFromID("MatteusDull"),characterFromID("Blaze"),"",0,1);
break;
после диалога запускается кейс Go_to_jungle ( запсукаем его опять де таки из диалога маттеуса)

Код:
 
case "Go_to_jungle":
RemovePassenger(Pchar,CharacterFromID("MatteusDull")); // удаляем Матеуса из пассажиров
ChangeCharacterAddressGroup(characterFromID("guardM1"), "Montserrat_town_exit", "Goto", "guard1")); // прописываем охрану у города
ChangeCharacterAddressGroup(characterFromID("guardM2"), "Montserrat_town_exit", "Goto", "guard2")); //прописываем охрану у города
// Для этого персонажи с такими ИД должны быть прописаны!!! 
Locations[FindLocation("Montserrat_town_exit")].locators_radius.goto.goto_quest = 3.0; // делаем радиус локатора goto_quest большим
 
pchar.quest.dialog_with_guard.win_condition.l1 = "locator";
pchar.quest.dialog_with_guard.win_condition.l1.location = "Montserrat_town_exit";
pchar.quest.dialog_with_guard.win_condition.l1.locator_group = "goto";
pchar.quest.dialog_with_guard.win_condition.l1.locator = "goto_quest";
pchar.quest.dialog_with_guard.win_condition = "dialog_with_guard";
 
// в этих 5 строчках описано, что когда ГГ окажется в локаторе goto_questто запуститься кейс dialog_with_guard
break;
Код:
 
case "dialog_with_guard":
ChangeCharacterAddressGroup(characterFromID("MatteusDull"), "Lavega_townhall", "Goto", "goto1")); // здесь переноситсья к Губернатору Ла-Вега (так надо!)
LAi_SetActorType(characterFromID("guardM1")); // тип актера одному из стражников
LAi_ActorDialog(characterFromID("guardM1"),Pchar , "", 0, 0.1);// начинаем диалог с ГГ
Break;
Дальше идут кейсы, в которых вам уже должно быть все знакома.. так что их я разбирать не буду…….

Значит чтобы вам было легче вот списочек функций в игре (далеко не всех!, и возможно у какой-то из них неправильное описание =))
У некоторых функций есть перед её именем указан тип..НО для её использования тип писать не надо….
В скобках после имени указаны параметры функции… их нужно заменять на свое……

Ну что ж пока что все….Продолжение следует…..
Вложения
Тип файла: rar функции.rar (4.3 Кбайт, 167 просмотров)

Последний раз редактировалось dima12, 17.05.2008 в 18:11.
   
__________________
Нужный человек не в том месте может перевернуть мир!