|
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
|
|
|
|