---------------------- ** Как создать НПС ** ---------------------- небольшое введение от Ghreyfain (переведено Aerie Team). Это моя попытка проиллюстрировать, как ввести в игру нового НПС используя WeiDU. Надеюсь, что все изложенное мной будет понятно тем, кто в первый раз использует эту программу. -------------------- * Порядок действий * -------------------- Вначале, назову то, что необходимо будет сделать для создания и ввода в игру персонажа. 1. Создать файл диалога (.dlg) для персонажа; 2. Создать файл персонажа (.cre) со всеми характеристиками и со снаряжением; 3. (по желанию) Написать скрипт (модель поведения) персонажа (.bcs); 4. Сделать установочный скрипт WeiDU (.tp2) для установки вашего персонажа на другие РС; ---------------------------- * Часть 1: .d и .dlg файлы * ---------------------------- Итак, первое, что необходимо - создать .dlg файл для персонажа. Это то, что позволить ему говорить с РС и, таким образом, позволит присоединиться к партии. Вначале создадим пустой .d файл, это можно сделать, переименовав пустой текстовый(.txt) файл. Я назвал свой файл J#Vondo.d. Первой строкой кода должно быть "BEGIN J#Vondo", что значит - что в процессе компиляции создастся файл с именем J#Vondo.dlg. * Вам не обязательно использовать преффикс J# в названии своего файла, это всего лишь условность, позволяющая отличать файлы написанные мной от других подобных. Код должен выглядеть примерно так: BEGIN J#Vondo //Основная часть нашего диалога должна иметь две части (States). Одна - первая встреча НПС с игроком, и другая - отклонив начальное предложение о присоединении, игрок вновь завязал диалог с НПС. Ниже описывается процесс создания первой части... IF ~NumTimesTalkedTo(0)~ THEN BEGIN FirstMeeting (Это триггер для первой части. ЕСЛИ ~Вондо еще не говорил с игроком~ ТО НАЧАТЬ (раздел) "FirstMeeting".) SAY ~Приветствую вас! Мое имя Вондо Справедливый.~ (Это начальная фраза диалога, ниже - все возможные варианты ответа игрока на эти слова.) IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Привет Вондо, ты не видел Айреникуса?~ GOTO InquireIrenicus IF ~~ THEN REPLY ~Привет.~ GOTO Greet IF ~Class(Player1,PALADIN)~ THEN REPLY ~Я вижу, что ты тоже паладин!~ GOTO BothPaladins IF ~~ THEN REPLY ~Уходи.~ GOTO GoAway (Ответ 1 доступен только, если игрок находится в первой или второй главе. Ответы 2 и 4 доступны всегда (IF ~~) и ответ 3 доступен только если, игрок - Паладин.) END (это заканчивает раздел диалогов.) Наш .d файл выглядит так: ------------------------------------------------------------------------------- BEGIN J#Vondo IF ~NumTimesTalkedTo(0)~ THEN BEGIN FirstMeeting SAY ~Приветствую вас ! Мое имя Вондо Справедливый.~ IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Привет Вондо, ты не видел Айреникуса?~ GOTO InquireIrenicus IF ~~ THEN REPLY ~Привет.~ GOTO Greet IF ~Class(Player1,PALADIN)~ THEN REPLY ~Я вижу, что ты тоже паладин!~ GOTO BothPaladins IF ~~ THEN REPLY ~Уходи.~ GOTO GoAway END ------------------------------------------------------------------------------- Теперь надо расширить диалог и написать реплики НПС на каждый из ответов, доступный игроку. IF ~~ THEN BEGIN InquireIrenicus (это после того, как игрок спросил о Айреникусе.) SAY ~Нет, но я могу помочь в поисках. Я паладин!~ (ответ Вондо) IF ~~ THEN REPLY ~Конечно. Присоединяйся.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT (Это вводит новый параметр, связанный с Вондо, который показывает принадлежность к партии. Команда "JoinParty()", как очевидно, присоединяет НПС :). EXIT заканчивает диалог.) IF ~~ THEN REPLY ~Нет, уходи.~ EXIT (Это тоже закончит диалог, только Вондо останется стоять на своем месте - ждать нашего следующего появления.) END Теперь - остаток модуля. IF ~~ THEN BEGIN Greet SAY ~Ну как, вам нужен паладин в ващей группе?~ IF ~~ THEN REPLY ~Вообще то, да.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, уходи.~ GOTO GoAway END IF ~~ THEN BEGIN BothPaladins SAY ~Я приветствую тебя, пусть боги продлят твои дни. Присоединяйся, и вместе мы сокрушим зло.~ IF ~~ THEN REPLY ~Звучит хорошо.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, уходи.~ GOTO GoAway END IF ~~ THEN BEGIN GoAway SAY ~Хорошо , я буду ждать вашего возвращения, чтобы мы могли вместе бить зло!~ IF ~~ THEN EXIT END ( Команда "GoAway" отражает ситуацию, когда для продолжения диалога игроку необходимо нажать Enter) Итак, все что нужно для первогй части,"Первой встречи" - готово. Теперь приступим ко второй части, когда игрок возвращается для разговора к Vondo. IF ~NumTimesTalkedToGT(0)~ THEN BEGIN ReturnDialogue SAY ~Я вижу вы вернулись.~ IF ~~ THEN REPLY ~Да, нам нужны твои способности.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Да, но нам не нужны твои способности.~ GOTO RefusedAgain END IF ~~ THEN BEGIN RefusedAgain SAY ~Вы опять отклонили мою просьбу. Не важно, я пока поразвлекаюсь с той магической штучкой, что недавно купил у гнома. Его звали Джон Джонсон или как то так.~ IF ~~ THEN EXIT END Итак, мы сделали то, с чего НПС будет начинать диалог. Теперь же приступим к другой части диалога - *P.dlg, когда НПС уходит или его удаляют из партии. Я имею в виду: Вондо присоединился к партии (используя J#Vondo.dlg), и автоматически назначилось 3 различных диалога из различных файлов (Pdialog.2da и Interdia.2da). Когда вы исключаете из команды, запускается *P.dlg файл и смотрит верно ли первая строчка. И так как мы начали новый раздел в .dlg файле, нам надо написать строчку ... BEGIN J#VondoP ...которая войдет в .2da файл. Остальная часть будет выглядеть примерно так: IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut (Эта переменная показывает, что присоединился ли Вондо к партии. Если она равна 1 - то он в данный момент в составе команды, и если его исключают - то запускается *P.dlg фай.) SAY ~Вы выгоняете меня?~ IF ~~ THEN REPLY ~Ой, это Аномен заслуживает исключения из команды, не ты. Извини.~ DO ~JoinParty()~ EXIT ( P.dlg автоматически исключает персонажа из партии, так что если вы желаете оставить его, то используйте команду JoinParty().) IF ~~ THEN REPLY ~Именно, нам не нужны твои способности.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT (Эта строчка ставит переменную "VondoJoined" равной 0, что значит, что он исключен из партии.) END Итого, эта часть должна выглядеть примерно так: ------------------------------------------------------------------------------------ IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut SAY ~Вы выгоняете меня?~ IF ~~ THEN REPLY ~Ой, это Аномен заслуживает исключения из команды, не ты. Извини.~ DO ~JoinParty()~ EXIT IF ~~ THEN REPLY ~Именно, нам не нужны твои способности.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT END ------------------------------------------------------------------------------------ Это все, что нужно для удаления персонажа из партии. Чтобы иметь возможность присоединить его вновь, после исключения, вам надо написать следующее: IF ~Global("VondoJoined","LOCALS",0)~ THEN BEGIN Rejoin SAY ~Хотите вновь видеть меня рядом?~ IF ~~ THEN REPLY ~Да, конечно.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, извини.~ EXIT END Все необходимые диалоги написаны. Конечная версия вашего .d файла могла бы выглядеть так ... ----------------------------------------------------------------------------------- BEGIN J#Vondo IF ~NumTimesTalkedTo(0)~ THEN BEGIN FirstMeeting SAY ~Приветствую вас ! Мое имя Вондо Справедливый.~ IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Привет Вондо, ты не видел Айреникуса?~ GOTO InquireIrenicus IF ~~ THEN REPLY ~Привет.~ GOTO Greet IF ~Class(Player1,PALADIN)~ THEN REPLY ~Я вижу, что ты тоже паладин!~ GOTO BothPaladins IF ~~ THEN REPLY ~Уходи.~ GOTO GoAway END IF ~~ THEN BEGIN InquireIrenicus SAY ~Нет, но я могу помочь в поисках. Я паладин!~ IF ~~ THEN REPLY ~Конечно. Присоединяйся~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, уходи.~ EXIT END IF ~~ THEN BEGIN Greet SAY ~Ну как, вам нужен паладин в ващей группе?~ IF ~~ THEN REPLY ~Вообще то, да.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, уходи.~ GOTO GoAway END IF ~~ THEN BEGIN BothPaladins SAY ~Я приветствую тебя, пусть боги продлят твои дни. Присоединяйся, и вместе мы сокрушим зло.~ IF ~~ THEN REPLY ~Звучит хорошо.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, уходи.~ GOTO GoAway END IF ~~ THEN BEGIN GoAway SAY ~Хорошо , я буду ждать вашего возвращения, чтобы мы могли вместе бить зло!~ IF ~~ THEN EXIT END IF ~NumTimesTalkedToGT(0)~ THEN BEGIN ReturnDialogue SAY ~Я вижу вы вернулись.~ IF ~~ THEN REPLY ~Да, нам нужны твои способности.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Да, но нам не нужны твои способности.~ GOTO RefusedAgain END IF ~~ THEN BEGIN RefusedAgain SAY ~Вы опять отклонили мою просьбу. Не важно, я пока поразвлекаюсь с той магической штучкой, что недавно купил у гнома. Его звали Джон Джонсон или как то так.~ IF ~~ THEN EXIT END BEGIN J#VondoP IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut SAY ~Вы выгоняете меня?~ IF ~~ THEN REPLY ~Ой, это Аномен заслуживает исключения из команды, не ты. Извини.~ DO ~JoinParty()~ EXIT IF ~~ THEN REPLY ~Именно, нам не нужны твои способности.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT END IF ~Global("VondoJoined","LOCALS",0)~ THEN BEGIN Rejoin SAY ~Хотите вновь видеть меня рядом?~ IF ~~ THEN REPLY ~Да, конечно.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Нет, извини.~ EXIT END ----------------------------------------------------------------------------------- На первый взгляд это кажется очень сложным, но в действительности, это не так. Достаточно сделать один раз, и все покажется вам простым и понятным. Что ж, мы только что закончили часть 1 нашего пособия. Осталось еще немного, так что не волнуйтесь. :) ------------------------------------- * Часть 2: Создание файла персонажа * ------------------------------------- Это очень простая часть. Просто запустите многопользовательскую игру в BG 2 (не нужно использовать Интернет, простой сетевой игры с одним игроком будет вполне достаточно), и создайте персонажа. Поставьте ему желаемые параметры, опыт, экипировку и прочее (это можно сделать с помощью редакторов, Shadow Keeper например), а затем с помощью NearInfinity перекиньте файл персонажа из формата .chr в формат .cre. Теперь, так как он в .cre формате, то можно добавить переменные смерти (Death Variable), файл диалогов, скрипты (если захотите), изменить имя. Это все достаточно просто, поэтому я не буду останавливаться на этом. Просто сохраните все изменения и все. ------------------------------ * Часть 3: Создание скриптов * ------------------------------ Возможно самая короткая часть. Если вы хотите, что НПС подошел в вашему персонажу как только увидит в первый раз, напишите такой скрипт: IF See([PC]) NumTimesTalkedTo(0) THEN RESPONSE #100 Dialogue(Nearest([PC])) END Скомпилируйте его с помощью любого компилятора на ваш выбор (NearInfinity тоже подойдет), сохраните и добавьте его к .cre файлу НПС. Теперь разместим НПС на карте. Для этого надо вновь написать небольшой скрипт. К примеру, пусть он будет стоять в Правительственном районе (Government District), тогда сделаем файл J#AR1000.bcs, в котором будет следующее. IF Global("J#VondoExists","AR1000",0) THEN RESPONSE #100 SetGlobal("J#VondoExists","AR1000",1) CreateCreature("J#Vondo",[9137.2046],3) END Наш скриптик будет добавлен в установочный набор, и автоматически допишется в AR1000.bcs с помощью WeiDU при установке. Ниже все будет разьяснено все более детально. --------------------------- * Часть 4: The WeiDU .TP2 * --------------------------- Большая часть всего этого приведена в README-WeiDU.txt, поэтому я просто выпишу .tp2 файл для НПС. ---------------------------------------------------------------------------------- BACKUP ~VondoTheNPC\backup~ AUTHOR ~ghreyfain@forgottenwars.net~ BEGIN ~Vondo the NPC for BG2:ToB~ // копирует .cre файл для НПС COPY ~VondoTheNPC\J#Vondo.cre~ ~override\J#Vondo.cre~ SAY NAME1 ~Vondo~ SAY NAME2 ~Vondo~ SAY SELECT_COMMON4 ~Blah blah blah.~ [Vondo1] // [Vondo1] - название .wav файла, сопоставленного данному действию SAY SELECT_COMMON5 ~Give the word.~ [Vondo2] SAY SELECT_COMMON6 ~Point the way.~ [Vondo3] SAY SELECT_ACTION1 ~I'm on the job.~ [Vondo4] SAY SELECT_ACTION2 ~As you wish.~ [Vondo5] // сообщает WeiDU о компиляции .d файла COMPILE ~VondoTheNPC\J#Vondo.d~ USING ~~ // копирует файлы скриптов в папку ...\override COPY ~VondoTheNPC\J#Vondo.bcs~ ~override\J#vondo.bcs~ // добавит то, что мы написали в J#AR1000.bcs в конец AR1000.bcs EXTEND_BOTTOM ~Ar1000.bcs~ ~VondoTheNPC\j#ar1000.bcs~ // некоторые .2DA файлы, необходимые для персонажа APPEND ~pdialog.2da~ ~J#Vondo J#VondoP J#VondoJ J#VondoD~ UNLESS ~J#Vondo~ UNLESS ~25POST~ APPEND ~pdialog.2da~ ~J#Vondo J#VondoP J#VondoJ J#VondoD = J#Von25P J#Von25J J#Von25D J#Vond25~ UNLESS ~J#Vondo~ IF ~25POST~ ------------------------------------------------------------------------- Это все, надеюсь, что все изложенное мной было понятно. Приятного вам творчества. Вы можете послать все ваши вопросы автору на Ghreyfain@forgottenwars.net, или посетить "WeiDU site" http://www.cs.berkeley.edu/~weimer/bgate/ Ваши вопросы и пожелания по переводу можете направлять по адресу alina@aerie.ru или посетите наш сайт www.aerie.ru Aerie Team