|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
2Wasteland Ghost:
Цитата:
stored_node := "Node002"; call stored_node;
Об этой особенности синтаксиса фоловских сриптов не знал. Big thnks :) Будем использовать. 2Raven:
Цитата:
перебирает все "юзерские" мсг-шки, смотрит на 100-ую строчку на наличие слова "LABEL: Vasya", например.
Предпочитаю alt+f7 в totalcmd по дате :)
Цитата:
Вообще же я даже написал скрипт, который парсит свою мсг-шку как ... скрипт.
А вот это - полезно :) Спасибо за идею :) 2pal: Имхо, noid'овский декомпилер лучше... он ближе к оригинальным скриптам фола. (Отредактировал(а) Mynah - 15:24 - 17 Ноября, 2004)
----- Scio me nihil scire
|
Отправлено: 13:22 - 17 Ноября, 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2pal Что там смысл имеет, а что нет надо смотреть конкретно по гварам. Это ж из Ф1 гвары? Вот и посмотри :). По вопросу. Что там декомпилер выдаёт - без понятия :). Но вот что я про say_option знаю: void gSay_Option(int msg_list, int msg_num, procedure target, int reaction) - вывести вариант ответа в диалоге без проверки интеллекта Аргументы: msg_list - номер файла msg msg_num - номер строки в файле msg target - процедура, к которой осуществляется переход при выборе соответствующего ответа reaction - эмоциональная реакция (см. DEFINE.H): GOOD_REACTION (49) NEUTRAL_REACTION (50) BAD_REACTION (51) Возвращаемое значение: нет
|
Отправлено: 16:03 - 17 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
To Wasteland Ghost: большой спасибо за исчерпывающий ответ! то что и искал. единственный момент: target - процедура, к которой осуществляется переход при выборе соответствующего ответа в том примеру где я видел этот код стоит число.я так понимаю нумерация берется из заголовка скрипта где процедуры описаны. вопрос отсчёт тут с 1 ведётся или 0 ? To Mynah: эхх согласен что Noid'овский лучше тока мне Ipp-шный компилер больше по душе , точнее по паскалевскому синтаксису дело вкуса....
|
Отправлено: 16:28 - 17 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Предпочитаю alt+f7 в totalcmd по дате :) Alt+F7 , конечно, рулит, но ты не понял смысла фразы :-) Идея в том, что таким образом ты "отучаешь" скрипт от фиксированого номера (помнишь #define NAME?). Т.е. такому скрипту абсолютно пофигу на какой там строчке scripts.lst его прописали. Он сам ищет нужную ему мсг-шку по определённой ключевой фразе и запоминает её номер. Scripts.lst в этом случае перестаёт быть узким местом. >>А вот это - полезно :) Спасибо за идею :) Хи. Незачто. Ты попробуй парсер написать :-) Могу выслать тебе свой.Правда, там ни строчки комментариев на 10кб кода :-) Основная идея, от которой всё пошло, проста: нужно вынести Node-процедуры в мсг-файл. Как это делается (я с этого начинал, сейчас всё совсем иначе). Заводится мсг-шка такого вот формата: ------------------------------ {100}{}{NODE_START} {101}{}{Привет} //Аргумент для Reply {102}{}{Ага} //Текстовый аргумент для Option {103}{}{Нод1} //Ссылка на нод для этого Option {104}{}{Пока} //Аналогично 102 {105}{}{Выход} // {106}{}{NODE_END} {200}{}{NODE_Нод1} <...> {341}{}{NODE_Выход} <...> ------------------------------- Пишется примерно такой код: variable start_node; -------------------------------- variable start_node; procedure talk_p_proc begin call parse_node("START"); end procedure parse_node(variable str) begin variable i:=1; //str-имя нода для парсинга str:="NODE_"+str; //приводим к единому формату, str="NODE_START" while mstr(i)!=str do i+=1; //Ищем начало нода. У нас i==100 Reply(i+1); //Выводим в Reply стр. 101 start_opt:=i+2; //start_opt = номеру стр. с первым Option (стр. 102) i:=0; while mstr(start_opt+i)!="NODE_END" do begin //Всё до конца нода парсим как Option-ы if (i/2+1)==1 then Option(mstr(start_opt+i),Node001); //Первый Option диалога фактически ссылается на Node001 else if (i/2+1)==2 then Option(mstr(start_opt+i),Node002); //Второй - на Node002 и т.д. <...> end end procedure Node001 begin call parse_node(mstr(start_node+1)); //Вызываем парсер снова, передавая ему в качестве арг. текст соответствующей первому Option ссылки (стр. 103) end procedure Node002 begin call parse_node(mstr(start_node+3)); //стр. 105 end <...> -------------------------------- Итого: код скрипта фиксирован, реальных нодов в нём девять. А "виртуальных" нодов в msg может быть сколько угодно. Т.е. парсер пишется один раз, а все диалоги программируются в мсг. Можно полностью поменять структуру диалога без перекомпиляции. Минусов (в этом, примитивном, случае) вагон. Чеки на ЛВАРы, выдача предметов, строгий синтаксис, возможность появления бесконечных циклов и т.д. Всё из перечисленного уже исправленно :-) Кто-то заинтересовался? Если наберётся 3-5 желающих, то можно парсер довести до ума и использовать в работе.
|
Отправлено: 16:34 - 17 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Цитата:
Могу выслать тебе свой.Правда, там ни строчки комментариев на 10кб кода :-)
Мы в такие шагали дали, что не очень-то и дойдёшь :))) Если не сложно - вышли. Я уже почти привык к коду без комментов :) Вот сюда
----- Scio me nihil scire
|
Отправлено: 17:03 - 17 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: Зато базовый адрес строки укладывается просто замечательно .
Гхды.. Как это? (Лучше бы вы этого не говорили.. То есть вы хотите сказать, что при попытке присвоения переменной значения типа string, переменной автоматически присваивается указатель на эту строку? Указатель как раз четыре байта, но тогда где храниться строка?) [флуд удалён] P.P.S. Никто не отвечает, наверное приняли за шутку.. Как узнать, присутствует ли в *.msg файле реплика с заданным номером? (Отредактировал(а) Alan Killenger - 20:47 - 17 Ноября, 2004)
----- hit me, nail me, make me god
|
Отправлено: 19:45 - 17 Ноября, 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Когда error на экране появится, тогда и узнаешь :). Скрипт это не обрабатывает, это обрабатывает движок.
|
Отправлено: 10:39 - 18 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
1. Как производить проверку работы скрипта? То есть существуют ли какие-либо аналоги пошагового выполнения, как в Pascal'e? Знаю, что скорее всего нет.. но я просто не мог не спросить. А какие-нибудь левые способы? Я, например, в начале работы critter_p_proc вывожу плавающими сообщениями значения всех переменных, может кто знает способ получше? 2. Как заставить криттера подойти к чузену и только потом завести диалог? Ээ.. попытался найти этот момент в скрипте механника из Наварро, но не нашел. Какова технология согласовывания времени воспроизведения анимации и мгновенных действий? добавление Раскрыл глаза и узрел: boolean anim_busy(ObjectPtr who), sorry за второй вопрос. (Отредактировал(а) Alan Killenger - 15:14 - 21 Ноября, 2004)
|
Отправлено: 15:27 - 18 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
кто нибудь может помочь в определнии что делает команда : PlayerHasPresencePerk(1) ? и есть ли аналоги этой команды? а то декомпилер её перевёл в ipp а компилер её (команду т.е.) не хочет обратно в int делать .
|
Отправлено: 17:13 - 18 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
2pal:
Цитата:
PlayerHasPresencePerk Return 1 (true) if player has the Presence trait, false (0) otherwise.
Т.е. у этой команды не должно быть параметров. А вообще, тебе сюда.
----- Scio me nihil scire
|
Отправлено: 17:37 - 18 Ноября, 2004
|
|
|
|