|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Цитата:
Как узнать, присутствует ли в *.msg файле реплика с заданным номером?
if message_str(file_num, str_num)="Error" then begin end else begin end (Добавление от 5:28 - 23 Ноября, 2004.) 2Alan Killenger: 1) Пошагового выполнения нет. Значения переменных обычно вывожу display_msg'ами из look_at и description . 2) Не совсем понял твой комментарий. anim_busy это всего лишь проверка состояния анимации. А для того, чтобы криттер подходил к чузену одной командой не обойдёшся. Простейший пример: procedure citter_p_proc begin if (tile_distance_objs( self_obj, dude_obj ) <= 25) and (tile_distance_objs( self_obj, dude_obj ) >5) and (local_var(0)==0) then animate_run_to_tile(tile_num(dude_obj)); if (tile_distance_objs( self_obj, dude_obj ) <= 5) and (local_var(0)==0) then call Node001; end procedure Node001 begin set_local_var(0, 1); end В этом примере, как только чузен подойдет к криттеру, в скрипте которого данная процедура, на 25 тайлов - криттер начнёт бежать к чузену, пока не достигнет расстояния в 5 тайлов, а уже оттуда начнёт разговор. local_var используется, чтобы процесс "криттер гоняется за чузеном" выполнялся всего один раз.
----- Scio me nihil scire
|
Отправлено: 5:10 - 23 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Исчерпывающий ответ, Mynah. Насколько я начал понимать, универсальных алгоритмов взаимодействия событий и анимации нет? anim_busy - это как раз то, что мне нужно, задача была немного другая. Ее решил, тебе все равно спасибо (приятно знать, что тебя не игнорируют ).
Цитата: if message_str(file_num, str_num)=="Error" then begin end else begin end
Проверил, работает. Ооохх, блаженство . Уж коли я сюда отвечаю, да и тема подходящая.. мне вдруг тоже чертовски интересны стали последние разработки в области диалогов.
Цитата: Кто-то заинтересовался? Если наберётся 3-5 желающих, то можно парсер довести до ума и использовать в работе.
Еще один есть . P.S. Как работает функция self_can_hear_dude? В описании сказано, что она должна принимать значение "истина" в том случае, когда один объект может слышать другой. На самом деле мой криттер стоял вплотную к чузену и все равно условие не срабатывало (когда я поставил self_can_see_dude все стало нормально).
----- hit me, nail me, make me god
|
Отправлено: 21:33 - 23 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Расчёт видимости и (особенно) слышимости в Фоле очень забагован. А про слышимость - я вообще не уверен, что она работает.
|
Отправлено: 7:02 - 24 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
друзья вот такой вопрос: накатал простейший скрипт подключил его в Фоле1, и запустил Фол в режиме отладки чтобы посмотреть чо да как через LogFileDebug.bat в итого в разговоре окно диалога не закрывается и ничего тама не пишется. В логе отладчика пишется следующее: Error during execution: Stack underflow short. Current script: scripts\Zeca.int, procedure Zeca05 Scripts: [Game Reset] помогите чем погите!от чего это? Сорри.нашел проблему сам.Собственная ошибка при написании SayWOAnswer(XXX,YYY,ZZZ) забыл написать туда ZZZ. (Отредактировал(а) pal - 13:52 - 24 Ноября, 2004)
|
Отправлено: 10:34 - 24 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Цитата: Как работает функция self_can_hear_dude?
Никак. Убил два часа на тестирование. Криттер тебя не слышит когда ты: ходишь/бегаешь/воруешь/ремонтируешь/стреляешь/разговариваешь рядом с ним. Не слышит флоатеры других криттеров. Вобщем глухие они все... Зато меня "услышали", когда я был на другом конце карты... Просто шёл к зоне выхода. Вывод: функция не работает, использовать нельзя.
----- Scio me nihil scire
|
Отправлено: 5:07 - 25 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
Вот такой вопрос: я получил через GetObjectID(SlotX(Player,1); номер ИД вещи ктотрую держит Чузен. как мне поместить в диалог название этой вещи (ну т.е. выбрать по № ИД через pro_item.msg) ,ведь pro_item.msg в script.lst нету. ??? если можно то показать кусок кода в ipp формате. Спасибо Ане виртуально конечно за то что нашел её подсказку по этому вопросу в FOP базе: write ('Object Name: ' + GetName (objAddr)); { показываем название объекта } Tnx ! (Отредактировал(а) pal - 14:59 - 26 Ноября, 2004)
|
Отправлено: 12:30 - 26 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
<здесь был бред> Надо меньше пить :-/ Перепутал стил со сником. (Отредактировал(а) Mynah - 22:03 - 27 Ноября, 2004)
----- Scio me nihil scire
|
Отправлено: 17:07 - 27 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Можно ли создать общедоступный всем скриптам *.msg файл, не привязанный к какому-либо, пусть даже тождественному, скрипту? Задумал я, чтобы мой персонаж песни распевал (песни для глухонемых наверное ) по технологии Raven'а. Беды нет, если песня одна и доподлинно существует, а если нет? Нет, на самом длеле, сливать 4 песенки в сплошной ряд реплик - это, мягко говоря, неудобно; между песенками должны быть пустоты, думаю очевидно. Как тогда реализовать скрипт? Можно было бы это сделать как в Pascal'е - findnext, но неизвестно количество песенок и неизвестен номер последней реплики. Так или иначе, натыкаешься на мысль о том, чтобы вводить тэг конца *.msg'шки. Кто-нибудь сталкивался с подобным? Ламмерский вопрос, возможно ли полностью заменить какую-либо GVAR'у какой-либо экспортируемой переменной (если нет разницы, то зачем платить больше )?
----- hit me, nail me, make me god
|
Отправлено: 2:25 - 28 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
2Alan Killenger: Тебе сюда. И читать очень-очень внимательно. Найдёшь ответы на все вопросы про *.msg.
Цитата:
возможно ли полностью заменить какую-либо GVAR'у какой-либо экспортируемой переменной
Нет. Экспортные переменные работают только во время работы скрипта, из которого экспортируются. Хотя.. можешь экспортировать из скрипта obj_dude, записывая значение в лвару, при изменениях. Будет импровизированная замена гвары. Но это, имхо, изврат :) (Отредактировал(а) Mynah - 5:48 - 28 Ноября, 2004)
----- Scio me nihil scire
|
Отправлено: 3:46 - 28 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Задача: у нас есть некоторое кол-во "песен" в мсгшке (от 0 до бесконечности). Мы знаем (уже) номер мсгшки. Надо чтобы при первом talk НПС "пел" первую (по порядку выводил флоаетер-строчки из блока с промежутком в секунду), при втором - вторую и т.д. Когда песни кончатся - опять переходим на первую. Решение: Во-первых договоримся о формате мсг. Нулевая строчка - идентификатор. Все разделы (в нашем случае идентификаторы песен) могут начинаться только со строчек, кратных 10-ти (10, 20, 30 ...). МСГ-шка. ------------------------------- {0}{}{[Songs file]} {10}{}{[Song]} {11}{}{La-la-la} {12}{}{Lu-lu-u} <...> {20}{}{[Song]} <...> {60}{}{[Song]} <...> {100}{}{[End file]} ------------------------------- Скрипт:
Код:
variable msg_num; //известный номер скрипта/мсг variable num_of_songs; //переменная под число песен variable last_song; //последняя исполненная песня <...> //считаем число песен procedure get_num_of_songs begin variable i:=10; //номер строки while i<2000 and message_str(msg_num,i)!="[End file]" do begin //ищем до лимита либо метки if message_str(msg_num,1)=="[Song]" then num_of_songs+=1; //считаем число разделов i+=10; end if num_of_songs==0 then num_of_songs:=-1; //если разделов нет, ставим число в -1 end procedure sing(variable song) begin variable i:=10; variable cur_song; variable start_song; if not num_of_songs then call get_num_of_songs; //если песен ноль, значит мы их ещё не считали if num_of_songs==-1 then begin //для отладки display_msg("There is no songs in msg #"+msg_num); return -1; end if song>num_of_song then begin //для отладки display_msg("There is only "+num_of_songs+" songs"); display_msg("Try to get:" + song); return -1; end while cur_song!=song do begin //ищем нужный раздел. Ограничители здесь уже не нужны if message_str(msg_num,i)=="[Song]" then cur_song+=1; i+=10; end last_song:=song; //запоминаем последнюю спетую песню i+=1; //переходим на первую строчку найденной песни start_song:=i; //добавляем набор событий по таймеру. По событию для каждой строки с промежутком в секунду //i-strsong=0 при первом проходе, 1 при втором и т.д. while message_str(msg_num,i)!="Error" and message_str(msg_num,i)!="[Song]" do begin add_timer_event(self_obj,i-start_song,i); i+=1; end end procedure timed_event_p_proc begin //fixed_param==номер строки, выводим её floater(message_str(msg_num,fixed_param); end //активатор песнопения procedure talk_p_proc begin if num_of_songs!=-1 then begin //если есть ещё песни в запасе - поём следующую if last_song<num_of_songs then call sing(last_song+1); //иначе начинаем сначала else call sing(1); end else display_msg("!ERROR!"); end
Enjoy :-) Доработай скрипт - и в наработки его :-) (Отредактировал(а) Raven - 14:18 - 28 Ноября, 2004)
|
Отправлено: 7:16 - 28 Ноября, 2004
|
|
|
|