----------------------
				**  Как создать НПС **
				----------------------

			небольшое введение от 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