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


Форум TeamX » Тех. поддержка » Скрипты (FAQ)

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 ] Все собщения

 
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
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 ] Все собщения


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