|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Оглавление Страница 1: Q: Что такое скрипты? Q: Где можно достать нормальную документацию для чайников? Q: Какие есть компиляторы\декомпиляторы? Q: Как использовать компилятор от BIS? Q: Как использовать int2ssl? Q: Как использовать Noid compiler? Q: Как мне упростить работу с Нойдовским компилём? Q: Декомпилировал скрипт с помощью noid_decompiler'а , а компилировал с помощью компилера от BIS. Скрипт не создаётся. Выдаются ошибки. С чем это связано? Q: Что такое препроцессор и зачем он нужен? Q: Что такое макросы? Q: Что такое GVAR, MVAR, LVAR? Q: Слышал, что GVAR под номером 633 лучше не трогать. Почему? Она-же вроде Reserved? Q: Где найти номера *.msg файлов для использования в диалогах? Q: Как в диалоге в реплику Чузена или в реплику NPC вставить имя Чузена? Q: Я посылаю охранника, и вся охрана атакует меня. Как это сделать? Q: Как привязать скрипт к карте? Q: Как переместить предмет из инвентаря NPC в инвентарь героя (на примере бутылочных крышек)? Q: А если я хочу добавить не крышки, а что-то другое? Q: Как создать диалог? Q: Непонятно, какую роль играет та или иная функция/непонятно что значит тот или иной аргумент? Q: Я создал frm'ку с анимацией объекта (открытие шлагбаума). Как в игре использовать этот объект? Q: Я создал скрипт - диалог персонажа с новым NPC. Но при тестировании, как только обратился к NPC, выдало в окошке (windows) "GDialog::Error Grabbing text message!" Страница 2 Q: Что такое export и import variable's? Для чего они нужны? Для того, чтобы из скрипта одного объекта обратиться к другому? Q: Когда использую стандартные исходники скриптов, которые поставляются в комплете с маппером, при работе вылезают глюки (чаще всего с машиной). В чём дело? Q: Из доки по скриптам : int critter_state(ObjectPtr who) - вернуть состояние обьекта. Что это означает? Q: Возможно отменить-повлиять скриптово на действие принятого наркотика ? Q: Процедура смерти (любыми способами) НПС прописана в его скрипте, я полагаю? Q: Как заставить криттера подойти к чузену и только потом завести диалог? Q: Почему когда я в BIS'овском маппере ставлю перса, вешаю на него свой скрипт, то всё работает как надо, а в игре при наведении курсора пишется, что это деревенский житель? (смысл использования script_overrides) Q: Почему BIS'овский компилятор выдаёт ошибки при использовании макросов? Q: Как узнать, присутствует ли в *.msg файле реплика с заданным номером?
|
Отправлено: 11:07 - 12 Июня, 2005 | ИСПРАВЛЕНО: Ray - 17:42 - 6 Фев., 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Что такое скрипты? A: Любая локация (карта) в Фоле состоит из различных объектов - людей, животных, зданий (стен, пола, потолка), мебели и т.д. Эти объекты - не монолитны. Любой объект - это просто совокупность ряда элементов: -- картинки -- озвучки -- скрипта -- прототипа Скрипт определяет реакцию объекта на воздействие со стороны вашего персонажа, других персонажей, внутриигровых параметров (времени, локации, координат). Он представляет собой файл с расширением int. Этот файл получается путём компиляции из файла с исходным текстом скрипта (расширение ssl). Исходный текст - это программа на специальном языке с синтаксисом, похожим на C с примесью Паскаля. Q: Где можно достать нормальную документацию для чайников? A: Скриптинг подразумевает определённые познания в области программирования. Существует лишь одна дока, которая обучает скриптованию от "полного нуля" до "вполне себе ничего". Автор - Raven FScript-HOWTO Q: Какие есть компиляторы\декомпиляторы? A: Компилятор - это специальная программа, которая переводит файл с исходным текстом скрипта(.ssl) в файл, который воспринимается двигом фолла (.int) Декомпилятор выполняет противоположные функции. На данный момент существует несколько видов таких программ. Среди них: Официальный компилятор скриптов: Компилятор: BIS compiler Авторы - Interplay Декомпилятор: int2ssl Автор - Anchorite Компилятор/декомпилятор Ноида: Noid compiler Это два основных. Остальные можно найти в утилитах Q: Как использовать компилятор от BIS A: Инструкция по использованию: 1) Необходимо скачать препроцессор 2) В папке с компилятором (там, где находятся файлы compile.exe и DOS4GW.EXE) создаёте две папки: a)Tools b)New 3)файлы из архива watcom_cpp.rar кладёте в папку Tools. 4)Переименовываете файлы: WCC386.EXE - в cpp.EXE WCCD386.DLL - в cppD.dll 5)В папке New создаём файл - comp.bat ,с таким текстом ================================== @echo off set MP=C:\Fallout2\scripts ..\Tools\cpp.exe -i=%MP%\Headers /w /pc /fo=%1.i %1.ssl ================================== Где вместо "C:\Fallout2\scripts " следует написать путь к папке, где находятся compile.exe и DOS4GW.EXE Теперь компилятор готов к использованию. Для компиляции: 1)Кладём в папку New наш скрипт (для примера myscript.ssl) 2)В консоль пишем: comp myscript Всё без расширения 3)Если в скрипте не будет ошибок, то создастся файл myscript.i если будут найдены ошибки, то они будут записаны в файл myscript.err 4)Кладём файл myscript.i в папку с compile.exe и DOS4GW.EXE 5)В консоль пишем: DOS4GW.EXE compile.exe myscript.i 6)Получаем откомпилированный скрипт. (Отредактировал(а) Ray - 18:55 - 12 Июня, 2005)
|
Отправлено: 13:27 - 12 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Как использовать int2ssl? A: Поместите в папку с файлом int2ssl.exe ваш скрипт(для примера myscript.int). Напишите в командной строке: int2ssl.exe myscript.int Примечание: Для последующей компиляции получаемых .ssl использование препроцессора не требуется. Q: Как использовать Noid compiler? A: Просто распакуйте папку "usr" в корневой каталог диска C: Зайдите в папку С:\usr\local\bin и поместите сюда нужный для вас скрипт (для примера файл myscript.ssl)Для компиляции напишите в командной строке: ruby.exe compile myscript.ssl Для декомпиляции: ruby.exe decompile myscript.int Q: Как мне упростить работу с Нойдовским компилём? A: Сейчас есть графическая оболочка под него, однако проще использовать другой способ: В папке bin создаём два файла - comp.bat и decomp.bat. Содержание первого: ======================= C:\usr\local\bin\ruby compile %1 > %1.log ======================= Второго: ======================= C:\usr\local\bin\ruby decompile %1 > %1.log ======================= Далее при помощи асоциации в винде(Правый клик мышки+SHIFT на файле с нужным расширением; "Открыть с помощью") привязываем все файлы с расширением .ssl к файлу comp.bat, все файлы .int - к decomp.bat. Для компиляции\декомпиляции просто запустить нужный файл(Двойной клик на файле с расширением .ssl/.int или ENTER).Также будет создан лог-файл с возможными ошибками. Q: Декомпилировал скрипт с помощью noid_decompiler'а , а компилировал с помощью компилера от BIS. Скрипт не создаётся. Выдаются ошибки. С чем это связано? A: Всё дело в том, что у двух этих компиляторов разные названия команд и формат скриптового языка. Хоть формат файла одинаковый (.ssl), но файлы созданные компилятором от Нойда не будут работать с компилятором от BIS. И наоборот. Q: Что такое препроцессор и зачем он нужен? A: Для того, чтобы можно было использовать #define и #include нужна прога, называемая "препроцессор". Фактически, препроцессор - это своеобразный текстовый редактор, который выполняет несколько функций. В процессе своей работы он использует так называемые директивы препроцессора(#define и #include). В часности в результате работы препроцессор выполняет следующее: Вместо строки: #include <define.h> препроцессор просто вставит содержимое файла define.h. Если же в скрипте присутствует такая команда: #define one 1 препроцессор полностью проверит содержимое файла и везде где найдёт, заменит one на 1. Это сделано для облегчения работы со скриптами(и программами в целом). Уменьшает вероятность запутаться и пользователю не надо будет по много раз писать одни и те-же команды. Примечание:Если в скрипте нет директив препроцессора, то его можно не запускать. Он так-же не нужен для компиляции .ssl файлов созданных декомпиляторами int2ssl и Noid Compiler. Q: Что такое макросы? A: Грубо говоря, есть два типа команд: 1. Встроенные команды 2. Макросы (директивы препроцессора) Встроенные команды прошиты в движке, их не нужно нигде объявлять дефайном или подключать include- ом какие-либо файлы. Если в скрипте используются встроенные команды - то препроцессор не нужен, компилятор обойдётся и без него. Макросы - это сокращения/дополнения встроенных команд. Например, тебе часто приходитя использовать встроенную команду obj_name(dude_obj) - т.е. выводить Имя Чузена. Вместо этого ты можешь написать #define pl_name obj_name(dude_obj) и использовать pl_name, но теперь тебе понадобится препроцессор. Q: Что такое GVAR, MVAR, LVAR? A: Это переменные. Переменные в Fallout делятся на четыре типа: GVAR Глобальные переменные. Переменная такого типа будет доступна ВСЕМ скриптам. Значения ГВАРов сохраняются в save'ах. Перед использованием, ГВАРУ надо зарегистрировать в файле fallout2/data/data/vault13.gam. Каждая переменная описывается строчкой вида: GVAR_PLAYER_REPUTATION :=0; // (0) Сначала идет название переменной. Оно нигде не светится, нужно, чтобы сами смогли разобраться потом. Затем идет присвоение начального значения переменной. Далее, в скобочках идет номер переменной. По этому номеру вы и будете к ней обращаться из скрипта. Если вы собираетесь делать мод на базе карт и скриптов фола, т.е. добавляя что-то свое , то стандартные Гвары лучше не трогать. Используйте ГВАРЫ с номерами от 634 и дальше. Бытовало ошибочное мнение, что количество GVAR строго ограничено, однако это не так. MVAR Переменные карты. Переменные такого типа будут доступны для всех скриптов карты, которой принадлежат. Значения этих переменных тоже в сохраненках сохраняются. Объявляются МВАРЫ следующим образом: а)В папку с файлом карты (fallout2/data/maps) нужно положить файл совпадающий с названием файла карты, но с расширением .gam. Т.е. для карты artemple.map это будет artemple.gam. б)В этом файле для каждой переменной создать строчку вида: MVAR_Made_Car :=0; // (0) Принцип то-же самый, что и у GVAR. Т.е. название-->начальное значение-->порядковый номер. LVAR Локальные переменные скрипта. Следует отметить, что это не переменные скрипта, а переменные ОБЪЕКТА, к которому привязывается скрипт. Например: у нас есть два охранника двери, к ним привязан один и тот же скрипт - guard.int, local_var(x) у обоих охранников может принимать разные значения. То есть мы можем создать кучу одинаковых объектов с одинаковыми скриптами. В ходе выполнения, в результате действий, local_var(x) для каждого скрипта может выполнятся и принимать своё значение. Но после выполнения скрипта все значения исчезают. Объявляются в файле scripts.lst в конце строчки, описывающей скрипт выражением вида local_vars=5. Таким образом у нас будет пять LVAR'ов. В скриптах не требуют "обнуления" (set_local_var(x, 0)), т.к. при выполнении скрипта (а точнее его начале) двиг сам обнуляет все local_vars. Variable Не сохраняемые переменные скрипта. Доступны только внутри одного скрипта. Значения теряются, как только скрипт перестает работать. Объявляются в тексте скрипта вот такой вот конструкцией: (для обоих компилеров) variable var_name:=0;
|
Отправлено: 17:18 - 12 Июня, 2005 | ИСПРАВЛЕНО: Ray - 23:28 - 5 Июля, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Слышал, что GVAR под номером 633 лучше не трогать. Почему? Она-же вроде Reserved? A: Не трогай гвару 633, ибо это есть очень и очень важная гвара. Эта гвара отвечает за правильное отображение машины и хранит номер тайла, на котором располагалась машина последний раз. Если ты её подпортишь, начинай считать глюки. Q: Где найти номера *.msg файлов для использования в диалогах? A: У .msg-файла нет номера. Имя .msg совпадает с названием соответствующего скрипта. Например: acklint.int и acklint.msg. А номер для .msg берётся такой-же, что и номер соответствующего ему скрипта из scripts.lst. Для примера: Для компилятора от Нойда: op_gsay_reply(751, 119); Взято из скрипта Клинта. Его имя - acklint.int. И номер соответственно 751. Второе число - это номер в самом .msg-файле. Для компилятора от BIS: #define NAME SCRIPT_ACKLINT ......................... reply(119); //Открываем scripts.h и смотрим номер, соответствующий SCRIPT_ACKLINT //Возможна так-же такая запись: #define NAME 751 //Всё то-же самое. Q: Как в диалоге в реплику Чузена или в реплику NPC вставить имя Чузена? A: На примере Клинта: Для компилятора от BIS: В начале скрипта пишешь #define NAME SCRIPT_ACKLINT //Вместо SCRIPT_ACKLINT может стоять число раное номеру скрипта в scripts.lst или слово соответствующее номеру из scripts.h //В самом диалоге пишешь: Reply(mstr(103)+obj_name(dude_obj)+mstr(104)); Тогда из файла с названием acklint.msg будут взяты строки №103 и №104 и между ними вставлено имя Чузена. Для компилятора от Нойда: //в диалоге всё прописывается одной строкой: op_gsay_reply(751, op_msg_string(751, 112) + op_obj_name(op_dude_obj()) + op_msg_string(751, 113)); //Где 751 - номер скрипта из scripts.lst; 112 и 113 - номера строк из файла msg. (Отредактировал(а) Ray - 13:35 - 14 Июня, 2005)
|
Отправлено: 0:13 - 13 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Я посылаю охранника, и вся охрана атакует меня. Как это сделать? A: Вот пару вариантов: 1.1 Можно забрить всю охрану в одну команду. Team прописывается в свойствах критера в Mapper`е. Тогда в скрипте одного из охранников в одной из веток диалога вызываешь attack - и вся команда NPC-ей атакует чуза. Для компилятора от BIS: 2.1 Завести MVAR_say_fuck. (Для этого в файле "название_города.gam" вставляешь: MVAR_say_fuck :=0; // (X) и вставить в скрипты всех охранников, например, такой кусок: --------------------- procedure critter_p_proc begin if map_var(MVAR_say_fuck) then begin set_local_var(LVAR_Hostile,1); attack(dude_obj); end ... end --------------------- и завести в диалоге Node под это дело: --------------------- procedure NodeFuckOff begin set_map_var(MVAR_say_fuck,1); end --------------------- Ещё надо добавить в имя_карты.h #define MVAR_say_fuck (X) Для компилятора от Нойда: 2.2 (Тот же принцип). Заводим MVAR. --------------------- procedure critter_p_proc begin if (op_map_var(X) == 1) then begin op_set_local_var(5, 1); op_attack(op_dude_obj(), 0, 1, 0, 0, 30000, 0, 0); end ... end --------------------- и завести в диалоге Node под это дело: --------------------- procedure NodeFuckOff begin op_set_map_var(X, 1); end --------------------- Q: Как привязать скрипт к карте? A: Есть два способа: через pro-файл объекта и при помощи маппера. Второй способ легче, о нём и пойдёт речь: 1) Прежде всего вы должны убедиться, что файл patch000.dat распакован и находится в папке data. 2) Поместите ваш скрипт в папку scripts, а также допишите в конец файла scripts.lst (в этой же папке) строку с названием скрипта. 3) Откройте маппер. 4) Поместите какой-нибудь предмет на карту. 5) Выбирете предмет уже на карте ( левый клик мышки). Нажмите на кнопку "EDIT" (внизу) 6) Затем в окошке кнопка "New Script" и из списка выбираешь свой скрипт. Примечание: Когда дописываете свой скрипт в файл scripts.lst убедитесь, что после вашей строки нет больше ни строк, ни табуляций, ни пробелов. (Отредактировал(а) Ray - 16:04 - 14 Июня, 2005)
|
Отправлено: 14:35 - 14 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Как переместить предмет из инвентаря NPC в инвентарь героя? A: Кусок кода на примере бутылочных крышек: Для компилятора от BIS: #include <itempid.h> variable caps; variable num_of_caps; //получаем указатель caps:=obj_carrying_pid_obj(self_obj,PID_BOTTLE_CAPS); //получаем число крышек в инвентаре num_of_caps:=obj_is_carrying_obj_pid(self_obj,PID_BOTTLE_CAPS); //если caps==0 - значит крышек в кармане нет if caps !=0 then begin //добавляем Чузу add_mult_objs_to_inven(dude_obj,caps,num_of_caps); //удаляем у себя rm_mult_objs_from_inven(self_obj,caps,num_of_caps); end else ... Для компилятора от Нойда: variable caps; variable num_of_caps; //получаем указатель caps:=obj_carrying_pid_obj(op_self_obj(),41); //получаем число крышек в инвентаре num_of_caps:=op_obj_carrying_pid_obj(op_self_obj(), 41); //если caps==0 - значит крышек в кармане нет if caps !=0 then begin //добавляем Чузу op_add_mult_objs_to_inven(op_dude_obj(), caps, num_of_caps); //удаляем у себя op_rm_mult_objs_from_inven(op_self_obj(), caps,num_of_caps); end else ... Q: А если я хочу добавить не крышки, а что-то другое? A: Каждый предмет имеет свой номер, то, что называется PID. Для всех одинаковых предметов PID одинаков. Т.е. два 10мм пистолета будут иметь одинаковый PID. PID нужен для добавления/удаления предметов из инвентаря, криттеров и сценери с карты. Все стандартные PID'ы объявлены в хеадерах Critrpid.h(криттеры), Itempid.h(Итемы) и Scenepid.h(сценери). В случае с крышками, значение PID_BOTTLE_CAPS может быть найдено в файле itempid.h и составляет 41.
|
Отправлено: 21:05 - 14 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Как создать диалог? A: Теория: диалоги в Fallout устроены так: при попытке заговорить с криттером вызывается процедура talk_p_proc. В простейшем случае эта процедура переключает игру в режим диалога, передаёт управление процедуре, отвечающей за первую фразу диалога, и после завершения диалога переходит обратно в нормальный режим. Диалог состоит из множества процедур, каждая из которых отвечает за кокретную фразу криттера и варианты ответов на эту фразу, доступные игроку. В оригинальных скриптах фола эти функции носят название NodeXXX. Например: procedure talk_p_proc begin start_gdialog(NAME,self_obj,4,-1,-1); gSay_Start; call Node001; gSay_End; end_dialogue; end Процедура открывает окно диалога и передаёт управление процедуре Node001. Процедуры типа Node строятся следующим образом: procedure Node001 begin Reply(100); giQ_Option(4,NAME,120,Node002,NEUTRAL_REACTION); end Получился единственный вариант ответа, при выборе которого мы попадём в процедуру Node002. Чтобы добавить ещё один вариант, просто добавьте ещё одну функцию giQ_Option. Для завершения диалога нужно создать пустую процедуру (обычно это Node999). procedure Node999 begin end При выборе варианта ответа, ссылающегося на неё, диалог будет завершён. Пример для Noid Compiler: procedure talk_p_proc begin op_start_gdialog(1319, op_self_obj(), 4, -1, -1); maybe_start_dialog(); call Node001(); maybe_close_dialog(); maybe_op_end_gdialog(); end procedure Node999 begin end procedure Node001 begin op_gsay_reply(1319, 204); op_giq_option(1, 1319, 205, @Node999, 50); op_giq_option(1, 1319, 206, @Node002, 50); end (Отредактировал(а) Ray - 21:25 - 15 Июня, 2005)
|
Отправлено: 19:39 - 15 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Непонятно, какую роль играет та или иная функция/непонятно что значит тот или иной аргумент? A: Если используется компилятор от BIS, то вам поможет следующая дока: Функции компилятора скриптов Fallout от BIS Если же вы используете Нойдовский компилятор, то тут можно только посоветовать искать нужную функцию в доке к BIS, находить в каком она скрипте используется и декомпилить нужный скрипт. Или всё в обратном порядке.
|
Отправлено: 21:18 - 16 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Я создал frm'ку с анимацией объекта (открытие шлагбаума). Как в игре использовать этот объект? A: Проиграть frm-ку (саму по себе) нельзя. Можно проиграть анимацию какого-либо объекта. Т.е. сначала тебе нужно сделать scenery-прототип и анимировать его своими frm-ками. Пошагово: 1. Делаешь из трёх своих frm-ок одну анимированную. У тебя должна получиться полная анимашка открытия или закрытия шлагбаума с минимум тремя кадрами. 2. Прописываешь получившуюся frm в data\art\scenery\scenery.lst 3. Создаёшь в Мапере новый scenery-прототип. Выбираешь для него свою frm. Сохраняешь прототип (Внимание: маппер должен быть настроен на редактирование прототипов) 4. Размещяешь свой шлагбаум. У тебя получается статичный объект, используется первый кадр твоей frm-ки. 5. В скрипте компа пишешь следующее (я полагаю, что на первой фрмке у тебя закрытый шлагбаум): для открытия: animate_stand_obj(tile_contains_pid_obj(tile,elev,PID)) - простая прокрутка твоей анимации. для закрытия: animate_stand_reverse_obj(tile_contains_pid_obj(tile,elev,PID)) - обратная прокрутка. + удаление/добавление блокеров. Т.е при открытии прокрутится вся твоя анимашка и произойдёт остановка на последнем кадре. При закрытии анимашка крутится задом наперёд и сотановка происходит на первом кадре. Удалять/создавать блокеры можно. Их PID, ЕМНИП, 33554499. Для удаления/создания блокера нужно знать его координаты. Удалить блокер: destroy_object(tile_contains_pid_obj(координаты,elevation,33554499)); Создать блокер: create_object(33554499,координаты,elevation); Функции для Нойдовского компилятора: 1.op_animate_stand_obj(op_tile_contains_pid_object(tile,elev,PID)) 2.op_animate_stand_reverse_obj(op_tile_contains_pid_object(tile,elev,PID)) 3.op_destroy_object(op_tile_contains_pid_object(координаты,elevation,33554499)); 4.op_create_object(33554499,координаты,elevation); (Отредактировал(а) Ray - 20:00 - 18 Июня, 2005)
|
Отправлено: 20:07 - 18 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Я создал скрипт - диалог персонажа с новым NPC. Но при тестировании, как только обратился к NPC, выдало в окошке (windows) "GDialog::Error Grabbing text message!" A: Такое бывает, когда игра не находит *.msg фаил, соответствующий скрипту, а так же при критической ошибке в msg, например {100]}{txt} (именно критической. Если просто не закрыть скобку - будут только Error'ы)
|
Отправлено: 12:24 - 19 Июня, 2005 | ИСПРАВЛЕНО: Ray - 23:29 - 5 Июля, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Что такое export и import variable's? Для чего они нужны? Для того, чтобы из скрипта одного объекта обратиться к другому? A: Никакого "обращения" не происходит. Переменная, прописанная в скрипте карты с ключевым словом export будет доступна ВСЕМ скриптам на карте - как на чтение, так и на запись. Хранить в этой переменной можно всё, что угодно - PID, указатель, число денег, причитающихся Чузу - в общем, всё. Пример: По результатам разговора с одним персонажем Чуз должен получить некоторое количество денег от другого. Число денег генерируется автоматически в скрипте первого НПС. Как второму узнать сколько денег выдавать? Используем импорт/экспорт. В скрипте карты пишем: export variable money_to_give; Теперь переменная money_to_give потенциально доступна всем объектам на этой карте. В скрипте первого НПС (генератора числа денег) пишем: --------------------------- <...> //Импортируем переменную, т.е. делаем её доступной для этого скрипта import variable money_to_give; <...> //Какая-то процедура генерации денег procedure generate_amount begin <...> //Присваиваем экспортной переменной сгенерированную сумму money_to_give:=generated_cash; end <...> --------------------------- Всё, теперь переменная money_to_give хранит подлежащую выдаче сумму денег. В скрипте НПС2 (выдающий) пишем: --------------------------- <...> import variable money_to_give; <...> procedure give_money begin <...> //Передаём Чузу сгенерированную сумму item_caps_adjust(dude_obj,money_to_give); <...> end <...>
|
Отправлено: 23:10 - 20 Июня, 2005 Исправлено: Ray - 22:26 - 20 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Когда использую стандартные исходники скриптов, которые поставляются в комплете с маппером, при работе вылезают глюки (чаще всего с машиной). В чём дело? A: Злые дяди из БИС подсунули фанатам старые исходники. В частности, абсолютно все скрипты карт, на коих должна рисоваться машина, неверны, т.к. алгоритм прорисовки машины был сильно изменён. Потому был написан новый макрос, который заменяет старые макросы в заголовках БИС. А вообще, если ты собрался юзать исходники, то сходи в файловый раздел и скачай исходники скриптов 1.02d от Haenlomal. Там всё чётко. А лучше всего используйте декомпиляторы.
|
Отправлено: 23:34 - 21 Июня, 2005 | ИСПРАВЛЕНО: Ray - 22:41 - 21 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Из доки по скриптам : int critter_state(ObjectPtr who) - вернуть состояние обьекта. Что это означает? A: Вернуть состояние - значит, что функция вернёт значение соответствующие задаче функции. Потом можно сверять эти значения. Например, может возвращятся текущий уровень облучения, отравления и т.д. Так critter_state вернёт значение одной из характеристик. Нигде в окошке тебе этого не отобразят. Пример: Допустим у тебя значение хар. = 120, тогда: if (get_critter_stat(self_obj, STAT_current_rad) > 100 ) begin ..... end выполнится. Если хар. = 90 - Нет.
|
Отправлено: 15:54 - 26 Июня, 2005 | ИСПРАВЛЕНО: Ray - 16:34 - 26 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Возможно отменить-повлиять скриптово на действие принятого наркотика ? A: Нет. За действие наркотиков отвечает двиг. Q: Процедура смерти (любыми способами) НПС прописана в его скрипте, я полагаю? A: Никакой "процедуры смерти" нет. Анимация смерти выбирается/отрисовывается движком, скрипты здесь не при чём. Но в момент смерти персонажа срабатывает обработчик destroy_p_proc, во время получения повреждений (любых, из любого источника) - damage_p_proc и в ряде случаев срабатывает combat_p_proc Q: Как заставить криттера подойти к чузену и только потом завести диалог? A: Для того, чтобы криттер подходил к чузену одной командой не обойдёшся. Простейший пример: ====================== 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 используется, чтобы процесс "криттер гоняется за чузеном" выполнялся всего один раз.
|
Отправлено: 0:09 - 30 Июня, 2005 | ИСПРАВЛЕНО: Ray - 15:16 - 3 Июля, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Почему когда я в BIS'овском маппере ставлю перса, вешаю на него свой скрипт, то всё работает как надо, а в игре при наведении курсора пишется, что это деревенский житель? (смысл использования script_overrides) A: В прототипе прописан и номер скрипта и описание. Если мы прописываем криттеру новый скрипт, то это ещё не означает, что мы полностью "отрубаем" тем самым стандартные процедуры (description_p_proc и т.п.) Проще говоря, даже если в новом скрипте описана какая-то процедура, это ещё не означает, что стандартная процедура не будет выполняться. Для этого необходима команда scrpipt_overrides. Она отменяет стандартное выполнение функции, которое можно заменить своим. Пример для скрипта рад-скорпиона: --------------------------------------- procedure description_p_proc begin display_msg("Страшный зверь"); end такая процедура выведет две строки - "Вы видите рад-скорпиона"(берётся из прототипа) и "Страшный зверь" --------------------------------------- procedure description_p_proc begin script_overrides; display_msg("Страшный зверь"); end А такая только одну - "Страшный зверь" --------------------------------------- Писать script_overrides везде не советую. А вот обработчики description_p_proc и look_at_p_proc содержать её просто обязаны, если необходимо заменить стандартное описание своим. БИСовский маппер после нажатия F8 работает тоже в некотором отладочном режиме, не совсем соответствующем режиму работы "чистой" игры.
|
Отправлено: 22:40 - 5 Июля, 2005 | ИСПРАВЛЕНО: Ray - 21:08 - 6 Июля, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Почему BIS'овский компилятор выдаёт ошибки при использовании макросов? A: Он макросы понимать не обучен. Если вы просто использовали #define, то вам понадобится препроцессор. Если же вы использовали стандартные макросы (можно найти в доке от Wasteland Ghost), то для компиляции, перед использованием препроцессора, вам следует подключить <command.h> Будьте внимательны. После некоторых макросов не ставится точка с запятой. Пример (для unmark_on_map(int area)): ======================== #include "..\headers\command.h" #include "..\headers\define.h" procedure start; procedure map_enter_p_proc; procedure start begin end procedure map_enter_p_proc begin unmark_on_map(5) end ========================
|
Отправлено: 13:07 - 19 Авг., 2005 | ИСПРАВЛЕНО: Ray - 15:49 - 19 Авг., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Q: Как узнать, присутствует ли в *.msg файле реплика с заданным номером? A: Для компиллера от BIS: ======================== if (message_str(file_num, str_num)== "Error") then begin ..... end else begin ..... end ======================== Для компиллера от Нойда: ======================== if (op_msg_string(file_num, str_num) == "Error") begin ..... end else begin ..... end ========================
|
Отправлено: 22:47 - 16 Янв., 2006 | ИСПРАВЛЕНО: Ray - 22:01 - 16 Янв., 2006
|
|
|
|