Создание диалогов



Содержание:

1. Минимальные знания, необходимые для создания диалога.
2. Различные способы вызова диалога.
3. Приложения, необходимые для грамотного написания диалогов.
3.1. InsideUO by Black Squad.
3.2. UOHueEditor by Alazane.
4. Общая структура диалога.
5. Разбор примера.

1. Минимальные знания, необходимые для создания диалога.

Для того что бы написать любой диалог вы должны обладать необходимым минимумом знаний: должны уметь определять предметы и NPC (Not Player Character) и иметь представление о работе с Триггерами (triggers). Этого вполне достаточно, чтобы прочитав эту статью суметь написать диалог, который будет открываться без ошибок и иметь вид, который вы ему зададите. Остальное зависит только от вас...

2. Различные способы вызова диалога.

Главное, что нужно помнить при вызове диалога, это то, что диалог всегда вызывается после триггера.

Чтобы вызвать диалог вам необходимо воспользоваться процедурой вызова диалога 'DIALOG' . Например:

ON=@EQUIP // или любой другой триггер
SRC.DIALOG d_my_dialog

Если человек оденет предмет, на котором висит этот триггер, то у него откроется диалог d_my_dialog. Так же возможны и следующие комбинации:

ON=@DCLICK // или любой другой триггер
if (> != 5)
SRC.DIALOG d_my_dialog
endif

Или так:
.
.
.
[Function test]
SRC.DIALOG d_my_dialog
.
.
.
ON=@ENTER // или любой другой триггер
SRC.TEST

Это самые распространенные варианты вызова диалогов. Но не единственные. Если вы хотите вызвать как то по другому - пробуйте.

3. Приложения, необходимые для грамотного написания диалогов.

3.1. InsideUO by Black Squad.

Эта программа позволяет просматривать вшитую в *.mul файлы информацию, такую как анимация, звуки и рисунки. При написании диалогов нам понадобятся gump'ы и тайлы (gump'ами называются вшитые в mul рисунки, отображаемые на портрете или на других диалогах. Тайлами называют рисунки предметов, как они выглядят на земле). InsideUO программа бесплатная и скачать вы ее можете с официального сайта (т.е. отсюда: http://dkbush.cablenet-va.com/alazane/insideuo.html)

После запуска программы в некоторых случаях вам придется ее настроить (поздние версии настраиваются автоматически). Для этого выберете пункт Option в меню File и в открывшемся окне, там где нужно пропишите пути к вашим *.mul файлам. Теперь в столбце слева вы увидите ярлычки: Animation, ArtWork, Fonts, Gumps, Map, Multi, Sound, Texturemap.

Пока будем пользоваться только разделом Gumps (Хотя чуть-чуть затронем и Artwork). Щелкните по иконке, чтобы перейти к разделу. Вы увидите список адрессов, где каждому адрессу будет соответствовать определенная картинка. В дальнейшем номером гампа я буду называть десятичное представление адресса. Заметте - все адресса записаны в шестнадцатеричном виде - т.е. если картинка имеет адресс например 100, то номер гампа будет 256. Чтобы перевести значения из HEX в DEC используйте инженерный вид стандартного калькулятора Windows'a.

3.2. UOHueEditor by Alazane.

Эта программа позволяет просматривать и изменять цвета, которые хранятся в файле hues.mul и которыми пользуется ваш клиент. Нам она понадобится только для того, чтобы узнавать номер цвета, которым будет написан текст нашего диалога. Программа является бесплатной, скачать можно с q1.ru.

Откройте программу. Выберете Пункт Open меню File. Вам необходимо открыть файл hues.mul, который находится в папке вашего клиента. Теперь вы можете увидеть список адрессов, где каждому значению адресса соответствует близкая группа цветов, из которого состоит цвет в игре. Адресс записывается двумя способами - сначала идет адресс в десятичной системе, а далее, в скобках в шестнадцатиричной. В дальнейшем номером цвета я буду называть адресс в десятичной системе, соотвтствующий группе цветов.

4. Общая структура диалога.

Итак общая структура диалога будет иметь следующий вид:

[DIALOG d_my_dialog]
... Тут вид диалога задается. Раздел кода ...

[DIALOG d_my_dialog TEXT]
... Тут текст идет, который в диалоге используется. Раздел данных ...

[DIALOG d_my_dialog BUTTON]
... Тут идет описание действий после нажатия на кнопки (если есть)...

Любой диалог начинается со строки [DIALOG имя диалога]. Эта строка говорит интепертатору, что дальнейший код (до следующего определения) будет относится к диалогу. Практически во всех скриптах диалоги начинаются на 'd_' - это не обязательно, но грамотно. Учтите это при написании собственных диалогов.

Далее идет код, описывающий диалог. Можно использовать следующее:

noclose
Окно нельзя закрыть правой кнопкой мыши.

nomove
Окно нельзя перемещать по экрану.

nodispose
Не используется. Хотя может быть встречено в скриптах.

text
Эта строка описывает расположение и параметры текста в диалоге; <х> и <у> - координаты, по которым будет располагаться текст; <сolor> - цвет текста; сам текст будет специальным образом описан ниже, а параметр - это номер строки, в которой ниже располагается текст; строки считаются начиная с первой строки содержащей текст (в разделе данных) и эта строка имеет номер 0.

,
Этой строкой мы задаем положение окна нашего меню (понятие "окно меню" включает в себя также кнопки и текст);

resizepic
Это основная строка; тут мы указываем вид окна, его положение и размер; первые два значения - - показывают расположение окна - начиная с какого места надо начать прорисовку этого окна (в отличие от предидущей строки в данном случае имеется в виду только графическое окно меню, то есть ни кнопки, ни текст не входят в этот параметр); - это основной параметр - задает вид окна - начиная с момента будет взято еще 9 следующих значений гампа, которые и должны исчерпывать прорисовку окна; номер нужного вам значения можно найти через программу InsideUO; - длинна и высота окна.

button
Эта строка описывает расположение и параметры кнопки в диалоге. - координаты кнопки; - номер гампа зажатой кнопки; - номер гампа отжатой кнопки; - эффект от нажатия (0 - переключение страниц 1 - действия в ONBUTTON=) ; номер страницы диалога (лично я не рекомендую пользоваться страницами, но это на ваш вкус); - это "номер" кнопки (теперь может быть использован триггер ON=, но об этом после).

page
Страница диалога (см. пример).

group
Группа диалога (не используется).

gumppic
Вставляет картинку , по координатам .

tilepic
Вставляет картинку, но не из раздела Gump в InsideUO, а из раздела Artwork; - координаты; - номер картинки в десятичной системе.

radio
"Кружочек с точкой, можно выделить одну из нескольких"; - координаты; номер гампа, когда не выделенно; - номер гампа, когда выделенно; - состояние (выбрано/невыбрано); - это "номер" кружка - теперь при проверке выбран ли этот пункт надо будет пользоваться функцией ARGCHK[index] (Смотри пример).

checkbox
"Квадратик с "галочкой", причем можно выделять несколько одновременно"; - координаты; номер гампа, когда не выбрано; номер гампа, когда выбрано; выбрано/не выбрано; - это "номер" квадратика - теперь при проверке выбран ли этот пункт надо будет пользоваться функцией ARGCHK[index] (См.пример).

textentry
Выводит текст, на который указывает , позволяет его изменять: Строка, куда выводится открывается отдельно через resizepic. - координаты; - ширина и высота гампа; - цвет текста; - это "номер" строки; ARGTXT[] возвращает значение, введенное в строку (Смотри пример).

croppedtext
"Обрезанный текст" - если текст не помещается по ширине в указанные габариты, то что не вместилось заменяется на многоточие (...); - координаты "квадрата" в которым ограничен текст; - это номер строки, в которой ниже располагается текст; строки считаются начиная с первой строки содержащей текст (в разделе данных) и эта строка имеет номер 0.

group
Группа диалога - как правило используется для объединения radio.

htmlgump
- координаты; - ширина, высота; - флаг, если 0, фон прозрачный, если 1 - нет; - флаг, 1 - Scrollbar есть, 0 - нету; - номер строки минус 1 из [DIALOG xxx TEXT] (1-ая строка - 0, 2-ая - 1 и т.д.)

Выводит некое подобие ХТМЛ страницы (клиент понимает некоторые тэги, правда символы < и > в сфере зарезервированы, так что в текст их вставлять придётся каким-нибудь извращённым способом.

xmfhtmlgump 0
Cинтаксис тот-же самый, но берётся из стандартных ресурсов клиента (файлы типа cliloc00.enu, . - номера начинается с 1000000.

Далее идет следующее определение: [DIALOG имя диалога TEXT], после которого идут только текстовые данные. Например если в разделе кода у вас был описан текст:

text 50 50 1 1
text 10 10 1 0
text 100 100 1 1

А сразу после [DIALOG имя диалога TEXT] будет написано:

000
111

То по координатам 10 10 у вас будет располагаться текст 000, а по координатам 50 50 и 100 100 текст 111 черным цветом.

Также после [DIALOG имя диалога TEXT] вы можете использывать конструкции вроде:

eval< >


ВНИМАНИЕ!!! Если вы указали ссылку на сторку в разделе кода, а саму строку написать забыли, то попытка вызова диалога приведет к зависанию клиента!!!

Далее идет следующее определение: [DIALOG имя диалога BUTTON], после которого идут действия, происходящие после нажатия кнопки. Например в разделе кода у вас были описаны кнопки:
button 20 77 1209 1210 1 0 1
button 20 117 1209 1210 1 0 2
button 20 157 1209 1210 1 0 1

А потом, после [DIALOG имя диалога BUTTON], будет написано:

ONBUTTON=1
SRC.SYSMESSGE TEST1

ONBUTTON=2
SRC.SYSMESSGE TEST2

После вызова диалога появятся три кнопки: при нажатии на верхнюю окно диалога пропадет, а в левом нижнем углу появится надпись TEST1, при нажатии на среднюю TEST2, при нажатии на нижнюю снова TEST1.

Запомните, кнопка с индексом 0 - всегда закрывает диалог. Если использовать ONBUTTON=0, то действия будут выполняться при закрытии диалога.

ВНИМАНИЕ!!! После нажатия на кнопку окно диалога пропадает! Если вы хотите, чтоб оно остальсь используйте комбинацию:

ONBUTTON= // где - номер кнопки
SRC.DIALOG имя диалога

Вот и все...

5. Разбор примера.

Вот мы и подошли к практике. Рассмотрим пример, который использует большую часть возможностей диалога.

[DIALOG d_test]
nodispose // Не работающая команда; но если noclose/nomove стоят до нее, то не работают
noclose // Теперь окно нельзя закрыть правой кнопкой мыши
nomove // Теперь окно не будет двигаться
50,50 // Диалог будет начинаться с этих координат
page 0 // Начало главной страницы (все, что описано на главной странице - сохраняется при перескоке на другую)
resizepic 25 0 2600 500 220 // Открываетм картинку главного окна (см. рисунок)
resizepic 45 60 5100 450 25 // Открываем полоску (см. рисунок) для красоты
resizepic 145 170 3000 270 22 // Открываем полоску для textentry (на рисунке в ней текст)
gumppic 257 125 2642 // Открываем картинку фиговины (кнопки?) из гампов
tilepic 255 70 1991 // Открываем картинку лестницы из artwork'a

button 80 138 242 241 1 0 0 // Кнопка Cansel
button 410 138 247 248 1 0 1 // Кнопка Okey
button 115 63 5209 5003 0 1 2 // Кнопка переключения страницы
button 455 63 5209 5003 0 2 3 // Кнопка переключения страницы
textentry 147 172 253 25 0 0 3 // Курсор для ввода текста

page 1 // Начало другой страницы
radio 100 100 210 211 0 501 // Radio с параметрами
radio 420 100 210 211 0 502 // Radio с параметрами

page 2 // Начало другой страницы
checkbox 150 100 210 211 0 504 // Сheckbox с параметрами
checkbox 370 100 210 211 0 505 // Сheckbox с параметрами

[DIALOG d_test TEXT] // Начало раздела данных!
DIALOG EXAMPLE FROM Q1.RU // Заголовок нашего окна, с параметрами из первого text'a
Radio // Название первой страницы (не путать с главной!)
Checkbox // Название второй страницы
Test 'textentry' // Эту надпись можно будем менять через textentry
[DIALOG d_test BUTTON] // Начало исполнительного раздела
on=1 // Если нажата кнопка с последним параметром 1 (и c action не 0)
if () // Если галочка стоит на первом радио, то
SRC.SYSMESSAGE Radio 1 // Выводит сообщение Radio 1
DIALOG d_test BUTTON // И вновь открывает диалог!
elif () // Если галочка стоит на втором радио, то
SRC.SYSMESSAGE Radio 2 // Выводит сообщение Radio 1, но диалог не открывает!
elif () // Если галочка стоит на первом checkbox'e (что на второй странице), то
if () // Если галочка стоит также и на втором checkbox'e, то
SRC.SYSMESSAGE OBA CHECKBOXA AND in textentry // выведет это сообщение
else // если на втором checkbox'e не стоит - то выведет вот это сообщение:
SRC.SYSMESSAGE Checkbox1 and in textentry // - это то что у нас в строке textentry (т.е. если вы изменили textentry, то эта строка выведет то что там написано!)
endif // Конец диалога

Пример совершенно надуманный - он открывает диалог, состоящий из трех страниц. Что бы понять что он делает смотрите коментарии к коду.
Hosted by uCoz