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


Форум TeamX » Тех. поддержка » Скрипты (Все вопросы по скриптингу - сюда)

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения

 
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
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения


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