» TeamX (Архив Форума)«


Форум TeamX » Исследования » Say-режим

Переход по темам
<< Пред. След. >>
Единственная страница этой темы

 
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

Say-режим.

[Для пущей целостности начало перенесно из "Наработок".]

Что это вообще такое.

В Фоле есть набор команд, начинающихся с say, которые не описаны в API и не использованы в игре. Например:
saystart
saysend
sayoption
sayreply
и т.д.

После не слишком длительной целенаправленной возни, мне удалось с ними разобраться. Итак, что это такое. Это - режим организации диалога. да-да, такого же, что вызывается с помощью start_gdialog, но куда как более гибкого. А именно:
1. мы можем задавать координаты, размеры и бэкграунд reply- и option-окон (потенциально возможно разные диалоги - с компами, с людьми, с предметами - оформлять по разному)
2. мы можем задавать шрифт, цвет шрифта, подсветку при наведении, выравнивание, отступы
3. для организации простых диалоговых веток (без if-проверок, установок флагов и т.п.) не требуется создавать отдельные ноды
4. самое главное. Этот режим можно инициализировать в любой момент - во время боя, из инвентаря etc. После его использования инвентарь *обновляется*. Т.е. можно сделать, например, свою карту, которая при использовании из инвентаря вызовет say-режим, а по его окончании - исчезнет из инвентаря. Проблема, считаемая нерешимой.

Время при переходе в say-режим останавливается (как с инвентарём/диалогом). Минус - исчезает курсор :-( Обратно его можно вызвать переместив мышку на display-экранчик. Он сменится на скроллинг-курсор и появится обратно.

Как скриптится.

Есть два типа процедур - подготовительные и управляющие. К подоготовительным относятся, например:

sayreplywindow(x,y,width,height,"path/to/pcx_file.pcx");
Задаёт координаты, размер и картинку окна. Путь - относительно Data. Т.е., создаём data/pcx, кладём туда pcx-картинку и пишем путь в скрипте.

setfont(num);
num - номер шрифта (1-5 с пропусками, см. корень master.dat)

sayborder(x,y);
Отступы для выводимого в окно текста - по вертикали и горизонтали - с обеих сторон.

Ладно, пока хватит, потом раскажу об остальных.

Теперь про управляющие. Вначале надо перейти в режим командой saystart. После этого вплоть до saysend  
sayreply(str node_name, str text);
Второй параметр - выводимый текст (окно создаётся автоматом в соответствии с параметрами, заданными sayreplywindow).
Первый - это имя этого "нода". Потом его можно будет вызывать наравне с процедурами из sayoption.

sayoption(str text,str/proc node);
Выводит вариант ответа в option-окно (параметры задаются в sayoptionwindow, аналогично reply).
Внимание! Если ответ на фразу один, то option окно не создаётся и ответ не выводится. Для продолжения диалога при этом надо кликнуть на reply-окно. Причём, результат будет браться из того самого написанного, но не выводящегося на экран sayoption.
Первый - текст. Второй - имя нода из sayreply (в кавычках) *или* имя вызываемой процедуры (без кавычек).

Простой пример:
-----------------------------
procedure start begin end

procedure critter_p_proc begin
end

procedure talk_p_proc begin
 sayreplywindow(20,10,200,100,"111.pcx");
 sayoptionwindow(230,10,200,100,"111.pcx");
 setfont(5);
 sayborder(10,10);

 saystart;
   sayreply("NodeHi","Hello");
     sayoption("Hi. How it goes?","NodeHow");
     sayoption("Bye","NodeClose");
   sayreply("NodeHow","Fine, thanks");
     sayoption("Well, gotta get moving.","NodeClose");
     sayoption("Bye","NodeClose");
   sayreply("NodeClose","Bye");
     sayoption("Bye","Empty");
 sayend;
end
-----------------------------

Как видите, никаких предобъявлений, обилия процедур и т.п. Процедуры понадобятся, если захотите организовать выдачу вещей, установку вар и т.п. if-ы работают.

Компилируем, привязываем, смотрим. Можете пока pcx-ину прикрутить, поиграться с расположением окон, проверить работу с отдельными процедурами и т.п.

---------------------------------------------------------------------------------------------------------------
Сейчас поглядим на работу с процедурами:
-----------------------------
procedure start begin end

procedure critter_p_proc begin
end

procedure NodeExp begin
 give_exp_points(1000);
 //sayquit;
 saygotoreply("NodeGoAway");
end

procedure NodeMoney begin
 item_caps_adjust(dude_obj,1000);
 saygotoreply("NodeGoAway");
end


procedure talk_p_proc begin
 sayreplywindow(20,10,200,100,"111.pcx");
 sayoptionwindow(230,10,200,100,"111.pcx");
 setfont(5);
 sayborder(10,10);

 saystart;
 
   sayreply("NodeWhat","What do you want?");
     sayoption("Exp",NodeExp);
     sayoption("Money",NodeMoney);
     sayoption("Nothing","NodeClose");
   
   sayreply("NodeGoAway","Now go away.");
     sayoption("Bye","Empty");
     
   sayreply("NodeClose","Bye");
     sayoption("Bye","Empty");
 sayend;
end
-----------------------------

Всё просто - вместо имён SayReply в SayOption пишется имя процедуры. Процедура вызывается. А вот дальше...

Если мы просто напишем give_exp_points(1000); и больше ничего, то по окончании процедуры произойдёт автоматический выход из say-режима.

Если напишем просто sayquit, то вызов произойдёт .. дважды. То есть, say-режим закончится и при следущей попыткы его вызвать произойдёт моментальной выход. То есть есть какой-то quit-флаг, который устанавливается при вызове sayquit. Если этот флаг установлен, то при вызове любой say-команды произойдёт выход и флаг сбросится. Чтобы убедится в этом, попробуйте раскомментить sayquit. Произойдёт выход - но одиночный. Т.е. мы поставили quit-флаг, вызвали say-команду и произошёл выход.

До того, как рассказать о saygotoreply, надо сказать о том, как say-команды парсятся.

Как вы уже заметили, в say-режиме можно ссылаться на reply-строки, которые ещё не объявлены:
--------------------------------
<...>
sayreply("NodeWhat","What do you want?");
 <...>
 sayoption("Nothing","NodeClose");
<...>  
sayreply("NodeClose","Bye");
 sayoption("Bye","Empty");
<...>
--------------------------------

Как видно, "NodeClose" объявлен  *ниже* первой ссылки на него в  sayoption("Nothing","NodeClose"). О чём это свидетельствует? О том, что say-режим не читается последовательно, строчка за строчкой. Читается сразу весь say-блок целиком и запоминаются имена reply-строк. Минус в том, что проверку параметров компилятор не осуществляет. Если вы сошлётесь на несуществующую процедуру/sayreply, компилятор вам ничего не скажет. А say-режим просто завершится при некоректном вызове. Убедиться в том, что читается say-блок целиком, можно добавив несколько тестовых display_msg в различные места блока. Все они вызовутся друг за другом, как только парсер скрипта дойдёт до saystart.

А плюсом является как раз saygotoreply. Эта команда вызывает sayreply, переданную в качестве параметра. Причём, как видно из кода, вызываемый sayreply-нод может быть и в другой процедуре. saygotoreply работает и с процедурами. Такое изменение кода сработает:
--------------------------------
<...>
procedure NodeMoney begin
 item_caps_adjust(dude_obj,1000);
 saygotoreply(NodeExp);
end
<...>
--------------------------------

В say-режиме работают if-условия:
--------------------------------
variable once;

<...>

procedure NodeExp begin
 once:=1;
 <...>
end

procedure NodeMoney begin
 once:=1;
 <...>
end


procedure talk_p_proc begin
 <...>
 saystart;
 if not once then begin
   sayreply("NodeWhat","What do you want?");
     <...>
 end else begin
   sayreply("NodeNothing","I have nothing more to spare with you");
    sayoption("Nothing","Empty");
 end
 <...>
end
--------------------------------

Пока всё. Устал писать :-) Ждите следующего поста.

[Оффтопик]
Да, если вас интересует тема, о которой я пишу (не конкретно say-режим, любая рассматриваемая тема) - ответьте чего. Хотя бы банальное "круто"/"ни к чему". Чтобы я мог оценить аудиторию, которой интересна та или иная тема и не распыляться сразу на пол-десятка тем, а уделять больше внимания исследованию и описанию того, что вам интересно. А то пишу и не знаю - читает ли кто? Интересно ли кому? Про say-режим уже знаю - интересно :-) А остальное? Если не хотите засорять тему - напишите личкой. Не поленитесь :-)

И про say-режим. Если есть время - поковыряйте, пожалуйста команды saystartpos(1), saygetlastpos(1), sayscrollup(6), sayscrolldown(6), refreshmouse(1), setglobalmousefunc(4), mouseshape(3). В скобках - число параметров.
[Оффтопик]

Отправлено: 7:07 - 28 Янв., 2005
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

Круто! Но, имхо, всё-таки малополезно. :) Однако, как собиратель инфы о скриптовых функциях, интересуюсь ;).

Вот, кстати, списочек функций say-режима:
saystartpos
saystart
sayreply
saygotoreply
sayreplytitle
sayoption
sayend
sayquit
saymessage
sayreplyflags
sayoptionflags
sayreplywindow
sayoptionwindow
sayborder
sayscrollup
sayscrolldown
saysetspacing
sayoptioncolor
sayreplycolor
sayrestart
saygetlastpos
saymessagetimeout

Ждут исследователей ;). У меня на интерфейсные и специальные функции последние силы ушли :). Точнее, последнее время :).

Отправлено: 10:45 - 28 Янв., 2005
ABel
Партизан

Откуда: Krasnoyarsk
Регистрация: Дек. 2002

Всего: 307 сообщений

Круто!
Может соберётесь с мыслями, да запихнёте всё это добро в FOP, вместе с музыкальными опкодами?

-----
Семь раз об дверь, один - об рельс.

Отправлено: 11:55 - 4 Фев., 2005
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

Сейчас собираюсь обновить доку по функциям. Может, найду время и залезу в ФОП...

Отправлено: 12:01 - 4 Фев., 2005
 

Переход по темам
<< Пред. След. >>
Единственная страница этой темы


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com