|
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
|
|
|
|