» 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 ] Все собщения

 
Alan Killenger
Пользователь

Откуда: Россия, Ижевск
Регистрация: Июль 2004

Всего: 404 сообщения

Спасибо Raven, но разве я скрипт просил? У меня все почти так же, но работа стала так как нет ответов на два вопроса:

1. Можно ли создать общедоступный всем скриптам *.msg файл, не привязанный к какому-либо, пусть даже тождественному, скрипту?

2. Стоит ли вводить тэг конца файла? Есть ли какие-нибудь альтернативы этому?

Саму задачу ты понял как нельзя правильно и реализовал ее.. вводя тэг конца файла "[End file]". Ну, наверное и вправду без него никак? Далее, в примере ты использовал обычный *.msg файл, за которым обязательно должен стоять скрипт? Иначе никак?

-----
hit me, nail me, make me god

Отправлено: 13:09 - 28 Ноября, 2004
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

>>Можно ли создать общедоступный всем скриптам *.msg файл, не привязанный к какому-либо, пусть даже тождественному, скрипту?

Насколько я понимаю принципы работы движка в плане поиска мсг-шек - нет. Никаких номеров мсг-шек нет, есть номера скриптов. Если у тебя в scripts.lst на строчке 1307 прописан test.int, то
--------------------
message_str(1307,10);
--------------------
попытается найти test.msg и извлечь из него десятую строчку. Т.е. имена мсг-шек должны совпадать с именами скриптов (и каждая мсг-шка жёстко привязана к номеру одноимённого скрипта).

Но! Всё это не делает мсг-шку недоступной для других скриптов. Ничто не мешает тебе брать строчки из "чужих" мсг-шек, если ты знаешь номера их скриптов. Какой номер ты скормишь первым параметром message_str, из той  мсг-шки и будет браться строка.

Кроме того, можно завести fake-скрипт: просто прописать строчк в scripts.lst, но не делать сам скрипт, только мсг.

>> Стоит ли вводить тэг конца файла? Есть ли какие-нибудь альтернативы этому?

Тут всё зависит от того жестко ли задано число записей в мсг. Если у тебя, скажем, ровно 10 песен - то и тэг тебе не нужен. Если число записей никак не ограничено, то без тэга не обойтись.

Есть, правда, другой вариант - использовать atoi (о котором я вот-вот расскажу и о котором ты уже знаешь):
------------------------------
{1}{}{[Songs]}
{2}{}{121}
{3}{}{632}
<...>
{121}{}{La-la}
<...>
{632}{}{Bla-bla}
<...>
------------------------------

Т.е. хранить в начале файла номера строк, с которых начинаются песни. Такой подход позволит обойтись без метки конца файла, т.к. общее число песен можно легко и быстро подсчитать.

-----------------------------------------------
Atoi преобразует строковое представление числа в int-число ("232" в 232). Дело в том, что mstr(2) в нашем случае вернёт строку, "121". А mstr("121") вернёт "Error". Т.е. числа в мсг, вообще говоря, хранить нельзя. Но мною написана процедурка atoi, которая перебором сравнений делает преобразование char * -> int (только в одну сторону и только для цифр, разумеется). Минус - работает довольно медленно, поэтому нельзя использовать её, скажем в critter_p_proc, вызывать по 10-15 раз за map_update и использовать для преобразования больших строк (>150 символов).

Откомментированный и изложение принципов работы выложу в следующем посте в "Наработках". Скорее всего, во вторник.
-----------------------------------------------

Отправлено: 13:51 - 28 Ноября, 2004
Mynah
Модератор

Откуда: Пермь
Регистрация: Окт. 2004

Всего: 469 сообщений

Не столько хочу попросить о помощи, сколько гложет любопытство.

У меня кривые руки, или critter_attempt_placement работает криво?
Каждый раз, когда пытался её использовать случались мелкие, но неприятные баги... То не перемещает вообще, то перемещает, но тайлов за 20 от того места, которое я планировал, то вообще Фаллаут вылетает.
Между тем, move_to, вкупе с tile_contains_pid_obj работают ничуть не хуже.
Может я не знаю какой-то мелочи про аттемпт плэйсмент?

-----
Scio me nihil scire

Отправлено: 9:42 - 30 Ноября, 2004
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

А она, подлая такая :), пробует только один раз. Т.е., если указанный тайл занят, то она ищет ближайший свободный. Если не находит, то обламывается.

ЗЫ Карту свою проверь на предмет левых блокеров.

Отправлено: 10:07 - 30 Ноября, 2004
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Если кто знает, может ответит на такой вопрос :
Можно ли через скрипты запустит анимацию (например открывающейся двери), но чтобы она проигрывалась не до конца. Если да, то в каком именно скрипте это реализовано (пример из фолла.)

Отправлено: 1:38 - 5 Дек., 2004
Alan Killenger
Пользователь

Откуда: Россия, Ижевск
Регистрация: Июль 2004

Всего: 404 сообщения

Цитата:

procedure description_p_proc;
procedure demo_proc(variable par1, variable par2);

procedure description_p_proc
begin
 variable myvar;
 script_overrides;
 myvar := demo_proc(12, "qwerty";
 display_msg("MyVar=" + myvar);
end

procedure demo_proc(variable par1, variable par2)
begin
 display_msg("param1="+par1);
 display_msg("param2="+par2);

 /* Определяем возвращаемое значение */
 if par1<=10 then return(par1+25);
 else return(30);
end

Примечание:
Наличие в процедуре demo_proc оператора return не обязательно, а вот если при её вызове не использовать присвоение к переменной, компилятор выдаёт ошибку.


Это означает, что каждая процедура может вернуть только одно значение (насколько мне кажется, после return процедура перестает выполняться)? То есть никак нельзя в процессе ее выполнения изменять параметры так, чтобы при возвращении они были измененными этой процедурой (без всяких общих переменных для предка и потомка)?

Как узнать тип значения, которое записано в переменную в данный момент? Это вообще можно сделать (без длинной цепочки if .. then)?

Знаю, что "нет", но спросить надо . Можно ли изменять (увеличить) время отображения float_msg?

Две проблемы.

1. В скрипте:
Цитата:

..
variable a:=true;
..
procedure start begin
 if a then begin
   display_msg("true";
   a:=not a;
 end else begin
   display_msg("false";
 end
end
..


В игре:
Цитата:

..
•true
•false
..


То есть процедура start выполняется дважды в любом случае. Ни для какой другой процедуры это не верно.

2. В скрипте:
Цитата:

..
display_msg(message_str(1304,100));
display_msg(message_str(1304,100));
..


или
Цитата:

..
display_msg(message_str(1304,200));
display_msg(message_str(1304,100));
..


реплики заведомо присутствуют, но до этого функция message_str ни разу не вызывалась. В игре:
Цитата:

..
•Error
•(реплика)
..


В скрипте:
Цитата:

..
variable str;
str:=message_str(1304,100);
display_msg(message_str(1304,100));
display_msg(message_str(1304,100));
..


то есть message_str уже хоть раз вернула значение. В игре:
Цитата:

..
•(реплика)
•(реплика)
..


Если обращение к message_str было, но такой строки нет, то баг продолжается до тех пор, пока она не вернет существующую реплику.

Кто знает от чего это? Кто знает как с этим бороться? (Я работаю под win2k.)

09.12.2004
Причина проблемы с message_str найдена, как следствие - и ее решение. Такая фича вылезает при наличии в *.msg файле подобной строки:
Цитата:

..
{}{}{}
..



(Отредактировал(а) Alan Killenger - 6:58 - 9 Дек., 2004)

-----
hit me, nail me, make me god

Отправлено: 5:52 - 5 Дек., 2004
Alan Killenger
Пользователь

Откуда: Россия, Ижевск
Регистрация: Июль 2004

Всего: 404 сообщения

Такой вопрос меня давно гложет.. Есть функция message_str, есть некое условие типа:
Цитата:

..(message_str(a,b)==c)or(message_str(a,b)==d)..


Знамо дело будет два сравнения строк.. но вот сколько будет обращений к файлу? Будет ли ниже следующая конструкция обузой или оптимизацией?
Цитата:

str:=message_str(a,b);
..(str==c)or(str==d)..


Ваше мнение, мастера скрипта?

Из комка растет лавина.. Люди, расскажите плиз про операции над переменными, не имеющими фиксированного типа. Простейший пример: процедура возвращает номер некоторой строки, если она есть; какое значение она должна принимать в том случае, когда заданной строки нет? Можно возвращать false, но false есть 32 бита запоненных 0; можно возвращать указатель, но биты указателя можно тоже интерпритировать как число.. Скажите хотя бы как вы лично решаете у себя эту проблему.

-----
hit me, nail me, make me god

Отправлено: 5:59 - 9 Дек., 2004
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

to Ray

>>Можно ли через скрипты запустит анимацию (например открывающейся двери), но чтобы она проигрывалась не до конца.

Запустить можно. Ограничить число проигрываемых фреймов, ЕМНИП, нет.

to Alan

>>Как узнать тип значения, которое записано в переменную в данный момент? Это вообще можно сделать (без длинной цепочки if .. then)?

if var+0!=var then ... стринговое значение

"asdf"+0=="asdf0"

Дробные числа не используются никем, так что их можно и не проверять. Так что char* от int отличить легко - за один if.

>>Можно ли изменять (увеличить) время отображения float_msg?

Можно постоянно выводить одну и ту же строку. Напр., floater("Hi") в critter_p_proc не исчезнет никогда. Можно повозиться с timed_event, в принципе, написать универсальный скрипт отображения флоаетров в течении задаваемого отрезка времени. Но только зачем? :-)

>>a:=not a;

Такое работает? А что будет при a==0?

>>То есть процедура start выполняется дважды в любом случае

Обработчик start лучше не трогать. Никто толком не знает, когда именно он вызывается (к какому событию привязан). Похоже, он вызывается до вызова любой другой процедуры/обработчика.

>>Простейший пример: процедура возвращает номер некоторой строки, если она есть; какое значение она должна принимать в том случае, когда заданной строки нет?

В смысле, возвращать, а не принимать, да? Добное. Или строковое. Если строка есть - номер, если нет строку "fck", например.
--------------------------
var num;
num:=get_str;
if not num=="fck" then begin
...
--------------------------

>>Ваше мнение, мастера скрипта?

Сложно сказать. Кто ж знает как оно там всё внутри устроено? Но чтение/запись строк - операция медленная (например, последовательное чтение 6000 строк на XP3000+ занимает ~10-15 сек.). Потому запоминание в вару опять же лишним не будет. Благо, вара занимает всего 32*7 бит памяти. В сырце компилятора вары определены так:
--------------------------------
typedef struct {
  int type;   // this type is the type of the variable
  union {
     int intData;
     float floatData;
     int stringData;  /* offset into program's string space */
  };
} Value;

typedef struct {
  int name;   /* offset into program or procedure's namespace */
  int uses;
  Value value;
  int type;   // this type is where it was declared
} Variable;
--------------------------------

Да и память освобождается по выходу из процедуры. Наверное :-)

Отправлено: 9:32 - 9 Дек., 2004
DeuS
Пользователь

Откуда: Питер
Регистрация: Дек. 2004

Всего: 1 сообщение

Объясните ламеру, дело в препроцессоре или еще в чем то??
Допустим берется скрипт:

/*
Copyright 1998-2003 Interplay Entertainment Corp.  All rights reserved.
*/

/*
       Name: Crate in Church
       Location: Den
       Description:


          Created: December 04, 1997

          Updated:
*/

/* Include Files */

#include "..\headers\define.h"

#define NAME                        SCRIPT_DICRATE
#define TOWN_REP_VAR                GVAR_TOWN_REP_THE_DEN

#include "..\headers\command.h"
#include "..\headers\Den.h"

procedure start;
procedure use_p_proc;

procedure start begin
end

procedure use_p_proc begin
  script_overrides;
  display_mstr(100);
  set_crates_ID;
end

врубаю, препроцессор выдает
..\headers\Condtion.h(45): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\Condtion.h(46): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\Condtion.h(46): Error! E1009: Expecting ';' but found ':'
..\headers\Condtion.h(46): Error! E1061: Expecting data or function declaration, but found ':'
..\headers\Condtion.h(46): Error! E1026: Invalid declarator
..\headers\Condtion.h(46): Error! E1009: Expecting ';' but found '='
..\headers\Condtion.h(46): Error! E1061: Expecting data or function declaration, but found '='
..\headers\Condtion.h(46): Error! E1026: Invalid declarator
..\headers\Condtion.h(46): Error! E1009: Expecting ';' but found '1'
..\headers\Condtion.h(46): Error! E1061: Expecting data or function declaration, but found 'constant'
..\headers\Condtion.h(46): Error! E1026: Invalid declarator
..\headers\ScenePid.h(18): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\ScenePid.h(19): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\ScenePid.h(20): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\ScenePid.h(21): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\ScenePid.h(22): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\Party.h(13): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\Party.h(14): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\Party.h(92): Warning! W123: '//' style comment continues on next line
..\headers\Party.h(185): Warning! W123: '//' style comment continues on next line
..\headers\Party.h(185): Warning! W123: '//' style comment continues on next line
..\headers\Party.h(185): Warning! W123: '//' style comment continues on next line
..\headers\Party.h(251): Error! E1022: Missing or misspelled data type near 'variable'
..\headers\Party.h(693): Error! E1022: Missing or misspelled data type near 'procedure'
..\headers\Party.h(693): Error! E1147: Too many errors: compilation aborted

и так любой скрипт
плиз help!

Отправлено: 13:33 - 10 Дек., 2004
Alan Killenger
Пользователь

Откуда: Россия, Ижевск
Регистрация: Июль 2004

Всего: 404 сообщения

Я ошибся. Как жаль, что нельзя удалять собственные сообщения.

(Отредактировал(а) Alan Killenger - 3:32 - 11 Дек., 2004)

Отправлено: 2:24 - 11 Дек., 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