|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Для начала у меня всего пара вопросов: 1. Где можно достать нормальную документацию для чайников, где обьяснено все о скриптах? 2. Где можно достать декомпилятор для скриптов, который переделывает их в формат *.ssl (я хочу работать на F_GECKе. Кстати его можно найти на сайте http://www.tehnokrat.nm.ru)? (Отредактировал(а) GaroldPredator - 18:25 - 16 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 18:24 - 16 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Скриптинг подразумевает определённые познания в области программирования. Поэтому доки "для чайников" не существует. Пока не существует. Я сейчас кропаю документик FScript-HowTo, который и должен стать такой докой. Т.е. от "полного нуля" до "вполне себе ничего". Когда выйдет - не знаю. Сеёчас есть уже 3 главки.
|
Отправлено: 4:32 - 17 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Второй вопрос я выразил неправильно : где достать прогу,которая компилирует *.ssl в *.int?
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 18:41 - 17 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Поставляется вместе Мапером. Лежит в папке Scripts. Зовётся compile.exe. Запускается dos4gw.exe compile.exe имя_скрипта.ssl К ней очень желателен препроцессор. Стандартный выбор - Watcom 11-ой версии. Но можно прикрутить почти любой, было бы желание.
|
Отправлено: 19:34 - 17 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Может быть я что-то не то делаю, но она у меня пишет "can't load executable format for file DOS4GW.EXE или, если в командной строке немного по-другому написать, то вместо DOS4GW.EXE пишет имя_скрипта.SSL НЕ ДОПИРАЮ, ПОМОГИ,!!! ПЛИ-И-И-И-ИЗ!!!! P.S. Че конкретно писать в командной строке?!
Цитата:
Зовётся compile.exe. Запускается dos4gw.exe compile.exe имя_скрипта.ssl
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 20:21 - 17 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Способ (пошаговый :-) проверить работоспособность компайлера: - создай в mapper\scripts файл test.ssl - впиши туда ---------------------------------------- procedure start begin end ----------------------------------------- - запусти cmd.exe (command.com) - перейди в mapper\scripts - пиши: dos4gw.exe compile.exe test.ssl Если появится надпись "Compiling TEST.SSL" - всё ОК. Если появится надпись "Can`t load что-то там"... Тут всё сложнее. Compile.exe - это dos-программа, а dos4gw - это dos-extender. Соответственно, в Win2K, WinXP Win2K3 и непатченом WinME могут возникнуть проблемы - dos`а нет. Попробуй поискать эмулятор DOSBox или поставь 98-ую параллельно основной оси... У меня в 2000-ой такой баг одно время был. Потом исчез. Сам собой (?).
|
Отправлено: 4:34 - 18 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Компилер работоспособный test.ssl компилирует нормально, но возникли другие проблемы. При компилировании любого другого скрипта, пишет Undifened symbol reply вместо reply может быть что-нибудь другое. reply - это команда, диалоговая.
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 15:13 - 18 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Нет, Reply - это не команда, это макрос. :-) Т.е. где-то в файлике command.h написано #define Reply(x) gsay_reply(NAME,x) NAME - номер нужного msg-файла из scrname.msg x - номер нужной фразы из msg-файла Т.е. gsay_reply - это команда, а Reply - просто сокращение. В начале скрипта пишут, например: #define NAME 1404 #include <command.h> и дальше вместо,например, gsay_reply(1404,201) можно писать просто Reply(201) Для того, чтобы можно было использовать #define и #include нужна прога, называемая "препроцессор". Обычно зовётся cpp.exe, поставляется с любым C или Pascal компилятором. Рекомендуется Watcom. Где найти? Ну ... можно в Гугле. Или, например, в Гугле :-) Ну, в общем, найдёшь, если захочешь. Весит меньше метра. Как скачаешь - ищи файлик *cpp*.exe (что-то типа w386cpp.exe -точно не знаю), копируй его в диру со скриптом и запускай: cpp.exe [опции] -i=[путь к папке headers] имя_скрипта.ssl Опции спрашивай у кого другого :-) На выходе получишь какой-то файлик (если всё прощло успешно). Его уже можно компилировать. Обычно для избавления от рутины пишут bat-ник.
|
Отправлено: 6:48 - 19 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
У меня все равно пара проблем: Во-первых, я никак (ну ника-а-а-ак) не могу найти препроцессор. Есть огромная куча инфы, тысяча документаций, миллион форумов, но я нигде не нашел его (может я не там искал)?! Кстати, у меня есть Visual C++ 5.0. Правда он какой-то Microsoft Developer Studio. Я и там тоже не нашел препроцессор (может я не там искал)?! Во-вторых, я так подумал немного, и , мне кажется, что если он (F-GECK) не использует без препроцессора #include и #define во2обще, то я так думаю у меня не должна была перестать вылезать ошибка с "replyем", а она (???) перестала вылезать, когда я написал вместо "replyя" "gsay_reply", хотя в принципе, раз она не понимает #include, то она должна была написать, что она не знает, что такое "gsay_replay", потому, что он определяется в сommand.h, а она не может к нему обратиться! Но легче мне от этого не стала, потому, что она не понимает, что такое dude_is_male, хотя в сommand.h и в других скриптах эта штука используется! МОЖЕТ, Я ОПЯТЬ ЧЁ-НИБУДЬ НЕ ДОДЕЛАЛ?!?!?! (Отредактировал(а) GaroldPredator - 17:21 - 19 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:20 - 19 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
2Raven А затем пользоваться именно той прогой... вот у меня прога ruby... и нормально все перегоняется из int в ssl... и обратно... И в F-GECK открывается... и в блокноте.. Может это проги разного назначения? Т.к. НИЧЕГО не понимаю в скриптах... но надеюсь когда FScript-HowTo докропается... то ситуация изменится...
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 17:33 - 19 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
2 Tim Можно поинтересоваться вопросом? А где ты Ruby достал, ась?
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:47 - 19 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
Скачал где-то... не помню... могу на мыло кинуть... Надо?
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 19:06 - 19 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
2 Tim Буду очень признателен... В смысле, давай! Мыло такое: hunter199090@mail.ru Заранее Thank you! (Отредактировал(а) GaroldPredator - 19:34 - 19 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 19:33 - 19 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
2GaroldPredator Догадался ридми почитать и нашел сайт с которого его скачать можно: http://www.dm4lab.to/~usa/ruby/index_en.html Но там столько версий.... у меня 1.6.8 И весят они... И фиг знает что качать... Кот. у меня весит 741Кб... Может это спец. версия как раз для Фолла... Подождем пока кто-нибудь скажет что да как... иль слать...?
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 20:24 - 19 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
2 Tim Я щас нашару ткнул одну, которая весит побольше! Может, как докачается напишу!
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 22:15 - 19 Апр., 2004
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Препроцессор watcom лежит здесь (849K). Прога F-GECK не имеет никакого отношения к компиляции скриптов. При нажатии кнопки "Компилировать" она передаёт имя скрипта BAT-файлу compiler.bat в котором должны быть прописаны пути к препроцессору, компилятору и папке назначения для выходящих из компилятора int-файлов. Декомпилятор Ruby действительно создаёт файлы ssl, но это не файлы компилятора BIS, и приниматься этим компилятором они естественно не будут. Там и названия команд другие и формат скриптового языка отличается.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 0:13 - 20 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Garold Грубо говоря, есть два типа команд: 1. Встроенные команды 2. Макросы Встроенные команды прошиты в движке, их не нужно нигде объявлять дефайном или подключать include-ом какие-либо файлы. Если в скрипте используются встроенные команды - то препроцессор не нужен, компилятор обойдётся и без него. Макросы - это сокращения/дополнения встроенных команд. Например, тебе часто приходитя использовать встроенную команду obj_name(dude_obj) - т.е. выводить Имя Чузена. Вместо этого ты можешь написать #define pl_name obj_name(dude_obj) и использовать pl_name, но теперь тебе понадобится препроцессор. Выдержка из "сырого" HowTo (гл. 2): ------------------------------------------------------------- До запуска компилятора выполняется ещё одна программа - препроцессор. Он ищет так называемые "директивы препроцессора" и выполняет их. Узнать директиву легко - она начинается с символа #. Есть два основных типа директив - #define и #include Директива #define делает замену (по всему тексту программы) своего первого параметра вторым. Например: #define ONE 1 #define TWO 2 заменит все слова ONE в тексте на 1 и слова TWO на 2. (ONE < TWO превратится в 1 < 2) Директиве #include в качестве параметра передают имя файла - и она "вставляет" весь этот файл в скрипт - как раз в то самое место, где написана директива. Например #include "c:\text.txt" будет заменено на содержимое файла c:\text.txt. Но на разных компьютерах файлы могут лежать в разных каталогах. Для того, чтобы в таких случаях не пришлось переписывать все директивы во всех скриптах - используют относительные имена. Т.е. мы просто просто пишем #include <text.txt> и вызываем препроцессор с флагом -I c:\ - теперь все свои параметры для директивы #include препроцессор будет искать в "c:\". ------------------------------------------------------------- Файлик command.h как раз и содержит большую часть этих макросов. Например, макрос dude_is_male выглядит так (всё из command.h): #define dude_is_male (dude_gender == GENDER_MALE) В свою очередь есть макрос: #define dude_gender (get_critter_stat(dude_obj,STAT_gender)) , а в файле define.h раскрывается смысл переменных GENDER_MALE: #define GENDER_MALE (0) #define GENDER_FEMALE (1) Если мы "развернём" макрос dude_is_male, то получим: get_critter_stat(dude_obj,STAT_gender) == 0 , где get_critter_stat - это встроенная команда, а dude_obj - указатель на Чузена (т.е. команда применяется по отношению к Игроку. Если Elder - указатель на старейшину, то get_critter_stat(Elder,STAT_gender) вернёт пол старейшины). Все "переменные", написанные ПРОПИСНЫМИ буквами представляют из себя define-ы (напр. GENDER_MALE). Т.е. STAT_gender - это тоже define. Смотрим в define.h: #define STAT_gender (34) В конце концов получаем, что dude_is_male это тоже самое, что и get_critter_stat(dude_obj,34) == 0 Если ты заменишь все dude_is_male в тексте на get_critter_stat(dude_obj,34) == 0 - то препроцессор тебе не понадобиться. Мало того, что последняя строчка длиннее, так она ещё и непонятней. Вот для избежания таких непоняток и исполбзуют препроцессор. to Tim and Garold Вы давайте-давайте - спрашивайте всё, что не понятно. Чтоб я знал какие вопросы возникают у новичков. И вам польза, и я буду знать что в HowTo писать :-)
|
Отправлено: 6:23 - 20 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Сам ты новичок! Я просто проверял знаешь ты это или нет! Да ладно, на самом деле, типо, спасибо! (Добавление от 15:33 - 20 Апр., 2004.) 2 VSEM У меня всё равно какая-то фигня: Когда пытаюсь сделать препроцессинг, watcom находит ошибки в некоторых заголовочных файлах: ScenePid.h, Party.h и т.д и т.п. А если их удалить, то пишет, что нужно их загрузить, потому, что к ним обращается command.h. Как быть?
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 15:01 - 20 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
Объясните какие надо вводить команды... если нет watcom то все ясно... а если есть... что compile больше не нужен... напишите плиз на примере... куда девать папку HEADERS... куда watcom и главное что писать в ком. строке.... То разобраться не могу...
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 16:36 - 20 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
2 Tim Смотри, Тимищще! Во-первых, ты уже, я надеюсь, написал скрипт? Если да, и если у тебя стоит этот самый watcom (будь он неладен), то запихиваешь его (каталог c_nt) в папку fallout2mapper\scripts и потом запихиваешь в папку c_nt\binnt файл command.h (который живёт в каталоге headers). Дальше (желательно в volcov commandere или в любом другом менеджере, где можно посмотреть, что пишет файл после его запуска) заходишь в каталог binnt и в коммандной строке пишешь: wcc386.exe (или wcc.exe, по мне, так безра -i C:\fallout2\fallout 2 mapper \scripts\название скрипта.ssl. Все бы хорошо, но после этого всего нужно еще что-то сделать, потому, что она (или он) пишет у меня ошибки в других *.h файлах и нифига не компилирует! ВОТ!!! (Отредактировал(а) GaroldPredator - 17:27 - 20 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:23 - 20 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
1. Переименовываем wcc386.exe в cpp.exe 2. Кладём cpp.exe в Mappers\Scripts\Tools 3. Кладём свой скрипт в Mappers\Scripts\New 4. Создаём файл comp.bat. Пишем в него: --------------------------- @echo off REM Впиши свои пути set MP="C:\Fallout2\Mapper\Scripts" set FP="C:\Fallout2\Data\Scripts" ..\Tools\cpp.exe -i=%MP%\Headers /w /pc /fo=%1.i %1.ssl %MP%\Dos4Gw.exe %MP%\compile.exe %1.i copy %1.int %FP% ----------------------------------- Примитив, конечно, но работать должно. Теперь для компиляции скрипта my_script.ssl: 5. Запускаем консоль, переходим в Mapper\Scripts\New 6. Пишем: comp my_script т.е. без расширения. 7. Если компилер выдаст ошибку на строке xxx - открывай my_script.i и смотри строку xxx. Как поймёшь причину - исправляй её в my_script.ssl и запускай опять. 8. Можно сделать comp_my_script.bat: comp.bat my_script и компилировать всё дабл-кликом.
|
Отправлено: 9:01 - 21 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Никто не знает, как в диалоге в реплику Чузена или в реплику NPC вставить имя Чузена? P.S. 2 Raven Спасибо, нормально откомпилировал свой скрипт! Правда, он всё ещё не работает, но это скорее всего мои ошибки!
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:24 - 21 Апр., 2004
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
>> Никто не знает, как в диалоге в реплику Чузена или в реплику NPC вставить имя Чузена? Очень просто: obj_name(dude_obj)
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:22 - 21 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Никто не знает, как в диалоге в реплику Чузена или в реплику NPC вставить имя Чузена? Чуть более подробно: Допустим, ты хочешь чтобы NPC говорил "Привет, Имя_Чузена. Как дела?" В скрипте пишешь: Reply("Привет, "+obj_name(dude_obj)+". Как дела?"); Если хочешь делать через msg-файл, то всё усложняется. Ты ведь не знаешь как подключать msg-шки к игре? Тогда слушай. 1. В начале скрипта пишешь: --------------------------------------- #define NAME 1304 //Можно больше, но не меньше ... Reply(mstr(xxx)+obj_name(dude_obj)+mstr(yyy)); ... --------------------------------------- 2. Потом создаёшь msg-файл - имя_скрипта.msg (формат, я думаю, понятен?). Пишешь туда: --------------------------------------- ... {xxx}{}{Привет, } {yyy}{}{. Как дела?} ... --------------------------------------- 3. Потом открываешь Data\Text\English\Game\scrname.msg Добавлешь строчку: --------------------------------------- {1404}{}{Имя_NPC}# имя_скрипта.int ; Описание_NPC --------------------------------------- При вызове obj_name(self_obj) или просто взгляде на этого NPC будет выдаваться именно Имя_NPC Соответственно, если писал #define NAME 1305 здесь пишешь {1405} и т.д. 4. Теперь надо добавить в игру сам скрипт. Открываем Data\Scripts\Scripts.lst. Добавляем последней строкой: --------------------------------------- имя_скрипта.int ; Описание_скрипта # local_vars=0 --------------------------------------- Про local_vars потом. Пока пиши 0. После добавления строки не жми Enter (т.е. не добавляй пустой строки) - иначе в мапере появятся баги - не серъёзные, но неприятные. 5. Уф. Вроде всё. Радует, что эту процедуру не надо повторят при перекомпиляциях - один раз добавил строчки и всё. 6. Можешь открыть мапер, добавить критера и привязать ему свой скрипт. Выбрал, E,S, выбрал свой скрипт, Esc, F8 - можно тестить. Вставить имя во варианты ответа можно точно так же. И напоследок. Пример работающего скрипта с диалогом: ------------------------------ #define NAME 1304 #define My_Option(x,y) gsay_option(NAME,x,y,-1) #include <command.h> procedure start; procedure talk_p_proc; procedure NodeBegin; procedure NodeEnd; procedure start begin end procedure talk_p_proc begin Start_gDialog(NAME,self_obj,-1,-1,-1); GSay_Start; call NodeBegin; GSay_End; End_Dialogue; end procedure NodeBegin begin Reply("А, "+obj_name(dude_obj)+". Приятно познакомиться, я "+obj_name(self_obj)+"."); My_Option("Извини, "+obj_name(self_obj)+", мне некогда",NodeEnd); end procedure NodeEnd begin end ------------------------------ Спрашивай о том, что не понятно. По идее, из предыдущих постингов ты должен здесь почти всё знать. Процедуры смотри в доке от fgeck`а. В качестве Д/З :-) 1. Добавь скрипт в игру. 2. Сделай вызов сообщений ч/з msg-файл Млин, все точки с запятыми в смайлы превратились.... Отключаем. (Отредактировал(а) Raven - 12:27 - 22 Апр., 2004)
|
Отправлено: 5:24 - 22 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Между прочим, я не такой глупый, кк ты думаешь! Конечно, я ЧАЙНИК, но не настолько же! Я знаю про MSG-шники и использую этот самый NAME! НО конечно без этого форума и умных людей, которые в нём сидят я бы не справился! ТАК ЧТО, СПАСИБО! З.Ы. Скрипт в игру я уже добавил, работает отлично (за исключением имён, щас буду пробовать)! (Отредактировал(а) GaroldPredator - 15:53 - 22 Апр., 2004) (Добавление от 16:04 - 22 Апр., 2004.) Про эти самые local_vars!!! Я хочу сделать так, чтобы после определённой фразы Чузена, на неё реагировал не только self_obj, но и другие объекты! Например Я посылаю охранника на три буквы, и вся охрана атакует меня. Как это сделать?
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 15:31 - 22 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Garold No offence. Мой пост был формально обращён к тебе, но ведь на форуме есть и другие люди, которых это может заинтересовать. В идеале форум должен стать базой знаний. Т.е. новички должны спрашивать, остальные им отвечать. Потом на базе этих постов составляется FAQ. Потом FAQ плавно перетекает в How-To - доки. Так что если я пишу что-то, что ты уже знаешь - просто не читай. Но если новичок задаст такой вопрос, скажи ему "Была уже такая тема. Поищи в Тех. Поддержке". Теперь содержательная часть. >>Я посылаю охранника на три буквы, и вся охрана атакует меня. Как это сделать? Вариантов много: 1. Можно забрить всю охрану в одну команду. Team прописывается в свойствах критера в Mapper`е. Тогда в скрипте одного из охранников в одной из веток диалога вызываешь attack - и вся команда NPC-ей атакует чуза. 2. Завести MVAR_say_fuck и вставить в скрипты всех охранников, например, такой кусок: --------------------- 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) 3. Самый извращённый способ - делать это ч/з импорт/экспорт указателей. В скрипте каждого из нужных криттеров пишем: --------------------- export variable ptr_npc_xxx; procedure start begin ptr_npc_xxx:=self_obj; end --------------------- В скрипте карты, на котрой всё расположено, пишем: --------------------- import variable ptr_npc_xxx; import variable ptr_npc_xxy; import variable ptr_npc_xxz; ... --------------------- В скрипте критера, с которым будет говорить Чуз, пишем тоже, что и для карты: --------------------- import variable ptr_npc_xxx; import variable ptr_npc_xxy; import variable ptr_npc_xxz; ... procedure Node_Say_Fuck begin attack_setup(ptr_npc_xxx,dude_obj); attack_setup(ptr_npc_xxy,dude_obj); attack_setup(ptr_npc_xxz,dude_obj); end --------------------- Муторно, конечно, - зато ты полностью контролируешь кто конкретно и при каких случаях будет атаковать игрока. (Отредактировал(а) Raven - 14:15 - 23 Апр., 2004)
|
Отправлено: 6:54 - 23 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Цитата:
Между прочим, я не такой глупый, кк ты думаешь! Конечно, я ЧАЙНИК, но не настолько же! Я знаю про MSG-шники и использую этот самый NAME!
Извиняюсь, был не прав, исправлюсь!
Цитата:
Я посылаю охранника на три буквы, и вся охрана атакует меня. Как это сделать?
Насчет охраны я просто пример привел! Я имел ввиду, что мне нужно, чтобы на меня реагировал не только персонаж с данным скриптом, но и другие криттеры. Насколько я понимаю, это пункт 2 в твоем сообщении:Завести MVAR_say_fuck. Я правильно понял? (Отредактировал(а) GaroldPredator - 18:17 - 23 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 16:42 - 23 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
2GaroldPredator Спасибо что выслал что я просил... 2All Ну блин я уже запарился с этими скриптами... ну блин некомпилится и все тут... Так, поставил Фолл на C:\Fallout2 Мэппер C:\Fallout2\Mapper Создал в папке C:\Fallout2\Mapper\scripts папку tools положил туда файлы: wcc386 wcc wccd386.dll wccd.dll Создал в C:\Fallout2\Mapper\scripts папку new, положил туда скрипт XSComp.ssl(работает у GaroldPredator'a ) Создал файл с расширением comb.bat .... @echo off set MP="C:\Fallout2\Mapper\Scripts" set FP="C:\Fallout2\Data\Scripts" ..\Tools\wcc386.exe -i=%MP%\Headers /w /pc /fo=%1.i %1.ssl %MP%\Dos4Gw.exe %MP%\compile.exe %1.i copy %1.int %FP% Положил его в C:\Fallout2\Mapper\scripts\NEW В ком. строке зашел в папку new написал comb XSComp Получаю: Watcom запустился... Error! E1073: invalid option '-i="c:\fallout2\mapper\scripts\"headers' потом запустился DOS/4GW и DOS/4GW fatal error (1007): can't find file \DOS4GW.EXE to load Еще если wcc386.exe переимен. в cpp.exe тогда он не нах. свою библиотеку... В итоге создается файл XSComp.i (весит 143кб) ЛЮДИ ПОМОГИТЕ!!! Я уже начинаю сильно нервничать... Винда XP........
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 19:36 - 24 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Не психуй. Для начала, нужно переименовать wcc386.dll в cppd.dll тогда watcom станет ее видеть. Дальше, XSComp.i - это файл, в котором все includы переделаны в заголовочные файлы, а все definы уже заменены (в смысле: #define one two исчезает и пишется вместо one , two). А весит этот файл до дури, потому, что в *.h куча комментариев, которые она (watcom) благополучно пишет у тебя в скрипте (ЗАРАЗА!). *.i открывается всем, чем угодно: хоть f-geckом, хоть блокнотом. Далее, нужно откомпилировать *.i в *.int, для этого нужны dos4gw и compile.exe. В принципе, в обычной коммандной строке dos4gw почему-то не работает (в windows commander, в пуск\выполнить). НО ЗАТО ОН ПОЧЕМУ-ТО РАБОТАЕТ В VOLCOV COMMANDERе! Я лично нормально компилирую скрипты ТОЛЬКО в VC! Вывод: или нужно всем дружно преобретать VOLCOV COMMANDER, или компилятор работает во многих других менеджерах! P.S. В DOS-е же он работает, ведь так?! P.P.S. to Tim Я забыл, я тебе msg-шник кинул на мыло или нет!? P.P.P.S. Надеюсь, ты в каталог new comp.bat, dos4gw.exe и compile.exe кинул?! P.P.P.P.S. Кстати, ты знаешь,что дефайн учитывает регистр, т.е. One и one не одно и тоже!
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 20:51 - 24 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
2GaroldPredator 1) Msg-шник кинул... 2)Взял твой bat, только пути поменял @echo off set MP="C:\Fallout2\Mapper\scripts set FP="C:\Fallout2\data\Scripts ..\Tools\cpp.exe -i=%MP%\Headers /w /pc /fo=%1.i %1.ssl Dos4Gw.exe compile.exe %1.i copy %1.i %FP% 3)Положил в new Dos4Gw.exe compile.exe 4)Переименовал wccd386.dll в cppd.dll wcc386.exe в cpp.exe 5) В Volkove зашел в папку new и написал comp xscomp 6) Пишет что недостаточно памяти для переменных среды Environment Ватком выдает ERROR E1138 Filename required on command line... P.S.Даже файл с расшир *.i не создается так... И заметь у тебя в bat ковычки только в начеле пути... а у Raven пути выдел. в ковычки... Не ну если файл с расш. i получился.... ватком пашет? И осталось только Dos4Gw.exe compile.exe? Значит дело в этом? Может 98виндоз поставить... Не ну я щас повешусь....
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 23:38 - 24 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Tim Пути надо ставить в кавычки только если они содержат пробелы. Т.е. в том батнике, который был в моём посте они не нужны. Но если ты напишешь set FP=C:\Program Files\BlackIsle\Fallout2\Data то у тебя вылезет cannot find C:\Program или что-то подобное. Проблемы с DOS4GW скорее всего вызваны отсутствием DOS в WinXP. Я XP не трогал никогда и ничего конкретного сказать не могу. Попробуй поиграть с режимами совместимости. Если есть возможность - поставь 98 (95, чистый DOS) рядом. В Win2000 все работает. Ещё попробуй просто закинуть dos4gw и compile в диру со скриптом, запустить cmd.exe, перейти в эту диру и просто напечатать dos4gw compile имя_скрипта.ssl Если будет таже ошибка - значит дело точно не в батнике а в Оси. Про переименовывание wcc в cpp - я ж это просто для удобства и большей логичности делал :-) Это совсем не обязательно. Кстати, по поводу Error! E1073: invalid option '-i="c:\fallout2\mapper\scripts\"headers' Ошибка, скорее всего - это кавычки перед и после c:\fallout2\mapper\scripts\ Поменяй set FP="C:\Fallout2\Data\Scripts" на set FP=C:\Fallout2\Data\Scripts Моя версия Ватки таких ошибок не выдавала... to Garold Да, скорее всего тебе проще завести вару. Но, опять же, если группу критеров можно объеденить в один team в мапере - то можно и так. Если хочешь облегчить *.i файл - воспользуйся програмкой grep. Она вырезает из файла строки, совпадающие с определённым шаблоном. Например, ты хочешь вырезать из файла все пустые строки и строки, начинающиеся с # (i.e. #line 21). Пишешь что то типа (зависит от производителя grep`а): grep ^[A-Za-z_0-9]* имя_исходного_файла > имя_конечного_файла Т.е. ты вырезаешь все строки начинающиеся со строчных или прописных букв, цифр или знака подчёркивания и пишешь их в другой файл. Ничего лишнего. Очень удобно. Хороших версий grep`а под винды нет. Всё хорошее такого рода - в юнихах :-) Но есть порты юниховых утилит под вынь. Я пользуюсь подсказанным Абелем msys`ом. Весить 2,5 мега, взять можно здесь: http://www.mingw.org/msys.shtml Тыкнешь там в Files и выбери msys package (не gcc, binutils или что-то подобное, именно msys) - имя файла MSYS-1.0.11-2004.03.30-1.exe Когда распакуешь - получишь кучу утил, в т.ч. и grep. Скопируй msys.dll из Msys\bin\ в winnt\system32, grep в mapper\scripts\tools - и можно использовать его в батниках.
|
Отправлено: 6:40 - 25 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
2 Raven Насчет охраны я привел просто не существующий пример, так что не надо зацикливаться на ней. Если хочешь на чём-то зациклиться, вот НАСТОЯЩИЙ пример: Я поболтал с компом, и в зависимости от ответа, на меня или нападают турели на нескольких локациях, или комп дает мне несколько предметов. С предметами я разобрался, а вот с турелями не догоняю. Здесь ведбь надо использовать GVAR, потому, что несколько локаций с турелями, так? Кстати, у меня не работают эти самые GVAR, MVAR и LVAR. Наверное что-то не доделываю... Подскажи, ПЛИИЗ!
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 9:12 - 25 Апр., 2004
|
|
Tim
Пользователь
Откуда: Санкт-Петербург Регистрация: Май 2003
Всего: 265 сообщений
|
2All Спасибо всем, разобрался... просто лишние " убрал...
----- Ядерному взрыву - да! да! да! Солнечному миру - нет! нет! нет!
|
Отправлено: 12:41 - 25 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Garold >>Насчет охраны я привел просто не существующий пример, так что не надо зацикливаться на ней. ??? >>Здесь ведбь надо использовать GVAR, потому, что несколько локаций с турелями, так? Да. За примерами смотри Navarro (GVAR_NAVARRO_BASE_ALERT) - там если поднял тревогу - на тебя на всех картах налетают. >>Кстати, у меня не работают эти самые GVAR, MVAR и LVAR. Наверное что-то не доделываю... А как ты скрипты тестишь? Кнопкой F8? Тогда GVAR у тебя вообще не заработают. В Мапере во время тестинга не работают GVAR (MVAR вроде бы тоже - точно не знаю), timed events и ещё по мелочам. Поэтому тестить надо в Фоле. По CTRL+R тестить тоже не получится - там вообще ничего кроме дверей не обрабатывается. Поэтому вначале надо тестить скрипты на artemple.map а потом переносить их в нужную локацию. Можно сделать сейв рядом с нужным местом. Но если ты менял число GVARs (i.e. добавил квест) - сейвы работать перестанут! Самая надоедливая недоработка...
|
Отправлено: 2:12 - 26 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Все равно не работает! Пли-и-и-из, объясни все конкретно и приведи пример!
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:28 - 26 Апр., 2004
|
|
Gatling
Пользователь
Откуда: БОМЖ Регистрация: Февр. 2004
Всего: 115 сообщений
|
А не проще ли комунибудь выложиь батник, и не мучатся... Батник с пояснением...
----- "Гизмо...Гизмо-кака!" Gremlin.
|
Отправлено: 19:27 - 28 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
По многочисленным просьбам :-) Использование GVARs. GVARы нужны для сохранения информации, которая должна быть доступна из разных локаций. Если вы хотите, чтобы действие персонажа на одной локации (скажем, убийство мэра в западной части города) влияло на объекты, расположенные в другой локации (отношение NPC к Чузену в восточной части города), то вам не обойтись без использования GVARs. GVAR - это 32-битная переменная (т.е. она способна хранить значения от 0 до 4.294.967.296). Всего GVARs в Фолауте 695 штук. Из них свободны (зарезервированы разработчиками ) 60 (на самом деле больше, т.к. есть неиспользуемые GVARs - напр. репутация игрока в локациях Abbey, EPA и т.д., которые не вошли в игру. Их можно использовать для своих нужд). Все GVARs сохраняются в сейв-файле (причём, дважды). В скриптах GVARs принято обозначать с помощью префикса GVAR_. Значения GVAR устанавливаются с помощью процедуры set_global_var(имя_переменной,значение) Читаются с помощью global_var(имя_переменной) Объявления глобальных переменных (т.е. сопоставление define-сокращений номерам переменных) производятся в файле headers\global.h. Как понятно из названия, любая глобальная переменная может быть прочитана/установлена из любого скрипта без каких-либо предварительных действий. GVARs не работают в Мапере, проверить их работу можно только в самой игре. Приведём пример скрипта, использующего GVAR (для случая Garold`а). Сделаем подобие псионика-супер-мутаната с заброшенной военной базы. Т.е. у нас должны быть Pet Master и Pets. В роли Pet Master возьмём Клинта, в качестве Pets - 2-3 крыс (чтобы игрок мог отбиться в начале игры). Напишем скрипты petmaster.ssl и pet.ssl (листинги см. ниже). Скомпилируем, пропишем в scripts.lst. Откроем в Мапере artemple.map, поменяем Клинту скрипт на petmaster.int, добавим пару крыс со скриптом pet.int. Сохраняем artemple. Открываем arcaves, размещяем там несколько криттеров (крыс или муравьев), также со скриптом pet.int. Сохраняем. Запускаем игру. Начинаем новую, берём чара. Бродим рядом с крысами - они ничего не делают. Оскорбляем Клинта-Мельхиора - вуаля! Быстро-быстро убегаем. Листинги скриптов: petmaster.ssl -------------------------------------------- //Стандартные инклюды #include <command.h> #include <define.h> //Для хранения нашей вары мы будем использовать одну из незанятых вар в Фоле: //#define GVAR_TOWN_REP_ABBEY (63) #define GVAR_say_fuck (63) //Для простоты #define Option(x,y) gsay_option(-1,x,y,-1) //Для использования макроса Reply. Можно указать любое число, т.к. мы не используем msg-файл #define NAME 1407 //Объявления процедур procedure start; procedure talk_p_proc; procedure Node_Begin; procedure Node_Attack; procedure Node_End; procedure start begin end procedure talk_p_proc begin start_dialogue(self_obj,-1); gsay_start; call Node_Begin; gsay_end; end_dialogue; end procedure Node_Begin begin Reply("Hello, Chosen One."); Option("Fuck off, motherfucker.",Node_Attack); end procedure Node_Attack begin Reply("My mighty pets! Attack this creature! [He points at you]"); set_global_var(GVAR_say_fuck,1); Option("O-ops",Node_End); end procedure Node_End begin end -------------------------------------------- pet.ssl -------------------------------------------- #define GVAR_say_fuck(63) procedure start begin end procedure critter_p_proc begin //Примитивный вариант. Желательно устанавливать LVAR_Hostile флаг. if global_var(GVAR_say_fuck) and obj_can_see_obj(self_obj,dude_obj) then attack(dude_obj); end -------------------------------------------- (Отредактировал(а) Raven - 14:19 - 29 Апр., 2004)
|
Отправлено: 7:03 - 29 Апр., 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
Где можно посмотреть какими значениями иницализирутся LVAR для определенного скрипта?
|
Отправлено: 16:04 - 29 Апр., 2004
|
|
Gatling
Пользователь
Откуда: БОМЖ Регистрация: Февр. 2004
Всего: 115 сообщений
|
Наверно в самих скриптах... (Добавление от 19:07 - 29 Апр., 2004.) Кстати, кто и как диалгои делает? Подскажите...
----- "Гизмо...Гизмо-кака!" Gremlin.
|
Отправлено: 18:14 - 29 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
to Gatling Во-первых: Между прочим, твой скрипт уменя НЕ РАБОТАЕТ!!! Во-вторых: Ещё раз между прочим, я научился использовать GVARы ПО ДРУГОМУ!!! Теперь я буду работать с этими переменными только через БИТЫ!!! всё очень просто, нужно просто создать свой хеадер и прописать в нём пару строчек. Как ты уже сам сказал, в GVARе 32 БИТА, то есть, 32 квеста в каждом GVARе (в смысле 32 простеньких квеста: не сделан, сделан)!!!!!! Упс, загон! Пршу прщения, но не to Gatling, а to Raven! Так, я думаю будет правильнее! (Отредактировал(а) GaroldPredator - 17:31 - 30 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 20:50 - 29 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Garold По поводу битов: молодец, растёшь. :-) Я использовал битовую запись в LVARы при написании скрипта игры в пятикарточный покер на троих. В 6 LVAR-ов удалось запихнуть почти 100 переменных - информацию о наличии/отсутствии в колоде каждой из 52 карт, информацию о картах на руках у каждого из трёх игроков, информацию о наличии комбинаций у текущего игрока. Возможно, ты видел мой постинг с вопросом о структуре save-файлов. Мы с Абелем продолжили разговор по почте. И буквально два дня назад я предложил ему идею побитовой записи в неиспользованные в игре, но прописанные в vault13.gam GVARы. В три GVARы можно записать 90 битовых (1/0) значений, т.е. информацию о 45-ти небольших простых квестах (1/0 - взят/не взят, 1/0 - выполнен/не выполнен). Для квестов с многочисленными исходами или временным лимитом потребуеться, конечно, больше битов - но ведь и свободных GVARов, если поискать, можно найти побольше. Причём тут сейвы? Дело в том, что при добавлении нового квеста (и, соответственно, новых GVARs) в игру необходимо занести GVARы в файл vault13.gam. Все GVARы оттуда пишутся в сейв-файл. И сейвы становятся несовместимыми. Но если мы пишем в вары прописанные в vault13.gam, но не используемые в игре - то сейвы будут совместимы! А побитовая запись позволяет записать в несколько варов большое количество информации. Т.е. если разработать соответствующее API (в виде процедур побитовой записи) и задокументировать соответствующие свободные вары - то можно будет делать полноценные моды, совместимые с сейвами оригинального Фола (а при договорённости между модерами об использовании разных GVARs - и совместимые между собой моды!). Представь себе - выходит новый оружейный мод. Меняет в основном стволы, добавляет квестов, сейвы не совместимы. Что ты будешь делать? Начинать играть по новой? А так - загрузил свой СТАРЫЙ сейв и наслаждаешься НОВЫМ оружием и предметами... Такой подход не потребут перекомпиляции оригинальных скриптов из Фола или подобных трудоёмких операций. Авторы новых модов - возьмите на заметку. К сожалению, реализовать такое в "Новом Взгляде" мы уже не успеем :-( Но "Новый Взгляд" как раз и предполагает пролхождение игры с самого начала. Теперь, по традиции, полезная часть. Два куска кода из моего покера с реализацией побитовой записи/чтения (я использовал LVAR, а не GVAR - но никакой разницы, как понимаете, нет). О-о-чень рекомендую уж если не изучить код - то ознакомиться с комментариями. ----poker_bits.ssl---- //Работа с битовыми массивами ( в смысле, с LVARS :-) //Возвращает 1/0 - есть/нет карта с UID x (1-52) в колоде //Возвращат значение бита x из одной из двух пременных, отведённых под колоду procedure get_deck(variable x) begin if (x < 31) then return lvar_bit(LV_DECK1,pow(2,x-1)); else return lvar_bit(LV_DECK2,pow(2,x-31)); end /* lvar_bit(x,2^y) - возвращает значение бита номер y из переменной x Для использования процедуры очень желательна ф-ия возведения в степень pow(x,y) - возвращает x^y */ <...> //Для работы с .. гм .. руками. //Процедура записывает число от 1 до 52 в переменную hand (hand хранит значение LVAR руки текущего игрока) //для представления числа 52 необходимо 6 бит, т.е. в переменную записывается пять блоков по 6 бит //num определят смещение tmp для записи значения карты номер num (1-5) //--------------------------------------------------- procedure set_hand(variable num,variable value) begin variable i:=5;variable tmp;variable tmp1:=32; tmp:=6*num-1;//6*(num-1)+(5-i); while i>=0 do begin if value/tmp1!=0 then begin set_lvar_bit_on(hand,pow(2,tmp-i)); value-=tmp1; end else set_lvar_bit_off(hand,pow(2,tmp-i)); tmp1/=2; i-=1; end end /* to Garold Принцип работы процедуры set_hand на примере. Пусть мы хотим записать в hand информацию о том, что карта номер 4 в руке имеет номер 51. num:=4;value:=51;tmp1:=32; tmp:=23; Первый проход цикла: Срабатывает условие if (51 больше-равно 32) - мы устанавливаем бит номер tmp-i=23-5=18 - первый в 4-ом 6-и битовом блоке. value=51-32=19 tmp1:=tmp1/2=16; i:=4; Второй проход: if (19 больше-равно 16) == true => устанавливаем второй бит в блоке value:=3;tmp1:=8;i:=3; Третий проход: if ( 3 больше-равно 8 ) == false => третий бит в 0 value:=3;tmp1:=4;i:=2; Четвёртый проход: if ( 3 больше-равно 4 ) == false => четвёртый бит в 0 value:=3;tmp1:=2;i:=1; Пятый проход: if ( 3 больше-равно 2 ) == true => пятый бит в 1 value:=3-2=1;tmp1:=1;i:=0; Шестой проход: if ( 1 больше-равно 1 ) == true => шестой бит в 1 В конечном итоге имеем запись 110011 - двоичное значение 51 (вообще говоря, "перевёрнутое") со смещения 18-1=17 В принципе, стандартнаz процедура конвертации dec->bin, только bin записывается задом наперёд */ //Разбери сам (лучше на примере). procedure get_hand(variable num) begin variable i:=0;variable tmp:=0; variable tmp1;variable tmp2:=1; tmp1:=6*num-1; while (i<=5) do begin if lvar_bit(hand,pow(2,tmp1-i)) then tmp+=tmp2; tmp2*=2; i+=1; end return tmp; end <...> ----poker_bits.ssl---- Листинг процедуры pow(x,y) -------- //возведение в степень. x - показатель, y - степень procedure pow(variable x,variable y) begin /* Степени разбиты по категориям для ускорения, т.к. при линейной структуре процедура возврата работает ОЧЕНЬ медленно, не говоря уже об универсальном возведении в степень (см. конец процедуры) */ variable i:=1;variable tmp; if y==1 then return x; if y==0 then return 1; if y==-1 then return (1/x); //Ускоряем возврат степеней двойки. Вплоть до 2^30 //на 2^31 наступает переполнение, мы можем писать/читать только 30 бит в варе if (x==2 and y < 31) then begin if (y<10) then if (y<6) then begin if (y==2) then return 4; if (y==3) then return 8; if (y==4) then return 16; if (y==5) then return 32; end else begin if (y==6) then return 64; if (y==7) then return 128; if (y==8) then return 256; if (y==9) then return 512; end if (y<20) then if (y<16) then begin if (y<13) then begin if (y == 10) then return 1024; if (y == 11) then return 2048; if (y == 12) then return 4096; end else begin if (y == 13) then return 8192; if (y == 14) then return 16384; if (y == 15) then return 32768; end end else begin if (y == 16) then return 65536; if (y == 17) then return 131072; if (y == 18) then return 262144; if (y == 19) then return 524288; end if (y<31) then if (y<26) then begin if (y<23) then begin if (y == 20) then return 1048576; if (y == 21) then return 2097152; if (y == 22) then return 4194304; end else begin if (y == 23) then return 8388608; if (y == 24) then return 16777216; if (y == 25) then return 33554432; end end else begin if (y == 26) then return 67108864; if (y == 27) then return 134217728; if (y == 28) then return 268435456; if (y == 29) then return 536870912; if (y == 30) then return 1073741824; end end tmp:=x; if y>1 then begin while(i<y) do begin tmp*=x;i+=1; end return tmp; end if y<0 then begin while(i<=0-y+1) do begin tmp*=x;i+=1; end return (1/tmp); end end -------- to Garold Если нужен скрипт Покера - пиши на мыло. (Отредактировал(а) Raven - 13:19 - 30 Апр., 2004)
|
Отправлено: 6:14 - 30 Апр., 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
А если без "наверное". Тут, я так понимаю, отвечают на вопросы новичков. Ничего сложного я не спросил, а ответа так и не получил Итак, где можно посмотреть, какими значениями инициализируются LVAR для определенного скрипта. Пример: dclara.ssl Какие значения у переменных LVAR_Home_Tile LVAR_Home_Rotation
|
Отправлено: 10:32 - 30 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Jo Jim Извини за задержку :-) Если явной инициализации нет, то смотри все вызываемые в скрипте макросы (в процедурах start, map_enter, timed_event, critter_p_proc и т.п.) - LVAR инициализируется в одном из них. Т.к. в Фолаутовских скриптах вложенность макросов велика (один макрос может быть надстройкой для другого, который построен на базе третьего и т.д.), то найти точное место инициализации довольно сложно. Для твоего примера. dclara.ssl = Den Critter Lara Следовательно, критер "прописан" в Дэне. Открываем headers\den.h , ищем строчку set_local_var(LVAR_Home_Tile Находим строчку в макросе gang_member_map_enter Теперь открываем скрипт Лары и ищем gang_member_map_enter: ------------------- procedure map_enter_p_proc begin gang_member_map_enter flush_add_timer_event_sec(self_obj, 1, timed_event_float); end ------------------- Т.е. вара LVAR_Home_Tile инициализируется каждый раз при заходе на карту. Там же инициализируется LVAR_Home_Rotation. Вообще говоря, макрос не обязательно будет именно в имя_города.h, лучше делать контекстный поиск по всем файлам в headers. to Gatling А ты пробовал пользовать VDM?
|
Отправлено: 12:28 - 30 Апр., 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
Спасибо, Рэйвен. Очень полезная информация оказалась, но я по- прежнему не могу найти ЗНАЧЕНИЯ которыми, скажем так, заполняются эти переменные. Опишу ситуацию подробнее. После уничтожения банды Тайлера и выхода и боевого режима банда Лары занимает церковь. В версии 1.0 (и в бисовских скриптах) Лара встает на место Тайлера, справа от входа в церковь. В Версии 1.2 Лара располагается внутри церкви вместе со своей бандой. В связи с эти у меня проблема: Действуя по описанной технолонгии, я по-прежнему не могу получить конкретно set_local_var(LVAR_Home_Tile, 23096), например. То есть я не знаю где именно эти значения и чему эти значения, извините за такое выражание, равны! Ведь для каждого скрипта каждого члена банды долже быть свой LVAR - то есть где-то должно быть систематизированное хранилище этих значений.
|
Отправлено: 15:34 - 30 Апр., 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
to Gatling Лично я леплю диалоги прямо в f-Gecke (где найти его, смотри в начале), а чтобы не запутаться, перед каждой процедурой добавляю комментарии! vsem ostalьnыm Я собственно зачем пришёл? Ах, да, хочу спросить! Я добавил несколько скриптов (XSCOMP.INT, XSCOMP1.INT, XSCOMP2.INT), причём XSCOMP2.INT последний. Когда я пытаюсь привязать эти скрипты к объектам, привязывается почему-то только последний! Если в списке выбора скриптов тыкать первый или второй, всё равно выбирается последний!!! Что делать?! (Отредактировал(а) GaroldPredator - 17:41 - 30 Апр., 2004)
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:39 - 30 Апр., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Garold Посмотри наличие/отсутствие в Scripts.lst пустых строк. Поменяй табы на пробелы во всех самостоятельно вписанных строках. Просмотри scripts.lst в различных текстовых редакторах. Т.е. проблема возникает из-за несоблюдения формата scripts.lst to Jo Jim Ответ уже готов. В голове. Перевожу в текстовый формат - как закончу - сделаю пост.
|
Отправлено: 3:25 - 1 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Jo Jim Если тебе нужен только ответ - смотри в конец поста. Если хочешь понять, как я его нашёл - смотри ход мысли с самого начала. Итак, мы ищем координаты хексов на которые встают члены банды Лары после боя с бандой Тайлера. Начнём с начала. Ищем в dclara.msg номер строки, начинающей атаку на Тайлера: ---dclara.msg line:158--- {490}{}{I don't think so. You'll have to come with us if you want your money. You won't have to fight but just to be sure it's not a trap. We'll give you $300 total.} {491}{}{You ready?} {492}{}{Okay, let's do it.} <--- То, что нам надо. ------------------------- Ищем номер 492 в dclara.ssl: ---dclara.ssl line:450--- NOption(492, Node990, 004); ------------------------- Ищем Node990: ---dclara.ssl line:277--- procedure Node990 begin setup_gang_fight; end ------------------------- Открываем den.h и изучаем макрос setup_gang_fight: ---den.h line:583--- <...> set_gangwar(state_gangwar_in_fight); <--- устанавливает GVAR_DEN_GANGWAR=state_gangwar_in_fight <...> load_map(MAP_DEN_BUSINESS,0) <--- грузим карту denbus2.map (см. -------------------- Открываем maps\denbus2.ssl и видим следующее: ---denbus2.ssl line:58--- procedure map_enter_p_proc begin <...> if (gangwar(state_gangwar_in_fight)) then begin override_map_start_hex(21945,0,2); <--- закидываем Чузена поближе к церкви <...> ------------------------- Одновременно у всех критеров из банды Лары срабатывает map_enter_p_proc. Это просто вызов макроса gang_member_map_enter из den.h. Смотрим только те ветки if-ов, которые срабатывают для gang2, т.к. у Лары в скрипте написано #define self_gang gang_2 Итак, смотрим: ---den.h line:798--- <...> end else if (self_gang == gang_2) then begin if (NAME == SCRIPT_DCLARA) then gang_2_member_1 := self_obj; <...> end -------------------- Здесь переменные вида gang_x_member_y заполняются указателями на членов банд. Для Лары и Марка всегда y:=1, для остальных - как придётся. Эти вары импортируются в скрипте Лары и остальных критеров (про импорт/экспорт можешь прочесть в моём предыдущем посте. Если не поймёшь - спрашивай, объясню подробнее). Дальше: ---den.h line:798--- <...> end if (gangwar(state_gangwar_in_fight)) then begin <...> end else if (self_gang == gang_2) then begin if (gang_trap(state_gang_trap_no)) then begin critter_add_trait(self_obj,TRAIT_OBJECT,OBJECT_TEAM_NUM,TEAM_PLAYER); <...> -------------------- Лара загоняется в команду к игроку. Теперь смотрим gang_critter_p_proc: ---den.h line:777--- <...> if (gangwar(state_gangwar_in_fight)) then begin if (self_gang == gang_2) then begin gang_2_follow_to_attack <...> -------------------- Смотрим gang_2_follow_to_attack -> set_gang_2_follow - видим, что каждому мемберу Лариной банде приказывается долбить мембера опозиционной банды с минимальным номером (начиная с Марка, для которого, как помнишь x:=1). Начинается резня. При убийстве членов gang1 срабатывает dest_gang_member, который обнуляет указатель gang_1_member_x и вызывает dec_gang_counter(self_gang). Когда банда перебита, срабатывает set_gang_1_dead -> set_gangwar(state_gangwar_2won). Всё - война закончилась, Лара победила, все указатели на gang_1_member_x обнулены. Теперь, собственно, ответ на твой вопрос :-) Смотрим gang_map_update_p_proc: ---den.h line:863--- if (local_var(LVAR_Home_Tile) == 0) then begin if (self_gang == gang_2) then begin check_take_home_tile(1) else check_take_home_tile(2) else check_take_home_tile(3) else check_take_home_tile(4) else check_take_home_tile(5) if (local_var(LVAR_Home_Tile) == 0) then begin random_tile_in_box(22340, 22332, 24132, 23940); set_local_var(LVAR_Home_Tile, global_temp); set_local_var(LVAR_Home_Rotation, random(2,4)); end end else begin set_local_var(LVAR_Home_Tile, self_tile); end end -------------------- check_take_home_tile(x) устанавливает LVAR_Home_Tile мембера Лариной банды номер x равному текущему положению соответствующего по номеру мембера банды Тайлера. Когда бой закончен - check_take_home_tile перестаёт работать, а переменным LVAR_Home_Tile присваивается случайное значение из квадрата с координатами (22340, 22332, 24132, 23940) LVAR_Home_Rotation присваивается случайное значение от 2 до 4 включительно. После установки этих значений критер идёт куда надо и поворачивается благодаря следующим строчкам из gang_critter_p_proc: ---den.h line:777--- <...> end else if (self_tile != local_var(LVAR_Home_Tile)) then begin animate_move_to_tile(local_var(LVAR_Home_Tile)); end else if (self_cur_rot != local_var(LVAR_Home_Rotation)) then begin animate_rotation(local_var(LVAR_Home_Rotation)); end --------------------
|
Отправлено: 8:14 - 1 Мая, 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Спасибо, конечно, но я забыл написать, что уже разобрался !
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 9:24 - 1 Мая, 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
to Raven Меня давно мучает такой вопрос: Как воспроизвести анимацию, не используя объект? Т.е, я использую компьютер, и из-за этого где-то открывается дверь. И второй вопрос вдогон: Я нарисовал анимацию опсукания шлагбаума (такого, как в Военной базе). Как мне её привязать к этому шлагбауму. Шлагбаум в закрытом положении. Я использую комп. Вызывается анимация поднимания (или поднятия?) шлагбаума. Шлагбаум в поднятом положении. Как всё это провернуть?
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 17:34 - 1 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Для воспроизведения произвольной анимации используй команду ---------------------------------------------------------- #include <animcomd.h> anim(obj_ptr,anim_index,direction); ---------------------------------------------------------- ,где obj_ptr -указатель на анимируемый объект, anim_index - из списка ANIM_ в animcomd.h, direction - 0-5 Это работает, в основном, для критеров. Для твоего случая этого не надо. Более того, простое проигрывание анимации открытия двери не сделает эту дверь открытой - ты получишь закрытую дверь с анимацией "открытой" двери. Для это лучше использовать процедуру ---------------------------------------------------------- obj_open(obj_ptr); ---------------------------------------------------------- Для получения указателя на дверь можно использовать импорт переменных. Но не нужно. Лучше: ---------------------------------------------------------- tile_contains_pid_obj(int tile, int elev, int pid); ---------------------------------------------------------- Tile - координата двери. Берёшь из Мапера - просто выбери дверь и запомни пятизначное число в левом нижнем углу. Elevation - без комментариев. С pid`ом сложнее. Можешь написать простенький скриптик: ---------------------------------------------------------- procedure look_at_p_proc begin display_msg("PID:"+obj_pid(self_obj); end ---------------------------------------------------------- и повесить на дверь (или что у тебя там). Если ты настроил Мапер на редактирование прототипов - то можешь просто выбрать прото своей двери, нажать E, поменять что-нибудь и сразу вернуть изменения, нажать Done. Теперь в C:\Fallout2\dev\proto\scenery у тебя появится что-то типа 00000022.txt и в нём будет указана разная информация об объекте - в т.ч. и pid. В конечном итоге у тебя получится что-то подобное: ---------------------------------------------------------- obj_open(tile_contains_pid_obj(20301,0,33554454)); ---------------------------------------------------------- Прописываешь это в нужном ноде или use_p_proc - и всё. Второй вопрос: тебе нужно заделать шлагбаум под дверь и сопоставить стандартным frm-кам двери твои анимации (открыт, закрывается, закрыт;открывается = закрывается наоборот, ей рисовать не надо). Т.е., насколько я понял, у тебя есть три frm-ки? Одна анимированная и две статичных? Расскажи, пожалуйста, поподробнее.
|
Отправлено: 5:59 - 2 Мая, 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
>>display_msg("PID:"+obj_pid(self_obj); Зачем всё так усложнять? Можно же просто написать: tile_contains_pid_obj(int tile, int elev, obj_pid(self_obj); Ну это неважно. Перходим к основной части: Да, у меня действительно есть три frm-ки: первая - шлагбаум поднят, вторая - он опускается, третья - он опущен. Кстати, у шлагбаума же есть основа, на которой держится палка. Так вот, под этой основой и находится тайл, на котором стоит шлагбаум. Я хотел сделать так, чтобы когда шлагбаум опускался, под его палкой появлялись невидимые блокеры, а когда он поднимался, блокеры бы удалялись. Могу для понятности послать FRM-ки! ЗЫ А как привязывать FRM-ки к определённым действиям ты так и не сказал. Первый случай для криттеров! Я использую комп. Запускается анимированное поднимание шлагбаума. Удаляются блокеры.
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 10:57 - 2 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Зачем всё так усложнять? >>Можно же просто написать: >>tile_contains_pid_obj(int tile, int elev, obj_pid(self_obj)); 8-| Воттена. Ты сам понял, чего написал? Тебе нужно указать pid двери, а obj_pid(self_obj) вернет тебе pid твоего компа. Этот код работать не будет. PID двери в скрипте компа брать неоткуда - PID можно получить толко если есть указатель на объект. А мы всю эту возню и затеяли ради получения этого самого указателя. Т.е. PID должен быть задан изначально. Получить его проще всего методами, указанными в предыдущем постинге. Второй вопрос. Ты не понял. Проиграть frm-ку (саму по себе) нельзя. Можно проиграть анимацию какого-либо объекта. Т.е. сначала тебе нужно сделать scenery-прототип и анимировать его своими frm-ками. Пошагово: 1. Делаешь из трёх своих frm-ок одну анимированную (с помощью gif2frm, наверное. Точно не знаю). У тебя должна получиться полная анимашка открытия или закрытия шлагбаума с минимум тремя кадрами. 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); Убедись, что ты изначально располагаешь в Мапере под шлагбаумом блокеры с именно с этим PIDом! Блокеров разных много - повесишь не те - работать не будет. Для тех, кто не знает как создавать/редактировать объекты в Мапере - читайте Maper as Proto Editor.
|
Отправлено: 9:47 - 3 Мая, 2004
|
|
GaroldPredator
Пользователь
Откуда: Military Base Регистрация: Апр. 2004
Всего: 52 сообщения
|
Мдя... Ошибочка с пидом вышла... Ну ладно, неважно, с этим я уже разобрался! Теперь другой прикол. Я хочу, чтобы Чузен появлялся в левом углу карты, а не в середине. Я прописываю номер тайла в city.txt, а когда захожу на карту... Темная ночь... Короче, чёрный экран, и по нему блуждает Чузен! Я так думаю, я чего-то не доделал!!!
----- В мире есть две точки зрения: неправильная и моя.
|
Отправлено: 19:12 - 5 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Навскидку: 1. сделал какую-нибудь бяку с прототипами (напр., удалил pro-шники вручную сделанных объектов, оставив сами объекты на карте) 2. то же самое - но со скриптами 3. закидываешь чуза за пределы карты - т.е. оюласть карты 100x100, сама карта, например, представляет из себя квадрат 20x20 в середине - а ты закидываешь Чуза в (1,1) Более подробно отвечу если запостишь кусок кода с перемещением, назовёшь карту и скажешь чего ты с ней делал.
|
Отправлено: 6:30 - 6 Мая, 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Три последние цифры - elevation, tile_num, orientation. Ты уровень (elevation) правильный указал? Учти, кстати, что в отсчёт уровня в city.txt идёт с нуля.
|
Отправлено: 9:43 - 6 Мая, 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
Спасибо, Рэйвен. *Здесь переменные вида gang_x_member_y заполняются указателями на членов банд. Для Лары и Марка всегда y:=1, для остальных - как придётся. Эти вары импортируются в скрипте Лары и остальных критеров * А как определяется, что указатель уже занят другим членом команды и нужно использовать другой указатель? *---den.h line:863--- if (local_var(LVAR_Home_Tile) == 0) then begin if (self_gang == gang_2) then begin check_take_home_tile(1) else check_take_home_tile(2) else check_take_home_tile(3) else check_take_home_tile(4) else check_take_home_tile(5) if (local_var(LVAR_Home_Tile) == 0) then begin random_tile_in_box(22340, 22332, 24132, 23940); set_local_var(LVAR_Home_Tile, global_temp); set_local_var(LVAR_Home_Rotation, random(2,4)); end end else begin set_local_var(LVAR_Home_Tile, self_tile); end end -------------------- check_take_home_tile(x) устанавливает LVAR_Home_Tile мембера Лариной банды номер x равному текущему положению соответствующего по номеру мембера банды Тайлера. Когда бой закончен - check_take_home_tile перестаёт работать, а переменным * Где здесь проверка на то, что бой окончен? (надо сказать очень интересные ИФы. Разве второй ИФ не выполнится, если выполняеются условия первого ИФа?) *LVAR_Home_Tile присваивается случайное значение из квадрата с координатами (22340, 22332, 24132, 23940)* Да, понятно. Но для Лары это НЕ рандом. Если играть в версию 1.0 или на скриптах БИСа, но Лара ВСЕГДА встает на место Тайлера и всегда разворачивается в одну сторону лицом. То есть, я делаю вывод, что для Лары должно быть _явное_ определение либо координат или указание на координаты Тайлера.( А где тогда координаты Тайлера? я тоже найти не могу.) Я ещё раз уточняю вопрос: Для Лары есть _конкретные координаты_ куда ей вставать, после завершения боя (для Лары это не рандом). Я их найти не могу. Это точно есть в скриптах БИСа.
|
Отправлено: 13:30 - 6 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Jo Jim >>Где здесь проверка на то, что бой окончен? [про макрос check_take_home_tile(x)] Вот здесь. if (gang_1_member_##x != 0) then begin Пояснение: Изначально (точнее, после срабатывания map_enter_p_proc для всех членов банды) все переменные gang_1_member_x содержат указатели на членов банда Тайлера, т.е. отличны от нуля. Соответственно, когда критер гибнет - срабатывает макрос dest_gang_member, обнуляющий переменную с указателем на данного критера. Если критер мёртв - то переменная равна нулю. Т.е. фактически проверка делается на то жив ли данный критер или нет. Когда все критеры мертвы - все переменные gang_1_member_x установлены в ноль (на самом деле, не все - см. ниже) и в check_take_home_tile(x) для любого x не будет срабатывать if (gang_1_member_##x != 0). >>Разве второй ИФ не выполнится, если выполняеются условия первого ИФа? Недопонимание с твоей стороны. Может, ты не знаешь, что ##x означает подстановку переданого параметра? Т.е. для check_take_home_tile(1) будет if (gang_1_member_1 != 0) then begin и для check_take_home_tile(2) будет if (gang_1_member_2 != 0) then begin Т.к. gang_1_member_1 и gang_1_member_2 - разные вары, то очевидно, что, вообще говоря, из истинности check_take_home_tile(1) не следует истинность check_take_home_tile(2). Или ты просто воспринимаешь check_take_home_tile как процедуру, а не макрос? После раскрытия дефайнов препроцессором данный код выглядит так: ______________________________________________________________________ if (self_gang == gang_2) then begin if (self_obj == gang_2_member_1) then begin if (gang_1_member_1 != 0) then begin set_local_var(LVAR_Home_Tile, tile_num(gang_1_member_1)); set_local_var(LVAR_Home_Rotation, has_trait(TRAIT_OBJECT, gang_1_member_1, OBJECT_CUR_ROT)); end end else if (self_obj == gang_2_member_2) then begin if (gang_1_member_2 != 0) then begin set_local_var(LVAR_Home_Tile, tile_num(gang_1_member_2)); set_local_var(LVAR_Home_Rotation, has_trait(TRAIT_OBJECT, gang_1_member_2, OBJECT_CUR_ROT)); end end else <...> ______________________________________________________________________ >>А как определяется, что указатель уже занят другим членом команды и нужно использовать другой указатель? Все эти вары заполняются в gang_member_map_enter: ______________________________________________________________________ <...> if (NAME == SCRIPT_DCTYLER) then gang_1_member_1 := self_obj; else if (NAME == SCRIPT_DCMARC) then gang_1_member_2 := self_obj; else if (gang_1_member_3 == 0) then gang_1_member_3 := self_obj; else if (gang_1_member_4 == 0) then gang_1_member_4 := self_obj; else if (gang_1_member_5 == 0) then gang_1_member_5 := self_obj; <...> ______________________________________________________________________ Вот тут кроется ответ на твой изначальный вопрос, который я в прошлый раз проглядел :-) Изначально все эти вары обнулены. При заходе на карту у всех критеров из банд срабатывает map_enter_p_proc(gang_member_map_enter) - у кого-то раньше, у кого-то позже. Как видишь, gang_1_member_1 зарезервирована под Тайлера (а не под Марка, как я сказал в прошлый раз), gang_1_member_2 - под Марка. Остальные три свободны. У кого раньше сработает map_enter - тот и захапает себе "старшую" вару и запишет в нее указатель на себя. Т.е. gang_1_member_3 уже будет отлично от нуля и для следующего "обычного" члена банды первые три условия не выполняются. Поэтому он получает вару gang_1_member_4 и пишет указатель туда. >>Для Лары есть _конкретные координаты_ куда ей вставать, после завершения боя Я сказал что после окончания боя все gang_1_member_x обнулены. Это не так. gang_1_member_1 принадлежит Тайлеру - а он в бойне не участвует. Но указатель-то под него выделяется! Т.е. для Тайлера в какой-то момент вызывается check_set_obj_visiblity(self_obj,false) [вот с этим я сам не разобрался - но это не так важно] и он "исчезает" с карты, оставаясь в игре. Соответственно, т.к. и у Лары и у Тайлера первые номера, то check_take_home_tile(1) для Лары (и только для неё) работать будет. И её LVAR_Home_Title установится равным местоположению Тайлера (хотя самого Тайлера как бы и нет) - т.е. его изначально заданным в Мапере координатам - 24534. После боя при следующем заходе на карту Тайлер самоуничтожается. Но Лара уже стоит на его месте, так что всё в порядке. Вот такие чудесные парни писали скрипты в BIS - без допинга (3-4 кружки зелёного чая в моём случае) не разберёшь... :-)
|
Отправлено: 15:39 - 7 Мая, 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
Что ж, быстро медленно ли мы продвигаемся к ответу. Еще раз спасибо. Мне прямо жалко тебя, ты так развернуто пишешь. Зато понятно . *Недопонимание с твоей стороны. Может, ты не знаешь, что ##x означает подстановку переданого параметра? * Нет, я не разворачивание макросов имел ввиду. Именно тот кусок кода, который я цитировал, меня очень смутил. Подобные кострукции в скриптах я встречаю постоянно If x= 0 then ....... if x = 0 then ....... end if ....... end if Ну согласись глупо?! Но да я не о том. (это о том же, под чем были БИСовцы, когда писали скрипты ) *После боя при следующем заходе на карту Тайлер самоуничтожается. Но Лара уже стоит на его месте, так что всё в порядке. * Нет, не нужно заходить выходить\заходить на локацию, чтобы Лара встала у дверей. Как только я закрывается кнопка End, банда Лары занимает свои места, и Лара в том числе. Тайлер должен уничтожаться по событию завершения боя, а не по update_map. Ох, вот она координата. Я счастлив. Таким образом это значение храниться в master.dat/maps/denbus2.map, а не в скрипте? Tnx a lot!
|
Отправлено: 18:27 - 7 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Неужто все вопросы по скриптам получили исчерпывающие ответы? Jo Jim, Garold? Помощь больше не нужна? Или всё живое затихло в предверии сессии ? :-)
|
Отправлено: 6:07 - 18 Мая, 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
Да нет. Просто не хотелось мешать тебе загорать. У нас Питере как всегда +10 и дождь. (ррр) Продолжал заниматься вопросами, появились некоторые комментарии *Я сказал что после окончания боя все gang_1_member_x обнулены. Это не так. gang_1_member_1 принадлежит Тайлеру - а он в бойне не участвует. Но указатель-то под него выделяется! Т.е. для Тайлера в какой-то момент вызывается check_set_obj_visiblity(self_obj,false) [вот с этим я сам не разобрался - но это не так важно] * Это важно, я разобрался. -------------------- if (op_global_var(454) == 9) then begin ................... if (468 == 467) then if (op_global_var(471) == 1) then op_critter_add_trait(op_self_obj(), 1, 6, 0); else if ((op_global_var(468) > (3 + ((op_global_var(446) bwand -2147483648) != 0 == 0))) or (910 == 911)) then ........................ if (910 == 911) then op_set_global_var(446, op_global_var(446) bwor -2147483648); if (gang_1_member_1 == op_self_obj()) then gang_1_member_1 := 0; ----------------- Тайлер уничтожается сразу при заходе на карту, когда соглашаешься помочь Ларе в разборке. Поэтому gang_1_member_1 = 0 становится первым. Но это оказалось действительно не важным, так как в процедуре map_update (кот. выполняется каждую минуту, если я не ошибаюсь, или 250 тиков игры). указано следующее. ------------------ if (468 == 468) then begin if (op_local_var(5) == 0) then begin if (op_self_obj() == gang_2_member_1) then if (gang_1_member_1 != 0) then begin op_set_local_var(5, op_tile_num(gang_1_member_1)); op_set_local_var(6, op_has_trait(1, gang_1_member_1, 10)); end ------------------ Это значит, что home_tile'ы сохраняться задолго до начала разборок. То есть все члены банды Лары займут места членов банды Тайлера, после их "вынесения" НО, вот собственно, что я хотел найти. В скриптах бандитов в игре и в БИСе есть отличие. В игровом скрипте присутствует в процедуре map_update: ------------------- if (468 == 468) then begin ....................... if (gang_2_member_5 == 0) then begin gang_2_member_5 := gang_2_member_4; gang_2_member_4 := 0; end ........................... (тоже самое для 4,3) if (gang_2_member_2 == 0) then begin gang_2_member_2 := gang_2_member_1; gang_2_member_1 := 0; end end else begin if (op_local_var(5) == 0) then op_set_local_var(5, op_tile_num(op_self_obj())); if (gang_1_member_5 == 0) then begin gang_1_member_5 := gang_1_member_4; gang_1_member_4 := 0; end .......................(тоже самое для 3,4) if (gang_1_member_2 == 0) then begin gang_1_member_2 := gang_1_member_1; gang_1_member_1 := 0; end end ------------------- В силу того, что gang_2_member_5 =0 всегда, так как банда Лары состоит из 4 человек, gang_2_member_1 становиться в любом случае gang_1_member_2, следовательно Лара никогда уже не встанет на место Тайлера. Дальше больше. Смысл вышеуказанного добаления для меня не совсем ясен. Что он делает по моей логике. Он должен "кучковать" указатели ещё живых членов обеих банд, при этом ненулевые указатели стягиваются к "хвосту" списка указателей gang_x_member_y. Естественно, что при таких передачах указателей, НАВЕРНОЕ, потеряются ранее полученные значения home_tile. Если я прав, то далее я рассуждаю так: чтобы не возникало ситуаций, когда при раздаче home_tile'ов пара бандитов из противоположных банд не "промахивались" мимо друг друга. Поясню примером Банда Лары Банда Тайлера gang2(home_tile = 0) 0 (убит) 0(погиб) gang1(home_tile) ... .... Так тайл gang1 пропадет, а gang2 получит тайл рандомом, а, НАВЕРНОЕ, должен (по логике) тайл от живого gang1 передаться живому gang2, что и достигается "скучиванием" указателей живых членов банд. Но это только мои догадки. Для чего так сделали?! Как я сказал, в Бисе этого нет, поэтому Бандиты Лары на локации с церковью один раз получают тайлы членов банды Тайлера и сохраняют эти тайлы до самой смерти. Ваши мысли, уважаемый загорелый Рэйвен? )
|
Отправлено: 12:56 - 18 Мая, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Jo Jim Сдаётся мне, я понял, чем ты занимаешся. "Поднимаешь" скрипты от Мапера до версии 1.02? Если да - то такая работа уже проделана - см. секцию "Ресурсы" в файлах. Файлик scripts_102d.rar. ~400 kb Если ты таким не занимаешся - всё равно смотри. Так ты избавишся от необходимости использовать декомпилятор (и меня избавишь от необходимости разбираться в коде с раскрытыми дефайнами :-) Мда. Дальше - больше. Только что заметил, что банда Тайлера состоит из 6 человек (вместе с ним). Вобщем, думаю. Как будут идеи - отвечу.
|
Отправлено: 11:01 - 19 Мая, 2004
|
|
Jo Jim
Пользователь Регистрация: Март 2004
Всего: 14 сообщений
|
*"Поднимаешь" скрипты от Мапера до версии 1.02?* Нет в одиночку этого не сделать. (лень ) *Файлик scripts_102d.rar. ~400 kb* Спасибо. Буду иметь ввиду. Сорри за декомпайл. Пока не нашел возможности переводить игровые скрипты к бисовкомк виду, но постораюсь. Извини. *Только что заметил, что банда Тайлера состоит из 6 человек (вместе с ним). * Мда, я тоже посоображаю !! (Отредактировал(а) Jo Jim - 14:23 - 19 Мая, 2004)
|
Отправлено: 14:21 - 19 Мая, 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Во избежание дублирования вопросов и еженедельного появления на форуме аналогичных тем эту темку "приклеиваю".
|
Отправлено: 11:11 - 11 Июня, 2004
|
|
GanGMaN
Пользователь
Откуда: Красноярск Регистрация: Февр. 2003
Всего: 55 сообщений
|
Ну, блин, мою тему закрыли :-) Вобщем написал я скрипт. Диалог персонажа с новым NPC - мертвяком в Гекко. Но при тестировании как всегда мелкие ошибки :-) Ладно, их я исправил. Но при первом тестировании, как только обратился к мертвяку, выдало в окошке (виндовозском) "GDialog::Error Grabbing text message!" Больше ее не было - потом запускал раз 10... Кто знает, что такое? Есть скриншот.
----- Те безумцы, которые полагают, что могут изменить мир в конце концов его меняют...
|
Отправлено: 16:24 - 14 Июня, 2004
|
|
izuk3n
Deleted Регистрация: N/A
Всего: N/A сообщений
|
такое бывает, когда игра не находит *.msg фаил, соответствующий скрипту.
|
Отправлено: 17:42 - 14 Июня, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Люди, я вернулся. Сессия сдана (две четвёрки, четыре пятёрки - завалил, двоечник, блин). Потому возвращаю себя к доке и ответ-вопросной деятельности. Постоянного онлайна не обещаю - второе высшее летом никто не отменял. Да и долго-не-жданный апгрейд 166MMX 2mb video -> Atlon 3000 XP Radeon 9500 отвлекает, собака, внимание (это он виноват в четвёрках). В общем, вы этот флейм (который выше) забудте, из списков охладевших меня вычеркните и постите, постите же свои вопросы по скриптингу. PS to izuken У меня весь драгоценный почтовый архив накрылся бородой. Так что если я тебе на что-то не ответил - перепошли мне снова.
|
Отправлено: 8:20 - 22 Июня, 2004
|
|
Orlangur
Пользователь
Откуда: Питер Регистрация: Июнь 2004
Всего: 9 сообщений
|
Эх, пролистал я форум по скриптам и понял, что сам поздно за них решил приняться - народ вон уж куда ускакал ... 2 Raven Чего там с докой? Сам решил попробовать - покопошился - сложновато. ОБИДНО - карта готовая есть, но ходишь там, как по музею
----- Дерьмо случается. Люди умирают. Особенно, когда я рядом.
|
Отправлено: 14:05 - 26 Июня, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>Чего там с докой? Сам решил попробовать - покопошился - сложновато. Пытаюсь собрать волю в кулак и вырваться из поганого эскапистского мирка Моровинда и NWN-ов с аддонами (в своё время я их благополучно прозевал - см. ТТХ моего предыдущего калькулятора). > что сам поздно за них решил приняться - народ вон уж куда ускакал Так давай начнём с начала :-) Это же ответ-вопросный пост, а не "сопроводиловка" для отдельных людей.
|
Отправлено: 13:05 - 27 Июня, 2004
|
|
Kovarny
Пользователь
Откуда: Руссия, Новосибир ... Регистрация: Июнь 2003
Всего: 114 сообщений
|
Цитата: Quote: from Orlangur on 17:05 - 26 Июня, 2004 Эх, пролистал я форум по скриптам и понял, что сам поздно за них решил приняться - народ вон уж куда ускакал ...
Если не хочешь заново поднимать вопросы в форуме, могу предложить вот что. [шёпот]Я уже долгое время на этих ребят материал собираю. Так, что могу предоставить архив форума Тех-Поддержки TeamX для оффлайнового просмотра. Черкни на мыло kirillkovarny@list.ru если что. [/шёпот]
----- Схватился за стебель я Чтобы в пропасть мне не упасть А это была крапива.
|
Отправлено: 10:58 - 28 Июня, 2004
|
|
Kovarny
Пользователь
Откуда: Руссия, Новосибир ... Регистрация: Июнь 2003
Всего: 114 сообщений
|
Подниму старую тему, но уж очень интересно. Насчёт побитовой записи/чтения из Варов. 2Raven: Побитовая запись в LVAR это конечно круто. И в покере ты к месту её присобачил, а как насчёт GVAR, которые по-идее должны сделать сейвы совместимыми? Поправь меня, но если использовать побитовую запись, то возникнет проблема с отображением состояния квеста в Пип-бое. Какую цифру тогда писать в quests.txt?
----- Схватился за стебель я Чтобы в пропасть мне не упасть А это была крапива.
|
Отправлено: 18:17 - 2 Июля, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Не знаю, честно говоря. Попробую поэкспериментировать. В любом случае, побитовая запись - не панацея. Нашлось ещё ровно 852 причины, по которой нельзя сделать все моды совместимыми (я имею в виду, организационно-техническими методами, т.к. при большом желании - привет Икс - скрестить их всё-таки можно). Я пип-бой только как будильник и холодиско-читалку использую, квесты и так все помню. Но это, конечно, не аргумент. Проблема нехватки ГВАРов пока не стоит - нет таких модов, которым не хватит 160 зарезервированных. Как единственный контр-аргумент: не все ГВАРы заняты под квесты.
|
Отправлено: 8:04 - 3 Июля, 2004
|
|
Anonymous
Пользователь
Откуда: Россия, г.Северск Регистрация: Июль 2004
Всего: 10 сообщений
|
Я только начал освайвать скрипты и вот хочу спросить: Как добавить вещь в инвентарь и как называются вещи в скриптах
|
Отправлено: 15:15 - 14 Июля, 2004
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
2 Anonymous Попользуйся поиском, для БИС есть примеры на форуме для обмена крышечками, для ИПП нету почти ничего.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 18:06 - 14 Июля, 2004
|
|
Kovarny
Пользователь
Откуда: Руссия, Новосибир ... Регистрация: Июнь 2003
Всего: 114 сообщений
|
2Anonymous: Почитай вотэто.
----- Схватился за стебель я Чтобы в пропасть мне не упасть А это была крапива.
|
Отправлено: 18:36 - 14 Июля, 2004
|
|
Anonymous
Пользователь
Откуда: Россия, г.Северск Регистрация: Июль 2004
Всего: 10 сообщений
|
А как вещи называются? там ведь надо название вещи писать. (Добавление от 4:36 - 15 Июля, 2004.) А номара каких ГВАРов использовать можно, а какие - нет?
|
Отправлено: 4:25 - 15 Июля, 2004
|
|
Anonymous
Пользователь
Откуда: Россия, г.Северск Регистрация: Июль 2004
Всего: 10 сообщений
|
Где найти номера *.msg фаилов?
|
Отправлено: 6:39 - 16 Июля, 2004
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
У *.msg нет номера фалов, имя.msg точно такое же как и у скрипта. А вот в самом *.msg уже стоят номера.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 18:54 - 16 Июля, 2004
|
|
Anonymous
Пользователь
Откуда: Россия, г.Северск Регистрация: Июль 2004
Всего: 10 сообщений
|
Чтоб вставить реплику из *.msg фаила, надо указать номер этого файла, а потом номер строки. В FAQ написано, что в файле sripts.lst скрипты соответствуют *.msg файлов, а номер строки скрипта(они почемуто не нумерованы) и есть номер фаила. Так вот строк там примерно 1200, а скриптов всего около 500.
|
Отправлено: 13:31 - 17 Июля, 2004
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Загляни в master.dat и ты увидишь там 1447 скриптов, а вовсе не 500.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:14 - 17 Июля, 2004
|
|
Gatling
Пользователь
Откуда: БОМЖ Регистрация: Февр. 2004
Всего: 115 сообщений
|
я помню шли разговоры о доке Howto (уже и непомню кто и писал) Мне интересно доку эту закончили? Просто хотелось бы поосмотреть что там и про что.
----- "Гизмо...Гизмо-кака!" Gremlin.
|
Отправлено: 13:31 - 7 Авг., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Я снова в деле. К доке за это время добавилось две главы.
|
Отправлено: 11:13 - 21 Авг., 2004
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Народ, объясните плиз новичку, как компилировать скрипты. Скачал компилятор с этого сайта, а скомпилить им ничего не могу - все время какие-то ошибки выдает. Пробую компилить так - ipp.exe имя_скрипта.ipp Я так пологаю, что чего-то не хватает? Подскажите плиз. И еще - Процедура смерти (любыми способами) НПС прописана в его скрипте, я полагаю? Имеет ли она какое-нибудь стандартное название для всех? Можно ли туда вписать присвоение значения какой либо переменной во время смерти? И последнее Есть ли какая-нибудь GVAR, которая ставится в 1 если жители Арройо похищены Анклавом? В какой момент она устанавливается в 1?
----- Обломись! Я подложил туда носок...
|
Отправлено: 9:31 - 23 Авг., 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Kovarny в своем FAQ ответил на вопрос: "Q:Как из скрипта одного объекта обратиться к другому? Можно воспользоваться экспортированием переменных (так оно и сделано в большинстве скриптов). В скрипте карты объявляется переменная: export variable my_obj; Далее в скрипте объекта объявляется другая переменная: import variable my_obj; Ей присваивается значение указателя "на себя", например, так: procedure start begin my_obj := self_obj; end Потом в другом скрипте её можно использовать, объявив как "импортную": import variable my_obj;" Я считаю, что ввиду изначальной специфичности вопроса, ответ был именно такой, каким ему и надлежало быть дабы не растягиваться на несколько страниц. Но лично я не понял ни вопроса ни ответа на него и, так как здесь обсуждению скриптов самое место.. : Какова цель обращения из одного скрипта к другому: вызов процедуры чужого скрипта или запрос значений? Что конкретно указывают export и import? Зачем нужно задействовать скрипт карты? Почему бы тогда просто не использовать MVAR? Что означает "присваивается значение указателя "на себя""? Что должно получится в итоге: общая внутренняя переменная двух скриптов? Ну и так далее.. Дайте плиз кто-нибудь развернутый ответ.
----- hit me, nail me, make me god
|
Отправлено: 22:31 - 23 Авг., 2004
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
>Скачал компилятор с этого сайта, а скомпилить им ничего не могу - все время какие-то ошибки выдает. Вопрос прямо в ФАК. IPP включает в скрипт при компиляции стандартные переменные. Если ты используешь декомпилированный скрипт, то там эти переменные уже есть. Это источник ошибок. Если хочешь простой жизни, используй другие компиляторы. Или удали эти переменные - смотри файл new_scr.ipp. >И еще - Процедура смерти (любыми способами) НПС прописана в его скрипте, я полагаю? Обработчик destroy_p_proc. Переменную, конечно, можно. См. доки по скриптам.И последнее >Есть ли какая-нибудь GVAR, которая ставится в 1 если жители Арройо похищены Анклавом? Предполагаю, что есть. Надо декомпилировать скрипты (возможно, obj_dude.int). >Какова цель обращения из одного скрипта к другому: вызов процедуры чужого скрипта или запрос значений? Никаких процедур из другого скрипта не вызывается. Это нужно для обмена инфой. >Что конкретно указывают export и import? export - видимо то, что эта переменная может использоваться вне скрипта, import - то, что эта переменная внешняя, другого скрипта. >Зачем нужно задействовать скрипт карты? Не знаю, но БИСовцы так делали. >Что означает "присваивается значение указателя "на себя""? Нет никакого присваивания на себя. Есть пример, в котором переменной присваивается значение (вызовом функции). >Что должно получится в итоге: общая внутренняя переменная двух скриптов? Переменная, кот. могут пользоваться оба скрипта. Посмотри скрипт Нагора (ACNagor.int) и его пса Смока (ACDog.int). Это пример использования скрипта. Еще посмотри скрипт карты (ArVillag.int, по-моему) - там должна быть объявлена экспортная переменная. Просто все обычно делается по образу и подобию БИС.
----- Into The New Year - With A New Vision! Документация по скриптам, туториал по скриптам, вопросы по скриптам, FAQ по моддингу, "Утилиты", fallmods-tutor.
|
Отправлено: 2:06 - 24 Авг., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Какова цель обращения из одного скрипта к другому: вызов процедуры чужого скрипта или запрос значений? Никакого "обращения" не происходит. Объясняю. Переменная, прописанная в скрипте карты с ключевым словом 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 <...> --------------------------- Пример2 (передача указателя): Карта: --------------------------- export variable ptr_npc1; --------------------------- НПС1: --------------------------- <...> import variable npc1; procedure start begin //Присваиваем экспортной варе указатель "на себя" npc1:=self_obj; end <...> --------------------------- НПС2: --------------------------- import variable ptr_npc1; <...> display_msg("NPC1 tile="+tile_num(npc1)); display_msg("NPC1 meelee skill="+has_skill(npc1,SKILL_MEELEE)); --------------------------- НПС3: --------------------------- import variable ptr_npc1; <...> display_msg("NPC1 elev="+elevation(npc1)); display_msg("NPC1 doctor skill="+has_skill(npc1,SKILL_DOCTOR)); --------------------------- Теперь вместо денег мы сделали общедоступным указатель на НПС1. Теперь любой объект может импортировать эту переменную и использовать хранящейся в ней указатель для получения необходимой информации о НПС1 - номер тайла, уровень, предметы в инвентаре, скилы, характеристики - всё что угодно, любая информация об объекте может быть получена, если мы знаем указатель на него. Как видишь, "импортёров" вары может быть сколько угодно. Надеюсь, теперь понятно. >>Почему бы тогда просто не использовать MVAR? Да, можно использовать MVAR. В этом случае скрипт карты можно не править, в скрипте одного НПС пишем: --------------------------- //обычно пользуют start, но можно и m_e procedure map_enter_p_proc set_map_var(MVAR_var,self_obj); end --------------------------- Для остальных НПС: --------------------------- //пользуемся импортной переменной variable var; var:=map_var(MVAR_var); --------------------------- Но это плохой стиль. MVAR-ы запоминаются в сейвах. Зачем хранить на жёстком диске какой-то указатель на объект, тем более, указатель каждый раз разный. Проще импорт/экспорт. >>Что должно получится в итоге: общая внутренняя переменная двух скриптов? Общая внутренняя глобальная переменная всех скриптов на карте, которые эту переменную импортировали. (Добавление от 5:43 - 24 Авг., 2004.) >>Народ, объясните плиз новичку, как компилировать скрипты. Ну ты даёш, Икс. Новичок, блин :-) Сто лет в комьюнити уже :-) Бум обучать. >>Скачал компилятор с этого сайта, а скомпилить им ничего не могу - все время какие-то ошибки выдает. Во-первых: лучше переходи на БИС, ты же скрещиванием модов занимаешся, тут всё скрипты под BIS compiler обычно пишутся. Во-вторых: что компилишь? Запейсти кусок. >>Я так пологаю, что чего-то не хватает? Подскажите плиз. Скрипт с багами, вестимо. Или умный человек использовал препроцессорные директивы (обычно, ИППсты этого не делают). Проверь скрипт на наличие строчек #define, #include, #ifndef. >>И еще - Процедура смерти (любыми способами) НПС прописана в его скрипте, я полагаю? Никакой "процедуры смерти" нет. Анимация смерти выбирается/отрисовывается движком, скрипты здесь не при чём. Но в момент смерти персонажа срабатывает обработчик destroy_p_proc, во время получения повреждений (любых, из любого источника) - damage_p_proc и в ряде случаев срабатывает combat_p_proc >>Можно ли туда вписать присвоение значения какой либо переменной во время смерти? Да, следующим образом: ----------------------------- procedure destroy_p_proc begin //обычный стафф - inc_good/bad_critter и т.п. <...> //ставим переменную set_global_var(GVAR_pogib_smertyu_hrabrih,1); end ----------------------------- >>И последнее Есть ли какая-нибудь GVAR, которая ставится в 1 если жители Арройо похищены Анклавом? Да, под прогресс по основной сюжетной линии существует вара GVAR_FALLOUT_2 и макросы: set_f2, force_f2, get_f2, f2_flag_any. Флаги, хранящиеся в этой ГВАРЕ (точнее, их названия, сами флаги цифровые, от 0 до 8): f2_state_v13_looking f2_state_v13_known f2_state_v13_found f2_state_v13_entered f2_state_tribe_kidnapped f2_state_fix_tanker //возможно, не используется f2_state_tanker_fix_known f2_state_tanker_fixed f2_state_enclave_destroyed Тебя, видимо, интересует f2_state_tribe_kidnapped. >>В какой момент она устанавливается в 1? При первом заходе в ardead.map (разбитая деревня). Устанавливается из скрипта Хакунина (типа, умирающего). Попутно на карте открывается локация Наварро. Отследить момент смены "Живое Арройо - мёртвое Арройо". Мне пока не удалось. Ну, я не особо-то и пытался, если честно :-)
|
Отправлено: 5:11 - 24 Авг., 2004
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Ну, в скриптинге Фола то я новичок Я счас перешел на Нойдовский компайлер/декомпайлер - проблем пока нет. Ясно. То есть после смерти Хакунина GVAR_FALLOUT_2 == 4 так я понимаю? > f2_state_fix_tanker //возможно, не используется Похоже, это действительно так. В скрипте капитана Рона Майерса (который рассказывает, как починить танкер и как им управлять) устанавливаются только флаги 6 и 7. Да и еще. Что это за команда/оператор - op_metarule? еще я встречал - op_metarule3 Что сие такое?
----- Обломись! Я подложил туда носок...
|
Отправлено: 9:23 - 24 Авг., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Ясно. То есть после смерти Хакунина GVAR_FALLOUT_2 == 4 так я понимаю? Да. >>Да и еще. Что это за команда/оператор - op_metarule? еще я встречал - op_metarule3 Что сие такое? См. доку от WG. В BIS это соответственно metarule и metarule3 - комплексные многогранные команды с огромным числом параметров.
|
Отправлено: 11:15 - 24 Авг., 2004
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Новый вопрос на засыпку. Как и где прописывается взятие какого-либо квеста? Я полагаю, что в скрипте того, у кого квест берешь? И закрытие его наверное там же? Для этого какая-нибудь специальная команда существует? А то счас заметил прикол - когда сдаешь Бекки первый квест (про Фрэда и его долг), сразу же в ПИП-бое прописывается квест на Дерека и книгу, хотя я Бекки об этой работе еще и не спрашивал. Хотел исправить, лазил, лазил в скрипте Бекки - так и не разобрался в чем там косяк. Help!
----- Обломись! Я подложил туда носок...
|
Отправлено: 14:16 - 2 Сент., 2004
|
|
izuk3n
Deleted Регистрация: N/A
Всего: N/A сообщений
|
посмотри master.dat//data/quests.txt там всё разъяснено
|
Отправлено: 14:23 - 2 Сент., 2004
|
|
escapist
Пользователь
Откуда: В. Новгород Регистрация: Авг. 2004
Всего: 34 сообщения
|
Появилась у меня тут пара вопросиков: -Что такое AI Packet у криттера? -Как я понял float_msg предназначена для отображения реплик криттеров, которые появляются над их головами? Тогда правильно ли я написал для этого процедуру и когда она должна вызываться? procedure QQQ begin float_msg(self_obj,127,1); end -И еще: какая еще может быть реакция, кроме нейтральной, и на что она влияет? giQ_Option(4,NAME,114,Node003,NEUTRAL_REACTION); (Отредактировал(а) escapist - 11:20 - 20 Сент., 2004)
|
Отправлено: 19:58 - 19 Сент., 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата:
-Что такое AI Packet у криттера?
См. master.dat/data\ai.txt. AI определяет поведение криттера во время боя.
Цитата:
-Как я понял float_msg предназначена для отображения реплик криттеров, которые появляются над их головами? Тогда правильно ли я написал для этого процедуру и когда она должна вызываться? procedure QQQ begin float_msg(self_obj,127,1); end
А зачем тебе для этого, пардон, процедура? А по флоат... доки читать надо ;).
Код:
void float_msg(ObjectPtr who, string msg, int type) - создать "плавающее" сообщение (над криттером) Аргументы: who - указатель на криттера msg - строка сообщения, которую можно получить при помощи функции message_str type - тип (см. DEFINE.H): специальные: FLOAT_MSG_WARNING (-2) - предупреждение (эран центрируется на говорящего) FLOAT_MSG_SEQUENTIAL (-1) - циклический перебор всех цветов цвет сообщения: FLOAT_MSG_NORMAL (0) FLOAT_MSG_BLACK (1) FLOAT_MSG_RED (2) (FLOAT_COLOR_BAD) FLOAT_MSG_GREEN (3) (FLOAT_COLOR_SICK) FLOAT_MSG_BLUE (4) FLOAT_MSG_PURPLE (5) (FLOAT_COLOR_HIGH) FLOAT_MSG_NEAR_WHITE (6) FLOAT_MSG_LIGHT_RED (7) (FLOAT_COLOR_AFRAID) FLOAT_MSG_YELLOW (8) (FLOAT_COLOR_NORMAL) FLOAT_MSG_WHITE (9) (FLOAT_COLOR_GOOD) FLOAT_MSG_GREY (10) (FLOAT_COLOR_SAD) (FLOAT_COLOR_WHISPER) FLOAT_MSG_DARK_GREY (11) FLOAT_MSG_LIGHT_GREY (12) (FLOAT_COLOR_SFX) (FLOAT_COLOR_PAIN) Возвращаемое значение: нет Макросы: gen_floater, floater, floater_rand
Цитата:
-И еще: какая еще может быть реакция, кроме нейтральной, и на что она влияет? giQ_Option(4,NAME,114,Node003,NEUTRAL_REACTION);
Опять же, читаем доки:
Код:
void giQ_Option(int iq_test, int msg_list, int msg_num, procedure target, int reaction) - вывести вариант ответа в диалоге Аргументы: iq_test - ограничитель интеллекта (если отрицательный, то условие означает "интеллект меньше или равен", если положительный - "больше или равен") msg_list - номер файла msg msg_num - номер строки в файле msg target - процедура, к которой осуществляется переход при выборе соответствующего ответа reaction - эмоциональная реакция (см. DEFINE.H): GOOD_REACTION (49) NEUTRAL_REACTION (50) BAD_REACTION (51) Возвращаемое значение: нет Макросы: GOption, NOption, BOption, GLowOption, NLowOption, BLowOption
А определяет она цвет ответа при наличии перка эмпатия.
|
Отправлено: 11:52 - 21 Сент., 2004
|
|
escapist
Пользователь
Откуда: В. Новгород Регистрация: Авг. 2004
Всего: 34 сообщения
|
Да я доки-то читаю, просто у меня не всегда получается то, что я задумал , а вообще, конечно, спасибо. Однако, я так и не просек куда float_msg вставлять надо?
|
Отправлено: 19:01 - 21 Сент., 2004
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
поррручик Ррржевский, мммммолчать!!!!!
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 19:40 - 21 Сент., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
float_msg можно вызывать откуда угодно, за исключением режима диалога. Например, так: procedure description_p_proc begin script_overrides; float_msg(self_obj,"Hi",0); end
|
Отправлено: 1:03 - 22 Сент., 2004
|
|
escapist
Пользователь
Откуда: В. Новгород Регистрация: Авг. 2004
Всего: 34 сообщения
|
Мне надо, чтобы float_msg вызывалось все время (те пока игрок на карте). Я сделал так: procedure critter_p_proc begin In_Timed_Event:=0; if (In_Timed_Event == 0) then begin In_Timed_Event:=1; add_timer_event(self_obj,game_ticks(random(5,9)),1); end end procedure timed_event_p_proc begin if (fixed_param == 1) then begin float_msg(self_obj,"HI",0); In_Timed_Event:=0; end end Т.е. создал счетчик. Надпись появляется через 5-9 сек после входа на карту. А как вставить счетчик так, чтобы она через некоторое время пропадала, а потом появлялась снова? И еще вопрос: какую функцию необходимо вызвать, чтобы карта снова стала неизвестной?
|
Отправлено: 22:26 - 23 Сент., 2004
|
|
Sereney
Пользователь Регистрация: Окт. 2004
Всего: 1 сообщение
|
Как в скрипте диалога сделать так что бы носитель этого скрипта после определенного варианта ответа нападал на игрока?
----- Не трогай проблему пока проблема не трогает тебя!
|
Отправлено: 14:35 - 10 Окт., 2004
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
даёшь ссылку на node998 - у бисов так называется обычно узел с началой драки. в нём прописываешь что-нить вроде set_lvar(lvar_hostile,99999);
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 16:53 - 10 Окт., 2004
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Подскажите, а как в скрипте карты задать hex на котором появится игрок при заходе на локацию. Я использую пакет от Noida.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 22:07 - 21 Окт., 2004
|
|
escapist
Пользователь
Откуда: В. Новгород Регистрация: Авг. 2004
Всего: 34 сообщения
|
В чем предназначение функции Lighting?
|
Отправлено: 21:06 - 23 Окт., 2004
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
>>В чем предназначение функции Lighting? Эт не столько функция, сколько макрос, предназначенный устанавливать освещение карты в зависимости от времени суток: #define Lighting if ((get_month >= 3) and (get_month < 5)) then Spring_Lighting; else if ((get_month >= 5) and (get_month < 9)) then Summer_Lighting; else if ((get_month >= 9) and (get_month < 11)) then Fall_Lighting; else Winter_Lighting (Отредактировал(а) Tehnokrat - 3:23 - 24 Окт., 2004)
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:59 - 23 Окт., 2004
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Возник такой вопрос - как самому задать стартовый тайл, на котором появится игрок при посищении карты. Очень нужно сделать это через скрипт. В принципе есть процедура - map_enter_p_proc и так-же другая op_move_to. В теории map_enter_p_proc вызывается при посищении карты, а op_move_to переносит игрока. Но если вписать op_move_to внутрь первой ничего не работает . Кто знает, как точно работает map_enter_p_proc? И ещё. Если задавать стартовый тайл через маппер и привязывать при помощи скрипта, у кого из них приоритет выше.Что в итоге будет выполняться?
|
Отправлено: 23:10 - 28 Окт., 2004
|
|
CrashBoom
Пользователь
Откуда: Москва Регистрация: Авг. 2004
Всего: 39 сообщений
|
map_enter_p_proc этот скрипт задаёт первое место появления чузена.
|
Отправлено: 23:15 - 28 Окт., 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Ну вот и я обращаюсь за справкой :) Кусок кода: procedure move_pistols begin add_mult_objs_to_inven(self_obj, pistols,num_of_pistols); rm_mult_objs_from_inven(dude_obj, pistols,num_of_pistols); set_gunz_quest_complete; end При компиляции выдаёт "; expected" Другой кусок кода: procedure move_pistols begin test := add_mult_objs_to_inven(self_obj, pistols,num_of_pistols); test := rm_mult_objs_from_inven(dude_obj, pistols,num_of_pistols); set_gunz_quest_complete; end Компилируется без ошибок, хотя про add_mult_objs_to_inven и rm_mult_objs_from_inven в Доке указно, что это void, а не function... Я что-то не так делаю?
----- Scio me nihil scire
|
Отправлено: 14:20 - 29 Окт., 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата:
Компилируется без ошибок, хотя про add_mult_objs_to_inven и rm_mult_objs_from_inven в Доке указно, что это void, а не function... Я что-то не так делаю?
Дебажишь ты неправильно :). На будущее: за один раз можно вносить только одно исправление ;). Вот это вполне компилится: variable tmp; add_mult_objs_to_inven(self_obj, 1, 1); tmp := rm_mult_objs_from_inven(dude_obj, 1, 1); add_mult_objs_to_inven, действительно, ничего не возвращает, а вот rm_mult_objs_from_inven возвращает целое, о чём написано в доке.
|
Отправлено: 15:11 - 29 Окт., 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Wasteland Ghost, спасибо :) Надо в следующий раз внимательно читать... А то бьюсь головой об стенку. Кстати, мой вариант компилился, но диалог после выполнения скрипта не закрывался. Видимо, из-за присвоения переменной значения процедуры :-/
----- Scio me nihil scire
|
Отправлено: 15:40 - 29 Окт., 2004
|
|
Maximus
Пользователь
Откуда: RF Регистрация: Нояб. 2004
Всего: 1 сообщение
|
Скажите где скачать скрипты от Fallout1? Желательно от русской версии.
----- Dura lex sad lex
|
Отправлено: 7:33 - 8 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Кусок декомпилированного скрипта: if ((op_global_var(639) == 1) or (op_global_var(639) == 2)) then begin op_start_gdialog(1307, op_self_obj(), 4, -1, -1); maybe_start_dialog(); asm_push_value(6672); // помещаем в стэк значение 6672 asm(0x800d); // return? не знаю, что именно возвращает. видимо как-раз 6672 из "стэка возвратов"(?) asm_push_value(0); // последовательно помещаем asm_push_value(12); // в стэк 0 и 12 (как я понял, ссылка на процедуру) asm(0x8005); //call asm(0x801a); //удаление из стэка maybe_close_dialog(); maybe_op_end_gdialog(); end Я не очень большой специалист в асме. Скорее наоборот :) Реально ли определить - какая именно функция вызывается в этом куске кода? И если реально - то каким образом? (Отредактировал(а) Mynah - 14:34 - 9 Ноября, 2004) (Отредактировал(а) Mynah - 14:35 - 9 Ноября, 2004) (Добавление от 12:38 - 9 Ноября, 2004.) 2Maximus:
Цитата: Скажите где скачать скрипты от Fallout1?
ЕМНИП, нигде. Их, вроде бы, не выставляли для открытого доступа (хотя... точно сказать не могу). Пользуйся декомпилятором Noid'а, с ключом --fallout1.
----- Scio me nihil scire
|
Отправлено: 12:28 - 9 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Есть функции, проверяющие, может ли один объект слышать(видеть) другой, есть функция, которая распологает криттера на заданной позиции, а если хекс блокирован - на ближайшем свободном хексе. Есть ли функции, которые проверяют можно ли видеть/слышать/стоять непосредственно на этом хексе? Пример: требуется узнать, может ли криттер встать на заданный хекс; требуется узнать, если криттер отойдет на 1 хекс, то будет ли он виден другому криттеру?
----- hit me, nail me, make me god
|
Отправлено: 12:37 - 16 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Есть ли функции, которые проверяют можно ли видеть/слышать/стоять непосредственно на этом хексе? Нет. >>требуется узнать, если криттер отойдет на 1 хекс, то будет ли он виден другому криттеру? Можно создать тестового критера, сделать critter_attempt_placement на нужный хекс и сравнить тайл-нум этого критера (куда его разместили на самом деле) с исходным тайлом. Если номера совпадут - всё ОК, размещение возможно. Иначе нет. Удаляем тестового критера и делаем всё остальное. Криво, конечно, зато работать будет. А первая задачка - вроде никак.
|
Отправлено: 13:35 - 16 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Спасибо Raven, именно это я и ожидал услышать. Обыдно - пропадает возможность для создания нормального ИИ криттерам, создавать тестового криттера IMHO никак не прет. Еще такой ламмерский вопрос: как в скрипте узнать пол игрока?
----- hit me, nail me, make me god
|
Отправлено: 14:11 - 16 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
get_critter_stat(obj_ptr,STAT_gender); 0 - Male 1 - Female Проще пользовать макросы из command.h: dude_is_male и dude_is_female соответственно. >>Обыдно - пропадает возможность для создания нормального ИИ криттерам. Ну-у-у, не скажи. Есть тут у нас в тиме подходики... Наработочки, так сказать... Всё руки не доходят форумцев порадовать, да и аудитории особой, похоже, нет... Если сильно попросите... :-)
|
Отправлено: 14:28 - 16 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
Друзья скриптологи. кто нибудь может обьяснить значеть ф-ции ScriptAction. вот встретил в первом Фоле такой кусок кода: if ScriptAction=2 then begin Heal(Player,-100); Write('Hurt dude'; end; что эта проверка значит ???? заранее спасибо
|
Отправлено: 15:13 - 16 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Из Доки: int script_action - возвращает действие, активировавшее этот скрипт. В скриптах Fallout2 не используется Аргументы: нет Возвращаемое значение: номер стандартного обработчика (см. DEFINE.H, раздел Script Procedure Types) --------------------------------------------- // script.h: Script Procedure Types // #define no_proc (0) #define start_proc (1) #define spatial_proc (2) #define description_proc (3) #define pickup_proc (4) #define drop_proc (5) #define use_proc (6) #define use_obj_on_proc (7) #define use_skill_on_proc (8) #define use_ad_on_proc (9) #define use_disad_on_proc (10) #define talk_proc (11) #define critter_proc (12) #define combat_proc (13) #define damage_proc (14) #define map_enter_proc (15) #define map_exit_proc (16) #define create_proc (17) #define destroy_proc (18) #define barter_init_proc (19) #define barter_proc (20) #define look_at_proc (21) #define timed_event_proc (22) #define map_update_proc (23) --------------------------------------------- На пальцах: если твоя процедура вызвана из spartial_p_proc (а она вызывается когда дюд пробегает рядом), то ему сносят хиты.
|
Отправлено: 15:37 - 16 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
To Raven: если не трудно поясни смысл следующей конструкции if (GVAR[613]=9103 OR GVAR[613]=9102) then begin end else begin end; end; по мне так она смысла не несёт а почти везде есть
|
Отправлено: 17:24 - 16 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Ухх.. люди, простите если где-то это уже говорилось, но ни в учебнике Raven'a, ни в доке Walteland Ghost, ни на этой теме.. так и не увидел ответа. 1. На кой [censored] нужен scrname.msg? -------------------- фрагмент поста Raven'a, см. выше ---------------------- 3. Потом открываешь Data\Text\English\Game\scrname.msg Добавлешь строчку: --------------------------------------- {1404}{}{Имя_NPC}# имя_скрипта.int ; Описание_NPC --------------------------------------- При вызове obj_name(self_obj) или просто взгляде на этого NPC будет выдаваться именно Имя_NPC Соответственно, если писал #define NAME 1305 здесь пишешь {1405} и т.д. --------------------- end of фрагмент поста Raven'a ------------------------ То есть такая конструкция нужна только для того, чтобы в скрипте самого NPC на обработчик look_at_p_proc забить? 2. Дитя Pascal'я, я с трудом свыкаюсь с переменными, тип которых нигде не объявляется. Ладно еще где-то сказали, мол GVAR имеет 32 бита.. а остальные? Можно ли в LVAR записать стркоу? символ? а может число с плавающей запятой ? 3. Что, собственно, и явилось причиною предидущего вопроса, я написал в своем скрипте подобным образом: --- *.msg --- .. {номер строки}{}{строка с текстом} .. ------------- --- *.ssl --- .. set_local_var(LV_number,номер строки); float_msg(self_obj,message_str(номер скрипта,LV_number)+","+message_str(номер скрипта,номер строки)); .. ------------- В результате криттер говорит: "Error,строка с текстом". В чем прикол? Если номер строки равен 1, то ошибки нет. (Отредактировал(а) Alan Killenger - 7:39 - 17 Ноября, 2004)
|
Отправлено: 19:46 - 16 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
2pal: На всякий случай проверил все скрипты... Эта гвара используется только в одном, да и то - по-другому. Имхо, ты в чём то ошибаешся. Да и синтаксис твоего куска кода, мягко говоря, не совсем похож на Фоловский. 2Alan Killenger: 1. Самый простой пример: Попробуй не указать имя криттера в scrname.msg и начать бой с ним. Везде, вместо его имени, будет написано <None> получил повреждения... (бла-бла-бла) 2. А самому попробовать? ;) Там те же самые 32 бита. (кстати, где ты умудрился в Фаллауте использовать числа с плавающей запятой?). Строки там, имхо, хранить нет смысла. Можно ведь хранить номер строки из *.msg файла ;) А в случае использования битов, можно ещё и номер *.msg файла хранить. 3. У тебя так: float_msg(self_obj,message_str(номер скрипта,LV_number)+","+message_str(номер скрипта,номер строки)); А надо так: float_msg(self_obj,message_str(номер скрипта, local_var(LV_number))+","+message_str(номер скрипта,номер строки)); (Добавление от 21:27 - 16 Ноября, 2004.) 2Raven:
Цитата:
Всё руки не доходят форумцев порадовать, да и аудитории особой, похоже, нет...
Есть аудитория :) Ну ооочень просим :)) (Отредактировал(а) Mynah - 23:40 - 16 Ноября, 2004)
----- Scio me nihil scire
|
Отправлено: 21:25 - 16 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Alan 1. Раньше я думал, что scrname.msg необходим прежде всего для привязки msg-файла к скрипту и задания имени и описания объекта. Имя и описание можно задать в прототипе, с привязкой тоже не всё ясно. Так что даже не знаю что и ответить. 2. Числа с плавающей точкой в Фоле ЕСТЬ. Обнаружились совсем недавно, при просмотре исходников компилятора ssl-файлов. Попробуй: variable a=1234.5678; display_msg("a="+a); Кроме того, в Фоле есть тип char - одиночный символ ('a','Z' и т.д.). Более того, с помощью ряда манипуляций можно получить ASCII-код char-символа. Я не шучу. И да - все вары 32-ух битовые. >>Строки там, имхо, хранить нет смысла. Можно ведь хранить номер строки из *.msg файла ;) Только при этом нужно знать номер самого мсг-фала. Кстати, вот вам инфа для размышления - что делает следующий код: ------------------------------------- #define MAX_SCRIPTS2000 variable i=1307; variable msg_file_num; variable msg_string; msg_string:="LABEL: "+obj_name(self_obj); while (i<MAX_SCRIPTS) then begin if message_str(i,100)==msg_string then begin msg_file_num:=i; i:=MAX_SCRIPTS+1; else i+=1; end ------------------------------------- Догадались? Правильно, перебирает все "юзерские" мсг-шки, смотрит на 100-ую строчку на наличие слова "LABEL: Vasya", например. Оо-чень полезно в том случае, если вы не знаете номер мсг-шки, но знаете часть содержимого. Вообще же я даже написал скрипт, который парсит свою мсг-шку как ... скрипт. Т.е. пишем в мсг {101}{GIVE} {102}{Кожаная броня} и Чузу выдаётся броня :-) Постараюсь написать об этом попозже, по приходу из универа. to pal Это декомпиляторские штуки. Смысла нет, а почему он так делает - фиг знает.
|
Отправлено: 0:32 - 17 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Mynah: "Строки там, имхо, хранить нет смысла. Можно ведь хранить номер строки из *.msg файла.." Хехе, само собой, но это только в том случае, когда содержимое строки заранее есть одно из нескольких вариантов. А если строка строится более динамично? float_msg(self_obj,message_str(номер скрипта, local_var(LV_number))+","+message_str(номер скрипта,номер строки)); - thanks. Raven:"msg_string:="LABEL: "+obj_name(self_obj);" А по-моему, msg_string в четыре байта явно не укладывается.. в чем прикол? Как перестать париться с созданием диалогов и для героя-мужчины и для героя-женщины? Я думаю делать следующую конструкцию: 1. формат номера строки в *.msg файле: ???? - ? <=> номер - м/ж 2. в самом скрипте: #define message(P_number) message_str(C_script,P_number*10+get_critter_stat(dude_obj,34)) Никаких мучений в диалоговых процедурах, но в таком случае мне прийдется почти удваивать количество строк в *.msg файле. Как мне модернизировать скрипт, чтобы он делал следующее: в случае, когда не найдена реплика для женского пола, автоматом выбирал аналогичную реплику мужского? То есть, я спрашиваю: как определить, присутствует ли данная реплика в *.msg файле? (Отредактировал(а) Alan Killenger - 6:36 - 17 Ноября, 2004)
|
Отправлено: 2:37 - 17 Ноября, 2004
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Mynah абсолютно прав по поводу scrname.
Цитата:
А по-моему, msg_string в четыре байта явно не укладывается.. в чем прикол?
Зато базовый адрес строки укладывается просто замечательно :). 2pal декомпилер вообще странная штука, особенно когда скрипты ему от Ф1 подсовываешь :). Однако, я знаю одного скриптоманьяка, который скрипты из Ф1 переносил в Ф2 и довольно успешно ;).
Цитата:
Строки там, имхо, хранить нет смысла.
Ни разу не пробовал такую конструкцию:
Код:
variable stored_node; ... /*где-то в одной из нод диалога*/ stored_node := "Node002"; ... /*например, в обработчике talk_p_proc*/ start_gdialog(NAME, self_obj, 4, -1, -1); gSay_Start; call stored_node; gSay_End; end_dialogue;
Лично мне это помогло реализовать нормальную пьянку с Виски Бобом :). Ибо, если из диалога вызвать юз объекта (пива, например) на другом объекте, то произойдёт этот юз только при выходе из диалога. А такой вот макар помогает прервать диалог, что-то там похимичить, а потом диалог возобновить с того места, на котором остановились.
|
Отправлено: 9:36 - 17 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
To WastelandGhost and Raven: Аня ты меня раскусила со скриптами вот что то на них потянуло, с 1го Фола. в догонку микровопрос: такой кусок тоже смысла не несёт или это нромальная проверка:? (перед OR) if GVAR[159]>2 * GVAR[160] OR GVAR[156]=1 then ..... кстати предпологагается что ОпКоды в 1м Фоле ПОЛНОСТЬЮ аналогичны 2му ,так? т.е. по научному если то подмножество ОпКодов 1го входит в множество 2го ??? да если не трудно можно прокомментировать следующий кусок кода: if GetItemCountByCritter(Player,98) then begin SayOption_2(249,124,22,50); end else begin SayOption_2(249,125,21,50); end; команда SayOption_2(_script_,num_str,xx,50); незнакома. шо це есть параметр хх ? (Отредактировал(а) pal - 9:46 - 17 Ноября, 2004)
|
Отправлено: 10:25 - 17 Ноября, 2004
|
|
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
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Цитата:
Как узнать, присутствует ли в *.msg файле реплика с заданным номером?
if message_str(file_num, str_num)="Error" then begin end else begin end (Добавление от 5:28 - 23 Ноября, 2004.) 2Alan Killenger: 1) Пошагового выполнения нет. Значения переменных обычно вывожу display_msg'ами из look_at и description . 2) Не совсем понял твой комментарий. anim_busy это всего лишь проверка состояния анимации. А для того, чтобы криттер подходил к чузену одной командой не обойдёшся. Простейший пример: 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 используется, чтобы процесс "криттер гоняется за чузеном" выполнялся всего один раз.
----- Scio me nihil scire
|
Отправлено: 5:10 - 23 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Исчерпывающий ответ, Mynah. Насколько я начал понимать, универсальных алгоритмов взаимодействия событий и анимации нет? anim_busy - это как раз то, что мне нужно, задача была немного другая. Ее решил, тебе все равно спасибо (приятно знать, что тебя не игнорируют ).
Цитата: if message_str(file_num, str_num)=="Error" then begin end else begin end
Проверил, работает. Ооохх, блаженство . Уж коли я сюда отвечаю, да и тема подходящая.. мне вдруг тоже чертовски интересны стали последние разработки в области диалогов.
Цитата: Кто-то заинтересовался? Если наберётся 3-5 желающих, то можно парсер довести до ума и использовать в работе.
Еще один есть . P.S. Как работает функция self_can_hear_dude? В описании сказано, что она должна принимать значение "истина" в том случае, когда один объект может слышать другой. На самом деле мой криттер стоял вплотную к чузену и все равно условие не срабатывало (когда я поставил self_can_see_dude все стало нормально).
----- hit me, nail me, make me god
|
Отправлено: 21:33 - 23 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Расчёт видимости и (особенно) слышимости в Фоле очень забагован. А про слышимость - я вообще не уверен, что она работает.
|
Отправлено: 7:02 - 24 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
друзья вот такой вопрос: накатал простейший скрипт подключил его в Фоле1, и запустил Фол в режиме отладки чтобы посмотреть чо да как через LogFileDebug.bat в итого в разговоре окно диалога не закрывается и ничего тама не пишется. В логе отладчика пишется следующее: Error during execution: Stack underflow short. Current script: scripts\Zeca.int, procedure Zeca05 Scripts: [Game Reset] помогите чем погите!от чего это? Сорри.нашел проблему сам.Собственная ошибка при написании SayWOAnswer(XXX,YYY,ZZZ) забыл написать туда ZZZ. (Отредактировал(а) pal - 13:52 - 24 Ноября, 2004)
|
Отправлено: 10:34 - 24 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Цитата: Как работает функция self_can_hear_dude?
Никак. Убил два часа на тестирование. Криттер тебя не слышит когда ты: ходишь/бегаешь/воруешь/ремонтируешь/стреляешь/разговариваешь рядом с ним. Не слышит флоатеры других криттеров. Вобщем глухие они все... Зато меня "услышали", когда я был на другом конце карты... Просто шёл к зоне выхода. Вывод: функция не работает, использовать нельзя.
----- Scio me nihil scire
|
Отправлено: 5:07 - 25 Ноября, 2004
|
|
pal
Пользователь
Откуда: Estonia, Narva Регистрация: Янв. 2003
Всего: 42 сообщения
|
Вот такой вопрос: я получил через GetObjectID(SlotX(Player,1); номер ИД вещи ктотрую держит Чузен. как мне поместить в диалог название этой вещи (ну т.е. выбрать по № ИД через pro_item.msg) ,ведь pro_item.msg в script.lst нету. ??? если можно то показать кусок кода в ipp формате. Спасибо Ане виртуально конечно за то что нашел её подсказку по этому вопросу в FOP базе: write ('Object Name: ' + GetName (objAddr)); { показываем название объекта } Tnx ! (Отредактировал(а) pal - 14:59 - 26 Ноября, 2004)
|
Отправлено: 12:30 - 26 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
<здесь был бред> Надо меньше пить :-/ Перепутал стил со сником. (Отредактировал(а) Mynah - 22:03 - 27 Ноября, 2004)
----- Scio me nihil scire
|
Отправлено: 17:07 - 27 Ноября, 2004
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Можно ли создать общедоступный всем скриптам *.msg файл, не привязанный к какому-либо, пусть даже тождественному, скрипту? Задумал я, чтобы мой персонаж песни распевал (песни для глухонемых наверное ) по технологии Raven'а. Беды нет, если песня одна и доподлинно существует, а если нет? Нет, на самом длеле, сливать 4 песенки в сплошной ряд реплик - это, мягко говоря, неудобно; между песенками должны быть пустоты, думаю очевидно. Как тогда реализовать скрипт? Можно было бы это сделать как в Pascal'е - findnext, но неизвестно количество песенок и неизвестен номер последней реплики. Так или иначе, натыкаешься на мысль о том, чтобы вводить тэг конца *.msg'шки. Кто-нибудь сталкивался с подобным? Ламмерский вопрос, возможно ли полностью заменить какую-либо GVAR'у какой-либо экспортируемой переменной (если нет разницы, то зачем платить больше )?
----- hit me, nail me, make me god
|
Отправлено: 2:25 - 28 Ноября, 2004
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
2Alan Killenger: Тебе сюда. И читать очень-очень внимательно. Найдёшь ответы на все вопросы про *.msg.
Цитата:
возможно ли полностью заменить какую-либо GVAR'у какой-либо экспортируемой переменной
Нет. Экспортные переменные работают только во время работы скрипта, из которого экспортируются. Хотя.. можешь экспортировать из скрипта obj_dude, записывая значение в лвару, при изменениях. Будет импровизированная замена гвары. Но это, имхо, изврат :) (Отредактировал(а) Mynah - 5:48 - 28 Ноября, 2004)
----- Scio me nihil scire
|
Отправлено: 3:46 - 28 Ноября, 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Задача: у нас есть некоторое кол-во "песен" в мсгшке (от 0 до бесконечности). Мы знаем (уже) номер мсгшки. Надо чтобы при первом talk НПС "пел" первую (по порядку выводил флоаетер-строчки из блока с промежутком в секунду), при втором - вторую и т.д. Когда песни кончатся - опять переходим на первую. Решение: Во-первых договоримся о формате мсг. Нулевая строчка - идентификатор. Все разделы (в нашем случае идентификаторы песен) могут начинаться только со строчек, кратных 10-ти (10, 20, 30 ...). МСГ-шка. ------------------------------- {0}{}{[Songs file]} {10}{}{[Song]} {11}{}{La-la-la} {12}{}{Lu-lu-u} <...> {20}{}{[Song]} <...> {60}{}{[Song]} <...> {100}{}{[End file]} ------------------------------- Скрипт:
Код:
variable msg_num; //известный номер скрипта/мсг variable num_of_songs; //переменная под число песен variable last_song; //последняя исполненная песня <...> //считаем число песен procedure get_num_of_songs begin variable i:=10; //номер строки while i<2000 and message_str(msg_num,i)!="[End file]" do begin //ищем до лимита либо метки if message_str(msg_num,1)=="[Song]" then num_of_songs+=1; //считаем число разделов i+=10; end if num_of_songs==0 then num_of_songs:=-1; //если разделов нет, ставим число в -1 end procedure sing(variable song) begin variable i:=10; variable cur_song; variable start_song; if not num_of_songs then call get_num_of_songs; //если песен ноль, значит мы их ещё не считали if num_of_songs==-1 then begin //для отладки display_msg("There is no songs in msg #"+msg_num); return -1; end if song>num_of_song then begin //для отладки display_msg("There is only "+num_of_songs+" songs"); display_msg("Try to get:" + song); return -1; end while cur_song!=song do begin //ищем нужный раздел. Ограничители здесь уже не нужны if message_str(msg_num,i)=="[Song]" then cur_song+=1; i+=10; end last_song:=song; //запоминаем последнюю спетую песню i+=1; //переходим на первую строчку найденной песни start_song:=i; //добавляем набор событий по таймеру. По событию для каждой строки с промежутком в секунду //i-strsong=0 при первом проходе, 1 при втором и т.д. while message_str(msg_num,i)!="Error" and message_str(msg_num,i)!="[Song]" do begin add_timer_event(self_obj,i-start_song,i); i+=1; end end procedure timed_event_p_proc begin //fixed_param==номер строки, выводим её floater(message_str(msg_num,fixed_param); end //активатор песнопения procedure talk_p_proc begin if num_of_songs!=-1 then begin //если есть ещё песни в запасе - поём следующую if last_song<num_of_songs then call sing(last_song+1); //иначе начинаем сначала else call sing(1); end else display_msg("!ERROR!"); end
Enjoy :-) Доработай скрипт - и в наработки его :-) (Отредактировал(а) Raven - 14:18 - 28 Ноября, 2004)
|
Отправлено: 7:16 - 28 Ноября, 2004
|
|
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
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ребята, тут вопрос по скриптам возник. Ситуация такая. Избранный разговаривает с неким персонажем, и предлагает ему отойти в более спокойное местечко, чтобы там продолжить, так сказать, разговор. В идеале это должно выглядеть: диалоговое окно закрывается, экран темнеет, а когда картинка вновь проясняется, то видно, что персонажи стоят в другом месте. И, когда игрок осознает это, начинается (возобновляется) диалог. Как сделать это примерно понятно. Из диалоговой ноды вызывается процедура, в которой гасится свет(gfade_out), криттеры перемещаются на новые места(critter_attempt_placement), далее свет включается и вызывается нужная диалоговая нода. Но на деле это выглядит кошмарно! Диалоговое окно во время перемещения вообще не отключается. И то, что Избранный куда-то переместился, игрок понимает только когда все диалоги уже отбарабанены и окно закрыто. Кстати, именно так это выглядит в оригинальной игре. Сходите в Дэн и попробуйте заняться сексом с Джоем или Мецгером. Все же я эту проблему решил, но немного через задницу. У меня прерсонаж проявляется на определенном тайле, но разговор не начинается, пока он не дойдет до другого тайла. Вот он и успевает сделать пару шагов, пока игрок сообразит что к чему. Но мне думается, что это не есть хороший стиль програмирования. По идее, я должен был сначал закрыть диалог. Но просто так он не закрывается. Отсюда вопросы: Почему Node999 - пустая процедура, и почему talk_p_proc расценивает это как сигнал к закрытию диалога? И почему диалог не заканчивается, на процедуре перемещения, где сначала идет куча операторов не имеющая к диалогу отношения, а в конце стоит start_dialog_at_node(NodeХХХ)? Может быть в этой процедуре следовало сначала написать gSay_End; end_dialogue; А затем перемещать? И еще вопрос, общего плана, но вытекающий из вышесказанного. В скриптовом языке существует такое понятие, как подпрограммы? Я склонен думать, что да, видел даже на форуме кусочек кода,содержащий оператор return. Но в каком именно случае возможна ситуация, когда процедура_1 вызывает процедуру_2, и, кога та отрабатывается, управление возвращается процедуре_1? И как это реализовывать? Для меня почему-то выражение call proc_XXX, это все равно что goto XXX. Если исходить из диалоговых нод. Товарищи просветители и скриптоманьяки, просветите пожалуйста.
|
Отправлено: 6:23 - 11 Дек., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Ребята, тут вопрос по скриптам возник. Не могу проверить, но должно быть что-то типа: ------------------------------------- variable move; variable already_moved; <...> procedure talk_p_proc begin Start_gdialog(...); gsay_start; if not already_moved then call NodeStart; else call NodeStart2; gsa_end; end_dialogue; if move then begin gfade_out(60); move_to(self_obj,HEX,ELEV); critter_attempt_placement(dude_obj,HEX,ELEV); already_moved:=1; gfade_in(60); call talk_p_proc end end <...> procedure Node_SomeNode begin <...> move:=1; call NodeExit end procedure NodeExit begin end ------------------------------------- Т.е. первый диалог идёт как обычно, затем делается выход, экран фэйдится, НПС и игрок перемещаются в нужную точку, устанавливается флаг "Перемещён" и диалог начинается заново (но - с другого нода - NodeStart2). >>Почему Node999 - пустая процедура, и почему talk_p_proc расценивает это как сигнал к закрытию диалога? Команде gsay_option необходима процедура-обработчик варианта ответа как обязательный параметр. Если эта процедура будет пустой, то произойдёт выход из цепочки call-ов, идущих от первого call между gsay_* в talk_p_proc, что приводит к выводу из диалогового режима. На словах объяснить сложно, но идея проста. Node999 (общепринятое, но не обязательное имя для процедуры выхода) может быть и не пустой. Главное, чтобы не было *Reply и *Option. >>Для меня почему-то выражение call proc_XXX, это все равно что goto XXX. call - это и есть вызов подпроцедуры. У подпроцедур своё пространство имён. Подпроцедуры принимают и возвращают значения (return). Как видишь, на goto не похоже даже близко.
|
Отправлено: 13:39 - 11 Дек., 2004
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
to Raven Спасибо. Надо будет попробовать. И небольшое уточнение. Что ты понимаешь под ПОДПРОЦЕДУРОЙ? Диалонговые ноды? Но их же, по большому счету можно записать в виде: ==================== procrdure Node1 begin Reply(XXX) [option_1]; goto Node2 [option_2]; goto Node999 end procrdure Node2 begin [option_1]; goto Node999 end procrdure Node999 begin end ========================= То есть, от Node1 управление переходит к Node2, а вовсе не Node1 вызывает Node2 Или это нифига процедурами не считается? про терминалогии WG вся кие там critter_p_proc b talk_p_proc называются обработчиками., а всё остальное - процедуры. Надеюсь, я внятно высказался?
|
Отправлено: 14:30 - 11 Дек., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
---------------------------------------- procedure start begin end procedure hi begin display_msg("Hi"); end procedure talk_p_proc begin variable i; while i<10 do begin call hi; i+=1; end end ---------------------------------------- Ну и причём здесь goto? gsay_option работает по другому. Процедура-параметр не вызывается call-ом, просто ей передаётся управление (без возврата по окончанию в вызывавшую процедуру). А по её окончанию, если она не содержит option-ссылки на другие процедуры (т.е. по вызову пустой процедуры) происходит выход из диалога (возврат в talk_p_proc). В общем, диалоговый режим просто работает немного иначе, чем обычные вызовы. Но это не гоуту, в любом случае - адресное пространство, помнишь? Но по действию немного похоже. Про терминологию: есть обработчики, есть (движковые) команды, есть макросы на базе этих команд, есть пользовательские процедуры. Ноды - это последнее.
|
Отправлено: 6:45 - 12 Дек., 2004
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Доброе время суток. Столкнулся с проблемой. Ставлю девченку на artemple.map, пришиваю скрипт dura.int. Начинаю новую игру. И прыгаю вокруг нее и скачу. Не работает ни description ни look_at ни talk. Что делац?
|
Отправлено: 23:29 - 6 Янв., 2005
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
rtfm......
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 11:49 - 7 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Легко сказать rtfm. Вот именно изрыскал все что можно. Кстати еще вопросец: Если не использовать define & include то можно обойтись без предпроцессора а компилить напрямую BIS'овским компилятором? (Добавление от 14:02 - 7 Янв., 2005.) Как работать с mstr. Пишет underfined symbol. Никаких объявлений, ничего нет в других скриптах, а сразу юзают mstr.
|
Отправлено: 12:18 - 7 Янв., 2005
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
Если не использовать define & include то можно обойтись без предпроцессора а компилить напрямую BIS'овским компилятором? да Как работать с mstr. Пишет underfined symbol. если мне не изменяет память, mstr - макрос. толи в command.h, то ли в define.h а насчёт ртфм....я когда зздесь появился тоже подобные вопросы задавал. привыкай, что отвечать на них никто не станет, скорее всего. кроме того, хочешь получить ответ - пиши проблемный код.....
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 15:17 - 7 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Artemple.h ************* #define MVAR_kill_dude (0) ************* script.ssl ************* procedure node6 begin set_map_var(MVAR_kill_dude,1); end procedure critter_p_proc begin if map_var(MVAR_kill_dude)==1 then attack(dude_obj); end ************* Не атакует и все тут. Где ошибка? (Отредактировал(а) Net - 23:06 - 7 Янв., 2005)
|
Отправлено: 16:16 - 7 Янв., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
to Net ====== А зачем так сложно? Если ты не очень хорошо разбираешься в скриптах, возьми исходник скрипта(.ssl) того парнишки, который стоит у входа в храм, разберись, как у него что работает, затем вноси свои изменения, компиллируй и замечай разницу. При работе со скриптами хорошо помогает прога FSE (Fallout Script Editor). Вообще - побольше исходников смотри. И rtfm!
|
Отправлено: 20:01 - 8 Янв., 2005
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
2Net: critter_p_proc, если я не ошибаюсь, уже внутри боя вызывается. Попробуй обращение к attack поместить в одну из диалоговых процедур (возможно, глупость сказал). А вообще, Sokil дело глаголит. 2All: Ткните носом, где можно найти описание внутреннего фомата *.int и утилиту (если она вообще в природе существует), обратную по действию ilink. Есть необходимость разобраться со скриптами для F1, которые, судя по всему, компилируются без видимых ошибок, но с проблемами в формате результирующего p-кода. (Отредактировал(а) Alchemist - 22:28 - 8 Янв., 2005)
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 21:15 - 8 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
если в диалоге attack то скрипт виснет. прорыл все скрипты везде просто attack. Не работает её блин мать и все тут. rtfm начитался. Это тема просто супер! В чем может быть еще проблема?
|
Отправлено: 22:12 - 8 Янв., 2005
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
*.* (Отредактировал(а) izuken - 9:53 - 9 Янв., 2005)
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 2:03 - 9 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Net c_p_p не вызывается: 1. во время действия боевого режима 2. во время присутствия на экране диалогвых панелей (инвентарь, диалог и т.п.) Диалоговый, боевой и инвентарный режимы накладывают ораничение на использование некоторых функций - каждый по разному. Поэтому вызывать attack напрямую из диалога не получится. Сделать это можно так (внимание! Это сам принцип,точные примеры см. в скриптах БИСов): при выборе "неправильного" ответа мы устанавливаем в еденицу какую-то переменную и выходим. И сразу после выхода её проверяем. Если она поставлена в один - начинаем бой. ----------------------------------- variable wrong_answer; <...> procedure NodeXXX begin <...> wrong_answer:=1; <...> end procedure critter_p_proc begin if wrong_answer:=1 then begin attack(dude_obj); wrong_answer+=1; end <...> end <...> ----------------------------------- Метод основан на том, что c_p_p не вызывается во время диалога. Но вызовется *сразу* по его окончании. И если переменная установлена в один, то критер начнёт атаку. Инкрементить вару надо для того, чтобы attack не вызывалось по 30 раз в секунду вместе с каждым вызовом c_p_p и не было бы combat loops (когда мы убежали от критера, закончили бой - и он тут же начинается вновь). Логично и правильно использовать LVAR вместо обычных вар, чтобы криттер запоминал про то, что он атаковал чуза. Ещё желательно и map_update дописать. Всё это - см. в практически любом critter-скрипте от БИС. Аццкий Хомяк Йцукен - списваю всё на твой сессионный хронический недосып... ;-)
|
Отправлено: 6:17 - 9 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Есть одна проблемка(большая), может знает кто, как её решить : У меня на произвольной карте стоит зона перехода. Если ею воспользоватся то перемещаешся на другую карту на определённый hex. Дело вот в чём - если на это место поместить spatial скрипт, то после перехода он не сработает. А сработает только если перс перейдёт с данного hex'а на другой. Ни чего не помагает. Пробовал как в родных скриптах if (op_source_obj() == op_dude_obj()) then ... но эффекта ноль. Как заставить срабатывать скрипт без перемещений?
|
Отправлено: 0:09 - 10 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Есть одна проблемка(большая), может знает кто, как её решить : map_enter заюзать. Хотя, ты бы и сам тогда догадался :-) Что конкретно сделать надо, что без spartial-скрипта не обойтись?
|
Отправлено: 3:43 - 10 Янв., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Спатиал скрипт срабатывает только при *движении* криттера в зоне его действия. ЗЫ Ох знали бы вы, как я с этим спатиалом намучалась, когда ту самую дверь с кнопкой в Храме делала... :)
|
Отправлено: 10:09 - 10 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Да хотелось бы map_enter да не всё так просто. У меня есть карта, назовём её random1, на которую есть 2 "зоны переходов" с других карт. Так вот : при переходе на карту random1 перс появляется в определённом месте. Мне надо, чтобы в зависимости от определённых действий перс появлялся на разных тайлах. Кстати зоны перехода настраивать не получится, так-как там используются не совсем они. Фу,забыл. Map-enter нельзя использовать так-как у меня 3-уровневая карта и на каждом уровне надо появляться в разных местах. А при переходе с уровня на уровень map-enter не работает (пробовал).И нельзя так-же дописывать точки входа в city.txt. Короче ситуация такая - у меня есть карта при переходе на которую перс в любом случае окажется на одном и том-же месте(это не я - это двигло), а мне надо, что бы он мог быть на разных тайлах.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 10:54 - 10 Янв., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
>а мне надо, что бы он мог быть на разных тайлах. А через скрипт карты? if x move_to 1 if y move_to 2 if z move_to 3 x,y,z - mvar зависящие от действия (т.к. я понял при одном действии - один тайл, при другом - другой). 1,2,3 - тайлы.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 11:07 - 10 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Всё бы было так хорошо- если бы ни было так плохо. >>А через скрипт карты? if x move_to 1 if y move_to 2 if z move_to 3 В том то и дело, что через скрипт карты нельзя. Для того чтобы вызвать проверку придётся вписывать в map-enter, а он как уже сказано не работает для 3 уровней. А куда ещё проверку в скрипт карты вставить, чтоб она срабатывала в нужный момент? -> Правильно нет такого места!
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 11:48 - 10 Янв., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Неправильно: map_update_p_proc. При переходе на новый левел обязана сработать. ЗЫ Если не секрет... зачем тебе это?!? 8-( )
|
Отправлено: 13:22 - 10 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
2 Wasteland Ghost Большое спасибо. Это я как-то не досмотрел. Но spatial скрипты всё-равно придется использовать, а то перса 4 раза в 10 игровых минут будет переносить на заданый hex. P.S Не секрет, но пока не доделал не хочу просто трепаться, а "spatial" for you отвечу в мыло.
|
Отправлено: 15:18 - 10 Янв., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Если всё правильно сделаешь, то не будет ;).
|
Отправлено: 18:29 - 10 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Ещё одна мелочь. У меня есть такой кусок кода в скрипте карты procedure map_update_p_proc begin if (op_global_var(644) != 0) then begin op_critter_attempt_placement(op_dude_obj(), op_global_var(644), op_elevation(op_dude_obj())); op_move_to(op_dude_obj(), op_tile_num(op_dude_obj()), op_elevation(op_dude_obj())); op_set_global_var(644, 0); end else op_set_light_level(100); end В spatial script записано следующее procedure spatial_p_proc begin op_set_global_var(644,26304); end Тоесть, когда перс проходит по spatial скрипту присваивается значение гваре - куда надо перенестись. Потом выполняется перенос и гвара обнуляется что-бы не работать всё время. НО! Перенос происходит нормально, как и надо, но не срабатывает op_move_to перемещение экрана за персом. Ежели использовать всё тоже но не из map_update то всё работает. В чём дело понятно(так же как и с вызовом боя из разговора).Но как добиться рабочего результата?
|
Отправлено: 19:03 - 10 Янв., 2005
|
|
ChosenOne
Пользователь
Откуда: г. Химки Регистрация: Март 2004
Всего: 23 сообщения
|
Здравствуйте, многоуважаемые TeamX! Перво-наперво, хочу извиниться, за то что записался в бетатестеры так и не протестировал... Конечно, виной тому плохой коннект 19200, плохой комп 1999 года и крайне нестабильная политичекая обстановка в Гондурасе. Ну и я, вместо того что б посвятить себя тестингу, делал очень-много-другого... Вообщем простите, засранца и ответьте на вопрос... Вообщем маплю я уже сто лет... ещё до оффициального появления маппера БиСа... Занялся графикой... Вообщем всё идёт хорошо, но ОНИ... Скрипты всмысле... И дело не в том что я не могу что то понять в самом языке - у меня не работает компилятор. Скачал я ватком крутил вертел, добился того что откомпилировал пару скриптов - но в большенстве случаев он пишет нечто вроде "неизвестен символ S"(в родных скриптах... если бы в моих можно было пожаловаться на кривые руки)... Люди добрые... Помогите! А то город мёртв =)... P.S. Не могу не сказать о Доке по скриптам - отличная вещь... Прямо супер... Но не рауют ошибки в исходниках - это конечно помогает начинающему скриптеру наметать глаз, но я уж собирался винду сносить от того что скрипты не компилировались =))) Если будете дальше заниматься - вы там подкорректируйте для таких как я - нас много =)
----- Иди и впредь твори добро, но остерегайся соблазнов и красивых интерфейсов. Потому как не все золото, что блестит. [PNWORLD] - Post Nuclear World! LISTEN TO BLACK SABBATH
|
Отправлено: 21:07 - 10 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Raven. Ты, как я понял скрипт-убийца. Но ничего не работает И использовал MVAR Lvar просто variables, но не атакует меня и все тут. Что делать? И еще вопрос. newland.h *** #define MVAR_KILL_HIM (x) *** x - что значит? Отчего зависит еще В arvillag.h MVAR'ы с "индексами" от 0 до 4. Далее смотрим acwarrior.ssl и видим LVAR'ы объявляются с "индексом" начиная с 4. Как это можно объяснить?
|
Отправлено: 22:14 - 10 Янв., 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: Скачал я ватком крутил вертел, добился того что откомпилировал пару скриптов - но в большенстве случаев он пишет нечто вроде "неизвестен символ S"(в родных скриптах... если бы в моих можно было пожаловаться на кривые руки)...
Пошлите в приват некомпилируемый скрипт. P.S. Насчет ошибок в исходниках, вы точно не путаете это с необновленными скриптами?
----- hit me, nail me, make me god
|
Отправлено: 0:34 - 11 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Ray >>не срабатывает op_move_to перемещение экрана за персом. -------------------------------------------------------- int move_to(ObjectPtr obj, int tile_num, int elev) - переместить объект Аргументы: obj - указатель на объект tile_num - позиция (tile_num = 200 * y + x) elev - уровень (этаж) - 0, 1 или 2 -------------------------------------------------------- -------------------------------------------------------- void tile_set_center(int tileNum) - центрировать экран на заданном хексе Аргументы: tileNum - номер хекса (200 * y + x) Возвращаемое значение: Нет Примечания: макрос от metarule3(METARULE3_TILE_SET_CENTER, tileNum, 0, 0) центрирует экран на указнном хексе нулевого этажа, для того, чтобы центрировать экран на хексе не нулевого этажа, нужно воспользоваться функцией metarule3(METARULE3_TILE_SET_CENTER, tileNum, elevation, 0) -------------------------------------------------------- to Chosen One >>Если будете дальше заниматься - вы там подкорректируйте для таких как я - нас много =) А можно озвучить? Чтобы я знал чего править. Лучше в личку, наверное. to Net >>#define MVAR_KILL_HIM (x) >>x - что значит? Отчего зависит Доку читал? Глава "Препроцессор"? Кстати, не забыл, что при использовании МВАР/ЛВАР их надо прописывать? >>Но ничего не работает А тестишь, часом, не в Мапере? Там attack не вызывается. Добавь критера на artemple.map, начни новую игру и проверь (или любая другая карта, через ctrl+R, save, Ctrl+R, load). Только что набросал простой скрипт - работает. В игре. В мапере - нет. Если всё равно не заработает - пиши, запостю скрипт. >>Далее смотрим acwarrior.ssl и видим LVAR'ы объявляются с "индексом" начиная с 4. В заинклюденых файлах могут быть объявления первых 4-ёх. Да и вообще - ничего не мешает мне сделать так: scr.ssl ---------------------------------------------- #define My_lvar(11) <...> ---------------------------------------------- scripts.ssl ---------------------------------------------- <...> scr.int ; <...> # local_vars=12 ---------------------------------------------- Работать будет. Место мне выделять под 12 ЛВАР. Сколько из них я буду реально использовать - моё дело. Так могли и БИСы поступить. Например, у них вары по смыслу расписаны. Какая-то всегда Hostile. Какая-то - HereBefore. Место резервируем под все, используем только те, что необходимы.
|
Отправлено: 2:41 - 11 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
>>void tile_set_center(int tileNum) - центрировать экран на заданном хексе Примечания: макрос от metarule3(METARULE3_TILE_SET_CENTER, tileNum, 0, 0) центрирует экран на указнном хексе нулевого этажа, для того, чтобы центрировать экран на хексе не нулевого этажа, нужно воспользоваться функцией metarule3(METARULE3_TILE_SET_CENTER, tileNum, elevation, 0) По поводу metarule3(..... я так понимаю это обозначение бралось из define.h? Но к сожалению я не нашёл ни одного раза использования в родных скриптах или может я просто не нашел. Я не юзаю бисовский компилятор, так-что это не работает. А по поводу void tile_set_center(int tileNum) что-то я раньше в скриптах не замечал описания функций. И опять таки нигде в скриптах не нашел tile_set_center(int tileNum) , а как же родные op_critter_attempt_placement(.....) ?
|
Отправлено: 10:48 - 11 Янв., 2005
|
|
ChosenOne
Пользователь
Откуда: г. Химки Регистрация: Март 2004
Всего: 23 сообщения
|
Цитата:
P.S. Насчет ошибок в исходниках, вы точно не путаете это с необновленными скриптами?
Скрипты от 1.02d, всё равно не работает пишет undefined symbol S.(ПОчти во всех исходных, например в том же Джордане) Вот что в препроцессеных исходниках *.i на строчке где ошибка(В Джордане 9588)
Цитата:
... else if ((global_var((38)) == 1)) then Static_Reaction:=S\ ... <- ВОт она ета S судя по всему, от которой он ломается
Не компилируемости пошлю Raven'у... Вроде как он писал, ему интересней =)...(есси не ошибаюсь)
----- Иди и впредь твори добро, но остерегайся соблазнов и красивых интерфейсов. Потому как не все золото, что блестит. [PNWORLD] - Post Nuclear World! LISTEN TO BLACK SABBATH
|
Отправлено: 14:26 - 11 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>... else if ((global_var((38)) == 1)) then Static_Reaction:=S\ ... <- ВОт она ета S судя по всему, от которой он ломается Ааааа. Всё понятно. Сам мучался. Гадкий Ватком обрезает длинные строки (принудительно) и ставит им в конце '\' - символ продолжения строки. Но компайлер такое не хавает. Теоретически, это отключается каким-то ключом. Практически строки всё равно продолжают обрезаться. Я, честно говоря, давно перешёл на борландовский препроцессор. Он таких фокусов не делает. Как чинить - после прохода препроцессора рукам объединять длинные обрезанные строчки опять в одну. Муторно, да. (Добавление от 14:59 - 11 Янв., 2005.) to Ray http://www.teamx.ru/fop/docs/BIS_help.html Описание всех - ну, почти - Фоловских функций. Там нет say-режима. О котором как нибудь потом :-) http://www.teamx.ru/fop/docs/FScript-HOWTO Это так, на всякий случай :-)
|
Отправлено: 14:55 - 11 Янв., 2005
|
|
ChosenOne
Пользователь
Откуда: г. Химки Регистрация: Март 2004
Всего: 23 сообщения
|
Мдя... Как говориться - сполшное расстройство... ну ладно... Borland'овский препроцессор с чем идёт в поставку... у меня просто есть Borland C++(не билдер)... (Отредактировал(а) ChosenOne - 16:26 - 11 Янв., 2005)
----- Иди и впредь твори добро, но остерегайся соблазнов и красивых интерфейсов. Потому как не все золото, что блестит. [PNWORLD] - Post Nuclear World! LISTEN TO BLACK SABBATH
|
Отправлено: 16:21 - 11 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Я от Borland C++ Command Line Tools брал. Он весит 90кб.
|
Отправлено: 17:57 - 11 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
#include "headers\define.h" #include "headers\command.h" #include "headers\newland.h" #define NAME 1309 procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node005; procedure Node999; procedure start begin end #define LVAR_Hostile (1) procedure look_at_p_proc begin display_msg(message_str(NAME,100)); //message_str(NAME,random(100,102)) end procedure critter_p_proc begin if (local_var(LVAR_Hostile) == 1) then begin attack(dude_obj); end end procedure talk_p_proc begin start_gdialog(NAME,self_obj,-1,-1,-1); GSay_Start; call Node001; GSay_End; End_Dialogue; end procedure Node001 begin gsay_reply(NAME,103); if get_critter_stat(dude_obj,4) >= 4 then begin gsay_option(NAME, 104, Node002,-1); gsay_option(NAME, 105, Node999,-1); end else begin gsay_option(NAME, 106, Node999,-1); end end procedure Node002 begin gsay_reply(NAME,107); gsay_option(NAME,obj_name(dude_obj),Node004,-1); gsay_option(NAME,109,Node003,-1); gsay_option(NAME,110,Node005,-1); end procedure Node003 begin gsay_reply(NAME,111); gsay_option(NAME,112,Node004,-1); gsay_option(NAME,113,Node005,-1); gsay_option(NAME,114,Node999,-1); end procedure Node005 begin set_local_var(LVAR_Hostile,1); call Node999; end procedure Node004 begin gsay_reply(NAME,115); gsay_option(NAME,116,Node999,-1); gsay_option(NAME,117,Node999,-1); end procedure Node999 begin end Raven, в мапере работает диалог, но не атакует. В Фоле не работает диалог Я не могу пока еще понять полностью принцип работы движка, поэтому понять в чем проблема не могу.
|
Отправлено: 20:58 - 11 Янв., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
1) прописана ли в скрипт.лст последняя цифра в строке больше 0. попробуй по подобию БИС 2) #define LVAR_Hostile (1) поставь 5. Получится #define LVAR_Hostile (5) - при сэйве 5 вара сама переведет в бой. 3) вместо Node005 поставь Node998 - боевой выход. set_local_var(LVAR_Hostile,2); 4) в critter_p_proc напиши if ((local_var(LVAR_Hostile) == 2) and (obj_can_see_obj(self_obj,dude_obj))) then begin set_local_var(LVAR_Hostile,1); attack(dude_obj);
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 2:58 - 12 Янв., 2005
|
|
ChosenOne
Пользователь
Откуда: г. Химки Регистрация: Март 2004
Всего: 23 сообщения
|
Так ребят, я порассудил и решил, что "ладно фиг с ним, я пока не гений скриптингы и мои скрипты уж он потерпит прокомпилирует" So it was... Но столкнулся я с проблемкой... Надобно мне что бы NPC убегал если его ударят(ну вернее не дрался, а уходил во время боя), написал я скрипт, запустил в Игре - ну не убегает, хоты ты тресни(его по голове)... Вот значит кусок исходника:
Цитата:
procedure damage_p_proc begin script_overrides; if (source_obj == dude_obj) then begin set_local_var(LVAR_Personal_Enemy,1); end ----------- begin if (((local_var(LVAR_Hostile) == 2)or(local_var(LVAR_Personal_Enemy) == 1)) and (obj_can_see_obj(self_obj,dude_obj))) then begin set_local_var(LVAR_Hostile,1); Flee_From_Dude end else if ((random(0,100) == 1) and (In_Timed_Event == 0)) then begin In_Timed_Event:=1; add_timer_event(self_obj,game_ticks(random(17,37)),1); end
Поможите, люди добрые!
----- Иди и впредь твори добро, но остерегайся соблазнов и красивых интерфейсов. Потому как не все золото, что блестит. [PNWORLD] - Post Nuclear World! LISTEN TO BLACK SABBATH
|
Отправлено: 21:43 - 13 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
А всё, что ниже "--------------", к какой процедуре принадлежит? Не critter_p_proc, часом? Она во время боя не вызывается. Как и map_update, ЕМНИП. Ставить флаг лучше всего в том же damage_p_proc.
|
Отправлено: 9:08 - 14 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
В мапере диалог работает, а в игре - нет. Что длеать? Скрипт см выше
|
Отправлено: 14:00 - 14 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Net Скомпилял (закомментив подключение newland.h). Прекрасно работает как в мапере, так и в игре. Предположение: а ты скрипт в игре, часом, не через ctrl+r тестишь? Там половина обработчиков не вызывается. Короче: опиши пошагово процесс добавления своего скрипта в игру.
|
Отправлено: 14:10 - 14 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
To Raven. Ты мозг. Учту про CTRL+r Вот она пропаганда ctrl+r, вредители блин.
|
Отправлено: 19:15 - 14 Янв., 2005
|
|
ChosenOne
Пользователь
Откуда: г. Химки Регистрация: Март 2004
Всего: 23 сообщения
|
Raven Да, то что ниже к critter_p_proc(криво копировал)... Щас попробую как ты сказал...
----- Иди и впредь твори добро, но остерегайся соблазнов и красивых интерфейсов. Потому как не все золото, что блестит. [PNWORLD] - Post Nuclear World! LISTEN TO BLACK SABBATH
|
Отправлено: 19:36 - 14 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Net >>Вот она пропаганда ctrl+r, вредители блин. Нет, ctrl+r - штука сильная. Только делается это чуть-чуть сложнее. ctrl+r, выбираем локацию, *сохраняемся*, опять ctrl+r, загружаем сохранёнку. Если скрипт прекомпилирован - просто опять сделай load и всё. А если карта изменена была - тогда load не поможет, надо опять ctrl+r и т.д. делать.
|
Отправлено: 5:46 - 15 Янв., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
...а если у тебя где-нибудь is_loading_game проверяется - всё равно фигня будет. В чём "вред" от "Ctrl + R"? В том, что при таком способе захода на карту не выполняется map_enter_p_proc. Всем, кто среьёзно занимается моддингом и тестингом, советую изменить скрипт obj_dude, как это сделали мы, например, чтобы иметь возможность "законно" перемещаться по картам, менять ГВАРы и т.п. Очень полезно для отладки и тестинга.
|
Отправлено: 8:49 - 15 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>В чём "вред" от "Ctrl + R"? В том, что при таком способе захода на карту не выполняется map_enter_p_proc. Выполняется! ЛФ так тестю, всё работает. И при CTRL+R, и при последующих лоадах. m_e при лоадах вызывается.
|
Отправлено: 8:54 - 15 Янв., 2005
|
|
ChosenOne
Пользователь
Откуда: г. Химки Регистрация: Март 2004
Всего: 23 сообщения
|
Raven Эххх, всё таки я столкнулся с проблемой обрезания строк =(... Очень длинна процедура inc_goo(bad)_critter, следствие ясно... Не могли бы вы мне послать тот чудо Borland препроцессор которым вы пользуетесь(как я слышал он весит только 90 кБ? Хотя я соглашусь и на 500 =)) и краткое руководство по его адаптации к SSL скриптам Fallout'а. Если не затруднит конечно... =) А! E-mail: old--rocker@yandex.ru(Два "-" (Отредактировал(а) ChosenOne - 20:40 - 16 Янв., 2005)
----- Иди и впредь твори добро, но остерегайся соблазнов и красивых интерфейсов. Потому как не все золото, что блестит. [PNWORLD] - Post Nuclear World! LISTEN TO BLACK SABBATH
|
Отправлено: 20:29 - 16 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Возникла идея микроаддона к моему моду, поэтому прошу у вас помощи. Как известно, карта локации в Модоке "Bed and brekfast" имеет 2 уровня - один чистый, а другой сами знаете в чем. Отсюда вопрос - где прописывается условие грузить ли первый уровень (чистый) или 2-й при заходе на эту карту? В процедуре входа на карту (скрипт ModInn.int) я этого не нашел (может плохо искал)? Или это в движке прописывается? Буду премного благодарен за любую помощь.
----- Обломись! Я подложил туда носок...
|
Отправлено: 13:11 - 18 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Зачем декомпилятор если есть исходники? Вот кусок из modinn.ssl: ---------------------------------------------------- #define place_on_inn(the_tile, the_elev, the_rot) \ override_map_start_hex(the_tile, the_elev, the_rot); \ set_map_start((the_tile % 200), (the_tile / 200), the_elev, the_rot) procedure map_enter_p_proc begin <...> if (shitter_has_blown) then begin place_on_inn(22081, shitter_has_blown, 4); end else begin place_on_inn(19477, shitter_has_blown, 5); end ---------------------------------------------------- Смотрим. Если чуз взорвал уборную, то shitter_has_blown вернёт 1, иначе 0. Соответственно, макрос place_on_inn в первом случае установит elevation==1, во втором elevation==0.
|
Отправлено: 15:48 - 18 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
2 Raven: Ну не пользуюсь я бисовскими исходниками (и нет у меня их), у меня Нойдовский ком/деком. Есть такой кусок: if ((op_global_var(402) bwand 128) != 0) then begin if ((op_global_var(297) bwand 1) != 0) then begin op_obj_move_to_tile(22081 % 200, 22081 / 200, (op_global_var(297) bwand 1) != 0, 4); op_set_map_start(22081 % 200, 22081 / 200, (op_global_var(297) bwand 1) != 0, 4); end else begin op_obj_move_to_tile(19477 % 200, 19477 / 200, (op_global_var(297) bwand 1) != 0, 5); op_set_map_start(19477 % 200, 19477 / 200, (op_global_var(297) bwand 1) != 0, 5); end end else begin op_obj_move_to_tile(25321 % 200, 25321 / 200, (op_global_var(297) bwand 1) != 0, 5); op_set_map_start(25321 % 200, 25321 / 200, (op_global_var(297) bwand 1) != 0, 5); end Куда мне сунуть свое условие, чтобы при его выполнении грузилась чистая карта даже после взрыва сортира? if ((op_global_var(402) bwand 128) != 0) and (Условие)) then или if ((op_global_var(297) bwand 1) != 0) and (Условие)) then А то я в этих бвандах и бворах ничего не понимаю еще.
----- Обломись! Я подложил туда носок...
|
Отправлено: 16:05 - 18 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Заменить ------------------------------ if ((op_global_var(297) bwand 1) != 0) then begin op_obj_move_to_tile(22081 % 200, 22081 / 200, (op_global_var(297) bwand 1) != 0, 4); op_set_map_start(22081 % 200, 22081 / 200, (op_global_var(297) bwand 1) != 0, 4); end else begin op_obj_move_to_tile(19477 % 200, 19477 / 200, (op_global_var(297) bwand 1) != 0, 5); op_set_map_start(19477 % 200, 19477 / 200, (op_global_var(297) bwand 1) != 0, 5); end ------------------------------ На ------------------------------ op_obj_move_to_tile(19477 % 200, 19477 / 200, (op_global_var(297) bwand 1) != 0, 5); op_set_map_start(19477 % 200, 19477 / 200, (op_global_var(297) bwand 1) != 0, 5); ------------------------------
|
Отправлено: 16:20 - 18 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Так мне не надо чтобы полюбому чистая карта грузилась, мне надо чтобы по условию. Условие то куда вставлять?
----- Обломись! Я подложил туда носок...
|
Отправлено: 16:29 - 18 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Так мне не надо чтобы полюбому чистая карта грузилась, мне надо чтобы по условию. Не понял. Так чего ты хочешь? Чтобы взрыв был, всё было как в оригинале, но этаж оставался прежним?
|
Отправлено: 17:38 - 18 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Я хочу чтобы взрыв был, и во время него гвара устанавливалась в гвара + 20 дней (в игровых тиках). При заходе на карту должно проверяться условие: если гвара < op_game_time - грузится чистый уровень, если нет - то грязный.
----- Обломись! Я подложил туда носок...
|
Отправлено: 17:43 - 18 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Я хочу чтобы взрыв был, и во время него гвара устанавливалась в гвара + 20 дней (в игровых тиках). >>При заходе на карту должно проверяться условие: если гвара < op_game_time - грузится чистый уровень, если нет - то грязный. Понятно. Надо подумать. Вару установить и условие добавить легко. Но всё осложняется тем, что при заходе нужно будет не просто грузить нужный elevation, но и всех НПС туда переносить, т.к. они расположены на нулевом. Подумаю. Тебе в декомпилированном синтаксе? Или в БИСовом сойдёт?
|
Отправлено: 17:49 - 18 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Лучше в декомпилированном.
----- Обломись! Я подложил туда носок...
|
Отправлено: 17:50 - 18 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Ура, хоть кто-то ещё пользуется нойдовским компилером. А то все вопросы с ним связанные уходили в никуда (Не в этой теме, спасибо Raven'у) У меня такой вопрос - были ли замечены с bis'овым компилём глюки? Поясню. Нойдовский компиль работает как часы. Но нашлись несколько непреятностей. В часности когда декомпилишь kcsulik.int - скрипт Сулика, то назад закомпилит не получается. Получаются строки типа : if ((op_global_var(6) != 0) and (op_global_var(449) != 0 == 0)) then begin op_debug_msg(" GVAR_PLAYER_WAS_MARRIED before == " + op_global_var(449)); ..................... где две взаимоисключающие проверки. Соответственно ничего не компилится. Были ли такие проблемы в bis'овском компиле? Я правда уже перегнал в рабочую версию (сверяясь с исходниками), но это не единственный случай. P.S. Поправка, только что заметил - такие глюки происходят только с некоторыми файлами (пока нашёл 3), но главное, только с патчеными скриптами из patch000.dat Для родных из master.dat всё супер. Интересно, что там делали ,когда правили скрипты.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 18:20 - 18 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Хм, у меня Сулик компилился/декомпилился всегда без проблем. Мож ты файлики compile и decompile не переписал куда надо?
----- Обломись! Я подложил туда носок...
|
Отправлено: 18:39 - 18 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
У меня этот компилятор год стоит, как им пользоватся я знаю. Причем если б я файлик не туда положил - у меня бы всё не компилилось, а так только (пока) 3 файла скрипыт Сулика, Маркуса, и доктора Троя из vault city. У меня 2 идеи 1)Либо WinXP играется( ведь надо прописывать в autoexec), а в XP только с расширением nt, хотя в принципе пофиг, я и так и так пробовал 2)Либо в самой версии компилятора. Их существует куча. Если не секрет какой у тебя. А вообще компилер - гуд. Не знаю почему, но мне он больше нравится. Быстрее в обращении. 5 батников и работа происходит в 2 клика
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 19:20 - 18 Янв., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Фих его знает, что за версия. То ли 1.6, то ли 1.6.8 - не могу разобраться. Я прописывал пути через системную переменную окружения Patch. В аутоекзики всякие я и не лез.
----- Обломись! Я подложил туда носок...
|
Отправлено: 19:39 - 18 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Кто знает, как заблокировать дверь, чтобы она не открывалась не под каким предлогом и спустя любое количество времени. Функции lock\unlock не помогают, а в справочнике по функциям BIS найти не могу.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 21:30 - 19 Янв., 2005
|
|
Kovarny
Пользователь
Откуда: Руссия, Новосибир ... Регистрация: Июнь 2003
Всего: 114 сообщений
|
Цитата: Quote: from Ray on 0:30 - 20 Янв., 2005 Кто знает, как заблокировать дверь, чтобы она не открывалась не под каким предлогом и спустя любое количество времени.
Попробуй засунуть script_overrides в use_p_proc двери. Там-же можно указать условие блокировки.
----- Схватился за стебель я Чтобы в пропасть мне не упасть А это была крапива.
|
Отправлено: 21:37 - 19 Янв., 2005
|
|
Strongholder
Прилипала MkII
Откуда: Nelly's Bar Регистрация: Май 2004
Всего: 393 сообщения
|
Вопрос к матёрым скриптовикам. :) Есть необходимость убить Чузена (точнее - сжечь его). Юзаю "kill_critter(dude_obj, 57);". Чузен убивается. Но! Не успевает начаться анимация "испепеления", как выскакивает картинка с костями (типа "вас убили и всё такое"). Даже не успеваешь толком разобрать что произошло. Какие существуют пути выхода из этой ситуации? Может оверрайднуть процедуру смерти? Если да, то как выглядит обработчик смерти криттера? Хотел было исходники полистать, но не смог припомнить где использовалось что-то подобное. И использовалось ли вообще... Помогите бедному ламеру кто чем может... :)
----- Живущий в стране эльфов. Несмотря ни на что.
|
Отправлено: 23:33 - 9 Фев., 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Про kill_critter в доке WG ясно сказано: "команда НЕ анимирует смерть криттера и НЕ обновляет экран", так что нечему удивляться. Могу предложить следующий рабоче-крестьянский метод, как сделать из чуза барбекю: critter_dmg(dude_obj, 999, DMG_fire bwor DMG_BYPASS_ARMOR); 999 игнорирующего броню и чуз повторяет подвиг Джонардо Бруно
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 0:33 - 10 Фев., 2005
|
|
Strongholder
Прилипала MkII
Откуда: Nelly's Bar Регистрация: Май 2004
Всего: 393 сообщения
|
Хм. critter_dmg я юзал с самого начала, и надо сказать это было ещё хуже. Фол вообще вылетал через раз. С флагом 512 (DMG_NOANIMATE) вылетать почему-то перестал. Но выходит в "экран с костями" так же резко. А вообще кто-нибудь может напомнить после каких действий Чузена сплющивало/сжигало/взрывало ит.д.? Мне в голову пришли только электропластины в Сьерре и Анклаве, но там от 20 до 40 HP снимается. А чтоб Чузена убивало за раз?
----- Живущий в стране эльфов. Несмотря ни на что.
|
Отправлено: 12:11 - 10 Фев., 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Говорящая голова (ECBHead.ssl) убивает чуза с помощью critter_damage(dude_obj, 40000); А critter_damage это всего лишь макрос от critter_dmg. Так что сдаётся мне, что это твои глюки. У меня всё нормально работает, многократно проверял.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 0:28 - 11 Фев., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Вопрос к тем, кто разобрался с интерфейсными функциями. Допустим я создам окно с кнопкой, которая будет отвечать за какое-нибудь действие. Но перед этим будет включена функция game_ui_disable (заблокировать пользовательский интерфейс) Если теперь я нажму на кнопку, сработает ли она?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 12:04 - 11 Фев., 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Функция game_ui_disable полностью блокирует и мышь и клаву, курсор мыши исчезает. Это распространяется и на окна, созданные с помощью интерфейсных функций.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 0:19 - 12 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Может кто ответит, как сделать так, чтобы в диалоге с НПС при нажатии на кнопку "Бартер" выдавалось сообщение "Этот персонаж не будет с вами торговать". Так сделано, например, у дока Андрю и охранников у ворот в Городе-Убежище. Покопал их скрипты, но что то ничего не обнаружил.
----- Обломись! Я подложил туда носок...
|
Отправлено: 14:26 - 16 Фев., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
2 YikxX Это делается легко, но не через скрипты, а через маппер. Когда настраиваешь прошки критеров поставь barter - off
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 14:44 - 16 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
А без маппера никак нельзя? Не охота мне его качать, ставить и разбираться в нем.
----- Обломись! Я подложил туда носок...
|
Отправлено: 15:33 - 16 Фев., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Сочувствую, но через скрипты лично я не знаю как этого добиться. Единственное, что могу посоветовать - есть такая прога PROTOTYPEEDITOR . Весит 200 килл. В отличии от маппера не придётся мучаться с настройками . Всё предельно понятно. Эта прога просто редактирует прошки. Почти в самом конце одна из функций : barter 1\0. Для скачивания поищи ссылку на форуме. Тут это обсуждалось.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 16:27 - 16 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Чего-то не смог найти ссылку на форуме. Может скинешь мне эту прогу на yikxx@anort.com ?
----- Обломись! Я подложил туда носок...
|
Отправлено: 17:20 - 16 Фев., 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
2Ray: а можно узнать, кто автор этой проги (случаем не KIA?) или каково ее точное название? Просто коллекционирую проги по моддингу, и про такую слышу впервые.
|
Отправлено: 21:38 - 16 Фев., 2005
|
|
tracktor
Пользователь
Откуда: Москва Регистрация: Март 2004
Всего: 183 сообщения
|
Цитата: Quote: from Perceptron on 21:38 - 16 Фев., 2005 кто автор этой проги (случаем не KIA?)
Он.
|
Отправлено: 23:43 - 16 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
2 Ray: Спасибо, прогу не надо - добрые люди уже прислали измененный прошник.
----- Обломись! Я подложил туда носок...
|
Отправлено: 9:46 - 17 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Новый вопрос. Как удалить ВСЕ из инвентаря конкретного криттера, чтобы оно там больше не появилось и при воровстве в инвентаре ничего не было? Сохранять и возвращать обратно предметы из инвентаря не требуется.
----- Обломись! Я подложил туда носок...
|
Отправлено: 11:52 - 17 Фев., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Тебе оно именно скриптово надо или опять через маппер? ;) Вообще, странная необходимость :). Если скриптово... Можешь переместить всё в какой-нить контейнер, а потом удалить контейнер. Ну а можешь при помощи inven_cmds последовательно получать указатель на каждый предмет и удалять...
|
Отправлено: 14:02 - 17 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Чего странного то? При начале разговора с барменом ему в инвентарь добавляются пиво, водка и деньги. При выходе из диалога все удаляется. Потом снова при разговоре добавляется вновь. А как контейнер создать/удалять? И как в него инвентарь переносить? (Добавление от 14:17 - 17 Фев., 2005.) Я пробовал делать как в скрипте барменов из Нью-Рено: заводил в скрипте карты экспортируемую переменную export variable barmen_inven_box := 0; потом в скрипте бармена ее импортировал import variable barmen_inven_box; потом после окончания диалога делал так op_move_obj_inven_to_obj(op_self_obj(), barmen_inven_box); В итоге нефига не работает - инвентарь у бармена остается на месте. Может я чего перепутал?
----- Обломись! Я подложил туда носок...
|
Отправлено: 14:08 - 17 Фев., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Хы :). Так там не удаляется, а именно переносится :). Поскольку скрипты НВ лежат для свободного скачивания, то отошлю к Слику и его boxам ;). Вкратце: в маппере рисуешь за пределами видимости ящичек. Вешаешь к нему скрипт. В скрипте карты объявляешь экспортируемую вару. В скрипте ящика объявляешь импортируемую вару. В мап_энтер ящика присваиваешь этой варе указатель на ящик (self_obj). Потом используешь этот указатель в скрипте торговца.
|
Отправлено: 14:21 - 21 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Спасибо, попробую.
----- Обломись! Я подложил туда носок...
|
Отправлено: 14:36 - 21 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
2 WG: А зачем мне ваши исходники с БИСовским то синтаксисом? Я в нойдовском то порой разобраться не могу. Короче, попробовал, как посоветовали - все равно не работает.
----- Обломись! Я подложил туда носок...
|
Отправлено: 17:38 - 21 Фев., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Ну и выкинь нойдовский компилер нафиг :). Гм... Ну давай сюда свои скрипты. И рассказывай, что конкретно делал.
|
Отправлено: 10:21 - 22 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Скрипт ящика: ... procedure start; procedure map_enter_p_proc; procedure map_update_p_proc; import variable sf_tanker_bar_box; ... procedure start begin sf_tanker_bar_box := op_self_obj(); end procedure map_enter_p_proc begin sf_tanker_bar_box := op_self_obj(); if (op_metarule(22, 0) == 0) then begin if (op_local_var(0) < op_game_time()) then begin restock_amt := op_random(1, 2); if (op_obj_is_carrying_obj(op_self_obj(), 71) < restock_amt) then begin ... (в общем, тут как я понимаю, идет процесс заполнения ящика конкретными вещами - взято из скрипта ящика для бармена в казино Бишопа) procedure map_update_p_proc begin sf_tanker_bar_box := op_self_obj(); end Скрипт карты: ... export variable i_suze_obj := 0; export variable i_tgun_table_swap := 0; export variable i_tgun_merchant := 0; export variable i_tmer_table_swap := 0; export variable i_tmer_merchant := 0; export variable sf_tanker_bar_box := 0; ... procedure start begin if (inited == 0) then begin inited := 1; i_suze_obj := -1; i_tgun_merchant := -1; i_tmer_merchant := -1; end end ... (если добавить сюда sf_tanker_bar_box := -1; то игра вылетает, когда по скрипту бармена ему должны вещи добавляться :( ) Скрипт самого бармена: ... import variable sf_tanker_bar_box; ... procedure talk_p_proc begin Evil_Critter := 0; Slavery_Tolerant := 2; Karma_Perception := 10; op_set_global_var(37, 0); op_set_global_var(38, 0); op_set_global_var(39, 0); op_set_global_var(40, 0); ... else if (op_local_var(4) == 0) then begin op_start_gdialog(1103, op_self_obj(), 4, -1, -1); maybe_start_dialog(); call Node001(); maybe_close_dialog(); maybe_op_end_gdialog(); end else begin op_start_gdialog(1103, op_self_obj(), 4, -1, -1); maybe_start_dialog(); call Node006(); maybe_close_dialog(); maybe_op_end_gdialog(); end op_move_obj_inven_to_obj(op_self_obj(), sf_tanker_bar_box); op_set_local_var(4, 1); end ... procedure Node003 begin op_move_obj_inven_to_obj(sf_tanker_bar_box, op_self_obj()); op_gsay_reply(1103, 113); op_giq_option(1, 1103, 115, @NodeBarter, 50); end ... В итоге нефига не работает. Ящичек в маппере рисую и скрипт ему вешаю, в scripts.lst скрипт ящика прописываю (# local_vars = 0 ставлю для него).
----- Обломись! Я подложил туда носок...
|
Отправлено: 11:51 - 22 Фев., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А зачем ты в скрипте карты что-то инициализируешь? Только ящик должен в ту вару писать "себя".
|
Отправлено: 14:22 - 22 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
В смысле? Про это чтоли? export variable sf_tanker_bar_box := 0; Я вроде ничего не инициализирую в скрипте карты.
----- Обломись! Я подложил туда носок...
|
Отправлено: 14:31 - 22 Фев., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А это что? procedure start begin if (inited == 0) then begin inited := 1; i_suze_obj := -1; i_tgun_merchant := -1; i_tmer_merchant := -1; end end (Добавление от 15:01 - 22 Фев., 2005.) Да... SVARы-то у тебя используются в скрипте ящичка, так что не ноль их, а как минимум одна...
|
Отправлено: 15:00 - 22 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Про свары ясно. А в скрипте карты это переменные торговцев на танкере (оружейника и другой тетки )
----- Обломись! Я подложил туда носок...
|
Отправлено: 18:46 - 22 Фев., 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Новый вопрос. Почему не работаеа такая конструкция (LVar1 не увеличивается на единицу и т.д.)? if (op_party_member_obj(16777558) != 0) then begin if (op_tile_in_tile_rect(16324, 16312, 17924, 17912, op_tile_num(op_party_member_obj(16777558)))) then begin LVar1 := LVar1 + 1; op_critter_damage(op_party_member_obj(16777558), 1000, 0); end end Потому, что я оставляю НПС подождать или углы прямоугольника не в той последовательности заданы или еще почему?
----- Обломись! Я подложил туда носок...
|
Отправлено: 13:43 - 2 Марта, 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Всё проще :-) set_local_var( LVar1,get_local_var( LVar1)+1);
|
Отправлено: 14:43 - 2 Марта, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
... или макрос inc_local_var(LVar1).
|
Отправлено: 15:48 - 2 Марта, 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Всем спасибо - я разобрался. Не работало потому, что я оставлял соратника подождать и он как party_member_obj уже не считался. Это можно как-то исправить?
----- Обломись! Я подложил туда носок...
|
Отправлено: 16:27 - 2 Марта, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А что конкретно тебе нужно? Чтобы напарник рандомно гулял вокруг дуда? Или что-то ещё?
|
Отправлено: 16:56 - 2 Марта, 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Мне надо, чтобы когда я напарника оставляю подождать (говорю "Подожди здесь, пока я не вернусь" в комнате с операционным столом-экстрактором органов (4-й уровень SAD), то работала бы возможность что-нибуть у этого напарника извлечь (например мозг). Сейчас же это работает только тогда, когда ты не прося никого подождать, успел добежать до компа и заюзать его, а соратник еще находится в комнате с экстрактором.
----- Обломись! Я подложил туда носок...
|
Отправлено: 17:30 - 2 Марта, 2005
|
|
Yan Slate
Пользователь
Откуда: П.Посад Регистрация: Февр. 2005
Всего: 24 сообщения
|
Здравствуйте, модераторы. Мастерил я тут один скрипт (назовем его test.ssl). Скрипт привязывается к мужику, который стоит в Городе-Убежище. Он может поболтать и отметить на карте новую локацию. Диалоги идут нормально, карту он отображает как надо, но когда я начинаю прописывать его поведение, то компилятор меня посылает в баню. Я компилирую компилятором который с мапером поставляется. И он постоянно мне выдает вот это: Compiling TEST.SSL TEST.SSL(42): Error! Undefined symbol LVAR_Hostile *** THERE WERE ERRORS (1 of them) Как я понял в 42-й строке скрипта он видит ошибку, типа LVAR_Hostile - это неопределенный символ. Чего я, блин, только не перепробовал, чтобы исправить ошибку, но ни фига. Пока я не сотру кусок скрипта вообще, он компилировать не собирается. Кто-нибудь знает в чем дело? Помогите, пожалуйста. Вот этот кусок скрипта, на который компилер ругается: procedure critter_p_proc begin if ( ( ( local_var(LVAR_Hostile) == 2 ) or ( ( global_var( GVAR_ENEMY_VAULT_COURTYARD ) == 1 ) ) ) and (obj_can_see_obj(self_obj,dude_obj))) then begin set_local_var(LVAR_Hostile,1); attack(dude_obj); end end p.s. Я позаимствовал это из ssl какого-то чела Города-Убежища... и пообещал вернуть с процентами .
|
Отправлено: 16:20 - 4 Марта, 2005
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
LVAR_hostile - это, как ни странно, лвар.... то есть локальная переменная. что это такое и как их правильно объявлять лвары - в доку......... (Отредактировал(а) izuken - 17:26 - 4 Марта, 2005)
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 17:25 - 4 Марта, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2YikxX Гм...
Цитата:
Не работало потому, что я оставлял соратника подождать и он как party_member_obj уже не считался. Это можно как-то исправить?
Имхо, в скрипте, который занимается "вскрытием": 1. Получить указатель на Сулика по ПИД. 2. Проверить, находится ли он в комнате. 3. Если "да", то "вскрывать" :). Примерно то?
|
Отправлено: 17:50 - 4 Марта, 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Примерно да. Но как получить на него указатель по ПИД? И от уровня этот ПИД меняется или нет?
----- Обломись! Я подложил туда носок...
|
Отправлено: 17:57 - 4 Марта, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
party_member_obj, видимо, сама соображает. "Вручную" же придётся перебирать все пиды, скажем, Сулика для всех его левелов. Навскидку не скажу, попозже посмотрю.
|
Отправлено: 22:14 - 5 Марта, 2005
|
|
ROCK
Пользователь
Откуда: г.Коломна Регистрация: Февр. 2005
Всего: 110 сообщений
|
У меня появилась проблемка- Я перевел текст в файле с расширением int (кстати за помощь спасибо Anchorite-без него я не смог декомпилировать этот скрипт и скомпилировать его) Ну так вот текст я перевел а в игре вместо моего перевода-непонятные ероглифы. У меня версия от Левой корпорации и патч стоит 1.02 Подскажите че мне сделать чтоб все нормально работало! Оставлять одинаковые сообщения в разных темах запрещается. WG
|
Отправлено: 20:54 - 7 Марта, 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата:
Ну так вот текст я перевел а в игре вместо моего перевода-непонятные ероглифы.
Это не понятно. Что за "текст в игре"? Если вы имеете в виду литературные тексты (а-ля диалоги), то у вас проблема с кодировками, почитайте топик "FAQ по моддингу", там все описано.
----- hit me, nail me, make me god
|
Отправлено: 21:12 - 7 Марта, 2005
|
|
ROCK
Пользователь
Откуда: г.Коломна Регистрация: Февр. 2005
Всего: 110 сообщений
|
Ну это не совсем диалоги-скорее надписи над критером и надпись когда навожу на него-в меню иформации описание его(Вы видете Клинта)-вот это все написано ероглифами. Ссылочку напиши где че мне прочитать и если надо то укажи ссылки на утилиты для исправления моей головной боли. ;-) Хочу повторить что у меня версия от Левой корпорации. (Отредактировал(а) ROCK - 23:43 - 7 Марта, 2005)
|
Отправлено: 23:41 - 7 Марта, 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Оно самое, все такие надписи обобщаются словом диалоги или msg. У вас левая корпорация, а значит, что у вас все msg файлы написаны в кодировке от левой корпорации, а вы пишите в кодировке от dos cp866.
Цитата:
Ссылочку напиши где че мне прочитать и если надо то укажи ссылки на утилиты для исправления моей головной боли.
Мда.. лень топик перечитывать? Выхода два: либо создавать тексты для левой корпорации, либо поменять свой перевод на Фаргуса. Хм.. мне тоже лень прямые ссылки давать , здесь найдешь все что нужно. (Добавление от 0:54 - 8 Марта, 2005.) Уж коли запостил.. никто не знает способа создания макроса или процедуры, в котором можно было бы указывать разное количество параметров? Самая простая задача: есть N значений, из них требуется выбрать рандомно одно. N может меняться, однако не хотелось бы создавать sup{N} процедур.
----- hit me, nail me, make me god
|
Отправлено: 0:47 - 8 Марта, 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
И Фаргусовская, и ЛевКорповская кодировки - по сути есть DOS кодировка, только у Фаргуса всместо Х ставится Ё (если не ошибаюсь), а у ЛевКорпа - точно сказать не могу, но вроде полностью совпадает с DOSом. Соответсвенно, нужен редактор, поддерживающий эту кодировку. Сам я привык использовать Bred, а в Блокноте достаточно поставить шрифт Terminal. А там, где указал Alan, я ничего толкового по этому поводу не нашел ;))).
|
Отправлено: 11:58 - 10 Марта, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2YikxX По поводу указателя по ПИДу. Получать его через tile_contains слишком муторно. Но можно и схитрить ;). Сулика на карте изначально нет. Попасть туда он может лишь как сопартиец. А это означает, что party_member_obj(PID_SULIK) будет возвращать верный указатель... который надо будет получить и запомнить при заходе на карту. Но этот способ плохой. Одноразовый. Имхо, лучше завести мвару, в которую Сулик будет писать self_obj каждый раз при заходе на нужную карту. Ну а дальше - дело техники: проверить принадлежность объекта прямоугольнику...
|
Отправлено: 12:45 - 10 Марта, 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Спасибо, будем пробовать.
----- Обломись! Я подложил туда носок...
|
Отправлено: 13:20 - 10 Марта, 2005
|
|
ROCK
Пользователь
Откуда: г.Коломна Регистрация: Февр. 2005
Всего: 110 сообщений
|
Привет всем! Кстати проблему с переводом в Левой Корпорации я решил так-воспользовался двумя прогами:1)AkelPad(этот текстовый редактор устанавливается с Total Commander 6.50 PowerPack)он очень удобный и причем он поддерживает кодировку DOS;2)COOLer-прога сделана для того чтобы прегонять текст редактированный в кодировку от Левой Корпорации. ---------------------------------- Теперь у меня есть следующая проблемка в моде который я перевел на русский-мой герой(Нарг) говорит с персонажем(Клинт)-и Клинт предлагает помощь-и если отказаться от его помощи,то больше он не станет говорить с моим героем,а всего лишь Клинт будет приветствовать моего героя(т.е. просто над головой Клинта будет написанно-"Привет,Избранный" ). Как исправить эту недоделочку(надо сделать так,чтобы после отказа можно было опять говорить с Клинтом)!!! ------------------ Помогите! Заранее спасибо! (Отредактировал(а) ROCK - 11:41 - 13 Марта, 2005)
|
Отправлено: 11:39 - 13 Марта, 2005
|
|
tracktor
Пользователь
Откуда: Москва Регистрация: Март 2004
Всего: 183 сообщения
|
Цитата: Quote: from ROCK on 11:39 - 13 Марта, 2005 Привет всем! Кстати проблему с переводом в Левой Корпорации я решил так-воспользовался двумя прогами:1)AkelPad(этот текстовый редактор устанавливается с Total Commander 6.50 PowerPack)он очень удобный и причем он поддерживает кодировку DOS;2)COOLer-прога сделана для того чтобы прегонять текст редактированный в кодировку от Левой Корпорации. ---------------------------------- Теперь у меня есть следующая проблемка в моде который я перевел на русский-мой герой(Нарг) говорит с персонажем(Клинт)-и Клинт предлагает помощь-и если отказаться от его помощи,то больше он не станет говорить с моим героем,а всего лишь Клинт будет приветствовать моего героя(т.е. просто над головой Клинта будет написанно-"Привет,Избранный" ). Как исправить эту недоделочку(надо сделать так,чтобы после отказа можно было опять говорить с Клинтом)!!! ------------------ Помогите! Заранее спасибо! (Отредактировал(а) ROCK - 11:41 - 13 Марта, 2005)
Хм... По моему, это не недоделка, а специально сделанная фича. Глянь в talk_p_proc, там болкировка какая-то должна быть.
|
Отправлено: 16:16 - 13 Марта, 2005
|
|
ROCK
Пользователь
Откуда: г.Коломна Регистрация: Февр. 2005
Всего: 110 сообщений
|
Так нашел я вот следующее: ------------------------------------------------------- procedure talk_p_proc begin variable LVar1 := 0; variable LVar2 := 0; variable LVar3 := 0; variable LVar4 := 0; if (op_local_var(3) == 1) then begin op_start_gdialog(751, op_self_obj(), 4, -1, -1); maybe_start_dialog(); call Node010(); maybe_close_dialog(); maybe_op_end_gdialog(); end else if (op_local_var(1) == 0) then begin op_start_gdialog(751, op_self_obj(), 4, -1, -1); maybe_start_dialog(); call Node001(); maybe_close_dialog(); maybe_op_end_gdialog(); end else if (op_local_var(1) == 1) then begin LVar1 := op_critter_inven_obj(op_self_obj(), 0); op_start_gdialog(751, op_self_obj(), 4, -1, -1); maybe_start_dialog(); call Node005(); maybe_close_dialog(); maybe_op_end_gdialog(); if (op_critter_inven_obj(op_self_obj(), 0) != LVar1) then begin if (op_critter_inven_obj(op_self_obj(), 0) == 0) then LVar1 := op_create_object(16777217, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 1) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 379)) then LVar1 := op_create_object(16777342, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 232) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 14) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 3)) then LVar1 := op_create_object(16777338, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 349) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 348)) then LVar1 := op_create_object(16777331, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 240) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 380) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 2)) then LVar1 := op_create_object(16777344, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 74) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 265)) then LVar1 := op_create_object(16777346, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 239) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 17) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 381)) then LVar1 := op_create_object(16777348, 0, 0, 751); else if ((op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 524) or (op_obj_pid(op_critter_inven_obj(op_self_obj(), 0)) == 113)) then LVar1 := op_create_object(16777700, 0, 0, 751); LVar2 := op_critter_inven_obj(op_self_obj(), 1); LVar3 := op_critter_inven_obj(op_self_obj(), 0); LVar4 := op_get_critter_stat(op_self_obj(), 35); op_critter_heal(LVar1, LVar4); op_set_obj_invisibility(op_self_obj(), 1); op_move_obj_inven_to_obj(op_self_obj(), LVar1); asm_expr(op_critter_attempt_placement(LVar1, op_tile_num(op_self_obj()), op_elevation(op_self_obj()))); op_anim(LVar1, 1000, op_has_trait(1, op_self_obj(), 10)); if (op_local_var(3) != 1) then begin op_critter_add_trait(LVar1, 1, 6, 0); op_critter_add_trait(LVar1, 1, 5, op_has_trait(1, op_self_obj(), 5)); op_party_add(LVar1); op_set_global_var(40, op_local_var(1)); op_set_global_var(41, op_local_var(3)); op_set_global_var(42, op_local_var(6)); if (LVar2 != 0) then op_wield_obj_critter(LVar1, LVar2); if (LVar3 != 0) then op_wield_obj_critter(LVar1, LVar3); op_party_remove(op_self_obj()); op_destroy_object(op_self_obj()); op_add_timer_event(LVar1, op_random(5, 20) * 10, 1); end end end else op_float_msg(op_self_obj(), "Привет Избранный", 9); end ---------------------------------- И че тут тогда надо подправить? Подскажите! Заранее спасибо!
|
Отправлено: 18:08 - 13 Марта, 2005
|
|
tracktor
Пользователь
Откуда: Москва Регистрация: Март 2004
Всего: 183 сообщения
|
Мда... Видать ты с программированием вообще не знаком... Надо наскока я понимаю убрать вот это: if (op_local_var(3) == 1) then begin это: end else и это else op_float_msg(op_self_obj(), "Привет Избранный", 9); Ну мож ещё чего подправить если работать не будет.
|
Отправлено: 20:35 - 13 Марта, 2005
|
|
ROCK
Пользователь
Откуда: г.Коломна Регистрация: Февр. 2005
Всего: 110 сообщений
|
Я как ты сказал удалил строки: ------------------------------------------ if (op_local_var(3) == 1) then begin это: end else и это else op_float_msg(op_self_obj(), "Привет Избранный", 9); ----------------------------------------------------------------- Теперь появилась следующая проблема- Когда я говорю с Клинтом и отказываюсь от его помощи,то заканчивается диалог(так должно быть)-И ПОТОМ:сразуже появляется этот же диалог второй раз! А если я соглашаюсь с ним,то он со мной идет-но как с ним начну говорить,то опять он предлагает мне свою помощь! -------------------------------------------------------------------- Как это исправить? Подскажите! Заранее спасибо!
|
Отправлено: 21:26 - 13 Марта, 2005
|
|
tracktor
Пользователь
Откуда: Москва Регистрация: Март 2004
Всего: 183 сообщения
|
На самом деле начинать программировать со скриптов fallout'а есть не очень правильно, потому что и учебников по этому делу почти нет, и на отладку скриптов времени достаточно уходит. Я бы посоветовал тебе сначала научиться азам программирования на паскале или бейсике, а потом вернуться к скриптам. Ну или хотя бы почитать повнимательнее FScript-howto. Или, наконец, начинать с написания своих простейших скриптов, а не с разгребания чужих сложных.
|
Отправлено: 12:44 - 14 Марта, 2005
|
|
ROCK
Пользователь
Откуда: г.Коломна Регистрация: Февр. 2005
Всего: 110 сообщений
|
Конечно твой совет я возьму на заметку. Но щас все-таки надо мод доработать! Так че мне надо подправить чтобы все заработало как должно? Заранее спасибо!
|
Отправлено: 15:43 - 14 Марта, 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Ну ты ROCK даешь!!! Неуже ли ты думаешь что кто-то будет за тебя делать твою работу? Тебе помогут раз, два, ну три наконец. А потом тебя просто начнуть посылать "в направлении ФРГ" т.к. поймут, что "не в коня корм". Кроме того неужели так сложно стянуть с этого сайта доку по скриптам от Wasteland Ghost и неспеша разобраться что в этих скриптах к чему?
|
Отправлено: 19:53 - 14 Марта, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Я думаю мой вопрос как раз для этой темы. В игре машина состоит из двух частей. Для создания рабочего багажника. При необходимости при заходе на карту машина создаётся скриптово. Но главный вопрос - после решения "уехать с карты" и действии на car, каким образом вызывается переход на карту мира. Если через скрипт, то всё понятно - car_give_to_party и всего дел. Но каким образом скрипт привязывается к машине. В объектах (в маппере) прямой привязки нет. При создании тоже не замечал. Похожего скрипта в списке не нашёл. Кто знает есть ли соответствующий машине скрипт? По логике вещей обязан быть. Если это реализуется как-то иначе - то как?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 0:35 - 23 Марта, 2005
|
|
YikxX
Пользователь
Откуда: NCR :) Регистрация: Февр. 2004
Всего: 304 сообщения
|
Хм, а ZSDrvCar.int это чей скрипт?
----- Обломись! Я подложил туда носок...
|
Отправлено: 9:48 - 23 Марта, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
За работу с машиной отвечают: ZSDRVCAR.SSL - скрипт машины ZICRTRNK.SSL - скрипт багажника *Все* скрипты карт, с которых существуют выходы на карту мира.
|
Отправлено: 9:50 - 23 Марта, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Премного благодарен.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 15:27 - 23 Марта, 2005
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
переводил cinema.int из bosdemo Дена Бастера в ssl на языке Бис, компилировал запускал Гвара 646 ни как не принимает значение 9, Почему? procedure timed_event_p_proc begin if (combat_is_initialized==0 /*==0 чтобы это значило? на пальцах пожалуста*/and global_var(646)==8) then begin if cur_map_index==156 /* может здесь? но если тестить карту под именем Artemple то какой номер в соответственном h, вроде нет никакого, да и вырезаю это условие - толку не получается */ then begin if (tile_num(var_restock_trash)>20705 or tile_num(var_restock_trash)<20705) then begin animate_move_obj_to_tile(var_restock_trash,20705,0); end set_map_start(101,111,elevatio(0),0); float_msg(var_restock_trash,message_str(1444,105),3); set_global_var(646,global_var(646)+1); end end if (combat_is_initialized==0 and global_var(646)==14) then begin if cur_map_index==156 then begin if (tile_num(global_var(644))>20705 or tile_num(global_var(644))<20705) then begin animate_move_obj_to_tile(global_var(644),20705,0); end set_map_start(101,111,elevation(0),0); float_msg(global_var(644),message_str(1444,106),7); set_global_var(646,global_var(646)+1); end end if global_var(646)<8 then begin call cinema; if global_var(645)==0 then begin if global_var(646)==7 then begin call endanim; end end end if (global_var(646)>=7 and global_var(646)<9) then begin add_timer_event(self_obj,40,1); end if (global_var(646)>=11 AND global_var(646)<14) then begin Call cinema; if global_var(645)==1 then begin if global_var(646)==13 then begin Call endanim; end end end if (global_var(646)>=14 AND global_var(646)<15) then begin add_timer_event(self_obj,40,1); end end procedure endanim begin Fadeout(1000); set_global_var(646,global_var(646)+1); game_ui_enable; FadeIn(1000); end И как пересчитать тики в нормальные секунды? (Отредактировал(а) Dar - 11:20 - 1 Апр., 2005)
|
Отправлено: 11:06 - 1 Апр., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Тебе сюда. И в заголовки (*.h): /* Time Information (in Ticks) */ #define ONE_GAME_SECOND (10) #define ONE_GAME_MINUTE (60*ONE_GAME_SECOND) #define ONE_GAME_HOUR (60*ONE_GAME_MINUTE) #define ONE_GAME_DAY (24*ONE_GAME_HOUR) #define ONE_GAME_WEEK (7*ONE_GAME_DAY) #define ONE_GAME_MONTH (30*ONE_GAME_DAY)
|
Отправлено: 14:02 - 1 Апр., 2005
|
|
Jager
Пользователь Регистрация: Март 2005
Всего: 38 сообщений
|
Начал понемногу разбираться со скриптами. Вот, нашел в одном ноде такое (is_success(roll_vs_skill(dude_obj,SKILL_CONVERSANT,0))) Эта просто выдает результат сравнения спича криттера со спичем персонажа? То есть просто тупо у кого выше спич? Текст нода (на вс сл) procedure Node027 begin if (is_success(roll_vs_skill(dude_obj,SKILL_CONVERSANT,0))) then begin Reply(263); NOption(264,Node999,004); end else begin Reply(267); NOption(188,Node999,004); NOption(266,Node998,004); end end Подскажите еще как ассоциировать номера криттеров из critters.lst и реальные персонажи игры, есть ли такая табличка?
|
Отправлено: 19:35 - 4 Апр., 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
>Эта просто выдает результат сравнения спича криттера со спичем персонажа? То есть просто тупо у кого выше спич? roll_vs_skill - бросок костей, случайное число. Бросок может быть удачным и наоборот. Чем выше скилл, тем выше вероятность успеха. Вообще-то давно существует дока по скриптовым командам от Wasteland Ghost. >Подскажите еще как ассоциировать номера криттеров из critters.lst и реальные персонажи игры, есть ли такая табличка? Конечно, можно. Для этого были созданы pro-файлы. У каждого есть свой уникальный идентификатор (ID). В них прописаны характеристики криттеров - описание, изображение и т.д. Опять, же есть описание формата PRO. Неужели раздел "Документация" на нашес сайте моль похавала? А для того, о чем ты спросил, лучше использовать маппер Димса - там все криттеры в шеренгу выстроены, каждый с порядковым номером.
|
Отправлено: 23:56 - 4 Апр., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
>>Подскажите еще как ассоциировать номера криттеров из critters.lst и реальные персонажи игры, есть ли такая табличка? Я думаю, что Jager подразумевал несколько иное. Реальные персонажи в игре - это Сулик, Вик, хранитель моста.... ведь так? Вопрос был в этом? Если да, то как такового персонажа в фолле нет. Ты можешь взять любую картинку, прикрутить к ней любое поведение(скрипт), характеристики(прошки) и получить персонаж. Если имелось в виду другое, то ответ уже получен. 2 Perceptron: Не в обиду, но перечитывая на досуге доки из всё того же раздела нашёл столько неточностей и неизвестной информации, что.... Просто часть данных писалась довольно давно и не соответствует нынешним данным и полученым сведениям. По хорошему часть инфы нужно переработать. Вод только покажите мне такого человека, который рискнёт за это взятся.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 0:40 - 5 Апр., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Ray Самые нужные доки, по скриптингу и по прошникам, как раз регулярно обновляются. По остальным, не спорю, есть пробелы. Так на то "Исследования" и создавались ;).
|
Отправлено: 13:32 - 5 Апр., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Как создать своего напарника?Кто нибудь может помочь с этим?В доках ничего не понятно,т.е описаны только названия функций,и что они делают,а как их использовать неясно. Понятно,что начинаем с функции старт. Потом надо исользовать ентер мап или эта функция используется уже в скрипте карты. У персонажа нужно указать его статы,скиллы и поведение.Как это делать,с помощью каких функций? Наконец о функции диалога..как и создавать диалоги в ф-геке(к нему прикреплён редактор мсг файлов),и где их прописывать?(Я имею ввиду есть ли какой нибудь диалог.лст или что то типа этого)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:13 - 6 Апр., 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
Доки - это хорошо. Но всего охватить они не могут. Напарники - тема обширная. А лучший способ узнать, что же нужно делать - посмотреть на то, как это сделано в игре, разобраться со структурой ресурсов. Диалог.листа нет. Название файла .msg должно совпадать с названием файла .int и все. Прежде чем использовать ф-гек лучше действительно разобраться с компилятором. А скрипты изучать на примерах существующих (лучше по оригинальным исходникам). Кстати, есть мод: Klint the Generous. Лежал на falloutsite.ru. Там Клинт напарником сделан. Если посмотреть какие файлы и как там изменены, я думаю, можно будет понять, как создать своего напарника. А для начала лучше попробовать создать хотя бы своего НПС.
----- Into The New Year - With A New Vision! Документация по скриптам, туториал по скриптам, вопросы по скриптам, FAQ по моддингу, "Утилиты", fallmods-tutor.
|
Отправлено: 3:42 - 7 Апр., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Вот пример из доки Raven'a по реализации диалога: //Наш номер #define NAME 1305 // по списку -1 в script.lst //Макросы //Заменяем (номер_скрипта,номер_фразы) на (номер_фразы) //т.к. номер скрипта - заранее известен и неизменен для всего скрипта #define Reply(x) gsay_reply(NAME,x) //Тоже и для gsay_option #define Option(x,y) gsay_option(NAME,x,y,-1) procedure Node009; procedure Node010; procedure Node011; procedure Node999; //Процедуры procedure start begin end procedure talk_p_proc begin Start_gDialog(NAME,self_obj,-1,-1,-1); GSay_Start; call Node009; GSay_End; End_Dialogue; end procedure Node009 begin Reply(1); Option(10,Node010); Option(11,Node011); end procedure Node010 begin Reply(2); Option(12,Node011); Option(13,Node999); end procedure Node011 begin Reply(3); Option(15,Node999); end procedure Node999 begin end после этого пишем в msg файле {1}{}{Hello, Chosen One} {10}{}{Yeah. How its going?} {11}{}{Sorry. No time for chat} {2}{}{Not bad. Heard you have some troubles with the Enclave?} {12}{}{Oooh. Nothing serious, really} {13}{}{Eee. I must be going} {3}{}{Well, I wish you luck anyway} {15}{}{Thanks. Bye}
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 10:21 - 7 Апр., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Описываю как это в скрипте Криса: /* Standard Script Procedures */ procedure start; procedure critter_p_proc; procedure pickup_p_proc; procedure talk_p_proc; procedure destroy_p_proc; procedure look_at_p_proc; procedure description_p_proc; procedure use_skill_on_p_proc; procedure use_obj_on_p_proc; procedure damage_p_proc; procedure map_enter_p_proc; procedure push_p_proc; procedure timed_event_p_proc; Насколько я понял все эти процедуры описаны специально для нпс?И их обязательно вводить.Они уже есть в инклуде? дальше procedure Node998; // This Node is Alshhays Combat procedure Node999; // This Node is Alshhays Ending Что это?Что за процедуры нод,и за что каждая отвечает? дальше // The neht lines are added in by the Designer Tool. // Do NOT add in any lines here. //~~~~~~~~~~~~~~~~ DESIGNER TOOL STARTS HERE procedure Node001; procedure Node001a; procedure Node002; procedure Node003; procedure Node004; procedure Node004a; procedure Node004b; procedure Node005; procedure Node006; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure Node011; procedure Node012; procedure Node013; procedure Node014; procedure Node015; procedure Node016; procedure Node017; procedure Node017a; procedure Node018; procedure Node019; Что это? дальше // party member default nodes procedure Node1001; procedure Node1002; procedure Node1003; procedure Node1004; procedure Node1005; procedure Node1006; procedure Node1007; procedure Node1008; procedure Node1009; procedure Node1010; procedure Node1100; Это? дальше // Cassidy dialog procedure Node1101; procedure Node1101a; procedure Node1102; procedure Node1103; procedure Node1104; procedure Node1105; procedure Node1106; procedure Node1107; procedure Node1108; procedure Node1109; procedure Node1110; procedure Node1111; procedure Node1112; Это насколько я понял для диалога..Как они действуют?Обязательно их писать? // Cassidy floats procedure Node2001; procedure Node2002; procedure Node2003; procedure Node2004; procedure Node2005; procedure Node2006; procedure Node2007; procedure Node2008; procedure Node2009; procedure Node2010; procedure Node2011; procedure Node2012; procedure Node2013; procedure Node2014; procedure Node2015; procedure Node2016; procedure Node2017; procedure Node2018; procedure Node2019; procedure Node2020; procedure Node2021; procedure Node2022; Что такое флоатс?Как это действует? дальше //~~~~~~~~~~~~~~~~ DESIGN TOOL ENDS HERE // The Folloshhing lines are for anything that is not needed to be // seen by the design Tool /* Local Variables shhhich are saved. All Local Variables need to be prepended by LVAR_ */ #define LVAR_Herebefore (4) #define LVAR_Hostile (5) #define LVAR_Personal_Enemy (6) #define LVAR_SHHAITING (7) #define LVAR_FOLLOSHH_DISTANCE (8) #define LVAR_TEAM (9) #define LVAR_Cassidy_Offered (10) #define LVAR_Cassidy_Knoshhs_Plan (11) #define LVAR_Admonished_Cassidy (12) #define LVAR_Mentioned_Vault (13) #define LVAR_JOined_Party_Before (14) Что это за процедуры?За что отвечают?Где их редактировать?Может мне кто-нить обьяснить про гвар,лвар и остальные вары? #define check_bad_area(map, elev) ((cur_map_indeh == map) and ((elevation(self_obj) == elev) or (elev == -1))) #define cassidy_doesnt_like_area ((check_bad_area(MAP_RAIDERS_CAMP2, -1)) or \ (check_bad_area(MAP_KLAMATH_TOHICCAVES, -1)) or \ (check_bad_area(MAP_KLAMATH_RATCAVES, -1)) or \ (check_bad_area(MAP_BROKEN_HILLS2, 1)) or \ (check_bad_area(MAP_SAN_FRAN_TANKER, 1)) or \ (check_bad_area(MAP_GHOST_FARM, -1)) or \ (check_bad_area(MAP_REDDING_MINE_TUNNEL, -1)) or \ (check_bad_area(MAP_SIERRA_BATTLE, -1))) // *** finish Что это?За что эта процедура отвечает?За что отвечает в ней каждая переменная? Самой функции чек бад ареа нету в хелпе по скриптам Что за ((cur_map_index == map) and ((elevation(self_obj) == elev) or (elev == -1)))? За что она отвечает?Что за чек мап идут после неё? #define cassidy_is_poisoned (get_poison(self_obj)) #define cassidy_is_irradiated (get_critter_stat(self_obj, STAT_current_rad)) #define cassidy_is_crippled ((critter_state(self_obj) bshhand DAM_CRIP_LEG_LEFT) or \ (critter_state(self_obj) bshhand DAM_CRIP_LEG_RIGHT) or \ (critter_state(self_obj) bshhand DAM_CRIP_ARM_LEFT) or \ (critter_state(self_obj) bshhand DAM_CRIP_ARM_RIGHT)) Ок.Тут не понял первое..Зачем здесь пишется дефайн касиди из посонед?В дефайне есть такая функция?Что она делает? далее get poison.Цитирую:"int get_poison(ObjectPtr who) " - вернуть уровень отравления критера".Что это значит.Обьясни пожалуйста на примере игры.как функция действует точно?int get_critter_statе(ObjectPtr shhho, int stat) - вернуть значение характеристики.Зачем это тут?как это действует? int critter_state(ObjectPtr who) - вернуть состояние обьекта. Как это действует?При наводе курсора н обьект? bwand DAM_CRIP_LEG_LEFT) Что такое bwand?Что значат DAM_CRIP_LEG_LEFT,то же самое райт,и т.д?Почему между ними стоит or? #define cassidy_party_member_options if( party_is_waiting == false ) then \ NOption(9999, Node1101, 004); \ party_member_default_options \ Что это за процедура?Что она делает?.Что за нод здесь?Что такое вообще эти ноды? Наконец последнее /* Local variables which do not need to be saved between map changes. */ variable Only_Once:=0; variable Perform_Party_Add:=0; variable Perform_Party_Remove:=0; variable Perform_Critter_Float := 0; За что отвечают эти Переменные? Я вас очень прошу Павел,постарайтесь ответить на все вопросы ,и как можно ясней.Вы меня поймите=))Я в скриптах фалаута вообще не разбираюсь.Неплохо было бы понять сначала что для чего,и КАК ЭТО ВЫГЛЯДИТ В ИГРЕ. Заранее спасибо.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:32 - 7 Апр., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Я не Павел, но попробую ответить. Часть ответов можит быть не понятна(для этого надо хоть немного знать языки программирования//желательно Си//), но попробую. Как сказал один человек - "Поехали" >>procedure timed_event_p_proc; Насколько я понял все эти процедуры описаны специально для нпс?И их обязательно вводить.Они уже есть в инклуде? Не понял, что значит есть в инклуде. Однако - эти функции не специально для нпс. Одни из них могут исспользоваться, другие - нет. Их вообще может не быть. Часть из этих описаный могут относиться и к другим объектам. Вообще все это - просто прототипы функций (не путать с прошками, или по другому с прототипами как в игре!!!). Это зарезервированный термин языка прогр. Фактически прототипы - это описание функции, её имя, аргументы и т.д. >> procedure Node998; // This Node is Alshhays Combat procedure Node999; // This Node is Alshhays Ending Что это?Что за процедуры нод,и за что каждая отвечает? дальше Как правило ноды отвечают за разговор. Хотя это и не так. Просто разработчики решили называть процедуры, где исспользуются диалоги как NodeXXX. Это сделано для простоты читания кода. В ноде может быть что угодно. В данном случае 998 - при вызове отвечает за дружественность(возможность атаки нпс. на чуза) node999 - пустая и отвечает за конец диалога. К слову за конец диалога может отвечать любая нода без вызова других веток разговора. >>procedure Node1100; Это? дальше Все данные ноды отвечают за диалог. даже это не так, всё что было - это объявление процедур. >>procedure Node1112; Это насколько я понял для диалога..Как они действуют?Обязательно их писать? Как я уже сказал, ноды могут быть и не для диалога. всё зависит от того что ты запишешь в: procedure Node001; ............. procedure Node001 begin СЮДА end А писать их нужно столько, сколько тебе самому надо. Действуют они просто. По ходу выполнения скрипта, в одной из процедур есть вызов нод(любых процедур) Например так call nodeXXX(); после этого начинается выполнение соответствующей процедуры. >>Что такое флоатс Всё те-же ноды, но отвечающие за надписи над нпс. Собраны по порядку для простоты. >>#define LVAR_JOined_Party_Before (14) Что это за процедуры?За что отвечают?Где их редактировать?Может мне кто-нить обьяснить про гвар,лвар и остальные вары? вообще-то define - это директивы препроцессора. Фактически прпроцессор работает как обычный текстовый редактор. Он находит необходимую строчку и заменяет её на нужное : Например #define Just 17 найдет в тексте все слова just и заменит на 17. (Препроцессор занимается не только этим). Про лвары, гвары.... так много написано, что не хочется лезть в эту тему. Может по позже. >>Что за ((cur_map_index == map) and ((elevation(self_obj) == elev) cur_map_index - функция возвращающая номер локации, где находится перс. elevation(self_obj) - функция возвращающая этаж, где находится владелец скрипта. Фактически это проверки карты и этажа. >>Ок.Тут не понял первое..Зачем здесь пишется дефайн касиди из посонед?В дефайне есть такая функция?Что она делает? я рассказал, как действует дефайн. В разных ситуациях будут подставляться разные значения. "посонед" - степень отравления критера. Ну скорпион ткнул >>(ObjectPtr shhho, int stat) - вернуть значение характеристики.Зачем это тут?как это действует? int critter_state(ObjectPtr who) - вернуть состояние обьекта. Как это действует?При наводе курсора н обьект? Тут - это где? Откуда я знаю зачем это ТУТ без места нахождения в коде. Вернуть состояние - значит, что функция вернёт значение соответствующие задаче функции. Потом можно сверять эти значения. Например critter_state вернёт значение одной из характеристик. Нигде в окошке тебе этого не отобразят. Пример: Допустим у тебя значение хар. = 120, тогда if (get_critter_stat(self_obj, STAT_current_rad) > 100 ) begin ..... end выполнится. Если хар. = 90 - Нет. >>variable Perform_Critter_Float := 0; За что отвечают эти Переменные? А фиг их знает, надо конкретно смотреть кусок кода. ВСЁ P.S. А вообще, хоть без начального знания программирования в скриптинге делать нечего. Если знать хоть основы 90% вопросов не будет. А обо всём тебе отвечать никто не будет. И уж тем более учить программированию. Других дел полно. Да и столь больших ответов думаю тоже не будет.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:26 - 7 Апр., 2005
|
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Итак, по коду скрипта идет стандартное разбитие на разделы 1.описание процедур procedure - процедуры, которые будут использоваться. procedure Node998; // Боевой выход из диалога procedure Node999; // Простой выход из диалога. есть процедуры, которые используются бисовцами и относятся к диалогу и действиям, так что это просто пометки для себя. Само название НодехХх - тоже БИС придумал, можно написать бебебе и при обращении все работать будет, так что нода это просто имя процедуры. 2.описание переменных #define LVAR_ХХХ (х) Лвар - локальная переменная, сохранияется при окончании действия скрипта и выхода с карты. если х=5 то, при загрузке автоматически будет начинаться бой (все не много сложнее, но этой информации временно должно хватить.) Гвары и Мвары здесь (в скрипте) не описываются. 3.Далее идут вариаблы. variable Perform_Party_Add:=0; Вариабла работает только при исполнении скрипта, если работа скрипта закончена, то значение не сохраняется. Например расстояние до чуза. Если оставить нпс, то он не будет идти за тобой на установившемся ранее расстоянии. 4.далее идут макросы Препроцессор, если всё правильно прописано, заменяет при компиляции команду макроса на более длинную строку. Т.е. работает просто заменой короткого имени макроса на длинное описание самого макроса. #define check_bad_area(map, elev) ...... #define cassidy_doesnt_like_area ((check_bad_area(MAP_RAIDERS_CAMP2, -1)) or ... просто здесь идет возврат значения нахождения на той или иной карте, допустим для фразы появившейся над Кэсом. Вообще пропусти эту часть, так как это, в принципе, просто наворот партийца. Что за ((cur_map_index == map) and ((elevation(self_obj) == elev) or (elev == -1)))? За что она отвечает?Что за чек мап идут после неё? * cur_map_index == возвращает номер карты elevation(self_obj) == возвращает номер уровня карты elev == -1 любой уровень (уровни есть 0,1,2) Обьясни пожалуйста на примере игры.как функция действует точно?int get_critter_statе(ObjectPtr shhho, int stat) - вернуть значение характеристики.Зачем это тут?как это действует? * допустим есть характеристика значение которой нам нужно узнать, таким образом мы вернем её значение. И сможем использовать, например джет либо что то другое. int critter_state(ObjectPtr who) - вернуть состояние обьекта. Как это действует?При наводе курсора н обьект? * Очень понятно описал Ray. bwand DAM_CRIP_LEG_LEFT) Что такое bwand?Что значат DAM_CRIP_LEG_LEFT,то же самое райт,и т.д?Почему между ними стоит or? * Если, к примеру, есть ранение, то вести полноценный бой партиец не сможет, за сим идет просмотр ранена_правая_нога или ранена_левая_нога (отвечает за число ходов), ранена_правая_рука.... (за меткость) А вообще, начни писать партийца с нуля. Это лучший способ разобраться. Начни с диалога и подключения в команду. Когда будет основа работать - будет легше. И постепенно усовершенствуй скрипт.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 14:27 - 8 Апр., 2005
|
|
Jager
Пользователь Регистрация: Март 2005
Всего: 38 сообщений
|
Цитата:
roll_vs_skill - бросок костей, случайное число. Бросок может быть удачным и наоборот. Чем выше скилл, тем выше вероятность успеха.
А какими-нибудь числами можно подкрепить? Я вот знаю, что есть число - текущее значение скилла. А как там кидается? Ни одного числа эта операция не выдает... Ray все правильно понял. Я на самом деле хотел знать вот что. Например, я изучаю скрипт Фрэнки, хозяина бара в Дэне. Правильно ли я понял, что среди всех 500 pro есть pro именно с характеристиками Фрэнки? Или ему дают какой-то стандартный ПРО "мужика в зеленой куртке"? Так же как и стандартную картинку.
|
Отправлено: 16:33 - 8 Апр., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Следует чётко понимать, что есть прототип. В нём описываются значения(характеристики) персонажа. Как то повреждения, спец. возможности, причасность к команде, жизнь и т.д. Каждому критеру соответствуют свои прошки. Вопрос заключается в другом. Ты можешь взять двух одинаковых криттеров(с одинаковыми прошками) и прицепить к ним разные скрипты. Тогда поведение у них будет разное, но характеристики одни. Но при необходимости создаются отдельные прошки под спец. криттеров. Например, если тебе без разницы, что в городе у тебя несколько одинаковых перс. ты исспользуешь одинаковых криттеров(наркоманы). А если тебе нужен кто-то отдельно со своими личными хар. (главный Босс), то создаются отдельно.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 17:56 - 8 Апр., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Jager Настоятельнейше рекомендую сходить сюда и почитать вот это, а также всё, что лежит в разделе "Скриптинг". И не говорить больше, что roll_vs_skill ничего не возвращает. Функция описана очень подробно.
|
Отправлено: 13:02 - 9 Апр., 2005
|
|
Jager
Пользователь Регистрация: Март 2005
Всего: 38 сообщений
|
А я, простите, что, говорил, что она ничего не возвращает? Я хотел понять, можно ли сказать, что при такой величине скилла, вероятность каждого из четырех значений такая-то. Точного ответа, наверное нет. Кстати, если какая-то ссылка на документы проскакивает, я всегда читаю. И вообще, мои вопросы все "по материалам лекций".
|
Отправлено: 18:52 - 9 Апр., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: А какими-нибудь числами можно подкрепить? Я вот знаю, что есть число - текущее значение скилла. А как там кидается? Ни одного числа эта операция не выдает...
Ноу комментс. ЗЫ Ещё раз прошу обратиться к докам. И сделать контекстный поиск по исходникам от БИС, чтобы увидеть процесс, так сказать, в действии.
|
Отправлено: 9:22 - 10 Апр., 2005
|
|
Jager
Пользователь Регистрация: Март 2005
Всего: 38 сообщений
|
Обратился. Результат поиска, например procedure Node027 begin if (is_success(roll_vs_skill(dude_obj,SKILL_CONVERSANT,0))) then begin Reply(263); NOption(264,Node999,004); end else begin ............................. Что написано в справочнике (извините за перепечатывание) int roll_vs_skill(ObjectPtr who, int skill, int modifier) - выполняет "бросок кубика" на умения (skill) Аргументы: who - указатель на объект skill - номер проверяемого умения (см. Приложение) указанного объекта modifier - модификатор значения умения, отрицательное значение уменьшает вероятность успеха, положительное - увеличивает Возвращаемое значение: ROLL_CRITICAL_FAILURE (0) ROLL_FAILURE (1) ROLL_SUCCESS (2) ROLL_CRITICAL_SUCCESS (3) Что касается из_саксесс, то boolean is_success(int val) - проверяет, является ли результат "броска кубика" успешным Аргументы: val - результат "броска кубика" Возвращаемое значение: TRUE - если результат успешный (val == ROLL_SUCCESS или val == ROLL_CRITICAL_SUCCESS), иначе - FALSE В свете этого, не могли бы Вы все же ответить на уже заданый вопрос (или показать, где в том, что я перепечатал из доки на него ответ), а именно Я хотел понять, можно ли сказать, что при такой то величине скилла, вероятность каждого из четырех возвращаемых занчений roll_vs_skill такая-то. Или текущее значение скилла никак не влияет на выход roll_vs_skill?
|
Отправлено: 12:27 - 11 Апр., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Подскажите пожалуйста,где здесь неправильный синтаксис? #define NAME 1387 #define Reply(x) gsay_reply(NAME,x) #define Option(x,y) gsay_option(NAME,x,y,-1) procedure Node001; procedure Node002; procedure Node999; procedure Node003; procedure Node004; procedure Node005; procedure Node006; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure party_member_count; procedure start begin end procedure talk_p_proc begin Start_gDialog(NAME,self_obj,-1,-1,-1); GSay_Start; call Node001; call Node008; GSay_End; End_Dialogue; end procedure Node001 begin Reply(1); Option(2,Node002); Option(3,Node999); end procedure Node002 begin if party_member_count<3 then party_add(self_obj); else procedure Node010 begin Reply(15); Option(13,Node999); end end procedure party_add begin procedure Node008 begin Reply(4); Option(5,Node003); Option(14,Node009); Option(10,Node999); end procedure Node003 begin Reply(6); Option(7,Node004); Option(8,Node005); Option(9,Node006); Option(11,Node007); Option(10,Node999); end procedure Node004 begin Reply(12); Option(11,Node007) Option(13,Node999) end procedure Node007 begin procedure Node008 begin end end procedure Node005 begin ............//Здесь процедура (неважно какая) end procedure Node006 begin inven_unwield(self_obj); end procedure Node009 begin Reply(13); party_remove(self_obj); end end//Конец процедуры party_add
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 18:31 - 11 Апр., 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
2 Jager: >Я хотел понять, можно ли сказать, что при такой то величине скилла, вероятность каждого из четырех возвращаемых занчений roll_vs_skill такая-то. >Или текущее значение скилла никак не влияет на выход roll_vs_skill? Скилл, конечно, влияет. Функция возвращает значения в пределах от 0 до 3. Мат. ожидание равно (предположительно) 1+skill/100. Закон распределения, опять же продположительно, нормальный. is_sucess возвращает 1, если значение лежит в пределах от 1 до 2, is_critical - от 0 до 1 и от 2 и выше. Вероятность прикинь сам. (Добавление от 23:37 - 11 Апр., 2005.) 2 binyan: #define NAME 1387 #define Reply(x) gsay_reply(NAME,x) #define Option(x,y) gsay_option(NAME,x,y,-1) procedure Node001; procedure Node002; procedure Node999; procedure Node003; procedure Node004; procedure Node005; procedure Node006; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure party_member_count; // Где объявленные процедуры - Node999, party_member_count? procedure start begin end procedure talk_p_proc begin Start_gDialog(NAME,self_obj,-1,-1,-1); GSay_Start; call Node001; call Node008; GSay_End; End_Dialogue; end procedure Node001 begin Reply(1); Option(2,Node002); Option(3,Node999); end procedure Node002 begin if party_member_count<3 then party_add(self_obj); else // Что else? procedure Node010 begin Reply(15); Option(13,Node999); end end // Что за end? procedure party_add begin // Где объявлена party_add? // Почему собственная процедура названа как одна из стандартных? // Где end? procedure Node008 begin Reply(4); Option(5,Node003); Option(14,Node009); Option(10,Node999); end procedure Node003 begin Reply(6); Option(7,Node004); Option(8,Node005); Option(9,Node006); Option(11,Node007); Option(10,Node999); end procedure Node004 begin Reply(12); Option(11,Node007) Option(13,Node999) // Где точка с запятой? end procedure Node007 begin // Где end? procedure Node008 begin end // Почему Node008 встречается два раза? end // Что за end? procedure Node005 begin ............//Здесь процедура (неважно какая) end procedure Node006 begin inven_unwield(self_obj); end procedure Node009 begin Reply(13); party_remove(self_obj); end end//Конец процедуры party_add // Что за end? ============================================== А теперь то, что скомпилировалось у меня (только почему-то упорно не хотела компилироваться inven_unwield(self_obj); ): #define NAME 1387 #define Reply(x) gsay_reply(NAME,x) #define Option(x,y) gsay_option(NAME,x,y,-1) procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node006; procedure Node005; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure Node999; procedure party_member_count; procedure start begin end procedure talk_p_proc begin Start_gDialog(NAME,self_obj,-1,-1,-1); GSay_Start; call Node001; call Node008; GSay_End; End_Dialogue; end procedure Node001 begin Reply(1); Option(2,Node002); Option(3,Node999); end procedure Node002 begin if party_member_count<3 then party_add(self_obj); end procedure Node010 begin Reply(15); Option(13,Node999); end procedure Node008 begin Reply(4); Option(5,Node003); Option(14,Node009); Option(10,Node999); end procedure Node003 begin Reply(6); Option(7,Node004); Option(8,Node005); Option(9,Node006); Option(11,Node007); Option(10,Node999); end procedure Node004 begin Reply(12); Option(11,Node007); Option(13,Node999); end procedure Node999 begin end procedure Node005 begin end procedure Node006 begin end procedure Node007 begin end procedure party_member_count begin end procedure Node009 begin Reply(13); party_remove(self_obj); end ============================================== Советую внимательно относиться к синтаксису, искать ошибки самостоятельно и запомнить, что одна процедура внутри другой объявляться не может. (Отредактировал(а) Perceptron - 23:42 - 11 Апр., 2005)
----- Into The New Year - With A New Vision! Документация по скриптам, туториал по скриптам, вопросы по скриптам, FAQ по моддингу, "Утилиты", fallmods-tutor.
|
Отправлено: 23:02 - 11 Апр., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
#define NAME 1387 #define Reply(x) gsay_reply(NAME,x) #define Option(x,y) gsay_option(NAME,x,y,-1) procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node006; procedure Node005; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure Node999; procedure party_member_count; //Где обьявляется парти_эдд?Почему не обьявляется? procedure start begin end procedure talk_p_proc begin Start_gDialog(NAME,self_obj,-1,-1,-1); GSay_Start; call Node001; call Node008; GSay_End; End_Dialogue; end procedure Node001 begin Reply(1); //Сабж говорит Option(2,Node002); Option(3,Node999); //Варианты моих ответов end procedure Node002 begin /Если выбираю первый вариант,то начинается эа процедура if party_member_count<3 then /Если членов в команде меньше трёх,то party_add(self_obj);// сабж присоединяется,к команде.А иначе?Он должен что-то сказать.. end procedure Node010 begin //Эти процедуры нацинаются только тогда,когда процедура парти_эдд начинается.Где блок? Reply(15); Option(13,Node999); end procedure Node008 begin Reply(4); Option(5,Node003); Option(14,Node009); Option(10,Node999); end procedure Node003 begin Reply(6); Option(7,Node004); Option(8,Node005); Option(9,Node006); Option(11,Node007); Option(10,Node999); end procedure Node004 begin Reply(12); Option(11,Node007); Option(13,Node999); end procedure Node999 begin//Зачем для них бегин энд?Они же уже в опциях присутствуют.Или для каждой процеуры нужно делать бегин энд? end procedure Node005 begin end procedure Node006 begin end procedure Node007 begin end procedure party_member_count begin end procedure Node009 begin Reply(13); party_remove(self_obj); end Вы уж извините,если я чего-то не понимаю.Всё-таки паскаль отличается от си шарп.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 11:34 - 12 Апр., 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
party_add добавь сам. Только не забудь ее переименовать во что-нибудь другое. >/Если выбираю первый вариант,то начинается эа процедура if party_member_count<3 then /Если членов в команде меньше трёх,то // сабж присоединяется,к команде.А иначе?Он должен что-то сказать.. А почему ты после этого иначе написал следующее: procedure Node010 begin Reply(15); Option(13,Node999); end Зачем внутри одной процедуры объявлять другую? В чем смысл? Или в C# так принято? Достаточно написать это: begin Reply(15); Option(13,Node999); end >//Эти процедуры нацинаются только тогда,когда процедура парти_эдд начинается.Где блок? Повторяю в третий раз, что внутри одной процедуры другую объявлять нельзя. >/Зачем для них бегин энд?Они же уже в опциях присутствуют.Или для каждой процеуры нужно делать бегин энд? begin end - обычные операторные скобки. Присутствуют во всех языках программирования. Для процедуры обязательны. Я тебе уже говорил про fallmods-tutor?
----- Into The New Year - With A New Vision! Документация по скриптам, туториал по скриптам, вопросы по скриптам, FAQ по моддингу, "Утилиты", fallmods-tutor.
|
Отправлено: 12:17 - 12 Апр., 2005
|
|
Jager
Пользователь Регистрация: Март 2005
Всего: 38 сообщений
|
Perceptron, спасибо. (Отредактировал(а) Jager - 14:16 - 12 Апр., 2005)
|
Отправлено: 14:16 - 12 Апр., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Спасибо за ответы=)) Кстати,зачем переименовывать party_add?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:28 - 12 Апр., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
???
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 14:48 - 14 Апр., 2005
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
Просто так названа одна из стандарных функций. Если хочешь сделать свою процедуру - называть ее как одну из стандартных нельзя. И предупреждение за флуд.
|
Отправлено: 0:53 - 15 Апр., 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Есть вот два вопроса: 1. Можно ли при заходе на exit grid вернуть значение куда она посылает: на другую карту или на warldmap ? 2. Возможно отменить-повлиять скриптово на действие принятого наркотика ?
|
Отправлено: 16:28 - 2 Мая, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Нет.
|
Отправлено: 9:43 - 3 Мая, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Такой вопрос: в разделе "документация" лежит файл scenepid.h с новым макросом Check_Car, а в исходниках скриптов карт (v1.02) присутствует макрос Check_Create_Car которого в предлагаемом scenepid.h нет. С файлом scenepid.h из v1.02 вроде нормально компелится. И я вот не пойму надо ставить этот scenepid.h ? Ставить и править в исходниках Check_Create_Car на Check_Car ? Что за ошибка была в scenepid.h ?
|
Отправлено: 8:12 - 6 Мая, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Aman Вопрос с бородой. Злые дяди из БИС подсунули фанатам старые исходники. В частности, абсолютно все скрипты карт, на коих должна рисоваться машина, неверны, т.к. алгоритм прорисовки машины был сильно изменён. Потому был написан новый макрос, который заменяет старые макросы в заголовках БИС. А вообще, если ты собрался юзать исходники, то сходи в файловый раздел и скачай исходники скриптов 1.02d от Haenlomal. Там всё чётко.
|
Отправлено: 9:44 - 11 Мая, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Ага, вот оно что! Про исходники скриптов 1.02d от Haenlomal'a я знаю, не догадался сравнить скрипты. А этот отдельный scenepid.h лежащий в "документации" как-то меня запутал. Надо бы там указать что он нужен только для исходников "злых дядей из BIS".
|
Отправлено: 2:38 - 13 Мая, 2005
|
|
B A Z i K
Пользователь
Откуда: Киев, Украина Регистрация: Авг. 2004
Всего: 36 сообщений
|
Привет всем! Вот и я решил обратится за помощью. Дело вот в чем. Сделал я две карты, точнее одну двухуровневую. Первый уровень - вход в здание, второй это само здание. На втором уровне виднееться вход(делее дверь). Хотелось бы(только для реалистичности) сделать так, чтобы если мы открываем дверь на первой карте она выглядела открытой на второй. Сделал для этого МВАРу, в скрипте двери на юзание прописал следующее: if (map_var(0 == 0) then begin set_map_var(0, 1); end else begin set_map_var(0, 0); end То есть установка флага дверь открыта\закрыта. Можно конечно для дверей на каждом уровне написать разные скрипты, и юзать import\export, но хотелось бы обойтись одним. А вот теперь наконец-то вопрос. На какой обработчик поставить чек на эту самую МВАРу? map_update сработает не сразу, а такого обработчика как critter_p_proc, работаеющего "ежесекундно" для объектов нету Обясню еще раз(на всякий случай). Чуз заходит на карту, юзает дверь, МВАРа устанавливается в 1. Заходит в дверной проем, срабатывает спатиал, Чуза кидает на второй уровень карты, там на двери стоит такой-же скрипт, так вот каким образом(точнее обработчиком) можно проверить состояние двери на первом уровне, и соответственно открыть\закрыть ее?
----- B@ZiK was here!
|
Отправлено: 8:59 - 18 Мая, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Имхо, лучше связать эти две двери через экспортные вары-указатели. В скрипте карты:
Код:
export variable door1; export variable door2;
В скрипте door1:
Код:
import variable door1; import variable door2; procedure start begin door1 := self_obj; if (obj_is_open(door2) and not(obj_is_open(door1)) then obj_open(door1); if (not(obj_is_open(door2)) and obj_is_open(door1) then obj_close(door1); end procedure map_enter_p_proc begin door1 := self_obj; if (obj_is_open(door2) and not(obj_is_open(door1)) then obj_open(door1); if (not(obj_is_open(door2)) and obj_is_open(door1) then obj_close(door1); end procedure map_update_p_proc begin door1 := self_obj; if (obj_is_open(door2) and not(obj_is_open(door1)) then obj_open(door1); if (not(obj_is_open(door2)) and obj_is_open(door1) then obj_close(door1); end
В скрипте door2:
Код:
import variable door1; import variable door2; procedure start begin door2 := self_obj; if (obj_is_open(door1) and not(obj_is_open(door2)) then obj_open(door2); if (not(obj_is_open(door1)) and obj_is_open(door2) then obj_close(door2); end procedure map_enter_p_proc begin door2 := self_obj; if (obj_is_open(door1) and not(obj_is_open(door2)) then obj_open(door2); if (not(obj_is_open(door1)) and obj_is_open(door2) then obj_close(door2); end procedure map_update_p_proc begin door2 := self_obj; if (obj_is_open(door1) and not(obj_is_open(door2)) then obj_open(door2); if (not(obj_is_open(door1)) and obj_is_open(door2) then obj_close(door2); end
Вопрос остаётся с тем, как вызвать мап_апдейт. Попробуй fade_in/fade_out. Вроде бы после них апдейт вызывается... (Добавление от 10:46 - 18 Мая, 2005.) Глупый вопрос: зачем тебе переход между уровнями через спатиал? Почему не через exit grid?
|
Отправлено: 10:44 - 18 Мая, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Сейчас меня запинают, закидают камнями.... Будут говорить, как ты до такого бреда додумался. И т.д. и т.п. Однако, мне как-то нужно было кое что сделать, и поступил я следующим образом. Для предметов нет аналога critter_p_proc. Поэтому я просто поставил вне видимости карты критера с скриптом, где был critter_p_proc. Ну и там уже всё проверял. Прикол был в том, что через import сделать нельзя было. Но потом к счастью вышла дока по лифтам.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 17:27 - 18 Мая, 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
to Ray Ещё и не такие извращения приходится иногда использовать to B A Z i K Если нужно организовать аналог critter_p_proc для объекта - воспользуйся timed_event_p_proc. Зацикленный таймер - самое оно. Запустить его можно из map_enter_p_proc скрипта объекта.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:28 - 18 Мая, 2005
|
|
B A Z i K
Пользователь
Откуда: Киев, Украина Регистрация: Авг. 2004
Всего: 36 сообщений
|
2WG: >>Имхо, лучше связать эти две двери через экспортные вары-указатели. Да дверей то уже шесть... Эт прийдется 6 скриптов лепить + 3 спатиала. Теоретически можно конечно в скрипте двери еще чекать хекс, на каком она размещена, и обойтись одним скриптом для всех трех. Но... Надо пробовать по-другому. Карта выглядит очень похожей на карту входа\здания Собора из первого Фолла. Там переход организован не ахти, просто при юзании двери Чуза кидает на другой уровень карты. Но идею про вары-указатели намотаю на ус Если ничего не придумаем сделаю через эти самые вары. >>Вопрос остаётся с тем, как вызвать мап_апдейт. >>Попробуй fade_in/fade_out. >>Вроде бы после них апдейт вызывается... Что-то не получилось у меня добиться мап_апдейта :\ Также и с gfade_in\out. >>Глупый вопрос: зачем тебе переход между уровнями через спатиал? Почему не >>через exit grid? Имхо, через спатиал красивее выглядит Ничего более. Также в спатиал можно какую-то доп. проверку или изменение вары прилепить. Тот-же fade_in c аутом. Для данного случая получается гибче. 2Tehnokrat: А можно чуть подробней про зацикленный таймер?
----- B@ZiK was here!
|
Отправлено: 8:56 - 19 Мая, 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
2 B A Z i K Слушай, а не легче ли завести гвару и использовать побитовую запись? если 1 уровень и bit_1==1 и координаты(х,у) то открыта, иначе закрыта. Будет 1 скрипт дверей и 3 спатиала: всего 4 скрипта. А вообще, если все двери на одной карте, то поставь криттера, сделай его невидимым, у него запусти проверку в critter_p_proc и поставь дверям видимость. Если нужно видна открытая дверь, не нужно - закрытая. Опять же все двери в одном скрипте. Будет 1 скрипт дверей, один нпс и 3 спатиала: всего 5 скриптов. А еще можно реализовать все в скрипте одной двери. если 1 уровень и открыли дверь, то анимируем поход чуза в точку (х,у), как только он пришел, то перносим чуза и дверь на другой этаж. Дверь остается такая как есть открытая или закрытая. Будет 1 скрипт дверей. Выбирай варианты
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 12:52 - 19 Мая, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Tehnokrat [стучит головой о клавиатуру] Моя есть тупая. Моя пора на пенсию. Ё-моё! Это же так просто! 2B A Z i K Воспользуйся советом Технократа. А именно: в мап_энтер прописываешь вызов таймерного события, которое чекает двери и снова вызывает таймерное событие. Что-то типа рекурсии :). И у тебя получится нечто, вроде криттер_п_проц. Как подробнее сказать - не знаю :). Пример писать времени нет, но ты уж сам посмотри таймерные события ;).
|
Отправлено: 14:09 - 19 Мая, 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
to Wasteland Ghost Фигня, тебе просто не встречалась данная задача "в деле" to B A Z i K Примерно так это выглядит: procedure map_enter_p_proc begin add_timer_event(self_obj, 1, 1); end procedure timed_event_p_proc begin if fixed_param==1 then begin /* Здесь пишем всё, что необходимо сделать с дверью*/ add_timer_event(self_obj, 1, 1); end end
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:51 - 19 Мая, 2005
|
|
B A Z i K
Пользователь
Откуда: Киев, Украина Регистрация: Авг. 2004
Всего: 36 сообщений
|
2Tehnokrat: Не поверишь, но изначально делал именно так Знаю-знаю, все так говорят после получения ответа, но у меня сие не вышло. Разве что в моем варианте в timed_event_p_proc не указал установку этого же таймерного события. Получается, что при заходе на второй уровень дверь открывается по истечении некоторого времени (вроде меньше чем время мап_апдейта). Граждане, а может вы мой скриптик хоть одним глазком посмотрите, я скроее всего апшипся, но вот где... Постю его сюды: procedure timed_event_p_proc begin if (fixed_param == 1) then begin if (map_var(2) == 1) then begin obj_open(self_obj); add_timer_event(self_obj, 1, 1); end end end procedure use_p_proc begin if (map_var(2) == 0) then begin set_map_var(2, 1); end else begin set_map_var(2, 0); end add_timer_event(self_obj, 1, 1); end procedure map_update_p_proc begin if (map_var(2) == 1) then begin obj_open(self_obj); end end procedure map_enter_p_proc begin add_timer_event(self_obj, 1, 1); if (map_var(2) == 1) then begin obj_open(self_obj); end end Сделать через critter_p_proc левого криттера, как говорили Рей и Павел получилось. Способ неплохой, рабочий, но при заходе на второй уровень карты дверь открывается где-то через секунду после захода игрока. Также иногда дверь при клике открывается, и тут же закрывается. Но это скорее всего чеки и их выполнения из разных скриптов просто накладываются друг на друга. З.Ы. Сорри, что отвечаю с периодичностью в 24 часа. С инетом траблы. Все, прекращаю оффтопить
----- B@ZiK was here!
|
Отправлено: 22:02 - 20 Мая, 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
to B A Z i K Попробуй следующий скрипт прицепить к обоим дверям, только координаты правильные укажи: #define DOOR1_ELEV 0 // Уровень, на котором находится первая дверь #define DOOR1_TILE 24331 // Гекс, на котором находится первая дверь #define DOOR2_ELEV 1 // Уровень, на котором находится вторая дверь #define DOOR2_TILE 17112 // Гекс, на котором находится вторая дверь procedure start; procedure map_enter_p_proc; procedure use_p_proc; variable dpid; procedure map_enter_p_proc begin dpid := obj_pid(self_obj); end procedure use_p_proc begin if obj_is_open(self_obj) then begin if elevation(self_obj)==DOOR1_ELEV then obj_close(tile_contains_pid_obj(DOOR2_TILE, DOOR2_ELEV, dpid)); else obj_close(tile_contains_pid_obj(DOOR1_TILE, DOOR1_ELEV, dpid)); end else begin if elevation(self_obj)==DOOR1_ELEV then obj_open(tile_contains_pid_obj(DOOR2_TILE, DOOR2_ELEV, dpid)); else obj_open(tile_contains_pid_obj(DOOR1_TILE, DOOR1_ELEV, dpid)); end end (Отредактировал(а) Tehnokrat - 18:16 - 21 Мая, 2005)
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 12:52 - 21 Мая, 2005
|
|
B A Z i K
Пользователь
Откуда: Киев, Украина Регистрация: Авг. 2004
Всего: 36 сообщений
|
Работаетъ Вообщем остановился на последнем варианте от Технократа. Получилось 3 скрипта для дверей и три спатиала. Относительно дешево и cердито. И никаких МВАР. Т.е. то чего и добивался. Всем спасибо за советы и идеи!
----- B@ZiK was here!
|
Отправлено: 8:16 - 23 Мая, 2005
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Возник такой вопрос. Можно ли организовать чек на "применяемый" скил (воровство например) не стандартно в подъопытном критере, а в скрипте дюда, или еще как/где? Чтобы был один чек на 10-к критеров без перебивания их скриптов?
|
Отправлено: 20:34 - 23 Мая, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Нет. Отловить воровство можно только в скрипте кролика и только при неудаче через pickup_p_proc.
|
Отправлено: 8:09 - 24 Мая, 2005
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Эх, жаль.
|
Отправлено: 0:12 - 25 Мая, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Вообще, вопросами воровства занимался Рейвен. Посмотри в этой теме.
|
Отправлено: 8:15 - 25 Мая, 2005
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Не - там все помимо чека вне кролика.
|
Отправлено: 23:51 - 26 Мая, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Написал я скрипт.Пробовал скомпилировать,компилятор выдавал ошибки. Отловил ошибки.Всё скомпилировалось. Добавил скрипт в игру,добавил мсг в игру. Через маппер привязал скрипт к криттеру. Отлично!!Захожу в игру... Подхожу к криттеру(к которому скрипт прикреплён),завязываю с ним диалог.И что вы думаете?Выдаёт мне ПУСТОЕ диалоговое окно.То есть диалог-то начался,а вот реплик и опций тю-тю. Вот мне и интерестно,что у меня за ошибка в скрипте? Может кто нибудь знает? Вот скрипт : #include "..\headers\command.h" #include "..\headers\define.h" #include "..\headers\myhead.h" #define LVAR_PARTY_MAN (0) #define LVAR_talk_pistol (1) #define LVAR_have_pistol (2) #define NAME 1461 #define Have_pistol ((obj_carrying_pid_obj(dude_obj,PID_10MM_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_LASER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_14MM_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_PLASMA_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_ALIEN_LASER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_223_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_NEEDLER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_PK12_GAUSS_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_YK32_PULSE_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_MAGNETO_LASER_PISTOL))) (Это всё в одной строчке.Просто на форуме не вмещается) procedure start; procedure critter_p_proc; procedure pickup_p_proc; procedure talk_p_proc; procedure destroy_p_proc; procedure look_at_p_proc; procedure description_p_proc; procedure use_skill_on_p_proc; procedure use_obj_on_p_proc; procedure damage_p_proc; procedure map_enter_p_proc; procedure push_p_proc; procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node005; procedure Node006; procedure Node007; procedure start begin end procedure talk_p_proc begin dialogue(self_obj,Node001); end procedure Node001 begin if (LVAR_talk_pistol==2) then begin rep(4); if (LVAR_have_pistol==2) then begin opt(40,Node005); opt(41,Node006); end else opt(42,Node006); end else if(LVAR_talk_pistol==3)then begin rep(6); opt(60,end_dialogue); end else begin rep(1); opt(10,Node002); opt(11,end_dialogue) ; end end procedure Node002 begin rep(2); opt(20,Node003); opt(21,end_dialogue); end procedure Node003 begin rep(3); opt(30,Node004); opt(31,end_dialogue); end procedure Node004 begin set_local_var(LVAR_talk_pistol,2); end procedure Node005 begin rep(50); opt(5,Node007); end procedure Node006 begin rep(411); opt(412,end_dialogue); end procedure Node007 begin critter_add_trait (self_obj, 1, 6, 0); critter_add_trait (self_obj, 1, 5, 194); party_add(self_obj); set_local_var(LVAR_talk_pistol,3); set_local_var(LVAR_PARTY_MAN,3); end procedure critter_p_proc begin if Have_pistol then set_local_var(LVAR_have_pistol,2); end procedure pickup_p_proc begin end procedure destroy_p_proc begin end procedure look_at_p_proc begin end procedure description_p_proc begin end procedure use_skill_on_p_proc begin end procedure use_obj_on_p_proc begin end procedure damage_p_proc begin end procedure map_enter_p_proc begin end procedure push_p_proc begin end Вот myhead.h : #define rep(x) gsay_reply(NAME,mstr(x)) #define opt(x,y) gsay_option(NAME,x,y,-1) #define dialogue(x,y) start_gdialog(NAME, x, 4, -1, -1);\ gsay_start;\ call y;\ gsay_end;\ end_dialogue Вот мсг: 1. Привет,что тебе надо? 10.Пойдём со мной 11.Ничего 2.Сначала мне нужно оружие 20.Я принесу тебе оружие 21.У меня нет оружия,прощай. 3.Мне нужен пистолет 30.Хорошо,я принесу тебе пистолет 31.Забудь.Я передумал.Я не пойду за оружием.Прощай. 4.Ты уже нашёл пистолет для меня? 40.Да,вот он [Показываете пистолет] 41.[Врёте] нет,пока не нашёл 42.Нет,пока не нашёл 411.Тогда желаю удачи в поисках 412.Спасибо [уходите] 5.Хорошо.Я рад к тебе присоединиться 50.Отлично,пойдём 6.Ну вот я и в команде 60.Да.Класс (Отредактировал(а) binyan - 14:08 - 3 Июня, 2005)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 13:24 - 3 Июня, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: opt(60,end_dialogue);
Что это? Так нельзя. Если ты хочешь завершить диалог, то сделай пустую ноду и ссылайся на неё, например,так:
Код:
procedure Node999 begin end procedure NodeXXX begin opt(60,Node999); end
Ещё настораживает макрос #define opt(x,y) gsay_option(NAME,x,y,-1) Реакция -1 равна не бывает. Или 49, или 50, или 51.
|
Отправлено: 17:51 - 3 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Сначала я и делал пустую ноду,но мне компилятор выдавал,что нода не заполнена,или что то в этом роде. А насчёт gsay_option...Это мне Павел myhead делал.Не знаю...Но думаю,что если бы реакции такой не было,то скрипт попросту не скомпилировался бы. (Добавление от 21:02 - 3 Июня, 2005.) А!!!Вспомнил.По моему -1 это никакой реакции.Нет?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 20:56 - 3 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Ок..Чуть чуть разобрался.Заменил end_dialogue на Node999.Не компилировалось у меня ,потому что я(тупая мая башка) забывал объявить Node999,поэтому мне выдавалось сообщение о том,что Нода не объявлена. Ну ладно.Заменил я,обьявил,всё скомпильнулось,я добавил скрипт в игру. Захожу,начинаю новую игру,подхожу к криттеру,делаю попытку заговорить. На диалоговом экране мне с жутким лязгом вылезает сообщение о том,что я полный дурак,и не дружу с английским языком. А сообщение такого типа : GDialog::Error Grabbing text mesagge Ну что граждане,какие будут мысли по этому поводу? (Отредактировал(а) binyan - 0:19 - 4 Июня, 2005)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 0:16 - 4 Июня, 2005
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
>>GDialog::Error Grabbing text mesagge Ошибки в мсг или он не там, где должен быть или не прописан или в нем левые символы, например # - одна штука. Гм, у тебя случаем в мсг буквально не написано >> 1. Привет,что тебе надо? надо {1}{}{Привет,что тебе надо?} и т.д.
|
Отправлено: 0:46 - 4 Июня, 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Может ошибка тут: #define NAME 1461 //тут необходимо поставить правильный номер по списку, и все заработает. Список это и есть номер по списку в script.lst. А то уж как то одинаковый с моим номером, а у меня там скиптов немножко добавлено...
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 1:18 - 4 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Так...Спасибо большое,Павел, за правильный ответ, Ты выиграл поездку на Канары Теперь всё работает.Ошибка действительно была в номере скрипта.На самом деле он 1304 (у меня непропатченная версия) Но теперь другая проблема.И я уж точно не знаю как её решить. Из моего скрипта следует,что когда я уже поговорил с криттером насчё пистолета,он должен меня спрашивать,нашёл ли я пистолет.Но вместо этого он меня спрашивает ещё раз "Что тебе надо?" Я даже скрипт переделал(в сущности это одно и то же) Вот: #include "..\headers\command.h" #include "..\headers\define.h" #include "..\headers\myhead.h" #define LVAR_PARTY_MAN (0) #define LVAR_talk_pistol (1) #define LVAR_have_pistol (2) #define NAME 1304 #define Have_pistol ((obj_carrying_pid_obj(dude_obj,PID_10MM_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_LASER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_14MM_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_PLASMA_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_ALIEN_LASER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_223_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_NEEDLER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_PK12_GAUSS_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_YK32_PULSE_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_MAGNETO_LASER_PISTOL))) procedure start; procedure critter_p_proc; procedure pickup_p_proc; procedure talk_p_proc; procedure destroy_p_proc; procedure look_at_p_proc; procedure description_p_proc; procedure use_skill_on_p_proc; procedure use_obj_on_p_proc; procedure damage_p_proc; procedure map_enter_p_proc; procedure push_p_proc; procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node005; procedure Node006; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure Node999; procedure start begin end procedure talk_p_proc begin dialogue(self_obj,Node001); end procedure Node001 begin if (LVAR_talk_pistol==2) then call Node008; else if(LVAR_talk_pistol==3)then call Node009; else call Node010; end procedure Node002 begin rep(2); opt(20,Node003); opt(21,Node999); end procedure Node003 begin rep(3); opt(30,Node004); opt(31,Node999); end procedure Node004 begin set_local_var(LVAR_talk_pistol,2); end procedure Node005 begin rep(50); opt(5,Node007); end procedure Node006 begin rep(411); opt(412,Node999); end procedure Node007 begin critter_add_trait (self_obj, 1, 6, 0); critter_add_trait (self_obj, 1, 5, 194); party_add(self_obj); set_local_var(LVAR_talk_pistol,3); set_local_var(LVAR_PARTY_MAN,3); end procedure critter_p_proc begin if Have_pistol then set_local_var(LVAR_have_pistol,2); end procedure pickup_p_proc begin end procedure destroy_p_proc begin end procedure look_at_p_proc begin end procedure description_p_proc begin end procedure use_skill_on_p_proc begin end procedure use_obj_on_p_proc begin end procedure damage_p_proc begin end procedure map_enter_p_proc begin end procedure push_p_proc begin end procedure Node999 begin end procedure Node008 begin rep(4); if (LVAR_have_pistol==2) then begin opt(40,Node005); opt(41,Node006); end else opt(42,Node006); end procedure Node009 begin rep(6); opt(60,Node999); end procedure Node010 begin rep(1); opt(10,Node002); opt(11,Node999) ; end Но всё равно он меня спрашивает всё время одно и то-же. (Отредактировал(а) binyan - 19:41 - 4 Июня, 2005)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 19:40 - 4 Июня, 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
В чем может быть пролема? 1) не прописано нужное количество вар в скрипт.лст 2) заведи вариблу для проверки, а то замучаешься. 3) и вообще заведи ГВАРу, вместо Лвары - сразу заработает. Лично у меня заработало. а вообще, все проверки веди в talk_p_proc.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 19:19 - 5 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
В чем может быть пролема? 1) не прописано нужное количество вар в скрипт.лст >> Прописано 2) заведи вариблу для проверки, а то замучаешься. >>Дла проверки чего? 3) и вообще заведи ГВАРу, вместо Лвары - сразу заработает. Лично у меня заработало. >>Хорошо попробую а вообще, все проверки веди в talk_p_proc. >>А critter_p_proc здесь почему не канает?Она ведь выполняется каждую секунду,или что то такое.. (Отредактировал(а) binyan - 14:37 - 6 Июня, 2005)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 14:35 - 6 Июня, 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
procedure Node001 begin if (LVAR_talk_pistol==2)or(variablA==2) then call Node008; ....... procedure Node004 begin set_local_var(LVAR_talk_pistol,2); variablA:=2; end Проверь, может заработает В critter_p_proc все работает, а вот в диалоге нет. Смотри от обратного: если в диалоге получается проблем, то может critter_p_proc не причем? Поставь ГВАРу и забудь о проблемах.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 16:19 - 6 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Ок,попробую Кстати,если обьявлять вариаблу,то объявлять её не в процедуре так?А то она только в процедуре работать и будет.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 18:09 - 6 Июня, 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Да, у тебя получиться что-то вроде: ... procedure Node009; procedure Node010; procedure Node999; ... variable variablA; ...
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 18:47 - 6 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Ок.Сегодня попробую,завтра тебе на мыло напишу,и если получится уже скрипт буду доделывать.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 19:56 - 6 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Павел, даже не знаю как дописать уже этот скрипт до нормы. Вроде бы уже и гвару сделал… Гвара зарегистрирована Вот привожу строчки из vault13.gam : GVAR_MODOC_GHOST_SEED_PIP :=0; // (631) GVAR_PARTY_MEMBERS_HIDDEN :=0; // (632) GVAR_CAR_PLACED_TILE :=0; // (633) GVAR_PARTY_MAN_talk_have_pistol :=0; // (634) GVAR_RESERVED_VAR2 :=0; // (635) GVAR_RESERVED_VAR3 :=0; // (636) GVAR_RESERVED_VAR4 :=0; // (637) Но криттер всё равно упрямо выдаёт мне «что тебе надо?» Поправь этот скрипт до того, чтобы он работал у тебя, и выложи его тут, или на мыло мне пришли, ОК? А то я и вправду уже не знаю что делать… Вот скрипт : /* Если разговаривал о пистолете GVAR_PARTY_MAN_talk_have_pistol==1 Если говорил о пистолете и он у тебя GVAR_PARTY_MAN_talk_have_pistol==2 Если говорил о пистолете и он у тебя и ты в партии GVAR_PARTY_MAN_talk_have_pistol==3 Если не говорил о пистолете GVAR_PARTY_MAN_talk_have_pistol==0 */ #include "..\headers\command.h" #include "..\headers\define.h" #include "..\headers\myhead.h" #define GVAR_PARTY_MAN_talk_have_pistol (0) #define NAME 1304 #define Have_pistol ((obj_carrying_pid_obj(dude_obj,PID_10MM_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_LASER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_14MM_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_PLASMA_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_ALIEN_LASER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_223_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_NEEDLER_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_PK12_GAUSS_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_YK32_PULSE_PISTOL))BWOR(obj_carrying_pid_obj(dude_obj,PID_MAGNETO_LASER_PISTOL))) procedure start; procedure critter_p_proc; procedure pickup_p_proc; procedure talk_p_proc; procedure destroy_p_proc; procedure look_at_p_proc; procedure description_p_proc; procedure use_skill_on_p_proc; procedure use_obj_on_p_proc; procedure damage_p_proc; procedure map_enter_p_proc; procedure push_p_proc; procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node005; procedure Node006; procedure Node007; procedure Node008; procedure Node009; procedure Node010; procedure Node999; procedure start begin end procedure talk_p_proc begin if Have_pistol then set_global_var(GVAR_PARTY_MAN_talk_have_pistol,2); dialogue(self_obj,Node001); end procedure Node001 begin if ((GVAR_PARTY_MAN_talk_have_pistol==1)BWOR(GVAR_PARTY_MAN_talk_have_pistol==2)) then call Node008; else if(GVAR_PARTY_MAN_talk_have_pistol==3)then call Node009; else call Node010; end procedure Node002 begin rep(2); opt(20,Node003); opt(21,Node999); end procedure Node003 begin rep(3); opt(30,Node004); opt(31,Node999); end procedure Node004 begin set_global_var(GVAR_PARTY_MAN_talk_have_pistol,1); end procedure Node005 begin rep(50); opt(5,Node007); end procedure Node006 begin rep(411); opt(412,Node999); end procedure Node007 begin critter_add_trait (self_obj, 1, 6, 0); critter_add_trait (self_obj, 1, 5, 194); party_add(self_obj); set_global_var(GVAR_PARTY_MAN_talk_have_pistol,3); end procedure critter_p_proc begin end procedure pickup_p_proc begin end procedure destroy_p_proc begin end procedure look_at_p_proc begin end procedure description_p_proc begin end procedure use_skill_on_p_proc begin end procedure use_obj_on_p_proc begin end procedure damage_p_proc begin end procedure map_enter_p_proc begin end procedure push_p_proc begin end procedure Node999 begin end procedure Node008 begin rep(4); if (GVAR_PARTY_MAN_talk_have_pistol==2) then begin opt(40,Node005); opt(41,Node006); end else opt(42,Node006); end procedure Node009 begin rep(6); opt(60,Node999); end procedure Node010 begin rep(1); opt(10,Node002); opt(11,Node999); end
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 0:55 - 7 Июня, 2005
|
|
FFAN
Пользователь Регистрация: Июнь 2005
Всего: 22 сообщения
|
Помогите, я к примеру декомпилировал скрипт kcsulik.int ( почти на любом скрипте глюк ) и когда хочу его обратно компилировать - выдает ошибку: Undefined symbol op_party_member_obj Делал все вроде правильно. Декомпилировал скрипт с помощью noid_decompiler , а компилировал с помощью watcom и bis_compiler. В чем проблема?
|
Отправлено: 15:14 - 11 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Между компиляторами есть отличия в структуре команд. К примеру: Нойд - op_party_add(self_obj); BIS - party_add(self_obj); Декомпилируй/компил. всё одним компилятором. Для нода свой комп\декомп. в комплекте. Для BIS поищи в файлах
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 15:38 - 11 Июня, 2005
|
|
FFAN
Пользователь Регистрация: Июнь 2005
Всего: 22 сообщения
|
Декомпилировал с помощью int2ssl теперь при компиляции пишет - Error! expecting ';'. Захожу на ту строчку в ssl файле, ставлю ; в конце потом пишет что такая же ошибка, хотя знак уже поставил Строка: procedure destroy_p_proc добавляю в конец ; без толку, что точку с запятой что без нее - все равно не компилирует
|
Отправлено: 18:23 - 11 Июня, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Что-то тут нечисто. Если идёт объявление процедур, то будет например: procedure talk_p_proc; procedure destroy_p_proc; procedure look_at_p_proc; Если исполнение, то procedure destroy_p_proc begin в этой срочке ; не ставится У меня int2ssl => compile.exe работает как часы. Может ты не ту строчку смотришь ? А какой скрипт продолжаешь мучить, kcsulik.int ?
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 22:27 - 11 Июня, 2005
|
|
IRI2
Пользователь
Откуда: Санкт-Питер Регистрация: Июнь 2005
Всего: 7 сообщений
|
Цитата: Странно, должен работать. Текст такой: procedure start begin end procedure map_enter_p_proc begin display_msg("Hello" ); end Да ? В scripts.lst прописал, в маппере на криттера поставил ?
Да, все сделал абсолютно точно. Именно такой скрипт, приделал Клинту скрипт, в Скрипт.лст прописал свой скрипт и написал к нему описание. Все видно, все приделывается, ничего не работает.
|
Отправлено: 0:07 - 12 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
А может ты просто не входишь каждый раз на локацию (ведь map_enter_p_proc срабатывает только при заходе на локацию). Попробуй написать следующее: ============================== procedure start; procedure talk_p_proc; procedure start begin end procedure talk_p_proc begin display_msg("Hello" ); end ================================ А в фоле попробовать заговорить с персом.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 0:28 - 12 Июня, 2005
|
|
FFAN
Пользователь Регистрация: Июнь 2005
Всего: 22 сообщения
|
2 Aman к примеру arcaves.int получилось нормально декомпилировать и собрать, но когда декомпилирую kcsulik.int он пишет Warning: Result of expression is left in stack....... File kcsulik.int decompiled successfuly Потом когда пробую скомпилить - пишет: KCSULIK.I (1067): Error! expecting ';'. Пробовал с несколькими скриптами - ТАКОЕ ЖЕ ГОВНО
|
Отправлено: 15:42 - 12 Июня, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
to FFAN >> KCSULIK.I Для файлов ssl, полученных int2ssl препроцессор не нужен. Не знаю что ты там делаешь, погонял я скрипты через int2ssl, всё ОК. Ну вот смотри: берём kcsulik.int =>int2ssl=> получаем kcsulik.ssl => dos4gw compile kcsulik.ssl =>compile.exe=> получаем kcsulik.int. Ты изменяешь полученный ssl или сразу после int2ssl компилишь ? Прочитай хоть половину FScript-HOWTO. Потом будешь за int2ssl браться. Да и зачем эта прога тебе сейчас ? Исходники ведь есть.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 16:23 - 12 Июня, 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
2 to FFAN: Закинь этот твой проблемный скрипт мне на мыло. Погляжу что там и к чему.
|
Отправлено: 21:06 - 12 Июня, 2005
|
|
FFAN
Пользователь Регистрация: Июнь 2005
Всего: 22 сообщения
|
2 Aman Без препроцессора также. Не изменяя файл. Я просто его декомпилирую ( ничего не изменяю ) и хочу его компилировать обратно и возникает эта ошибка ((((((((((( >> Да и зачем эта прога тебе сейчас ? Хочу научится. Стандартные исходники тоже не скомпилить, такая же ошибка. 2 Anchorite Почти любой скрипт, скидывать нет смысла, mcdavin.ssl к примеру ТАК СТОП ! Сейчас попробовал скомпилить kcsulik.ssl и mcdavin.ssl из папки mapper/scripts и ПОЛУЧИЛОСЬ!!! Но почему тогда не получается скомпилить модифицированные исходники из патча 1.04 или 1.05 ?
|
Отправлено: 22:28 - 12 Июня, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
to FFAN Ты всё таки отошли скрипт, а то прям заинтриговал . Мне тоже, мылом и int (один какой-нибудь, что не получался).
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 0:00 - 13 Июня, 2005
|
|
FFAN
Пользователь Регистрация: Июнь 2005
Всего: 22 сообщения
|
2 Anchorite , Aman Отослал. Проверяйте мыла.
|
Отправлено: 10:27 - 13 Июня, 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Я посмотрел присланный скрипт. Нашел интересную вещь. 1. После декомпиляции конец процедуры talk_p_proc имеет вид
Код:
... add_obj_to_inven(self_obj, restock_obj); end return 0; LVar0 := 0; procedure destroy_p_proc begin if (source_obj == dude_obj) then begin ...
т.е. видно, что у тела функции отсутствует завершающий end. 2. Для выяснения, что и к чему смотрим дамп этой процедуры.
Код:
... 0x00004240: 0x80BC - O_SELF_OBJ 0x00004242: 0xC001 0x00000010 - O_INTOP(0x00000010) // 16 (16) 0x00004248: 0x8012 - O_FETCH_GLOBAL 0x0000424A: 0x80D8 - O_ADD_OBJ_TO_INVEN 0x0000424C: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00004252: 0x800D - O_D_TO_A 0x00004254: 0x8019 - O_SWAPA 0x00004256: 0x802A - O_POP_TO_BASE 0x00004258: 0x8029 - O_POP_BASE 0x0000425A: 0x800C - O_A_TO_D 0x0000425C: 0x801C - O_POP_RETURN 0x0000425E: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00004264: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x0000426A: 0x8031 - O_STORE 0x0000426C: 0x802A - O_POP_TO_BASE 0x0000426E: 0x8029 - O_POP_BASE 0x00004270: 0x801C - O_POP_RETURN
Из дампа видно, что данная процедура имеет "нестандартный завершитель". От "стандартного" от отличается наличием трех опкодов O_INTOP, O_INTOP и O_STORE. Поэтому декомпилятор и не стал преобразовывать его в завершающий end, а декомпилировал как есть. Для исправления этой ситуации нужно удалить строки
Код:
return 0; LVar0 := 0;
и заменить их на end. После этого функция примет номальный вид пригодный для компиляции. От себя замечу, что данный скрипт скомпилирован не "родным" BIS-овым компилятором, а чем-то другим. А "стандартные" последовательности опкодов можно глянуть в http://www.teamx.ru/docs/decompile.rar. Я его сделел, когда писал декомпилятор. (Отредактировал(а) Anchorite - 5:23 - 14 Июня, 2005)
|
Отправлено: 23:11 - 13 Июня, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Чувствую, сейчас кому-то прибавится работы По поводу непонятных вещей. Есть у Павла в моде скрипт - ardic.int Уж не знаю чем и как он его жал(Павел, ау....), но все декомпиляторы страшно на него ругаются. Нойдовский вообще ничего не создаёт и пишет, что "procedures are not sorted in ascending adress order", int2ssl создаёт пустой файл и тоже ругается, но уже "Expression required" (и также выдаёт warnings). Кинуть файл?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 0:02 - 14 Июня, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
>> данный скрипт скомпилирован не "родным" BIS-овым компилятором, а чем-то другим Сто пудово, что это нойдовский. Я попробовал нойдовский декомпайл, всё ОК - вместо return 0; LVar0 := 0; стояло законное end. Скомпилил. (Добавление от 2:04 - 14 Июня, 2005.) to Ray >> По поводу непонятных вещей. Есть у Павла в моде скрипт - ardic.int Это был ipp.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 1:18 - 14 Июня, 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
У int2ssl есть пара ключей (-a и -b), которые позволяют игнорировать неверное число аргументов для опкодов. Попробуй с ними, может чего толковое и получится.
|
Отправлено: 5:22 - 14 Июня, 2005
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
procedure critter_p_proc begin <...> obj_set_light_level(dude_obj, get_critter_stat(dude_obj, 37)*2, 8); end Я сделал чтоб чузен когда у него радиация светился, но даже при радиации 50 он светится слабо, да и то когда есть рядом источники света. А в бою у чузена свет потухает совсем. 1. Как сделать чтоб свет был ярче и везде? 2. И как сделать чтоб в свет не потухал?
|
Отправлено: 7:06 - 14 Июня, 2005
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
Если у кого еше есть проблемы с компиляцие\декомпиляцией, вэлком сюда: http://volkpk.nm.ru/Bis_compiller.rar Компилятор Декомпилятор Препроцесор Headers версии 1.02 Все настроено и предельно просто. Всесит 778 кб.
|
Отправлено: 18:31 - 16 Июня, 2005
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
Дано n новых предеметов, как их раскидать по всем торговцам? Чтоб не править и перекомпилировать все скрипты.
|
Отправлено: 22:54 - 17 Июня, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Два варианта: - переделать существующие (у торговцев) прошки на твои; - перекомпилить скрипты ; Скрипты кстати несложно переделать - пара строчек, посмотри например map_enter_p_proc в DIFLIBOX.ssl (box торговца в Дэне).
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 2:24 - 18 Июня, 2005
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
Да что легко, я знаю, просто мне надо чтоб ини могли появится у любого торговца могли появится, а прошки переделывать под свои не хочу... ЗЫ Ты исходники то даш runmodа
|
Отправлено: 3:11 - 18 Июня, 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Возникла интересная трабла. Есть добавленная в игру карта, правильно зарегестрирована везде, чузен на ней прекрасно себя чувствует, но у всех криттеров карты не работают animate_move_to_tile и animate_run_to_tile (во всех варицаиях, т.е. не помогает регистрация списка анимаций и bwor ANIMATE_INTERRUPT), при этом move_to и critter_attempt_placement работают прекрасно. Мне почему-то кажется, что криттер пытается "убежать" на другой elevation и, раз у него ничего не получается, остаётся на месте. Может кто сталкивался и знает как лечить? Проблема №2: При попытке битового использовани гвар на этой же карте, фаллаут вываливаетс в винду с ошибкой, причём ошибка "Приложение выполнило недопустимую операцию", а не фаллаутовская. На остальных картах всё нормально. PS: Формат карты вроде бы правильный. И бисовский и димсовый мапперы читают её нормально. Да и все остальные функции на ней работают
----- Scio me nihil scire
|
Отправлено: 22:55 - 18 Июня, 2005 Исправлено: Mynah - 19:36 - 19 Июня, 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Я конечно понимаю, что мои вопросы никто не читает, но всё же :) Каким образом из скрипта уменьшить какой-нибудь скилл? Про critter_mod_skill и отрицательные значения лучше даже не говорите, там число предварительно проходит через abs и скилл только увеличивается:) Как из скрипта сделать скилл Tagged? critter_add_trait конечно работает, при этом перк tag повляется, но не влияет ни на один из скиллов. Перепробовал все более или менее возможные варианты X в (PERK_tag bwor X). Не работает.
----- Scio me nihil scire
|
Отправлено: 11:33 - 22 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Скилл у чуза?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:32 - 22 Июня, 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
да, у чуза
----- Scio me nihil scire
|
Отправлено: 22:13 - 22 Июня, 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
ЕМНИП, criter_mod_skill следует читать как critter_set_skill, т.е.: critter_mod_skill(dude_obj,x,has_skill(dude_obj,x)-10); для уменьшения на 10.
|
Отправлено: 4:05 - 23 Июня, 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
неа... это именно mod_skill. да и вообще, это-то я первым делом проверил.
----- Scio me nihil scire
|
Отправлено: 4:41 - 23 Июня, 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Не подходит?Жалко.Я тоже об этом сначала подумал..
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:20 - 23 Июня, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Да, фигня с этим critter_mod_skill. Надо что-то с компилятором делать. (Добавление от 0:03 - 24 Июня, 2005.) Прогнал я с компилятором, двиг это так весело на минусы в critter_mod_skill смотрит. Пока не судьба Mynah.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 23:50 - 23 Июня, 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
Подскажите почему вылазит ошибка: "ERROR: atemp to reference local var out of range:10" что она значит и как от нее избавиться? Заранее благодарен.
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 13:05 - 18 Июля, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Число локальных переменных скрипта (LVAR) прописывается в SCRIPTS.LST. Пример:
Код:
Test2.int ; Used to Test Scripts # local_vars=8
Видимо, ты просто указал переменных меньше, чем тебе необходимо.
|
Отправлено: 17:16 - 18 Июля, 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
Цитата: Quote: from Wasteland Ghost on 16:16 - 18 Июля, 2005 Число локальных переменных скрипта (LVAR) прописывается в SCRIPTS.LST. Пример:
Код:
Test2.int ; Used to Test Scripts # local_vars=8
Видимо, ты просто указал переменных меньше, чем тебе необходимо.
Нет, (если бы было всё так просто) там указано # local_vars=15
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 17:26 - 18 Июля, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Если ты намекаешь, что 10 - это предел, утешься, бывает и 12 и 19 . Может, ты строчкой ошибся? Или создал дубликат уже существующей записи?
|
Отправлено: 19:50 - 19 Июля, 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
Нет дубликатов нету, проверил. Ну, а вообщем это LVAR_WAITING. Может у кого уже была такая ошибка.
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 15:18 - 20 Июля, 2005
|
|
Strongholder
Прилипала MkII
Откуда: Nelly's Bar Регистрация: Май 2004
Всего: 393 сообщения
|
Знаю, кретинский вопрос, но всё же... Можно ли присвоить переменной численное значение из мсгхи? Т.е. так, чтобы это значение восринималось именно как численное, а не как строковое. Если просто в лоб написать к примеру x:=mstr(1) и в мсгхе {1}{}{123}, то при попытке совершить с варой х какие-либо математические действия кроме сложения (она будет считаться строкой "123" ) она считается за ноль... Или дело в ДНК...
----- Живущий в стране эльфов. Несмотря ни на что.
|
Отправлено: 23:28 - 29 Июля, 2005 | ИСПРАВЛЕНО: Strongholder - 23:30 - 29 Июля, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Обычными методами, из msg, выходит только "строчный" вариант. Тобишь, "123" из msg + 1, даст 1231. Проблему решил Raven, написав atoi для скриптов фола. Что это такое и с чем его едят, читай в исследованиях в топике "Делимся опытом", сделай там поиск на слово atoi. Мой вопрос: во время боя можем ли мы, на одном ходу, прибавить очки хода чузу. То-есть оставалось 4, бац и уже 10, потратили - бац и опять 10. В течении одного хода.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 2:33 - 30 Июля, 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Нет.
|
Отправлено: 12:11 - 30 Июля, 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Немного тут combat_p_proc юзал. fixed_param == COMBAT_SUBTYPE_WEAPON_USED - что-то вообще у меня не срабатывал. Пробовал холодное и огнестрельное оружие. fixed_param == COMBAT_SUBTYPE_SEQUENCING - что это ? По мап-доке "чтобы проверить, хотят ли криттеры войти в бой/выйти из боя". Хм, насчёт войти не получалось, выйти не пробовал. Наверное, когда криттер убежать хочет срабатывает ? fixed_param == COMBAT_SUBTYPE_NONCOM_TURN - а то неизвестно стоит.. - срабатывает когда криттер хочет атаковать, но заблокирован (ну, это известно), причём срабатывает только один раз в начале боя. Также срабатывает, если атакован криттер из команды и атаковавший (чузен) сначала "не был" виден, то-есть как бы момент "криттер думает, что ему делать, куда бежать" (даже если члены команды стоят рядом (не обязательно) и никто не заблокирован), тоже один раз срабатывает при таком раскладе. Интересно, что еще этот параметр срабатывает, когда мы начинаем бой и сразу заканчиваем (не нанося повреждений), можно это использовать в местах, где чуз по читерски во время боя "крадётся" , у робота в токсических пещерах например. Какой командой, криттера во время боя, на нужный тайл идти заставить ? Анимационные команды вроде не пашут.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 8:50 - 4 Авг., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Aman >>Какой командой, криттера во время боя, на нужный тайл идти заставить ? Анимационные команды вроде не пашут. Помню, ковырял. Делал так: отслеживал начало хода НПС, блокировал интерфейс, заканчивал бой, делал animate_move_to_tile, начинал бой, разблокировал интерфейс. Написать АИ-шник - не проблема (моя крыса бегала за чузом, проигрывала анимацию атаки и даже сносила хиты - to hit, damage расчитывались в скрипте). Но есть большой минус - дурацкие раздражающие паузы при каждом завершении/старте боевого режима. Можно и без них, пользуя move_to. Тут всё работает, но - нет анимации. Дурацкие скачки по квадратам. Strongholder atoi и всё, что из него выросло активно юзается в mr. Fix-it. Сейчас есть штучки и покруче. Почти совсем полноценные массивы, например. Или get_char, позволяющяя полноценно парсить строчку. При желании, можно и поиск подстроки в строке реализовать и прочее.
|
Отправлено: 14:06 - 4 Авг., 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
2Raven: В принципе поддержку массивов можно добавить в компилятор. Правда с экспортируемыми / импортируемыми массивами будет геморно, т.к. обращение к таким переменным происходит по имени. А вот с локальными и скриптовыми без проблем. Могу попробовать добавить, если очень надо.
|
Отправлено: 21:34 - 4 Авг., 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
2Anchorite У, круто. А можно динамическое выделение памяти? 2Raven Немного достал разброс этих наработок.. поди их пособирай по топикам . Есть предложение: пиши потихоньку свой хэадер со всеми придуманными фентифлюшками. Обновляй его регулярно, комментарии делай избыточные. А народ будет его у тебя качать. 2All 44 скрипта заявленные в scripts.lst не присутствуют вообще. Еще 15 заявлены дважды. Не говорю уж о скриптах из первого фола, которые валяются у меня как мусор. Это локализатор так лажал или дядя из БИС?
----- hit me, nail me, make me god
|
Отправлено: 22:37 - 4 Авг., 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Гм.. пытаюсь потихоньку разобраться как работают оригинальные скрипты. Что такое FIXED_VAL? Увидел это в справке по metarule3. Долго читал, так и не понял.
----- hit me, nail me, make me god
|
Отправлено: 1:17 - 5 Авг., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
add_timer_event(dude_obj, 10, FIXED_VAL) metarule3(METARULE3_CLR_FIXED_TIMED_EVENTS, dude_obj, FIXED_VAL, 0) Понятно объяснил? :)
----- Scio me nihil scire
|
Отправлено: 2:12 - 5 Авг., 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
2 Alan Killenger Нет, динамически выделить память не получится.
|
Отправлено: 5:36 - 5 Авг., 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата:
add_timer_event(dude_obj, 10, FIXED_VAL) metarule3(METARULE3_CLR_FIXED_TIMED_EVENTS, dude_obj, FIXED_VAL, 0) Понятно объяснил?
То есть просто добавление события по таймеру? Ааа.. убийство ранее добавленного события по таймеру. Причем ключом к тому, какое именно событие из всех подвешенных убивать есть ранее переданное значение в fixed_param. Так?
----- hit me, nail me, make me god
|
Отправлено: 5:55 - 5 Авг., 2005 | ИСПРАВЛЕНО: Alan Killenger - 6:59 - 5 Авг., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Цитата: Ааа.. убийство ранее добавленного события по таймеру. Причем ключом к тому, какое именно событие из всех подвешенных убивать есть ранее переданное значение в fixed_param. Так?
Именно так.
----- Scio me nihil scire
|
Отправлено: 11:26 - 5 Авг., 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Еще вопрос. Хотя было бы лучше, если бы кто-нибудь давно копающий БИС скрипты просто поделился опытом, порассказывал что встречается в исходниках, чему следует удивляться, а чему - нет. Так вот, раскрываю такую строку:
Цитата: nr_add_timer_event_rand(self_obj, 10, 30, float_param);
Цитата: last_timed_obj:=self_obj; last_timed_param:=last_timed_param; metarule3(100,self_obj,1,0); add_timer_event(self_obj,game_ticks(10)+random(0,game_ticks(30-10)),1);
Хехе, вот бы где-нибудь типа в FGECK'е сделать команду "раскрыть отдельный макрос".. Ладно, так вот какой прикол. Нигде в скрипте пропущенном через препроцессор не встречаются переменные last_timed_param и last_timed_obj кроме как в следующих выражениях:
Цитата: last_timed_obj:=self_obj;
и
Цитата: last_timed_param:=last_timed_param;
А стало быть, они не имеют в этом скрипте никакой роли. Это нормально или у меня руки не из того места растут? Еще, следует ли удивляться тому, что в скрипте заявлено использование 5 или 7 LVAR, а на деле используется только LVAR(4) и LVAR(5)? (Добавление от 22:45 - 5 Авг., 2005.) Да, и еще вопрос. Вот есть у меня мод. Как мне узнать какие ГВАР затронуты в этом моде? Где-нибудь это отображается? То есть я делаю что-то свое поверх неизвестного мне мода и я хочу избежать пересечения ГВАР. Как мне быть? Неужто декомпилировать все скрипты в моде и смотреть?
----- hit me, nail me, make me god
|
Отправлено: 21:47 - 5 Авг., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
>>Вот есть у меня мод. Как мне узнать какие ГВАР затронуты в этом моде? Где-нибудь это отображается? То есть я делаю что-то свое поверх неизвестного мне мода и я хочу избежать пересечения ГВАР. Как мне быть? Обычно принято подписывать используемые гвары в vault13.gam. Глянь там, сразу после 633 Что ж за мод такой? А так только один способ из доступных мне - декомпайл.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 22:56 - 5 Авг., 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
>>порассказывал что встречается в исходниках, чему следует удивляться, а чему - нет - ничему не удивляйся Как правило, весь 2кб балласт идёт в начале декомпилированого скрипта и в основном - это лезет из command.h. Не стоит на это внимание обращать. Все "странные наборы" в скриптах, как правило одинаковые, сделай скрипт #include "..\headers\define.h" #include "..\headers\command.h" procedure start begin end Скомпили, потом декомпайл и вуаля. last_timed_obj и last_timed_param - похоже действительно не нужны, рудимент какой-то. Это всё newreno.h. Если мне что-то странное встречается, я просто поиск по папке с исходниками и хэадерами (1.02d) делаю. >>следует ли удивляться тому, что в скрипте заявлено использование 5 или 7 LVAR, а на деле используется только LVAR(4) и LVAR(5)? Не стоит. Помню меня это тоже сбило, подумал и решил - разработчики для себя решили, что LVAR(4) пусть отвечает за это, LVAR(5) за то и т.д. (это они так "выбрали", это не жестко и мы делаем, как хотим). Ну а то, что в скрипте первые три, например, не будут использоваться их особо не волновало: "подумаешь, лишние зарезервируем, мы ж не в Японии на конкурсе программистов". Да и при массовом написании, шаблоны так проще делать.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 3:14 - 6 Авг., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Кто-нибудь знает как скрыть отображение города на карте мира. То есть сделать противоположное функции mark_area_known. Да, есть макрос unmark_on_map(int area) но родной компилятор его не хочет понимать.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 18:12 - 17 Авг., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А он макросы понимать не обучен . command.h подключи. И ; не ставь. Компилится как миленький.
|
Отправлено: 18:28 - 17 Авг., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Здравствуйте, товарищи! Вопросик тут возник. Поможите, чем можете Диспозиция такова. Мне нужно, чтобы при первом заходе на карту отрубился пользовательский интерфейс, Чувак прогулялся до определенного тайла ,а дальше (при сближении с криттером) у него начинался не очень приятный разговор. Так вот, мне показалось логичным реализовать это через скрипт, навешиваемый на карту. Там это выглядит примерно так (точность не гарантирую): procedure map_enter_p_proc begin if(map_first_run) then begin game_ui_disable; animate_move_obj_to_tile(dude_obj, tile_x,1); game_ui_enable; end end Компиллится все нормально. При заходе на карту Чувак исправно отправляется в поход, но вот беда - не отрубается управление, и игрок в любой момент волен избежать неприятного разговора. Если Чувак доходит до тайла, рзговор начинается (тот криттер отслеживает расстояние до персонажа) Спрашивается, в чем косяк? Может я неверно выбрал скрипт? Может, нужно было зафигачить эту процедурку в скрипте криттера? И еще вопрос. Допустим, пользовательский интерфейс отключился, Чувак покорно идет навстречу неприятностям, и тут начинается диалог! Интерфейс включится? Даст выбрать диалоговые опции? Или кирдык?
|
Отправлено: 12:34 - 29 Авг., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Проблема в том, что F не ждёт окончания выполнения команды animate_move_obj_to_tile. Т.е. он отправляют obj куда надо, а сам приступает к выполнению следующей операции. Тут тебе поможет либо точно отсчитанный timer_event, либо critter_p_proc, включающий gui когда dude достигает нужно тайла, либо spatial скрипт в месте, куда должен придти dude.(spatial и timer - не рационально, имхо).
----- Scio me nihil scire
|
Отправлено: 12:52 - 29 Авг., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ок, спасибо. Оказывается, всё просто.
|
Отправлено: 13:59 - 29 Авг., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Хе, тут еще вопросик с помещением машины на карту появился. Собственно, я пока за него серьезно не брался, но почву прощупать хочется. Глянул в скриптах городов, вроде там заморочек особых нет. Осуществляется проверка GVAR_ PLAYER_GOT_CAR и car_current_town. Current_town - это обязательно? Если я добавляю новое поселение, скажем, вместо Abbey(area 17), с чем мне сверяться? Попробовал тупо в скрипте карты написать create_car(car_hex, car_elev) без всяких проверок и условий, но машина не появилась. Может, недостает переменной MVAR_Made_Car, назначение которой мне не совсем понятно. Кто подключал машину, поделитесь опытом плиз И еще, какой самый безгеморройный способ заиметь машину? Сложить все нужные детали на свалке у Смитти? Или сразу установить переменную GVAR_ PLAYER_GOT_CAR в единичку? Или какое там значение должно быть...
|
Отправлено: 16:54 - 10 Сент., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
>>Кто подключал машину, поделитесь опытом плиз Используй макрос Check_Create_Car и всё. Больше ничего не надо. Никаких проверок :)
----- Scio me nihil scire
|
Отправлено: 20:12 - 10 Сент., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Хм... Я бы рад воспользоваться, да только не нашел я такого макроса в стандартном комплекте скриптов, что шли с Бис-маппером. create_car валяется в SCENEPID.H, а вот этой самой check_create_car... Ну нету! В каком файле макрос должен лежать?
|
Отправлено: 22:17 - 10 Сент., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
А разве этот макрос не появился только в патченой версии 1.02d? Там-же чего-то с тачкой правили. Кто знает? P.S. А вообще, ленивый народ пошёл, макросы им подавай. Вот помню было время - декомпилишь скрипт, выкусываешь приблизительно похожий кусок скрипта и радуешься если потом за тобой багажник не бегает
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:17 - 10 Сент., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Сырцы просто пользуйте 1.02. Они есть прямо на сайте, по-моему в разделе "Утилиты".
----- Scio me nihil scire
|
Отправлено: 23:59 - 10 Сент., 2005
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
С "машинным" макросом путаница просто. Надо ставить исходники 1.02d от Haenlomal, поверх исходников от разработчиков, лежат они в "Ресурсах". Юзать макрос Check_Create_Car(Hex_Num, Elevation), в 1.02d от Haenlomal он есть (SCENEPID.H). Еще мвара есть, для карт с машиной, первая везде стоит (забыл я правда, зачем она нужна). ARBRIDGE.ssl в пример всем автолюбителям. Существует такая вещь - "Новый макрос Check_Car, заменяющий макросы Create_Car и Dest_Car" от WG. Это было сделано до исходников от Haenlomal и сейчас, в принципе, не нужно (так WG сказала ). P.S. Да хранят вас 1.02d, от блуждающего багажника.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 1:11 - 11 Сент., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Подтверждаю. Юзайте исходники 1.02дэ, там все макросы нормальные. А Чек_Кар давно пора забыть и снести с сайта . Да, кстати. МВАРы остались от старого макроса. Они в версии 1.02дэ не используются.
|
Отправлено: 9:34 - 11 Сент., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ура! Машина заработала. Эх, ребята, что ж вы мне про car_current_town не рассказали? Помучился я с ним. До сих пор не понимаю, как он изменяется, да вообще, доступен ли он для изменения из скриптов. В первый заход просто написал set_global_var(GVAR_PLAYER_GOT_CAR,1) в скрипте карты. Ломлюсь на свою крту, машины нет, вылезает отладочное сообщение: car_current_town==-1 (что за хэ?). Прихожу в Ден, машина стоит у Смитти, меня дожидается. Но только не тот Хайвеймен, который мы все любим, а бюджетный вариант - без багажника. Что-то среднее между "Москвичом" и "Окой". Прикольно! Во второй раз не извращался, положил топливный контроллер в Дене, заплатил Смитти, и все стало Ок.
|
Отправлено: 17:09 - 11 Сент., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Итак, вот и назрел вопрос у меня. Есть у нас говорящие головы и картинки за ними. Все бы хорошо, если бы не попытался я прикрепить это к сценери. Вот тут то и поджидал меня облом. Вылет в винду со страшной силой. Кто нить может подсказать в чем проблема? Вы спросите меня: - А зачем это тебе надо? Все и так работает. Ответ будет прост. Есть у нас машинка, та самая злополучная машинка, которая потребляя массу драгоценного электричества в бутылке, а точнее в коробке, треся всеми не дозаржавелыми внутренностями носит нас по всему вастленду и даже не поламается, пока не поламается... И вот поставим мы в неё рацию и будем иметь связь со всеми имеющими подобные передающе-принимающими аппараты. И все было бы здорово, если бы так и оставить, но как не поставить к этому красивую картинку внутренности этого технического чуда? Конечно можно извратиться и создать пораждающий скрипт, либо сделать просто создание криттера с другим скриптом, но хочется все же решить это спокойным простым способом. Но это еще не всё. Если создать пораждающийся скрипт - все работает отлично, до тех пор пока не вставить в него говорящую голову. А криттера, который может говорить за машину нельзя сделать невидимым, фалл падает. Но это мелочи по сравнению с тем, что диалог нельзя вызвать принудительно. Как только в диалоге появляется говорящая голова: call talk_p_proc перестает нормально работать, итог фалл падает. Если сделать машину криттером то последствия плохи, она пытается реагировать на бой и это влечет за собой тотализацию последней, а как только у неё начинается смерть - фалл падает. Фалл падает, падает и еще раз падает. Хто поможет?
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 0:02 - 21 Сент., 2005 | ИСПРАВЛЕНО: Pavel - 9:40 - 21 Сент., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Во-первых, вместо call talk_p_proc для принудительного входа в диалог используется команда dialogue_system_enter. Во-вторых, объясни подробнее, что конкретно ты делаешь. В-третьих, если не получается со сценери, сделай криттера, который выглядит как машина . И, кстати, что означает "порождающий скрипт"? Ты часом не до spawn добрался?
|
Отправлено: 10:13 - 21 Сент., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
1) Ой, моя тупой.. Да, ночь видать мозги отшибла 2) Есть машина, я почти определися, что наилегчайшим будет создавать криттера при начале диалога и убивать его по окончании. Криттер - мышь, за машиной не видно, видимость не убираю дабы багов не было. При начале диалога выходит задний фон: торпеда Крайслера /спасибо доброму человеку/ и на его фоне действует, мигает разными лампочками радиостанция. А все остальное диалог. 3) Думаю, что проблема как раз в 1м пункте закралась. Да, он самый. spawn конечно хорошо, но модочки в нем вроде не работают, хотя... опять же трабла может быть в первом пункте. Спасибо.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 11:16 - 21 Сент., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
О! spawn не привязывает скрипт ни к чему, поэтому я почти уверена, что диалоговый режим и прочая и прочая, связанная с прошниками и свойствами объекта будет глючить немеряно. Вообще криттера надо не спауном порождать, а просто через create_object_sid.
|
Отправлено: 13:54 - 21 Сент., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Полностью согласен, просто перед написанием сообщения я все перепробовал. Вечером отпишусь об успехах
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 18:05 - 21 Сент., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
WG еще раз спасибо, а то запарился из-за этой мелочи Если кому интересно будет, то текст ниже: В машине.. procedure use_obj_on_p_proc begin .... обычный текст .... // добавка if (obj_pid(obj_being_used_with)==PID_RIPPER) then /*116-риппер, просто пример предмета*/ begin create_object_sid(16777227,self_tile,0,1496); /*создадим криттера мышь, потому, что маленькая и за машиной не видна*/ end // end в скрипте самого диалога, у меня 1496 procedure start begin check_set_obj_visiblility(self_obj,true); /*сделаем криттера не видимым всегда, хотя всегда понятие растяжимое, 1 из 100 раз может и проявиться если бой начинается, а криттер только появился из предыдущего скрипта и еще не успел инициализироваться и двиг не запустил start*/ end procedure critter_p_proc begin if vs==0 then /* как только криттер появился, то начинается диалог, в конце диалога vs:=1 */ begin dialogue_system_enter; /*начало диалога*/ end else begin destroy_object(self_obj); /*и по завершению диалога он убивается.*/ end end .... procedure Node999 begin vs:=1; /*конец диалога, убиение криттера*/ end
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 20:08 - 21 Сент., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
>>1 из 100 раз может и проявиться если бой начинается Вообще-то, start должен срабатывать всегда. Но если возникают проблемы, то исправляется так: В машине.. procedure use_obj_on_p_proc begin variable smart_rat; .... обычный текст .... // добавка if (obj_pid(obj_being_used_with)==PID_RIPPER) then /*116-риппер, просто пример предмета*/ begin smart_rat:=create_object_sid(16777227,self_tile,0,1496); /*создадим криттера мышь, потому, что маленькая и за машиной не видна*/ check_set_obj_visiblility(smart_rat, true); end // end А из крыскиного start'a установку невидимости убрать.
----- Scio me nihil scire
|
Отправлено: 0:50 - 22 Сент., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Спасибо Mynah, то что нужно. Теперь вообще не красота, а просто заглядение
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 10:12 - 22 Сент., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ребята, очередной вопрос. Как от произвольного (гуманоидного) криттера добиться, чтобы он шевелил ручками, как будто что-то юзая? Хочется сделать такой прикол: мальчика на побегушках, который бы в баре постоянно шастал из кухни к столикам и обратно. Подходит к столу, шевелит руками, вроде как выпивку берет, и убегает. Аналогичную штуку видел только в "Новом Взгляде", где Виски Боб(?) бухает с Чузом. Исходников у меня нет, а декомпиллировать -- увольте-с.
|
Отправлено: 17:34 - 29 Сент., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
В НВ честный use . Тебе же нужна команда anim и примерно такие параметры: #define ANIM_magic_hands_ground (10) #define ANIM_magic_hands_middle (11) #define ANIM_magic_hands_up (12) Подробнее читай в доке .
|
Отправлено: 19:22 - 29 Сент., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Цитата: В НВ честный use . Тебе же нужна команда anim и примерно такие параметры:
У-у-у... Вот этого я и боялся. Я думал, может как-то через USE тоже сделать. Неужели произвольный криттер не может ничего взять со стола (являющегося контейнером)? По-моему так бы проще было.
Цитата:
Подробнее читай в доке .
В какой из? Bis_help? Command.h? Док - их много.
|
Отправлено: 21:01 - 29 Сент., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Надо выбирать не шаманские и не "заплаточные", а соответствующие логике ситуации методы . Использование скриптовой анимации в данном случае и есть как раз такой метод. Дока, ессно, бис_хелп. ЗЫ Ну попробуй сделать use на полке. Мне это в голову не приходило . Скорее всего, криттер полку поюзает, но взять что-то врятли сможет .
|
Отправлено: 12:25 - 30 Сент., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Собственно, мне не надо, чтобы криттер брал что-то на полке, а потом тащил к столику - иначе ушлые игроки будут воровать это "что-то" на каждой ходке. Мне нужно, чтобы он всего лшь изображал кипучую деятельность. Сегодня ночью в голову пришел способ реализации этой фигни. Допустим, есть два тайла, между которыми криттер курсирует: tile_1(возде полки) и tile_2(возле столика). Ну так вот, доходит он до первого тайла, и тут же у него в рюкзаке образуется фрукт или кусочек вяленого мяса, который он незамедлительно отправляет в рот. Со стороны это выглядит как шевеление руками. Но есть здесь одна загвоздка - каждое такое поедание будет сопровождаться сообщением на минидисплее: криттер такой-то заюзал то-то. Вопрос: можно ли сделать так, чтобы он жрал молчком, а не напоказ? Эх, чую, придется с анимациями возиться. Прикол маленький, а геморроя выше крыши
|
Отправлено: 12:51 - 30 Сент., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
"Заплатки" . Короче, тебе только один путь - изучать анимацию .
|
Отправлено: 15:09 - 1 Окт., 2005
|
|
Ronin
Пользователь
Откуда: Беларусь Регистрация: Июнь 2003
Всего: 27 сообщений
|
При использовании функции message_str({int msg_list}, {int msg_num}) нужно ввести номер msg файла и номер строки. Где взять номер msg файла.
|
Отправлено: 15:15 - 1 Окт., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Читать ФАК. Однозначно. На первой же странице написано: Q: Где найти номера *.msg файлов для использования в диалогах?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:33 - 1 Окт., 2005 | ИСПРАВЛЕНО: Ray - 22:34 - 1 Окт., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Есть такой скрипт: ... variable stored_node := 0; ... procedure CLICK_0; procedure start; ... procedure CLICK_0 begin ... call ${stored_node}(); end ЧИТО это за конструкция? P.S. Можно найти в ncKitty.int
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 14:23 - 3 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Ма-ать моя! Это ты чем декомпилировал? Вообще, приём вполне законный, только выглядит на самом деле так (ssl): variable stored_node; ... stored_node := "Node002"; ... call stored_node; Связана эта возможность тем, что в Фоле нет такого понятия, как тип переменной. Одна и та же переменная может быть и числом, и строкой, и ссылкой и даже, что мы и видим, именем функции (затрудняюсь выразить свою мысль по-другому, но думаю, что смысл ясен). Конструкция, на которую ты нарвался, определена в заголовке NEWRENO.H. Если есть исходники НВ - посмотри скрипт Виски Боба, там использован тот же приём.
|
Отправлено: 15:37 - 3 Окт., 2005
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Декомпилировано, я вижу, Noid'овской утилитой. Вообще, лучше взять int2ssl от Anchorit'а. А приём этот является одним из основополагающих в структурном программировании. Называется косвеный вызов. При чём переменая при таком вызове может содержать либо строковое имя процедуры, либо числовой индекс т.е. номер процедуры в скрипте по порядку объявления. Если не путаю ничего.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 16:23 - 3 Окт., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Декомпилил Нойдовским компилём взятым с этого сайта. int2ssl хорош, но я привык к другому коду. А, ${..........} это ж не Си'шный синтаксис? Вроде паскаль. Я в ООП под С++ такого вида раньше не встречал. Или опыта мало
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 22:22 - 3 Окт., 2005
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Нативный синтаксис скриптов Fallout, если что, называется Startrek Scripting Language aka SSL. К Си он отношения не имеет. А конструкция ${..........} является прямым заимствованием из Ruby, самого объектного из известных мне языков. На котором и написан Noid'ов декомпилятор. Но имей в виду, часть опкодов он всё равно понимает неправильно. На это мы с Anchorit'ом уже натолкнулись и в int2ssl пришлось вносить исправления.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 22:59 - 3 Окт., 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
Как можно проверить убил ли игрок Френка? Тоисть есть ли ГВАР'а которая за это отвечает? Будете смеятся, но раньше я проверял показывалась ли концовка для Ароййо .
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 21:21 - 5 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Вот типа ну никак скрипт Френка не изучить . В процедуре destroy_p_proc: set_global_var(GVAR_ENCLAVE_FRANK_DEAD,1); Есть ещё один способ. Для скриптоманьяков . int player_kill_count(int type) - число убитых игроком криттеров Аргументы: type - тип криттера Возвращаемое значение: число убитых игроком криттеров заданного типа Примечания: макрос от metarule3(METARULE3_GET_KILL_COUNT, type, 0, 0) Наш Френки, кажись, идёт под номером 18 (type = 18) - Большой и Страшный Босс .
|
Отправлено: 22:00 - 5 Окт., 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
Сенк, а теперь чисто теоритический вопрос: Как лучше зделать эффект подмены карты? Убрать маркер старого города, и вместо него поставить новый, или проверять определенную ГВАРу на 0/1 и подменять карту при входе чара.
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 18:01 - 6 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Также, как сделана "мёртвая" локация Арройо . [Area 00] ; Arroyo area_name=Arroyo world_pos=184,133 start_state=On size=Medium townmap_art_idx=156 townmap_label_art_idx=370 entrance_0=On,350,275,Arroyo Bridge,-1,-1,3 ; Etc. entrance_1=On,280,175,Arroyo Village,-1,-1,0 entrance_2=On,200,90,Arroyo Temple,-1,-1,0 entrance_3=Off,100,150,Arroyo Wilderness,-1,-1,0 entrance_4=Off,-1,-1,Arroyo Caves,-1,-1,0 [Area 22] ; Destroyed Arroyo area_name=Arroyo world_pos=184,133 start_state=Off size=Medium townmap_art_idx=-1 townmap_label_art_idx=370 entrance_0=On,345,230,Destroyed Arroyo Bridge,-1,26719,0 Вообще, прежде чем делать что-то посмотри реализацию аналогичных ситуаций.
|
Отправлено: 10:09 - 7 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Так. Процедура смены брони для партийца: variable original_fid; //"Родной" FID Procedure start begin original_fid:=obj_art_fid(self_obj);//Эта процедура вызывается первой - start, поэтому это будет действительно Родной FID end variable ptr_armor; //Указатель на броню variable Art_fidM:=-1;//"Мужской" FID variable Art_fidF:=-1;//"Женский" FID Procedure critter_p_proc begin ptr_armor:=critter_inven_obj(self_obj,INVEN_TYPE_WORN); if (ptr_armor==0) then metarule3(107,self_obj,original_fid,0); else begin if(obj_pid(ptr_armor)==PID_LEATHER_ARMOR)OR(obj_pid(ptr_armor)==PID_CURED_LEATHER_ARMOR)OR(obj_pid(ptr_armor)==PID_LEATHER_ARMOR_MK_II)then begin Art_fidM:=FID_HMLTHR; Art_fidF:=FID_HFLTHR; end else if(obj_pid(ptr_armor)==PID_LEATHER_JACKET)then begin Art_fidM:=FID_HMMAXX; Art_fidF:=FID_HFMAXX; end else if(obj_pid(ptr_armor)==PID_PURPLE_ROBE)then begin Art_fidM:=FID_HAROBE; Art_fidF:=FID_HAROBE; end else if(obj_pid(ptr_armor)==PID_METAL_ARMOR)OR(obj_pid(ptr_armor)==PID_TESLA_ARMOR)OR(obj_pid(ptr_armor)==PID_METAL_ARMOR_MK_II)then begin Art_fidM:=FID_HMMETL; Art_fidF:=FID_HFMETL; end else if(obj_pid(ptr_armor)==PID_COMBAT_ARMOR)OR(obj_pid(ptr_armor)==PID_COMBAT_ARMOR_MK_II)then begin Art_fidM:=FID_HMCMBT; Art_fidF:=FID_HFCMBT; end else if(obj_pid(ptr_armor)==PID_POWERED_ARMOR)OR(obj_pid(ptr_armor)==PID_HARDENED_POWER_ARMOR)OR(obj_pid(ptr_armor)==PID_BROTHERHOOD_COMBAT_ARMOR)then begin Art_fidM:=FID_NAPOWR; Art_fidF:=FID_NAPOWR; end Отлично! Теперь вопросы: 1. Если сменить(т.е снять одну, и одеть другую) броню в режиме диалога, вид партийца не меняется. Т.е. Чтобы сменить броню, нужно снять броню, выйти из диалога, зайти в диалог, и одеть другую. Почему? 2. Иногда, при смене брони(выход из диалога) партиец начинает съезжать вниз по карте. ИЗ-за чего это может быть? (Добавление от 23:53 - 13 Окт., 2005.) Далее... Мне всегда не нравилось, что в режиме диалога нельзя сказать партийцу, какое точно оружие он должен взять. Выбрать тобеж. Вот: #define Weapon(Pid_Item) if(obj_carrying_pid_obj(self_obj,Pid_Item)!=0)then\ gsay_option(-1,"Я хочу, чтобы ты взял в руки"+ proto_data(Pid_Item,it_name), wield_obj(obj_carrying_pid_obj(self_obj,Pid_Item)),-1); или (тут я не знаю точно что ставить, но мне кажется что всё-таки gsay_option) #define Weapon(Pid_Item) if(obj_carrying_pid_obj(self_obj,Pid_Item)!=0)then\ SayOption("Я хочу, чтобы ты взял в руки"+proto_data(Pid_Item,it_name),wield_obj(obj_carrying_pid_obj(self_obj,Pid_Item))); Я понимаю, что вместо wield_obj(obj_carrying_pid_obj(self_obj,Pid_Item)) там должно быть указание на процедуру. Что-то вроде: SayOption("Я хочу, чтобы ты взял в руки"+proto_data(Pid_Item,it_name), Wield_Critter); Procedure Wield_Critter begin wield_obj(obj_carrying_pid_obj(self_obj,Pid_Item)); end Но как передать этой процедуре Pid_Item??? Procedure Take_Weapon begin variable Pid_Item:=4; Rep(10); Weapon(45)Weapon(94)Weapon(118)Weapon(120)Weapon(122)Weapon(143)Weapon(159) Weapon(261)Weapon(268)Weapon(270)Weapon(280)Weapon(283)Weapon(287)Weapon(296) Weapon(313)Weapon(332)Weapon(365)Weapon(421)Weapon(427)Weapon(500)Weapon(519) while((Pid_Item>=3)AND(Pid_Item<14))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=15)AND(Pid_Item<17))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=18)AND(Pid_Item<29))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=115)AND(Pid_Item<117))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=160)AND(Pid_Item<163))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=233)AND(Pid_Item<237))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=241)AND(Pid_Item<243))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=290)AND(Pid_Item<294))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=299)AND(Pid_Item<301))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=319)AND(Pid_Item<321))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=350)AND(Pid_Item<356))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=371)AND(Pid_Item<373))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=383)AND(Pid_Item<408))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=496)AND(Pid_Item<498))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End while((Pid_Item>=508)AND(Pid_Item<510))do begin Weapon(Pid_Item)Pid_Item:=Pid_Item+1;End end
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 23:47 - 13 Окт., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Извращаться с critter_p_proc не надо. procedure talk_p_proc begin variable previous_armor; variable current_armor; variable previous_weapon; variable current_weapon; --запоминаем текущее состояние криттера в previous'ы--- --диалог-- --если текущее состояние != предыдущему, то сменить броню, потом оружие (если не wield'ать оружие, то, после смены брони, криттер окажется с пустыми руками)-- end
----- Scio me nihil scire
|
Отправлено: 9:19 - 14 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Ты слегка не прав. Я так пробовал, не получается. Процедуру нужно засовывать в Node999, т.е. в конец диалога. Тогда всё работает отлично. А как насчёт второй процедуры? Можешь что нибудь посоветовать?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 23:00 - 15 Окт., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
>>Ты слегка не прав. А может ты? ;) У меня-то всё работает. Я так делал уже ;)
----- Scio me nihil scire
|
Отправлено: 0:04 - 16 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Быть может всё. Но у меня работает так как я написал =)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 0:30 - 16 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Вот только не надо засорять тему воплями "а моя песочница круче!" Работают оба способа, но способ Mynah более изящный и верный. Совать одноразовые действия такого объёма в процедуру, которая вызывается десять раз в секунду - садизм чистой воды. Так что, binyan, проверь свой код, если есть вопросы - задай их. А шашкой махать не стоит.
|
Отправлено: 11:13 - 16 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Я конечно очень извиняюсь, что начал спорить, и я понимаю, что оба способа работают. Но:
Цитата:
Ты слегка не прав. Я так пробовал, не получается. Процедуру нужно засовывать в Node999, т.е. в конец диалога. Тогда всё работает отлично.
Продолжать спорить не хочу, но от криттер_п_проц я отказался почти сразу.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:40 - 16 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Вот упрямый человек. Да нечего этой процедуре делать в Node999, об этом тебе и пытаются сказать. Место ей - в отдельной процедуре. Во-первых. Во-вторых, в tpp после завершения диалоговой последовательности, должно идти что-то вроде того, что тебе изложил Mynah. С последующим вызовом твоей процедуры. И вся проблема. Так что засунь свою процедуру в tpp .
|
Отправлено: 10:07 - 17 Окт., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Насчёт выбора оружия. Вот здесь лежит header с набором необходимых процедур. Он НЕ проверялся, так что возможны какие-нибудь мелкие ошибки, да и принцип довольно таки топорный. Но всю работу за тебя мне делать не досуг:) Да и, если "птица говорун отличается умом и сообразительностью", то разберёшся дальше сам. Главное - концепт ;) ЗЫ: Самый большой недостаток и, одновременно, самая большая сложность состоит в том, что у Option нельзя указывать параметром процедуру с параметрами. От такая, блин, тавтология.
----- Scio me nihil scire
|
Отправлено: 13:18 - 17 Окт., 2005 | ИСПРАВЛЕНО: Mynah - 15:20 - 17 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
У меня такой вопрос: Можно ли в Фоловских скриптах объявлять массивы? Если да, то как?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:12 - 18 Окт., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
[Что то с памятью моей стало. Здесь был бред] Масивы у меня не получились. Вот только строки: variable temp:="abcd";
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 0:01 - 19 Окт., 2005 | ИСПРАВЛЕНО: Ray - 23:12 - 18 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
С памятью всё в порядке. Цитирую Raven:
Цитата:
Небольшой полуофтопец. При извесном желании можно в вару запихнуть оч. много указателей. Каким образом: "12345678:87654321:6892020"... Т.е. - самодельный char-массив. atoi написан. Естественно, это подходит только для динамического хранения вар. И работает не слишком шустро. Зато - массивы :-) И куча указателей "в одной варе" :-)
Теперь бы понять как их потом оттуда вытаскивать
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 0:49 - 19 Окт., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
После некоторой мороки представляю для общественности самопальный массив (причём отличия от Raven'овского должна быть существенна). Код: ======================== procedure start; procedure getmas(variable name,variable index); procedure setmas(variable name,variable numb,variable index); procedure look_at_p_proc; variable mas:=0; variable h:=0; procedure start begin end procedure look_at_p_proc begin mas:=setmas(mas,70,0); mas:=setmas(mas,90,1); mas:=setmas(mas,80,2); h:=getmas(mas,1); h:=getmas(mas,2); end procedure getmas(variable name,variable index) begin variable ret:=0; variable k:=0; ret:=name; while (index!=0) do begin index:=index-1; ret:=ret/100; end k:=ret; k:=k/100; k:=k*100; ret:=ret-k; return ret; end procedure setmas(variable name,variable numb,variable index) begin variable temp:=0; variable inj:=0; inj:=index; temp:=name; if (index!=0) then begin while (inj!=0) do begin inj:=inj-1; temp:=temp/100; end temp:=temp/100; temp:=temp*100+numb; while (index!=0) do begin index:=index-1; temp:=temp*100+getmas(name,index); end end else begin temp:=numb; end return temp; end ============================ Что мы имеем. А имеем мы масив mas. Нумерация идёт от 0. Имеет следующий вид __ __ __ __ где один элемент - число от 0 до 99. procedure setmas(variable name,variable numb,variable index); Записать в масив. Аргументы name - имя масива, numb - значение, index - номер элемента (нумерация с нуля) procedure getmas(variable name,variable index); Чтение name- имя масива index - номер Вроде проверял, работает. Кто может проще или элегантнее - милости прошу.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 1:54 - 19 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Садисты . Во-первых, сами ГВАР, МВАР и ЛВАР уже являются масивами. Во-вторых, ещё один способ реализации массива (через функцию) показал Mynah в своём хеадере для выбора оружия. В-третьих, скачайте фиксита и залезьте в исходники. И будет вам щастье . Файл custstr2.ssl, процедура wordar.
|
Отправлено: 10:21 - 19 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Итак, сабж. Когда делаешь смену брони для партийца посредством смены Фидов, то в "Приказ" партиец может взять даже то оружие, которое ему запрещено из-за АИ. Потому что есть анимация с этим оружием. Чего не скажешь о выборе из диалога. Если оружие выбирать из диалога, то запрещённое оружие партиец в руки не возьмёт. Так вот, возникла идея, сделать так, чтобы при диалоге, и "Приказе" запрещённое оружие не показывалось, а при выходе из диалога, и бартере показывалось.Вот несколько процедур: #define remove_from_inventory(Forbidden_weapon_remove) rm_obj_from_inven(self_obj,obj_carrying_pid_obj(self_obj,Forbidden_weapon_remove)) #define add_to_inventory(Forbidden_weapon_add) add_obj_to_inven(self_obj,create_object(Forbidden_weapon_add,1,1)) procedure forbidden_weapon_pid_array(variable num); procedure degree(variable num, variable degree); Procedure Hide_forbidden_weapon; Procedure Show_forbidden_weapon; variable amount_forbidden_weapon:=4; procedure forbidden_weapon_pid_array(variable num) begin variable temp; if num==0 then temp:=PID_PLASMA_RIFLE; if num==1 then temp:=PID_ROCKET_LAUNCHER; if num==2 then temp:=PID_GATLING_LASER; if num==3 then temp:=PID_TURBO_PLASMA_RIFLE; return temp; end Кстати, в скриптах Фоловских есть степень? Типа 10 в степни n и т.д.? Если есть, то я зря процедуру делал =(( procedure degree(variable num, variable degree) begin variable i:=1; variable temp; while(i<degree) do begin num:=num*num; i+=1; end temp:=num; if degree==0 then temp:=1; return temp; end Procedure Hide_forbidden_weapon begin variable i; set_local_var(LVAR_forbidden_weapon,0); while(i<amount_forbidden_weapon) do begin if(obj_carrying_pid_obj(self_obj,forbidden_weapon_pid_array(i))!=0)then begin remove_from_inventory(forbidden_weapon_pid_array(i)); set_local_var(LVAR_forbidden_weapon,((local_var(LVAR_forbidden_weapon)*10)+1)); end else set_local_var(LVAR_forbidden_weapon,(local_var(LVAR_forbidden_weapon)*10)); i+=1; end end Procedure Show_forbidden_weapon begin variable i; variable j:=0; variable g:=1; i:=(amount_forbidden_weapon-1); if((local_var(LVAR_forbidden_weapon)/degree(10,i))==1) then add_to_inventory(forbidden_weapon_pid_array(j)); while(i>=0) do begin i-=1; j+=1; if(((local_var(LVAR_forbidden_weapon)/degree(10,i))%degree(10,g))==1) then add_to_inventory(forbidden_weapon_pid_array(j)); g+=1; end end Procedure Dialog_in_party begin call Hide_forbidden_weapon; Rep(6); Opt(61,Weapon); //if self_wearing_armor then Self_wearing_weapon - Command.h if(critter_inven_obj(self_obj,INVEN_TYPE_WORN)!=0)then Оpt(62,Remove_Armor); Opt(63,Healing); Opt(64,Waiting); Opt(66,Distance); Opt(65,End_dialog); End Procedure talk_p_proc begin Dialogue(self_obj,Choose_dialog); call Show_forbidden_weapon; //Тут дальше смена брони еnd Как видите, при входе в диалог, всё запрещённое оружие скрывается, а при выходе открывается. Есть только одна проблема...Бартер. Специальной процедуры для бартера нету, есть только gdialog_barter. Но она не возвращает никакого значения. Следовательно я не могу узнать, начал ли дуд бартер с партийцем.И не могу открыть оружие в бартере. Из всего вышесказанного следует вопрос: А возможно ли вообще узнать, в бартере ты или нет?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 0:24 - 24 Окт., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
binyan Зачем ремувить-то из инвентаря? Просто сделай проверку в переборе оружия.
Код:
procedure check_forbidden_weapon(varibale pid) begin variable i:=0; variable tmp_out:=1; while i<frbdn_wpn_cnt+1 do begin i+=1; if forbidden_weapon_pid_array(i)==pid then tmp_out:=0; end return tmp_out; end ----- if check_forbidden_weapon(x) then ..... -----
PS: Слушай, чей скрипт-то получается? Мой или твой?;)
----- Scio me nihil scire
|
Отправлено: 12:27 - 24 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Ты меня чуть чуть опередил с проверкой =) Я это(ну не совсем, но что-то вроде) сделал дома =) А скрипт ? Общественное достояние =)) Мне его много людей помогало писать =)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 23:03 - 24 Окт., 2005
|
|
Zarkon
Пользователь
Откуда: Россия. Саратов. Регистрация: Окт. 2005
Всего: 2 сообщения
|
Помогите разобраться! Обьясните(если кто может) как создать скрипт для ПРОСТОГО ТОРГОВЦА, которому можно сказать: "Торговать" и "Выход". ???
|
Отправлено: 11:53 - 26 Окт., 2005
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Zarkon Для простого торговца - есть масса простых оригинальных скриптов, которые можно взять за основу. Все оригиналы скриптов есть на этом сайте. Если у тебя действительно будут вопросы, в которых нужна будет помощь - пости, а пока: RTFM. ЗЫ: для простого торговца достаточно вообще сказать в диалоге "привет-пока" и в прошке поставить бартер. Тогда кнопка бартера будет активна и сможешь спокойно торговаться.
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 12:06 - 26 Окт., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
2Zarkon По пробуй сделать свой скрипт на основе хотя бы скрипта Тубби из Дена. Для изучения тебе понадобятся файлы dctubby.ssl, ditubbox.ssl, command.h и конечно же bis_help. Еще может понадобиться den.h и кое что по мелочи. Вообще, на папку HEADERS стоит обратить особое внимание.
|
Отправлено: 13:10 - 26 Окт., 2005
|
|
Zarkon
Пользователь
Откуда: Россия. Саратов. Регистрация: Окт. 2005
Всего: 2 сообщения
|
Попробовал, ничего неполучилось... Можете написать что конкретно и где печатать надо?
----- (_|_)
|
Отправлено: 17:24 - 26 Окт., 2005
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Zarkon, Писать надо много. Скачивай документацию. Изучай. "Что конкретно и где" - это вопрос не сюда. ЗЫ: а конкретный примерчик могу только один дать. пуск->выполнить->cmd->shutdown -s -t 00
----- Scio me nihil scire
|
Отправлено: 18:52 - 26 Окт., 2005
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Собственно возвращаюсь к своему скрипту. С побитовой записью, гвару можно использовать только для простых квестов (да-нет). А вот таким способом, гвару можно использовать для множества квестов с 9 значениями для каждого. procedure degree(variable num, variable degree) begin variable i:=1; variable temp; while(i<degree) do begin num:=num*num; i+=1; end temp:=num; if degree==0 then temp:=1; return temp; end Procedure Hide_forbidden_weapon begin variable i; set_local_var(LVAR_forbidden_weapon,0); while(i<amount_forbidden_weapon) do begin if(obj_carrying_pid_obj(self_obj,forbidden_weapon_pid_array(i))!=0)then begin remove_from_inventory(forbidden_weapon_pid_array(i)); set_local_var(LVAR_forbidden_weapon,((local_var(LVAR_forbidden_weapon)*10)+1 )); end else set_local_var(LVAR_forbidden_weapon,(local_var(LVAR_forbidden_weapon)*10+2)); i+=1; end end Procedure Show_forbidden_weapon begin variable i; variable j:=0; variable g:=1; i:=(amount_forbidden_weapon-1); if((local_var(LVAR_forbidden_weapon)/degree(10,i))==1) then add_to_inventory(forbidden_weapon_pid_array(j)); while(i>=0) do begin i-=1; j+=1; if(((local_var(LVAR_forbidden_weapon)/degree(10,i))%degree(10,g))==1) then add_to_inventory(forbidden_weapon_pid_array(j)); g+=1; end end Вот...информация для размышлений
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 1:18 - 27 Окт., 2005
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Zarkon В ФАК. И не вылезай оттуда, пока не перестанешь задавать настолько гениальные вопросы.
|
Отправлено: 11:10 - 27 Окт., 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
Значит у мну появилась вот такая идея создания масивов в языке ssl.
Код:
#define mass[y]:=x set_local_var(y, x) #define :=mass[y] local_var(y)
Как видите эти макросы используют локальные переменные для работы с так называемым масивом. Недостатки: 1. Самый большой, мы не можем использовать название масива, вместо этого приходится зарезервировать слово mass что не есть гуд. Возможности: 1. Можно воспользоватся алгоритмом сортировки методом "пузырька".
Код:
procedure sort(variable max) variable i; variable y; variable temp; begin while i <= max - 1 do // Так как в язык не понимает цыклы for приходится юзать while begin while y != i do begin if i < y then //Если i проходит по условию с y меняем местами значения в переменных. Можно изменить знак в зависимости от того как сортировать. (По возростанию < (по убыванию > begin temp:=mass; mass:=mass[y]; mass[y]:=temp; end y:=y+1; end i:=i+1; end end
Этот код работоспособен(наверное) только для целочеслительных значений так как я не уверен что двиг сможет сравнить две строки. Извините за все кривости и неточности, писал по памяти. Надеюсь кому-то это пригодится.
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 17:38 - 23 Ноября, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Итак: Недостатки: 2. Нуммерация твоего масива будет от 633+. Т.к. начальные гвары уже заняты. С таким подходом сразу запутаешся. А так ты написал не массив, а быстрое происвоение\чтение гвары. Возможности: 1. Ну для начала неплохо бы обнулить переменные, а так работать не будет. 2. У тебя сортировка идёт с первого элемента (т.е. с первой гвары). Представляю какая каша начнётся, если такое применить. 3. Забыл обнулить 'y' после вложенного цикла. 4. А зачем вообще нужна сортировка? 5. Метод пузырька крайне не эффективен. Лучше уж использовать методы двухпутевого слияния, Шелла, квадратичной выборки, быстрой сортировки и т.д., любой на вкус и простоту исполнения. >>Этот код работоспособен(наверное) только для целочеслительных значений так как я не уверен что двиг сможет сравнить две строки. Как уже много раз говорилось: в ssl нет различий между типами переменной. Ты можешь написать как: temp:='aaa'; так и temp:=231;
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 21:03 - 23 Ноября, 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Для того, чтобы реализовать полноценные массивы требуется доработать компилятор. Однако массивы будет невозможно импортировать и экспортировать, т.к. обращение к переменным такого класса происходит по имени а не индексу. На настоящий момент массивы можно реализовать с помощью ассембларных вставок в компиляторе от Нойда.
|
Отправлено: 22:40 - 23 Ноября, 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: Нуммерация твоего масива будет от 633+. Т.к. начальные гвары уже заняты. С таким подходом сразу запутаешся. А так ты написал не массив, а быстрое происвоение\чтение гвары.
Он же написал set_local_var. Использование GVAR тут не рационально, об этом видимо и речи не идет. А нумерацию все-таки прийдется начинать не с 0 и не с 1 (двиг меняет значение одной LVAR).
Цитата: Метод пузырька крайне не эффективен. Лучше уж использовать методы двухпутевого слияния, Шелла, квадратичной выборки, быстрой сортировки и т.д., любой на вкус и простоту исполнения.
Могу начать всех грузить своими познаниями в численных методах... а нафига? Следует понимать, что автор идеи всего лишь предлагает пример. Лично я это использовать буду наврядли. Уж больно некрасиво смотриться (подождем новый компилятор Анчорита ). Да, кстати, автор забыл упомянуть, что данный способ позволяет нам создавать неограниченное (хехе, почти) количество многомерных массивов. Это можно записать как гуд.
----- hit me, nail me, make me god
|
Отправлено: 1:14 - 24 Ноября, 2005 | ИСПРАВЛЕНО: Alan Killenger - 2:20 - 24 Ноября, 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
>>Он же написал set_local_var Не заметил, прошу прощения. >>Могу начать всех грузить своими познаниями в численных методах... а нафига? А я никого и не грузил. Я просто высказал своё мнение - тот пример не эффективен. Извините, если это выглядело как-то по другому
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 11:44 - 24 Ноября, 2005
|
|
Fozzy
Пользователь
Откуда: Украина,Киев Регистрация: Апр. 2004
Всего: 81 сообщение
|
2Anchorite: Оч. хорошо, но есть одна проблема... Из Асемблера я знаю только принципы его работы, так что было бы неплохо если кто-нить сделает эту фичу. 2Ray: Я же не говорил что это эффективный способ этот пример я навел просто что бы показать для чего могут послужить массивы. 2Alan Killenger: Спасибо за понимание =) З.Ы. И еще... Мож кто-нить знает как двиг будет сравнивать переменные если в них записаны строки? По длинне или по индексам символов(А == 32(вроде)).
----- Последний патрон в поржавевшем стволе - Остаток надежды на то что бы выжить. И две банки джета в моем рюкзаке - Реальность, которой уже не увижу. (С)Fozzy
|
Отправлено: 18:06 - 24 Ноября, 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Угадал.
----- hit me, nail me, make me god
|
Отправлено: 5:10 - 25 Ноября, 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: procedure use_p_proc begin destroy_object(self_obj); end
Почему у меня маппер вылетает с ошибкой?
----- hit me, nail me, make me god
|
Отправлено: 17:53 - 2 Янв., 2006
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Alan Killenger, Попробуй поставить script_overrides или, если не поможет, то не уничтожай по use, а вешай короткий таймер, по которому предмет уничтожится.
----- Scio me nihil scire
|
Отправлено: 19:04 - 2 Янв., 2006 | ИСПРАВЛЕНО: Mynah - 21:05 - 2 Янв., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
1. Как удалить объект из инвентаря игрока, если инвентарь игрока открыт? Можно ли скриптами закрыть инвентарь игрока? 2. Как лучше отловить в скрипте партийца смену прошников? Ну и напоследок. Я поставил в скрипт игрока на обработчик юсе_обж_п_проц скрипт_оверрайдес (семшно звучит), так серьезных последствий не вижу, но если кто наступа на эту граблю может заранее сказать что мне надо реализовать кроме "Это ничего не делает.".
----- hit me, nail me, make me god
|
Отправлено: 23:04 - 4 Янв., 2006 | ИСПРАВЛЕНО: Alan Killenger - 0:05 - 5 Янв., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
1. Никак. Нельзя. 2. Сам процесс - никак. Прошники меняет движок. Можешь воспрользоваться этой функцией int obj_pid(ObjectPtr obj) - возвращает идентификатор прототипа (pid) объекта Аргументы: obj - указатель на объект Возвращаемое значение: идентификатор прототипа объекта Однако, она сработает постфактум. А тебе надо до или в процессе. Совет: а тебе очень надо, чтобы партийцы книжки читали? Мне, например, не надо... Оверрайд лучше не пиши где попало. Можешь и напороться...
|
Отправлено: 23:09 - 4 Янв., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
А можно ли как-нибудь узнать: открыт инвентарь или нет?
----- hit me, nail me, make me god
|
Отправлено: 4:34 - 5 Янв., 2006
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Нельзя
----- Scio me nihil scire
|
Отправлено: 10:02 - 5 Янв., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
А можно ли как-нибудь узнать: воспользовался ли игрок PipBoy опцией отдохнуть сколько-то времени? Или, скажем так... игровые тики точно не тикают когда инвентарь открыт?
----- hit me, nail me, make me god
|
Отправлено: 22:29 - 5 Янв., 2006 | ИСПРАВЛЕНО: Alan Killenger - 23:31 - 5 Янв., 2006
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
Ох, чувствую, расхочется тебе моддить :) Нельзя. Не тикают.
----- Scio me nihil scire
|
Отправлено: 23:06 - 5 Янв., 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ребята, у меня очередной глупый вопрос. Требуется отнять у чуза определенное количество денег. Можно это сделать одним оператрорм? Для того чтобы дать чузу золота или проверить его количество есть специальные операторы. А вот для экспроприации я такового не нашел. Придется поступать так же, как и с изъятием обычных предметов?
|
Отправлено: 15:34 - 20 Янв., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Аргумент отрицательный должен быть . Вот и всё .
|
Отправлено: 16:47 - 20 Янв., 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Тут в ФАКе был поднят вопрос насчет анимации. Мол если криттера ножичком пырнёшь, изменив придварительно тип повреждений, то он сгорит или ещё хуже сплавится. А у меня вопрос. Когда обьект умирает вызывается дестройт обджект? Если да, то можно скриптово нужную анимацию привязать и ноу проблем.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:40 - 20 Янв., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А вот ты сначала привяжи . Серьёзно. Для начала вставь оверрайд в дестрой_обж. Потом делай полностью свою обработку. Может и получится. Но вероятнее всего - нет.
|
Отправлено: 10:07 - 21 Янв., 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
В фолле 7 статов(характеристик): от 0 до 6. Тогда как расценивать данный текст: if (op_get_critter_stat(op_dude_obj(), 5) < 6) then call Node008(); else if (op_get_critter_stat(op_dude_obj(), 8) < 3) then call Node009(); Баг?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 22:07 - 30 Янв., 2006 | ИСПРАВЛЕНО: Ray - 21:08 - 30 Янв., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Из справки к F-Geck. #define STAT_ag (5) #define STAT_lu (6) #define STAT_max_hp (7) /// strength, perception, endurance, charisma, intelligence, agility, /// luck, // luck MUST be the last basic stat // derived stats #define STAT_max_hit_points (7) #define STAT_max_move_points (8) #define STAT_ac (9) ///#define STAT_unarmed_dmg (10) #define STAT_unused (10) #define STAT_melee_dmg (11) и так далее. Ray отдыхать то, хоть иногда надо (Добавление от 21:30 - 31 Янв., 2006.) Свои вопросы: При помоши wield_obj({ObjectPtr obj}); можно отправить броню прямо в ее слот, для дюда или критера. Как напарники надевают броню (речь не про отображение) у них просто плюсы к соответственным характеристикам или они ее надевают? что-то сегодня копался - копался да так и не понял где начало цепочки. :-/
|
Отправлено: 21:21 - 31 Янв., 2006 | ИСПРАВЛЕНО: Dar - 21:31 - 31 Янв., 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Ты прав Я это вспомнил только через 10 мин. После того как пост отправил. Глюконуло меня малость
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:49 - 31 Янв., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Смешно, но ответы на свои вопросы я тоже через десять минут нашел - тоже надо отдыхать. мою. . //wield_obj_critter(dude_obj,obj_carrying_pid_obj(dude_obj, {pid_Item}));
|
Отправлено: 9:38 - 1 Фев., 2006
|
|
Lesnik7
Пользователь Регистрация: Февр. 2006
Всего: 6 сообщений
|
Я конечно может быть тупойи нехрена не понимаю ,но у меня следующии вопрос. Написал я простой скрипт (хелоу ворд), откомпилировал ( если расширение инт - это откомпилированый скрипт?) засунул в маппер, открываю его и какбыло сказанно, жму s e , выбираю, и.... нет его в выпадающем списке.... что делать, а? где я мог допустить ошибку? В следующий раз прогоняй текст сообщения через Word или что-нибудь в этом духе. Читать же невозможно! WG
|
Отправлено: 15:41 - 6 Фев., 2006
|
|
Inviolatum
Пользователь Регистрация: Янв. 2006
Всего: 14 сообщений
|
Скорее всего ты не прописал скрипт в scripts.lst Как это сделать и зачем смотри тут и тут
|
Отправлено: 16:57 - 6 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Если можно пожалуйста разъясните тут что можно о процедуре combat_p_proc В FScript-HOWTO она не освещена, а из того что есть о ней в доке, понял мало: combat_p_proc - выполняется во время боя. Номер конкретного события, вызвавшего функцию, передаётся в качестве параметра fixed_param: fixed_param = COMBAT_SUBTYPE_WEAPON_USED (1) - было использовано оружие fixed_param = COMBAT_SUBTYPE_HIT_SUCCEEDED (2) - успешное попадание fixed_param = COMBAT_SUBTYPE_SEQUENCING (3) - проверяется боевая последовательность fixed_param = COMBAT_SUBTYPE_TURN (4) - начало хода fixed_param = COMBAT_SUBTYPE_NONCOM_TURN (5) - неизвестно (используется у любимцев Мельхиора, возможно, означает ход игрока) Как понял доку процедура всплывает при 1) было использовано оружие, 2)успешное попадание, 3) проверяется боевая последовательность,4) начало хода,... Как из этой процедуры узнать этот fixed_param? Точнее можно ли из combat_p_proc узнать какой боевой скил был использован при а) атаке , б) нанесении повреждения? (интересует атака и нанесение повреждения со стороны obj_dude по врагу)
|
Отправлено: 19:48 - 9 Фев., 2006 | ИСПРАВЛЕНО: Keha - 19:58 - 9 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Keha Туда можно дофига насовать, правда не все будет работать анимации например не будут вроде как они во время боя совсем никак. Вот тебе частный случай: procedure combat_p_proc begin variable tmp_armor; tmp_armor:=critter_inven_obj(dude_obj, INVEN_TYPE_WORN); add_timer_event(self_obj, 1, 2); if (fixed_param == 4) or (fixed_param == 3) then begin if (obj_is_carrying_obj_pid(self_obj, mech_armor_pid) == 1 ) then begin wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, mech_armor_pid)); display_msg("Bot set brain control"); end if (obj_is_carrying_obj_pid(self_obj, Android_armor_pid) == 1 ) then begin wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, Android_armor_pid)); display_msg("Bot set brain control"); end if obj_pid(tmp_armor)== mech_armor_pid then begin metarule3(107, self_obj, 16777282, 0); end if obj_pid(tmp_armor)== Android_armor_pid then begin metarule3(107, self_obj, 16777336, 0); end end end
|
Отправлено: 22:12 - 9 Фев., 2006 | ИСПРАВЛЕНО: Dar - 22:14 - 9 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Большое спасибо. Понял правдо в примере не все: procedure combat_p_proc begin присвоение перем. tmp_armor указателя одетой на чузе брони. variable tmp_armor:=critter_inven_obj(dude_obj, INVEN_TYPE_WORN); добавить событие по таймеру (носителю скрипта, задержка=1тик, инфо=2) add_timer_event(self_obj, 1, 2); Если ф_п=4 или 3 то if (fixed_param == 4) or (fixed_param == 3) then begin если количество мех_арморов в инвентаре носителя скрипта = 1 то if (obj_is_carrying_obj_pid(self_obj, mech_armor_pid) == 1 ) then begin Чюз экипируется в эту мех_арморину wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, mech_armor_pid)); написать: "Бот установил майнд контрол" - Это что арморина гипнознула чюза заставив его одется в нее  ? display_msg("Bot set brain control"; end если количество андроид_арморов в инвентаре владельца скрипта = 1 то if (obj_is_carrying_obj_pid(self_obj, Android_armor_pid) == 1 ) then begin То Чюз экипируется в эту арморину wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, Android_armor_pid)); написать: "Ктото влип?" display_msg("Bot set brain control"; end Если мех армор была изначально надета то If obj_pid(tmp_armor)== mech_armor_pid then begin metarule3(107, self_obj, 16777282, 0); meta3_switch = METARULE3_ART_SET_BASE_FID_NUM (107), владелец скрипта, FID=16777282, meta3_par = 0: изменить базовый номер FID (идентификатора фрейма) Изменить базовый идентификатор фрайма? хмм? Здесь не понял что делается? заменяется картинка у критера? end if obj_pid(tmp_armor)== Android_armor_pid then begin metarule3(107, self_obj, 16777336, 0); end end end В целом не уверен что понял весь скрипт. О том что тут делает metarule3 у меня только разные предположения. В части скрипта используется указатель dude_obj, а в части self_obj,. Это кусок для скрипта Obj_dude(Чуза)? Или любого другого критера? Если Чуза то понятно. Но зачем тогда указатель self_obj? Не уверен правильно ли понимаю как работает событие по таймеру. Насколько понимаю все что стоит в примере после add_timer_event это то что должно произойти через задержку в 1тик? Те каким то событием инициируется и стартует процедура combat_p_proc, сразу же запоминается указатель надетой на чюзе брони после чего идет задержка в 1тик, и только после этого выполняется все остальное? так?
|
Отправлено: 15:05 - 10 Фев., 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Цитата: В целом не уверен что понял весь скрипт. О том что тут делает metarule3 у меня только разные предположения. В части скрипта используется указатель dude_obj, а в части self_obj,. Это кусок для скрипта Obj_dude(Чуза)? Или любого другого критера?
1. У metalure есть несколько функций, по моему, но в данном случае она меняет ФИД - т.е. внешний вид, анимацию, называй как хочешь. 2. Тут я тебя не понял...Ты ж сам выше ответил. self_obj - это указатель на носителя скрипта dude_obj - указатель на чуза.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 23:11 - 10 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Да это скрипт дюда. self_obj было лень испаравлять - разницы то никакой для этого скрипта.
Цитата: "Бот установил майнд контрол" - Это что арморина гипнознула чюза заставив его одется в нее  ?
Мечта такая была у многих сделать новую расу сделать игрока мутантом и ли гулом например и еще многие хотели сделать базу со злыми роботами (2-е сюжетно у меня по другому - не суть важно короче.) из этого появилось а не сделать игрока Андроидом. И я поковырявшись в Mynah'х - скриптах мечвариора стал эксперементировать на предмет неснимаемой брони. Теперь она почти не снимается. :-/ Можешь заменить mech_armor_pid на пид обыкновенной брони, убить add_timer_event(self_obj, 1, 2); , исправить фиды на соответственные и загнать это в скрипт дюда и посмотреть что получится. >>Изменить базовый идентификатор фрайма? хмм? >>Здесь не понял что делается? заменяется картинка >>у критера? Так работает надевание брони на напарниках и на дюде если на текуший момент воспроизводится не нулевая анимация. Например игрок стоит и держит оружие в руках если его экипировать не изменяя фида то он так и будет с тем фидом который двиг определил пока его не заставищь(это не точно) чего нибудь сделать. >>добавить событие по таймеру (носителю скрипта, >>задержка=1тик, инфо=2) >>add_timer_event(self_obj, 1, 2); Это вызов procedure timed_event_p_proc параллельно. К идушим ниже в рамках сомбат проки fixed_param не относится. Мне нужно просто что бы дюд был всегда одет постоянно и снять с себя броню не мог поэтому у меня экиперовать и т.п. напихано почти вовсех процедурах (в которые это имело смысл засовывать).
Цитата: Не уверен правильно ли понимаю как работает событие по таймеру [и далее].
Начался бой - произошла усилием двига инициация сомбат проки после того как у тебя кончились актион поинты(правда кто нибудь может успеть походить еще это я еще не выяснил точно), выполнилась сомбат прока целиком Начала работать procedure timed_event_p_proc спустя один тик - меньше нельзя повиснет комп :-\ там тоже самое- т.е "экипировать". на втором и третьем и т.п ходах timed_event_p_proc уже будет работать на первом не факт. Выполнятся с сомбат прокой они будут обе. Если чего нибудь пропустил переспрашивай, но проше увидеть процедуру в действии.
|
Отправлено: 23:15 - 10 Фев., 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Цитата: И я поковырявшись в Mynah'х - скриптах мечвариора стал эксперементировать на предмет неснимаемой брони. Теперь она почти не снимается. :-/
Можно узнать что значит "Почти" ?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 23:19 - 10 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
binyan При перекладывании брони в инвентаре в окошке можно увидеть себя в костюме 13 волта. Это раз - но это фигня. В бою: Если не жаль актион поинтов то пока они есть можно броню убрать из слота брони в инвентарь, но нельзя выбросить. - это два и боюсь не изличимо. В бою броня одевается по окончании актион поинтов на втором и третьем ходу на первом видемо (чисто гипотетически) идет учет порядка хода критеров для combat_проки. - (здесь еще можно по идее побороться на желаемый результат.)
|
Отправлено: 23:44 - 10 Фев., 2006 | ИСПРАВЛЕНО: Dar - 14:52 - 11 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Dar спасибо большое, за разъяснения. А не подскажет кто-нибудь способ проверки какая инвентарная рука в данный момент активна? Или что за вещь экипирована в активной руке? ----------------------------------------------------------- близкая ситуация есть в Ф2 на входе в НКР. Там гвард как то смотрит наличие оружия в активной руке; просит убрать если оно присутствует. При этом если в неактивной руке оружие есть, это того гварда не волнует, его волнует только активная рука. А как это реализуется? Насколько понимаю такая вещь как #define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \ ((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) здесь не проканывает, ведь если я правильно понимаю critter_is_armed(x) проверяет обе руки, не различая какая из них активна? Пытаюсь разобраться со скриптом этого НКРовского гварда(scgtegrd.ssl), как он смотрит именно активную руку, но пока много дыр в знаниях скриптов, и многое не понятно.
|
Отправлено: 13:21 - 11 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Keha Согласно FAQ получить указатель на, неактиную руку нельзя, можно только на активную.
|
Отправлено: 14:48 - 11 Фев., 2006 | ИСПРАВЛЕНО: Dar - 14:54 - 11 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Упс, спасибо большое, проглазел этот момент.
|
Отправлено: 16:18 - 11 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Вроде как это не должно работать - а работает. procedure use_skill_on_p_proc begin script_overrides; if using_skill(self_obj, 7) or using_skill(self_obj, 6) or using_skill(self_obj, 10) then begin script_overrides; display_msg("This no can"; end //чтобы на критера можно было юзать науку или ремонт нужно ставить в про флаги steal, drop и какой либо третий. if (action_being_used == 13) and (obj_pid(self_obj) == 16777819) then call talk_p_proc; if (action_being_used == 12) and (obj_pid(self_obj) == 16777819) then float_msg(self_obj, "Hi", 4); if (action_being_used == 13) and (obj_pid(self_obj) == 16777817) then float_msg(self_obj, "My car is best", 4); end
|
Отправлено: 21:45 - 18 Фев., 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
И в чём же вопрос? Почему данный пример работает таки? Кстати, вот давно хотел спросить: есть ли в скриптах команды позволяющие прервать выполнение процедуры (continue, halt, etc.)?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 22:56 - 18 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
>>И в чём же вопрос? Почему данный пример работает таки? Ага - просто в доке было написано что using_skill(self_obj, 7) or using_skill(self_obj, 6) не работает(со скрипта подопытного кролика оно работает). И про pro-файлы нигде вроде не было упомянуто, как разрешить применение на критера того или иного скила (науки или ремонта). Моя про это скпрашивал раньше - как бы себе и ответил. И вопрос на засыпку, вот для чего может пригодится пид дюда со скриптовой точки зрения? Что с ним полезного можно сделать чего так нельзя?
|
Отправлено: 1:40 - 19 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Для чего все это мне надо описано в разделе Проэкты\повышение реалистичности. Чюзен проводит успешную атаку по критеру нанося дамаж. 1?) Мне нужно скриптово определить скил, по которому проходит оружие, которым Чюз дамажнул критера. Как просто реализовать определение скила нанесшего домаж оружия я не нашел, может проглазел, поэтому пишу как это я делаю через жо…. - чердак: procedure combat_p_proc begin variable wip; - перем. для указателя на предмет в активной руке. if (fixed_param == 2) then begin - если combat_p_proc вызвана успешным попаданием то wip:=critter_inven_obj(self_obj,1);- присваиваю переменной wip указатель на предмет в правой руке. if wip == 0 then begin - если wip все еще равна 0(правая рука оказалась неактивной) то wip:=critter_inven_obj(self_obj,2);стало быть активна левая рука и в wip записываем указатель на предмет из нее. end Далее определять скил (по которому проходит находящееся в ативной руке оружие) хотел выдергивая данные из прошника при помощи proto_data(obj_pid(wip),х); где х номер данных из прошника. ----------------------------------------------------------------- 2?) но поглядев на то что моржно выдернуть: #define it_pid (0) #define it_name (1) #define it_description (2) #define it_fid (3) #define it_light_distance (4) #define it_light_intensity (5) #define it_flags (6) #define it_flags_ext (7) #define it_sid (8) #define it_type (9) #define it_data (10) #define it_material (11) #define it_size (12) #define it_weight (13) #define it_cost (14) #define it_inv_fid (15) #define it_weapon_range (555) похоже по этим данным четкого определения скила не выйдет - так как это не все данные из прошника оружия, тут нет например данных о типе дамажа наносимого оружием, итп. ------------------------------------------------------------------ 3?) Да и например при выдергивании инфы из it_flags_ext при помощи proto_data(obj_pid(wip), 7); получается число с которым я не разобрался. О it_flags_ext описано в формате про файлов: Flags Ext (дополнительные флаги) Item Flags (флаги предметов): 0x08000000 – Hidden Item (предмет является «скрытым») Action Flags (флаги действий): 0x00001000 – Use On Smth (объект можно использовать на что-либо) 0x00002000 – Look (объект можно осмотреть) 0x00004000 – Talk (с объектом можно поговорить) 0x00008000 – PickUp (объект можно поднять) 0x00000800 – Use (объект можно использовать) Weapon Flags (флаги оружия): 0x00000100 – Big Gun (оружие относится к классу Big Guns) 0x00000200 – 2Hnd (оружие относится к классу двуручных) Primary Attack Type (тип основной атаки): 0x00000000 – stand 0x00000001 – throw punch 0x00000002 – kick leg 0x00000003 – swing anim 0x00000004 – thrust anim 0x00000005 – throw anim 0x00000006 – fire single 0x00000007 – fire burst 0x00000008 – fire continuous Secondary Attack Type (тип дополнительной атаки): 0x00000000 – stand 0x00000010 – throw punch 0x00000020 – kick leg 0x00000030 – swing anim 0x00000040 – thrust anim 0x00000050 – throw anim 0x00000060 – fire single 0x00000070 – fire burst 0x00000080 – fire continuous У меня proto_data(obj_pid(wip), 7) выдернуло число: 41478 Это число соответствовало самомоднутому стволу у которого я выставил Primary Attack Type = fire single, Secondary Attack Type отсутствовала. Как то можно расшифровать это 41478? чтоб понять где в нем Primary, Secondary Attack, Weapon Flags и прочее ? ----------------------------------------------------------------- В итоге решил пока тупо принудительно сопоставить каждому названию оружия скил по которому оно проходит через if но правда ifов многовато получится. Для определения скила в этом случае достаточно выдернуть из прошника название оружия при помощи proto_data(obj_pid(wip), 7) и далее, через ifовую сопаставительную (название - скил) таблицу получить скилл. --------------------------------------------------------------- 4?) Но тут возникают очередные проблы. например копьем можно колоть, а можно его метать. Что должно соответствовать разным скилам (метание и холодное оружие). Может кто знает скриптовые маневры которыми можно бы было выяснить какая текущая атьака (метание или укол в случае копья) включена на оружии? ---------------------------------------------------------------- 5?) Проблема определения скила при метании. - Еше один подводный камень на который наткнулся. При метании, оружия в руке не остается, и соответственно моя система определяет скил как рукопашку. Стало быть мне надо как то организовать запоминание указателя на оружие зарание еще до атаки, и чтоб указатель исправлялся при каждой смене оружия в руке, или изменении активной руки. А как это "при каждой смене" обстряпать пока не представляю.
|
Отправлено: 16:30 - 24 Фев., 2006 | ИСПРАВЛЕНО: Keha - 16:57 - 24 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
А что critter_p_proc (выполняется постоянно - несколько раз в секунду) в бою не выполняется? Чтоб что то переодично проверять в боевке (combat_p_proc) то только через timer_event ? add_timer_event(ObjectPtr obj, int time, int info) где time - задержка выполнения (в игровых тиках) Чему равен игровой тик? Хотяб приблизительно? Доли секунды, секунды, минуты?
|
Отправлено: 17:14 - 26 Фев., 2006
|
|
Strongholder
Прилипала MkII
Откуда: Nelly's Bar Регистрация: Май 2004
Всего: 393 сообщения
|
Строго AFAIR: 1) c_p_p в бою не выполняется. 2) Игровой тик = 10 мс. Т.е. 100 тиков = 1 с.
----- Живущий в стране эльфов. Несмотря ни на что.
|
Отправлено: 17:26 - 26 Фев., 2006
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
По-моему все-таки 1 тик=0,1 сек, 10 тиков = секунда.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 18:44 - 26 Фев., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата:
2) Игровой тик = 10 мс. Т.е. 100 тиков = 1 с.
Неверно. В секунде 10 тиков.
|
Отправлено: 18:45 - 26 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Спасибо большое. -------------------------------- Пытаюсь организовать в боевом режиме аналог critter_p_proc - чтоб можно было постоянно выполнять определенный блок команд, но вот толи сам корявый то ли: variable st; variable q; procedure combat_p_proc begin if st == 0 then begin st:=1; add_timer_event(self_obj,5,44); отсюда тайм ивент должен добавлятся только при старте боевки так как далее st будет равна 1 и сюда програма заходить не будет end end procedure timed_event_p_proc begin if (fixed_param == 44) then begin q:=q+1; эту и следующую строчку написал для проверки циклится тайм ивент в боевке или нет display_msg("n="+q); add_timer_event(self_obj,5,44); - зацикливание таймивента на себя через каждые 5 тиков *блок команд* как я пологал если сунуть сюда какие то команды то они во время боевки будут переодично выполнятся с установленым в add_timer_event(self_obj,периуд,44) периудом, но на практике выполняется только раз. end end procedure critter_p_proc begin rm_fixed_timer_event(self_obj,44); к_п_п включается как только боевка отключается и потому эту процедуру удобно использовать на остановку зацыкливания тайм ивента после прекращения боевки, заодно тут же нулим переменную st st:=0; end Почему у меня не циклится тайм ивент в боевке? Или тики это игровое а не машинное время, и во время турна они не тикают? А тикают только со сменой турна дискретно? А то у меня q меняется как раз с преходами турнов почемуто.
|
Отправлено: 19:11 - 26 Фев., 2006 | ИСПРАВЛЕНО: Keha - 21:45 - 26 Фев., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
В бою работает только combat_p_proc, емнип.
|
Отправлено: 10:35 - 27 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
void AddButtonProc(string btn_name, procedure button_on, procedure button_off, procedure button_press, procedure button_release) - связывает с кнопкой btn_name процедуры для обработки событий Аргументы: btn_name - имя кнопки, например, "test_btn" button_on, button_off, button_press, button_release - имена процедур для обработки наведения, убирания, нажатия и отпускания мыши Можно ли AddButtonProc прилепить к существующим фолаутовским кнопкам? Если можно, то очень интересует названия(btn_name) двух кнопок: 1) левая красная кнопка - изменяет активную руку. 2) кнопка "далее" в открытом инвентаре - которая закрывает окно инвентаря.
|
Отправлено: 15:49 - 27 Фев., 2006 | ИСПРАВЛЕНО: Keha - 15:53 - 27 Фев., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Нет.
|
Отправлено: 16:19 - 27 Фев., 2006
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
>>В бою работает только combat_p_proc, емнип. Фига:) Таймед евенты работаю тоже. Только странно как-то.
----- Scio me nihil scire
|
Отправлено: 22:01 - 27 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
>>Только странно как-то Дык, ход игрока неприкасаем, а остальное струкитурировано по fixed_param(которые для combat_p_proc ). вот они(timer_event) "структурированно" и работают.
|
Отправлено: 0:06 - 28 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Тайм ивент в кобмбате работает, проверено на приведенном мной скрипте, правда работает совсем не так, как хотелось бы. Как я понял игра начинает обрабатывать сколько тиков прошло только при нажатии перехода хода. Те тик - это именно игровое время, которое в мирной ситуации тикает непрерывно, а в бою тикает скачками(дискретно) только с нажатием перехода хода. Пока *некст турн* не нажат игровое время замирает и тики не тикают. Было бы уже неплохо, если бы число прошедших тиков было привязано в боевке к числу истраченных экшен пойнтов. Но к сожалению трата экшен пойнтов, на тиканье тиков не влияет, а только *некст турн*. Скорее всего каждый *некст турн* дискретно накидывает к игровому времени определенное число тиков. Чему равно это число в принципе можно попытаться выяснить экспериментально. А из за того что время в тиках меняется дискретно, например если оно меняется с *некст турном* скачком на 10 тиков, то соответственно несколько тайм ивентовых событий из моего скрипта остаются в пролете, и срабатывает только одно из них на каждый турн. Тайм ивент нормально сработает в боевке с часовым механизмом бомб, или каких то аналогичных бомбам ситуаций. Но вот для той задумки, которую я хотел реализовать он не пригоден.
|
Отправлено: 15:18 - 28 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Метод извлечения составных частей из полей прототипа объекта. Возможно кому-то понадобится. Если же данный метод не кому не нужен то пост можно удалить. Если мы хотим получить из прототипа объекта данные какого то определенного поля, то сталкиваемся с тем что proto_data возвращает эти данные в виде числа десятичного формата. А в описании формата файлов прототипов (Формат PRO-файлов Fallout2), поля представлены в виде чисел шестнадцатеричного формата. Причем одним полем - одним шестнадцатеричным числом зашифрованы сразу несколько данных(флагов). Вот способ как из полученного с помощью proto_data десятичного числа получить все эти шестнадцатеричные данные(флаги) по отдельности: dec:= proto_data(int pid, int data_member) flag1:=dec-(dec/16)*16; // последний знак шестнадцатеричного dec flag2:=dec/16-((dec/16)/16)*16; // предпоследний знак шестнадцатеричного dec flag3:=(dec/16)/16-(((dec/16)/16)/16)*16; //третий с конца знак flag4:=((dec/16)/16)/16-((((dec/16)/16)/16)/16)*16; //четвертый с конца знак итд по мат индукции. (Данные формулы работают корректно благодаря тому что в скриптах ssl операция / (деления) является целочисленной) Например мы имеем pid копья, и хотим получить из 7го поля про-файла копья, два флага типов атаки(см Формат PRO-файлов Fallout2): dec:= proto_data(pid копья, 7) flag1:=dec-(dec/16)*16; // Primary Attack Type flag2:=dec/16-((dec/16)/16)*16; // Secondary Attack Type В итоге flag1 станет равным 4ке, что, если сверится с хелпом Формат PRO-файлов, соответствует атаке thrust (колоть); flag2 станет равным 5ке соответствующей атаке throw(метание). Пример куска скрипта, на котором можно проверить работоспособность метода (вставлять в obj_dude_ssl): ----------------------------------------------------------------------- procedure Check_wip; procedure Check_wipon; procedure dec_to_hex; variable wip; // процедура critter_p_proc в obj_dude_ssl уже существует, вам останется вставить в нее //строку call Check_wipon; procedure critter_p_proc begin call Check_wipon; end procedure Check_wipon begin // проверка на изменение экипировки активной руки variable wip1; wip1:=wip; call Check_wip; if not(wip == wip1) then begin display_msg("you ekipirovalis "+proto_data(obj_pid(wip),1)); call dec_to_hex; end end procedure Check_wip begin // запоминание указателя на предмет в активной руке wip:=critter_inven_obj(self_obj,1); if wip == 0 then begin wip:=critter_inven_obj(self_obj,2); end end procedure dec_to_hex begin variable dec; variable at1; variable at2; dec:=proto_data(obj_pid(wip),7); at1:=dec-(dec/16)*16; // использование метода для флага первого типа атаки at2:=dec/16-((dec/16)/16)*16; //для флага второго типа атаки if at1 == 0 then begin display_msg("attack type1 = none"); end else if at1 == 1 then begin display_msg("attack type1 = punch"); end else if at1 == 2 then begin display_msg("attack type1 = kick leg"); end else if at1 == 3 then begin display_msg("attack type1 = swing"); end else if at1 == 4 then begin display_msg("attack type1 = thrust"); end else if at1 == 5 then begin display_msg("attack type1 = throw "); end else if at1 == 6 then begin display_msg("attack type1 = fire single"); end else if at1 == 7 then begin display_msg("attack type1 = fire burst"); end else if at1 == 8 then begin display_msg("attack type1 = fire continuous"); end if at2 == 0 then begin display_msg("attack type2 = none"); end else if at2 == 1 then begin display_msg("attack type2 = punch"); end else if at2 == 2 then begin display_msg("attack type2 = kick leg"); end else if at2 == 3 then begin display_msg("attack type2 = swing"); end else if at2 == 4 then begin display_msg("attack type2 = thrust"); end else if at2 == 5 then begin display_msg("attack type2 = throw "); end else if at2 == 6 then begin display_msg("attack type2 = fire single"); end else if at2 == 7 then begin display_msg("attack type2 = fire burst"); end else if at2 == 8 then begin display_msg("attack type2 = fire continuous"); end end ----------------------------------------------------------------------- Приведенный кусок скрипта в мирном режиме через critter_p_proc и вызываемую из нее Check_wipon постоянно проверяют активную руку на предмет изменения экипировки.( те либо на смену предмета в активной руке, либо на смену самой активной руки). В случае изменения экипировки активной руки приведенный кусок скрипта выводит три сообщения: *вы экипировались +(название предмета) *attack type1 = (тип первой атаки экипированного предмета) *attack type2 = (тип второй атаки экипированного предмета) Могу разъяснить подробней как получаются формулы для flag1, flag2, flag3,... , и все что будет непонятно.
|
Отправлено: 11:23 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 11:48 - 2 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Пардон, но это конкретное извращение . Посмотри в заголовках БИС как реализована побитовая запись/чтение. Вот тебе пример: // --- дефайны где-нить в h --- #define MAXINT 4294967295 //Max int #define INV(x) (MAXINT - x) //An inverse function // get bit state #define bit_state(x, the_bit) ((x bwand the_bit) != 0) // switch bit on #define set_bit_on(x, the_bit) x := x bwor the_bit // switch bit off #define set_bit_off(x, the_bit) x := x bwand INV(the_bit) #define FLAG_BIG_GUN 4 // --- конец дефайнов --- // --- где-нить в программе --- f_ext := proto_data(obj_pid(obj_ptr), it_flags_ext); f_big_gun := get_bit(f_ext, FLAG_BIG_GUN);
|
Отправлено: 13:05 - 2 Марта, 2006
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Keha: ...поля представлены в виде чисел шестнадцатеричного формата... Число в шестнадцатеричном предствалении всегда можно перевести в десятичное и наоборот. Primary Attack Type (тип основной атаки): 0x00000000 = 0 - stand 0x00000001 = 1 - throw punch 0x00000002 = 2 - kick leg 0x00000003 = 3 - swing anim 0x00000004 = 4 - thrust anim 0x00000005 = 5 - throw anim 0x00000006 = 6 - fire single 0x00000007 = 7 - fire burst 0x00000008 = 8 - fire continuous Secondary Attack Type (тип дополнительной атаки): 0x00000000 = 0 - stand 0x00000010 = 16 - throw punch 0x00000020 = 32 - kick leg 0x00000030 = 48 - swing anim 0x00000040 = 64 - thrust anim 0x00000050 = 80 - throw anim 0x00000060 = 96 - fire single 0x00000070 = 112 - fire burst 0x00000080 = 128 - fire continuous Потом с помощью bwand вырезать нужные группы битов и сравнить с указанными константами. Код будет работать в разы быстрее, т.к. операция деления самая медленная в выч. технике. flagExt:= proto_data(pid, 7) primaryAtackType := flagExt bwand 15; /* 15 = 0x0000000F */ secondaryAtackType := flagExt bwand 240; /* 240 = 0x000000F0 */
|
Отправлено: 13:17 - 2 Марта, 2006 | ИСПРАВЛЕНО: Anchorite - 16:49 - 2 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Цитата: Quote: from Wasteland Ghost Пардон, но это конкретное извращение .
Большое спасибо. Я просто тут у народа спрашивал как выдергивать нужный флаг при помощи proto_data. О существовании get_bit был не в курсе. Мне не кто не ответил, вот и решил изврашатся как получается .
Цитата: Quote: from Anchorite primaryAtackType := flagExt bwand 31; /* 31 = 0x0000000F */ secondaryAtackType := flagExt bwand 240; /* 240 = 0x000000F0 */
Сбасибо большое.
|
Отправлено: 13:37 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 13:45 - 2 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Keha Вообще говоря, советую бысто пробежаться глазами по БИСовым заголовкам. Там есть полезные готовые решения. get_bit, кстати, там нет. Есть gvar_bit, mvar_bit, lvar_bit и т.д.. А это уже моя переделка. Тем не менее, идея всё та же.
|
Отправлено: 13:49 - 2 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Протестил bwand заменив свой изврат at1:=dec-(dec/16)*16; at2:=dec/16-((dec/16)/16)*16; на at1:= dec bwand 31; /* 31 = 0x0000000F */ at2:= dec bwand 240; /* 240 = 0x000000F0 */ Но почему-то bwand не всегда работает, в отличие от моего изврата. У меня на карте где тестил скрипт лежало гаус ружье, метательный нож и копье. Так для ружья гаусса и bwand, и мое/16, дают правильные значения. А вот для случая копья и метательного ножа мое /16 работает, а bwand похоже вырезает, что то не то, по значению превышающее 8ку. Так как не то что неверных значений не выводится, а вообще никаких. ********************************* a2: вывести и для ножа и копья всетаки смог, ошибка была у меня. Забыл подправить ifы (a2 в случае bwand принимает значения не от 0 до 8 а уже от 0 до 128 А вот a1 по прежнему не выводится в них покакой то пречине для ножа и копья bwand заносит значения 20 и 21. А значение a1 не должно превышать 8. dec:=proto_data(obj_pid(wip),7); at1:= dec bwand 31; /* 31 = 0x0000000F */ at2:= dec bwand 240; /* 240 = 0x000000F0 */ //at1:= get_bit(dec, 0); //at2:= get_bit(dec, 1); //at1:=dec-(dec/16)*16; //at2:=dec/16-((dec/16)/16)*16; display_msg("at1 = "+at1); display_msg("at2 = "+at2);
|
Отправлено: 14:59 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 15:37 - 2 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Проверяй свою программу внимательнее . bwand не может "не работать" по определению .
|
Отправлено: 15:45 - 2 Марта, 2006
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Да лажанулся я. Вместо 31 должно быть 15. Лишний битик вырезал Посыпаю голову пеплом
|
Отправлено: 16:51 - 2 Марта, 2006 | ИСПРАВЛЕНО: Anchorite - 16:57 - 2 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Почему у меня LVAR не сейвятся в сейвах ? Все роботает хорошо, те лвара сохраняется при переходе с локации на локацию итп, но вот если записатся, и потом считаться то ее значение при загрузке игры теряется(обнуляется) . В scripts.lst число своих Лваров добавил - запись # local_vars=5 заменил на # local_vars=9. Запись чтение в лвару осуществляется только в приведенной процедуре: (obj_dude.int) //уже были: #define LVAR_Last_Digest_Time (0) #define DRTROY_INJECTION (1) #define CHECK_DUDE_V15ENT_LEVEL (2) #define CHECK_RNDBESS_FLOAT (3) #define TIMER_INIT_V13_SEQUENCE (4) // мои Лвары: #define LVAR_count_GUN (5) #define LVAR_count_UNARM (6) #define LVAR_count_MELE (7) #define LVAR_count_THROW (8) procedure Check_add_to_skill begin variable rand; variable skilev; variable N_ LVAR; variable skill_count; skilev:=has_skill(self_obj,skil1); if skil1 == 0 then begin// если (0) - легкие стволы то N_ LVAR:=5; //то номер Лвара 5 end else if skil1 >= 3 then begin N_ LVAR:=skil1+3; //номер лвара для остальных умений end rand:=random(0,180); display_msg("random = "+rand); // проверка для отладки if (rand >= skilev) then begin skill_count:=local_var(N_ LVAR); // ЧТЕНИЕ ИЗ ЛВАРЫ skill_count:=skill_count+1; if (skill_count >=(skilev+1)) then begin critter_mod_skill(self_obj,skil1,1); skill_count:=0; display_msg("+1 k skilu"+skil1); end set_local_var(N_ LVAR,skill_count); // ЗАПИСЬ В ЛВАРУ display_msg("kopilka skilla "+skil1+" ravna "+skill_count);// для отладки end end
|
Отправлено: 20:03 - 4 Марта, 2006 | ИСПРАВЛЕНО: Keha - 20:23 - 4 Марта, 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
В сэйве сохраняются только GVARы. Как ты думаешь, почему все квэсты завязаны именно них? И, кстати, заметная часть багов, оставшихся ещё от разработчиков как раз в том и заключается, что про этот факт банально забыли.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 13:01 - 7 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Алхимик, не сей панику . ЛВАР и МВАР сохраняются в мапах, т.е. в сейвах. Другое дело, что надо данный конкретный скрипт смотреть, ибо запись в ЛВАРы тут какая-то замудрённая . ЗЫ Надеюсь, никто не путает LVAR (скриптовые переменные) и variable (локальные переменные)?
|
Отправлено: 14:48 - 7 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Да я уже пересадил свою задумку на Гвары. Но гваров число ограниченное, и из соображения экономии приходится совать в одну гварину сразу несколько переменных. Во всех же доках что я читал написано что Lвары в сейвах сохраняются. А у меня те что из obj_dude.int сохранятся не хотят. Возможно причина именно в существовании некой привязки Lvara к "дому" - карте. И в итоге возможно для "бродячего бездомного" - не привязанного к конкретной карте скрипта obj_dude.int, Lvarы не сейвятся.
Цитата: Quote: from Wasteland Ghost Другое дело, что надо данный конкретный скрипт смотреть, ибо запись в ЛВАРы тут какая-то замудрённая .
Можь и мудреная , но с Гварами работает. Что там мудреного то ? Получение номера LVARа - N_ LVAR ? Все работает нормально: в приведенную процедуру приходит переменная skil1, которая может иметь значения 0, 3,4 и 5(номера скилов легкие стволы, безоружный бой, холодное и метиание). То что приходили именно эти значения проверял через display_msg("номер скила "+skil1); при любом из приведенных значений N_ LVAR принимает один из номероов: если skil1=0 то N_ LVAR=5 если skil1=3 то N_ LVAR=6 если skil1=4 то N_ LVAR=7 если skil1=5 то N_ LVAR=8 где: #define LVAR_count_GUN (5) #define LVAR_count_UNARM (6) #define LVAR_count_MELE (7) #define LVAR_count_THROW (8) запись чтение : skill_count:=local_var(N_ LVAR); // ЧТЕНИЕ ИЗ ЛВАРЫ set_local_var(N_ LVAR,skill_count); // ЗАПИСЬ В ЛВАРУ кроме того повторю что на гваразх тот же алгоритм работает те сейвится. ---------------------------------- Шас полезу проверю сейвятся ли у меня Lvars для "одомашненных" скриптов.
|
Отправлено: 15:04 - 7 Марта, 2006 | ИСПРАВЛЕНО: Keha - 15:34 - 7 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Просто ЛВАР у тебя девять, номер вычисляется как скилл + 3, а скиллов вообще-то 17 . В общем, тебе твои куски понятны, другим - не всегда, потому что они не весь скрипт видят . ЗЫ Только не восприми мои слова, как намёк на то, что впредь надо постить весь скрипт .
|
Отправлено: 18:45 - 7 Марта, 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
И вообще, кто тебе сказал, что:
Цитата:
Но гваров число ограниченное
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 0:10 - 8 Марта, 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
2WG:
Цитата: Надеюсь, никто не путает LVAR (скриптовые переменные) и variable (локальные переменные)
Пардон. Углядев конструкцию "variable N_ LVAR", именно так и перепутал. :/
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 6:27 - 8 Марта, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Цитата: Quote: from Ray И вообще, кто тебе сказал, что гваров число ограниченно
Дык где-то в хелпах вычитал. Помоему ограничение там связывали с прошивкой в движке. Т.е. есть офсетики в ехе.шнике где количество Гваров добавить можно?
Цитата: Углядев конструкцию "variable N_ LVAR", именно так и перепутал.
Это у меня переменная для номера Лваров, но не сами Лвары. ---------------------------------------------------------------- Кстати протестил работу Лвара в диалоге на привязанный к критиру на карте скрипте. Скрипт был аналогичен тому что приведен в FScript-HOWTO для освоения работы с Лварами. И чето оно у меня тоже глючит. Все-таки сейвится, но как правило со второго сейф/лоада. После первого сейф/лоада Лвара как правило не запоминается почему-то. Надо попробовать приведенный в FScript-HOWTO скрипт с Лварой 1 в 1 протестить. Мож все-таки я криворукий.
|
Отправлено: 19:05 - 8 Марта, 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Насчет Гвар...Я тоже думал почему то что кол-во гвар ограниченное. НО это было полгода назад. Потом посмотрел ещё раз хелп. Кол-во СВОБОДНЫХ гвар ограниченно, но добавлять новые гвары никто не запрещал по моему =)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:46 - 8 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Новые ГВАР добавлять можно. Открываешь VAULT13.GAM и добавляешь. А вот вопрос сохраняются ли ЛВАР для obj_dude на самом деле интересен. Я так понимаю, что не сохраняются. Или сохраняются всё-таки? Кто может проверить и сказать железно? Анхорит, данные дуда в мапах не сохраняются? Или сохраняются?
|
Отправлено: 8:42 - 9 Марта, 2006
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Не могу сказать с опредленностью. Мне вообще интересно есть ли в сейвленных мапах описатели для скриптов групп 0 (s_system) и 2 (s_timed). Если есть - тогда возможно и сохраняются.
|
Отправлено: 11:36 - 9 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Хмм... Я в сейвах, вообще-то, не разбиралась... Если мне не изменяет мой склероз, карты сохраняются в sav-файлах. Стало быть, надо сохраниться где-нить, например, в Храме и посмотреть соответствующий sav...
|
Отправлено: 13:53 - 9 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
Люди, помогите! Как сделать так, чтобы при выборе какого-нибудь варианта ответа в диалоге, человек атаковал бы Чузена. Смотрел в разных скриптах - там через ЛВАРы прописано все, да и как-то по-странному - в варианте ответа прописывается ЛВАРа = 2, а потом в critter_p_proc проверяется и если эта ЛВАРа = 2, то человек атакует Чуза. Пробовал писать так же, но ничего не выходит. Скажите, пожалуйста, и если возможно, покажите на примере, как можно реализовать атаку при выборе варианта ответа.
----- Вскрытие показало - больной спал.
|
Отправлено: 21:43 - 16 Марта, 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
ИМХО ничто не мешает в выбранной опции диалога сразу напасть на чузена. Т.е. у тебя есть допустим опция которая вызывает процедуру Nodexxx, внутри процедуры зовешь процедуру аттак. Бисовцы для этого использовали процедуру Node998. Для чего сделаны лвары? Я думаю для того чтобы если ты выйдешь из диалога с помощью 0, на тебя всё равно нападали.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:27 - 16 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
1.Вот именно. В этом Ноде (998) прописана лвара. Если я вызываю процедуру Node998, а в ней прописан один только attack_complex, то экран виснет в режиме диалога (пустом) и никто никого не атакует! 2. Почему тогда ничего не пашет с лварами??? Вариант ответа в диалоге выбираю, диалог закрывается, и ничего не происходит! Все стоят как и стояли!
----- Вскрытие показало - больной спал.
|
Отправлено: 0:25 - 17 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Подвесь атаку на таймер с задержкой 0. Таймерные события чем хороши - сработают гарантированно и нейтрально.
----- hit me, nail me, make me god
|
Отправлено: 0:44 - 17 Марта, 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
2 ERA Если ты говоришь, что сделал всё точно так же, а всё равно не работает, знаит, что-то ты пропустил. Node998 нужна для установки лвары в боевое положение и корректного выхода из диалога. Если вызывать драку из диалога, естественно, ничего не получится. Attac ружно вызывать из critter_p_proc. Вообще, переменную LVAR_Hostileм ожно изменить в любой ноде, но она сработает только по завершению диалога. Если ты проверяешь работоспособность скрипта в мэппере - это не самый лучший вариант. Там многие функции не работают. Проверять нужно непостедственно в игре. Модифицируй скрипт Клинта, того самого "племенного пацана", стояцего у храма. P.S. Эта тема уже где-то досконально разбиралась. Посмотри фак по модификации фола.
|
Отправлено: 8:01 - 17 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
2 Sokil Проверяю скрипты я в игре. Все факи пересмотрел - ничего не нашел. З.Ы. Попробую вместо нового скрипта переписать скрипт Клинта. 2 Alan Killenger Ты поподробнее рассказал бы, а то я новичок в скриптинге.
----- Вскрытие показало - больной спал.
|
Отправлено: 17:55 - 17 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата:
#define FIXED_ATTACK /* какое-нибудь значение */ ... /* там, где нужно вызвать атаку */ add_timer_event(self_obj, 0, FIXED_ATTACK); ... procedure timed_event_p_proc begin if (fixed_param == FIXED_ATTACK) then begin attack_setup(self_obj, /* кого атакуем */); end end
Событие по таймеру выполнится сразу же после того, как игрок выйдет из режима диалога. Не надо такие километровые буквы . WG
----- hit me, nail me, make me god
|
Отправлено: 18:11 - 17 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
2 Sokil Что-то какая-то фигня - у меня даже скрипт Клинта не компилится! Пробовал модифицировать его скрипт - тоже не компилится. 2 Alan Killenger Значение-то какое ставить??? add_timer_event ставить в Ноде? Пасибки!
----- Вскрытие показало - больной спал.
|
Отправлено: 19:10 - 17 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
FIXED_ATTACK поставь любое значение, к примеру 1. Это нужно сугубо для того, вдруг ты еще что-нибудь захочешь на таймер подвесить. add_timer_event - добавить событие по таймеру. Ставь инструкцию где угодно, хоть в диалоговой процедуре.
----- hit me, nail me, make me god
|
Отправлено: 19:29 - 17 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
1. Спасибо за таймер - все получилось! 2. Я дал криттеру алиен бластер, положил его ему в руку (БИС маппер), почему когда он на меня нападает - он меня гасит руками? 3. Может, не в тему, но почему после нескольких запусков Fallout 2 или после перезагрузки компа (редко), Fallout наотрез отказывается запускаться - пишет Fallout2 не является приложением win32. Приходится каждый раз переустанавливать экзэшник. (так случается со многими играми и не только у меня). P.S. Сорри за офтоп. 4! Почему если я не объявляю процедуры (не НОДЫ) то все хорошо компилится и работает, а если объявляю - не компилится?
----- Вскрытие показало - больной спал.
|
Отправлено: 20:06 - 17 Марта, 2006 | ИСПРАВЛЕНО: ERA - 20:40 - 17 Марта, 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
3. Элементарно, Ватсон. Лечись от вирусов и троянов. Если текущий антивирус ничего не находит - меняй его на другой.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 20:19 - 17 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
2 Alchemist Да не может быть - я систему несколько раз ЗАНОВО переустанавливал - каждый раз такая фигня! (Добавление от 20:46 - 17 Марта, 2006.) 2 Alan Killenger Ответь пожалуйста на мое сообщение на странице 52 (В конце).
----- Вскрытие показало - больной спал.
|
Отправлено: 20:43 - 17 Марта, 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Вот такая проблема: procedure add_weapon_options(variable num) begin variable option_proc; option_proc:= "WeaponOption"+num+"Selected"; gsay_option(-1, obj_name(self_item(weapons_pid_array(i))), option_proc , 49); в скрипте есть пять процедур WeaponOptionXSelected (Где Х – 1,2,3,4,5) и процедура, в которой вызывается add_weapon_options(Х) пять раз.(С различными значениями Х) Судя по результатам далога ( диалог заканчивается при клике на опцию вызывающую "WeaponOption"+num+"Selected", процедура не вызывается. НО, если вместо gsay_option(-1, obj_name(self_item(weapons_pid_array(i))), option_proc , 49); Написать конструкцию if else типа: if num==1 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption1Selected, 49); else if num==2 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption2Selected, 49); else if num==3 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption3Selected, 49); else if num==4 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption4Selected, 49); else if num==5 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption5Selected, 49); То все прекрасно вызывается и работает… Ваши соображения? Я думаю потому что WeaponOptionXSelected - это процедура, а option_proc параметр. Но всё же...Может в gsay_option нужно имя процедуры, а не сама процедура? Эхх...если окажется что я прав, я который раз разочаруюсь в скриптах Фола =)
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 20:51 - 17 Марта, 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Цитата:
Что-то какая-то фигня - у меня даже скрипт Клинта не компилится! Пробовал модифицировать его скрипт - тоже не компилится.
А в какой директории у тебя измененный скрипт Клинта находится? Он просто может не находить заголовочные файлы (command.h и тому подобное) Вообще - реализация такой штуки через timed_event эио излишнее усложнение. Оно и без того нормально работает. Чего-то ты упускаешь.
Цитата:
Я дал криттеру алиен бластер, положил его ему в руку (БИС маппер), почему когда он на меня нападает - он меня гасит руками?
Всё зависит от прототипа криттера. Насколько хорошо он владеет ием или иным видом оружия. Чтобы он стрелял из бластера, нужно искать криттера с хорошим показателем "энергетическое оружие". Параметры криттера просматриваются в мэппере. Edit -> Advanced. Кстати, интересный момент. Если дать дикарю винтовку или наркоману - пистолет, то они просто исчезают, так как в фоле нет соответствующих картинок.
|
Отправлено: 20:57 - 17 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
2 Sokil Спасибо за подсказку. С таймером все хорошо работает. Насчет скрипта Клинта - он у меня вместе с мапером шел, компилю правильно, как и свой скрипт. Просто у меня, если я не объявляю процедуры все компилится, а если объявляю - нет. Не знаешь, что за фигня? Криттер у меня техник. Проблему я так решил - я дал ему в ОБЕ руки по алиен бластеру и все! З.Ы. Не знаешь, как сделать так, чтобы этот техник убивал меня с первого удара, причем на тысяч 5 коцал бы. Пробовал через Атак_комплекс - все хорошо - убивается с первого удара на 5745 жизней, НО! криттер меня коцает (алиен бластером), жизни снимаются, и когда становится 000 жизней - только тогда Чузен падает и кровь растекается. При обычной атаке идет анимация убивания энергетическим оружием (скелет сгорает), а при атак_комплекс никакой анимации нет - 000 жизней и чуз просто оказывается на полу.
----- Вскрытие показало - больной спал.
|
Отправлено: 21:52 - 17 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата:
Я дал криттеру алиен бластер, положил его ему в руку (БИС маппер), почему когда он на меня нападает - он меня гасит руками?
1. У криттера должен быть нужный пакет frm'ок? 2. У криттера должны быть соответствующим образом развиты скиллы (умения) в совокупе с правильно подобраным AI пакетом. 3. Есть активная рука, а есть не активная. Ложить оружие именно в активную руку, иначе неизвестно потом будет ли криттер им пользоваться. Какая активная, а какая - нет проверь сам методом тыка.
Цитата:
Может, не в тему, но почему после нескольких запусков Fallout 2 или после перезагрузки компа (редко), Fallout наотрез отказывается запускаться - пишет Fallout2 не является приложением win32. Приходится каждый раз переустанавливать экзэшник. (так случается со многими играми и не только у меня).
Было у меня такое, правильно Sokil сказал, вирусняк.
Цитата:
Почему если я не объявляю процедуры (не НОДЫ) то все хорошо компилится и работает, а если объявляю - не компилится?
Бес понятия. А какое именно сообщение выдает компилятор? Мы ведь здесь не ясновидящие. Где кусочек кода, чтобы мы могли посмотреть правильность написания?
Цитата:
Не знаешь, как сделать так, чтобы этот техник убивал меня с первого удара, причем на тысяч 5 коцал бы. Пробовал через Атак_комплекс - все хорошо - убивается с первого удара на 5745 жизней, НО! криттер меня коцает (алиен бластером), жизни снимаются, и когда становится 000 жизней - только тогда Чузен падает и кровь растекается. При обычной атаке идет анимация убивания энергетическим оружием (скелет сгорает), а при атак_комплекс никакой анимации нет - 000 жизней и чуз просто оказывается на полу.
Тут я не помошник, т.к. сам этого никогда не делал. Наврядли тебе вот так ответят, кстати. Эксперементируй сам. Дока по функциям от BIS тебе в руки и фантазия в помощь. Попробуй просто проиграть анимацию испепеления чузена. Попробуй поработать с damage_p_proc, экспериментируй одним словом. Да, и попробуй найти и посмотреть скрипт "случайной встречи в пустыне" чузена с Френком Хорриганом и скрипт "хранителя моста".
----- hit me, nail me, make me god
|
Отправлено: 13:01 - 18 Марта, 2006 | ИСПРАВЛЕНО: Alan Killenger - 14:07 - 18 Марта, 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Собственно, Alan Killenger на все вопросы ответил, но я немножко добавлю. По поводу того, что не компиллируются скрипты с новыми нодами. Попробуй взять оригинальный не измененный скрипт (того же Клинта) и компильни его. Если не скомпиллится, значит как-то криво мэппер встал. И потом, компиллятор выдает ошибки - смотри, на какую строку он указывает, и смотри, что там не так. Закомментируй эту строку (тут главное логику сильно не нарушать) и снова компильни. Если ошибка обнаружится в следующей строке, знаит, реально она где-то выше. Может, в объявлении процедур изначально что-то напутано. Вообще, я пользуюсь оболочкой Fallout Script Editor и другим советую А по поводу чудовищного дэмэжда тоже ничего посоветовать не могу. Такого рода эксерименты над Чузом не проводил. Мне он живой нужен был
|
Отправлено: 14:05 - 18 Марта, 2006
|
|
ERA
Пользователь
Откуда: Россия, Краснодар Регистрация: Март 2006
Всего: 8 сообщений
|
Спасибо, Sokil и Alan Killenger, вроде бы все сделал в первом скрипте. Работает. Я компилю с echo off в батнике, поэтому ошибок не выдает, а просто не компилит. Кстати спасибо, что напомнил - echo я включу. З.Ы.
Цитата:
Бес понятия. А какое именно сообщение выдает компилятор? Мы ведь здесь не ясновидящие. Где кусочек кода, чтобы мы могли посмотреть правильность написания?
А вдруг ясновидящие???
----- Вскрытие показало - больной спал.
|
Отправлено: 14:40 - 18 Марта, 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Цитата: 3. Есть активная рука, а есть не активная. Ложить оружие именно в активную руку, иначе неизвестно потом будет ли криттер им пользоваться. Какая активная, а какая - нет проверь сам методом тыка.
Активная правая, сегодня проверял =)) П.С. И надеюсь что вы мой прошлый пост тут не пропустили? Интересно мнения узнать.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:29 - 18 Марта, 2006 | ИСПРАВЛЕНО: binyan - 21:31 - 18 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Мое личное мнение: да [censored] его знает... странно, что ты разочаровался в этих скриптах, на них и надеятся бы не стоило . Не хулигань. WG
----- hit me, nail me, make me god
|
Отправлено: 0:49 - 19 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Такой вот вопрос... Создаю криттера из скрипта карты. Криттер ходит разговаривает, все делает как надо... Одна только проблема - он не плотный, т.е. сквозь него можно ходить (хотя сам он ходить сквозь стены не может). Когда я создавал его не динамически, а правил карту - все было нормально. Может кто знает как сделать динамически созданного плотного криттера?
----- hit me, nail me, make me god
|
Отправлено: 1:14 - 20 Марта, 2006
|
|
Strongholder
Прилипала MkII
Откуда: Nelly's Bar Регистрация: Май 2004
Всего: 393 сообщения
|
Заранее поставь его на карте, сделай невидимым, а когда нужно чтоб он появился - сделай видимым.
----- Живущий в стране эльфов. Несмотря ни на что.
|
Отправлено: 1:26 - 20 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Неприемлимо.
----- hit me, nail me, make me god
|
Отправлено: 1:33 - 20 Марта, 2006
|
|
Strongholder
Прилипала MkII
Откуда: Nelly's Bar Регистрация: Май 2004
Всего: 393 сообщения
|
Хм. Почему? Скрипт у него ЕМНИП, если он невидим, блокируется. Атаковать он никого не будет, равно как и других гадостей делать. Проходить через него можно будет. И вообще, по сути он ничем никому мешать не должен. Или, скажем, сделать его за пределами карты, затыкать вокруг блокерами, а когда нужно - переместить куда нужно... Всё. Запас идиотских мыслей иссяк.
----- Живущий в стране эльфов. Несмотря ни на что.
|
Отправлено: 1:57 - 20 Марта, 2006 | ИСПРАВЛЕНО: Strongholder - 1:58 - 20 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Пршник проверяй . Первый раз слышу, что Призраки появляются скриптово .
|
Отправлено: 8:37 - 20 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Проверил, вместо create_object_sid(MY_PID, 0, 0, MY_SID) вызвал create_object_sid(MY_PID-10, 0, 0, MY_SID). Был создан кибердог, сквозь которого можно было свободно бегать. Так что... прикольно.
----- hit me, nail me, make me god
|
Отправлено: 21:11 - 21 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Глюки. Честное слово. Конкретные. Давай подробно: что за Фол, не маппером ли тестишь, что за прошники, что за скрипт...
|
Отправлено: 15:24 - 22 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Фол как Фол, 1.02d, поверх которого идут мои навороты. Тест идет именно в игре. Прошник любой. В скрипте карты, в map_enter_p_proc пихаю
Цитата:
if (global_var(MY_GVAR) == 0) then begin set_global_var(MY_GVAR, 1); create_object_sid(MY_PID, 0, 0, MY_SID); end
Причем от PID'а ничего не зависит. Создавал так брамина без скрипта - все нормально. Ладно, ушел еще раз проверять скрипт.
----- hit me, nail me, make me god
|
Отправлено: 16:12 - 22 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Как сделать безтелесного криттера:
Цитата: procedure start; procedure map_enter_p_proc; procedure start begin end procedure map_enter_p_proc begin set_obj_visibility(self_obj, 1); critter_attempt_placement(self_obj, tile_num(self_obj), elevation(self_obj)); set_obj_visibility(self_obj, 0); end
А вот так он будет телесным:
Цитата: procedure start; procedure map_enter_p_proc; procedure start begin end procedure map_enter_p_proc begin set_obj_visibility(self_obj, 0); critter_attempt_placement(self_obj, tile_num(self_obj), elevation(self_obj)); set_obj_visibility(self_obj, 0); end
Зря я грешил на create_object_sid. P.S. Безтелесный криттер ничем не отличается от телесного кроме того, что сквозь него можно ходить. Безтелесный криттер будет стараться обходить препятствия, в том числе других телесных криттеров. С ним можно общаться, разглядывать его, красть у него и даже драться с ним. Никаких багов в скрипте (нехилом скрипте) безтелесного криттера мною не наблюдалось.
----- hit me, nail me, make me god
|
Отправлено: 1:28 - 23 Марта, 2006 | ИСПРАВЛЕНО: Alan Killenger - 2:36 - 23 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А зачем тебе вообще играться с set_obj_visibility, если ты криттера создаёшь, а не прячешь/показываешь, как советовал Strongholder?
|
Отправлено: 9:25 - 23 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Затем, что при скритовом создании я меняю только скрипт карты. А так - и скрипт и саму карту.
----- hit me, nail me, make me god
|
Отправлено: 11:02 - 23 Марта, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Это-то я понимаю . Но всё равно не понимаю, зачем тебе невидимость нужна. Из мап_энтер всё и так нормально делается, т.к. картинка потом обновляется. А вообще... Блин, долго же до меня доходило, что такое "плотный криттер" . Вообще-то испокон веков под "плотными" объектами понимали объекты с флагом "TransNone" в прошнике . То, о чём говорит Alan Killenger, это не "неплотность", это отсутствие блокиратора под криттером, т.е. фактически флаг "NoBlock". Если мы делаем криттера невидимым, то блокиратор под ним автоматически убирается, чтобы через невидимого криттера можно было ходить. Далее действительно баг: если мы сначала перемещаем криттера, а затем делаем его видимым, то блокиратор под ним так и не появляется. Если же сначала сделать криттера видимым, а потом переместить куда надо, всё будет нормально. ЗЫ Попробуйте в Ф1 не выходя с карты рейдеров "встать на" Танди после её освобождения. Глюк-с .
|
Отправлено: 13:15 - 23 Марта, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: Это-то я понимаю . Но всё равно не понимаю, зачем тебе невидимость нужна. Из мап_энтер всё и так нормально делается, т.к. картинка потом обновляется.
А кто сказал, что мой криттер будет целый день торчать на одной карте? Вот именно для того мне невидимость и нужна, в том числе.
----- hit me, nail me, make me god
|
Отправлено: 18:26 - 23 Марта, 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
И я опять со своими ФИДами =) Как известно, имея указатель на криттера, мы можем получить всю информацию о нем. НО как имея только ПИД, мы можем получить ФИД? Поидее нужно с помощью ПИДа получить указатель, и с помощью указателя получить ФИД. Но отсюда возникает вопрос - как получить указатель с помощью ПИДа? Может меня конечно сильно проглючило, и существует обычная функция для этого, но ИМХО нет. Так может попытаться сделать это с помощью creat_obj? Создаём криттера с определённым ПИДом, и...А на него то как указатель получить?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 21:55 - 11 Апр., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Доки читать надо . int (string) proto_data(int pid, int data_member) - возвращает значение данных из прототипа объекта Аргументы: pid - идентификатор прототипа объекта (см. CRITRPID.H - PID криттеров, ITEMPID.H - PID предметов, SCENEPID.H - PID элементов пейзажа) data_member - номер данных (см. Приложение) Возвращаемое значение: значение указанного поля из файла прототипа FID под номером 3 .
|
Отправлено: 7:15 - 12 Апр., 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
Не мог бы кто привести пример, как пошагово сделать так, чтобы при попадании чузена на (к примеру нарисованную) карту один из выбранных критеров начал двигаться к определенной координате. Меня интересует содержание скрипта, а так же поправки в вспомогательных файлах. Заранее спасибо.
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 11:07 - 19 Апр., 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Посмотри скрипт того чувачка, которвй на выходе из Храма испытаний предлагает Чузу подраться. Очень интересный скрипт. Ответ на твой вопрос в нем содержится. Название скрипта не помню, чтобы узнать, открой в мэппере соответствующую карту и опцию "Show all scripts" - ту, что в верхнем меню. Для приличного совоения скриптового языка и его хитростей достаточно проштужировать всего 4 скрипта: наркомана из Дэна, Лару оттуда же, Мецгера и этого... вожака бандитов, охраняющих наркотики в церкви. Ну и торговца какого-нибудь. Например, Тубби.
|
Отправлено: 17:39 - 19 Апр., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: как пошагово сделать так
Что значит пошагово? В боевом режиме? Если "да", то никак - во время боя криттерами управлять почти невозможно, их действия определяются сугубо их статистикой и пакетом AI. Если "нет", т.е. в обычном режиме, то в скрипте "выбранного критера" пишем
Код:
procedure critter_p_proc begin if tile_distance(tile_num(obj_tile(dude_obj)), /* номер вашего тайла */) < /* расстояние до вашего тайла */ then begin animate_move_obj_to_tile(self_obj, /* куда идти */, /* скорость */); end end
----- hit me, nail me, make me god
|
Отправлено: 17:42 - 19 Апр., 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
Круто, скрипт пашет. Но у меня появилась опять проблемка. Я в мапере создал карту, при входе чузена на которую в диалоговом появляется :"Вы стоите перед великим мостом и т. д. ..." . Че за фигня. У меня к карте привязан конкретный скрипт. который должен выдавать свою подпись к карте, что он собственно и делает, но после него следует фактически сразу вот это вот:"Вы стоите перед великим мостом и т. д. ..." . Функция script_overrides не помогает.
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 15:15 - 22 Апр., 2006
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
Что не так? Когда if (party_member_obj(obj_pid(your_slave)) != 0) не выполняется все нормально, а когда выполняется игра входут в ступор, т.е. менюшка диалога остаеттся без текска и навсегда
Код:
if (party_member_obj(obj_pid(your_slave)) != 0) then begin if (((global_var(719) bwand 1) != 0) == 1) then begin set_local_var(8, (2 * random(100, 150) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15))))); if (get_critter_stat(your_slave, 34) == 0) then begin gsay_reply(121, message_str(121, 271) + local_var(8) + message_str(121, 270)); end else begin gsay_reply(121, message_str(121, 272) + local_var(8) + message_str(121, 270)); end end else begin set_local_var(8, (2 * random(50, 100) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15))))); if (get_critter_stat(your_slave, 34) == 0) then begin gsay_reply(121, message_str(121, 273) + local_var(8) + message_str(121, 270)); end else begin gsay_reply(121, message_str(121, 274) + local_var(8) + message_str(121, 270)); end end end else begin ... прододжение диалога
|
Отправлено: 22:34 - 23 Апр., 2006
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
Скорее всего переменная "your_slave" не успела объявиться как экспортируемая, так как я это делал в скрипте Дюда, а не в скрипте карты. Это проявляется в маппере, если загрузить карту с подобным скриптом и сразу ничего не делая начать диалог. Но если открыть дверь, или юзнуть умение, то всё ок. В игре этого не видно. Если всё-таки виснет в игре, значит где-то есть импорт, но нет экспорта.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 0:14 - 24 Апр., 2006
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
Спс, похоже нашел косяк, экспорт был из скрипта чуза, и в скрипте раба был импорт, значение переменно присваивалось в скрипте раба, тогда вобше не понятно зачем в скрипте чюза экспорт и как эта вся хрень работала с другим NPC если там где присваивается значение импорт ;] Ша потестю... (Добавление от 1:12 - 24 Апр., 2006.) Мдя... Терь вобше скрипт раба похоже не пашет... буду думать ;] (Добавление от 1:54 - 24 Апр., 2006.) Все, вкурил ) Тупанул я походу ) Почитал про Import\export в FAQ, у меня в скрипте карты нет экспорта... Ша потестю ;] Тока так я и не понял зачем экспорт в скрипте чуза... (Добавление от 2:15 - 24 Апр., 2006.) Экспорт в карте на которой непись не помог...
|
Отправлено: 1:07 - 24 Апр., 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
Я сделал следующее: убил старую карту нарисовал похожую(назвал тем же именем), прикрепил к ней тот же самый скрипт и все работает, в смысле сообщение про великий мост уже не появлятся. Возмно ли это по тому, что по умолчанию с каким-то предметом вылазеет етот текст, т. е. текст привязан к каому-то объекту, к примеру при наведении курсора на одного, из критеров(без скрипта) вылазеет сообщение:"Мастер-купец".
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 7:38 - 24 Апр., 2006
|
|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
to Volk >> Тока так я и не понял зачем экспорт в скрипте чуза Чтобы не делать экспорт во всех картах фола. Так как скрипт чуза присутствует всегда, в него и запихнут экспорт. >> Экспорт в карте на которой непись не помог Экспорт один, импортов несколько. Если экспорт в карте, убери его из Дюда. Где глючит - в маппере или в игре ? to Alexer >> к примеру при наведении курсора на одного, из критеров(без скрипта) вылазеет сообщение:"Мастер-купец" Если криттер незаскриптован, то надписи вылазят из данных его прототипа (pro файл). Надпись про мост должна быть, если конечно тот скрипт присоединил (ArBridge.ssl).
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 13:50 - 24 Апр., 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
У меня еще такой вопрос: в описаниях функций упоминается указание на объект (who, what и т. д.) к примеру (цитата из документа Функции компилятора скриптов Fallout 2 от BIS (четвёртая редакция)): int destroy_object(ObjectPtr obj) - уничтожает объект Аргументы: obj - указатель на объект Возвращаемое значение: число реально уничтоженных экземпляров (?) boolean obj_is_locked(ObjectPtr what) - проверяет, заперт ли данный объект Аргументы: what - указатель на объект Возвращаемое значение: TRUE - если объект заперт FALSE - если объект не заперт или объект вообще нельзя запереть... А на кого вообще можно указать. Я почему-то документацию по этой теме не нашел.
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 12:36 - 25 Апр., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Указать можно на любой объект, на который можно подвесить скрипт. Кажется. Как минимум, это все объекты с прошниками из категории Items и Critters. Если это действительно так, то остальное можешь проверить сам в маппере .
----- hit me, nail me, make me god
|
Отправлено: 13:42 - 25 Апр., 2006 | ИСПРАВЛЕНО: Alan Killenger - 14:43 - 25 Апр., 2006
|
|
Volk
Пользователь Регистрация: Июнь 2005
Всего: 79 сообщений
|
2Aman У меня в голове глючит как окачалось ;] Заместо set_local_var(8, (2 * random(50, 100) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15))))); надо set_local_var(8, floor(2 * random(50, 100) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15)))));
|
Отправлено: 4:24 - 26 Апр., 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
Как определить файл msg для скрипта, где в скрипте упоминается его имя. Я в диалоге сделал ссылки на строчки в файле msg(название такое-же как у скрипта(x.int и x.msg) ) , а текст почему-то испльзуется из ACTEMVIL.msg.
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 8:58 - 26 Апр., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
"Это мы не проходили, это нам не задавали" ... FAQ FScript-HOWTO
|
Отправлено: 10:49 - 26 Апр., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
У каждого скрипта есть номер (scipts.lst). Каждому скрипту может однозначно соответствовать 1 *.msg файл. Стало быть, каждому *.msg файлу должен соответствовать номер соответствующего ему скрипта. Когда мы берем текст из *.msg файла мы указываем два параметра: номер файла и номер строки.
----- hit me, nail me, make me god
|
Отправлено: 14:01 - 26 Апр., 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
Подскажите пожалуйсто! Как мне сделать так, что , к примеру : чузену требуется открыть дверь, для этого он идет к компьютеру, вводит в диалоговом окне соответсвующую строчку, и дверь открывается. Меня интересует, как можно сообщить скрипту двери, открытость, путем активации скрипта компьютера?
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 9:15 - 1 Мая, 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Элементарно. С помощью глобальной переменной (GVAR, а можно и MVAR, дело вкуса). Скрипт компа устанавливавт переменную в определенное значение( set_global_var(GVAR_DOOR,1); ), а скрипт двери при попытке взаимодействия с ней проверяет эту переменную : if (global_var(GVAR_DOOR)==1) then...
|
Отправлено: 10:37 - 1 Мая, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Из скрипта чюза прибавляю единичку к скилу под номером задаваемым переменной skil1: critter_mod_skill(dude_obj,skil1,1); команда работает нормально если скил не тагнут, а если тагнут единичка не добовляется. Кто нибудь знает в чем дело? С тагнутыми скилами нужно работать иначе?
|
Отправлено: 14:57 - 3 Мая, 2006
|
|
Avenger666
Пользователь Регистрация: Май 2006
Всего: 12 сообщений
|
Помогите - непонятная проблема. F2 вылетает с "программа выполнила недопустимую ..." из-за scripts.lst . Непонимаю в чем дело, все скрипты добавлял по одному шаблону, 100 раз проверял scripts.lst на ошибки. В чем проблема может быть?
|
Отправлено: 20:05 - 3 Мая, 2006 | ИСПРАВЛЕНО: Avenger666 - 20:11 - 3 Мая, 2006
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Не все текстовые редакторы одинаково полезны Некоторые из них имеют особенность портить lst-файл, хотя не исключено, что проблема в другом.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 20:15 - 3 Мая, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Avenger У меня как то была ситуация - правил scripts.lst в одной папке, а прога брала данные из другого неправленного scripts.lstа который лежал в другой папке. У тебя правильно пути выставлены? (на папку с исправленным файлом?)
|
Отправлено: 22:26 - 3 Мая, 2006 | ИСПРАВЛЕНО: Keha - 22:27 - 3 Мая, 2006
|
|
Avenger666
Пользователь Регистрация: Май 2006
Всего: 12 сообщений
|
пока смутно понимаю о чем ты. я пути вообще нигде не выставляю . Редактирую все в фаре в папке F2\data\scripts\scripts.lst , предварительно удалив оригинал из patch000.dat scripts.lst пишу с нуля (старые скрипты не использую или исправляю SCRIPT_NAME и компилирую опять если какие-то становятся нужными) все было ок до вчерашнего дня.
|
Отправлено: 9:04 - 4 Мая, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: critter_mod_skill(dude_obj,skil1,1); команда работает нормально если скил не тагнут, а если тагнут единичка не добовляется.
Однако, примечания читаем:
Цитата: если скилл отмечен как tagged, параметр amount уменьшается до чётного
|
Отправлено: 9:14 - 4 Мая, 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Цитата: Quote: from Avenger666 on 9:04 - 4 Мая, 2006 пока смутно понимаю о чем ты. я пути вообще нигде не выставляю . Редактирую все в фаре в папке F2\data\scripts\scripts.lst , предварительно удалив оригинал из patch000.dat
Лично я все содержимое patch000.dat вытряхиваю наружу, а сам это датник деляю. А то у меня игра начинала одно брать из этого датника, другое из паки с моднутыми файлами третье вообще не поймешь откуда. пути до модифицированных (patches) файлов проставляются в fallout2.cfg. Вот например часть строк моего cfg_шника: critter_dat=c:\games\Fallout2\critter.dat critter_patches=c:\games\Fallout2\mod cycle_speed_factor=1 executable=game free_space=20480 hashing=1 interrupt_walk=1 language=english master_dat=c:\games\Fallout2\master.dat master_patches=c:\games\Fallout2\mod
Цитата: scripts.lst пишу с нуля (старые скрипты не использую или исправляю SCRIPT_NAME и компилирую опять если какие-то становятся нужными) все было ок до вчерашнего дня.
Попробуй заново оригинальный scripts.lst очистить и аккуратно вписать свои скрипты. В других редакторах, как тут тебе уже предлагали. Или так много уже наскриптил что это проблематично заново набить?
Цитата: Quote: from Wasteland Ghost Однако, примечания читаем:
Спасибо большое, как обычно поглазел.
|
Отправлено: 21:03 - 4 Мая, 2006 | ИСПРАВЛЕНО: Keha - 21:08 - 4 Мая, 2006
|
|
Alexer
Пользователь
Откуда: Россия Владивосток Регистрация: Апр. 2006
Всего: 11 сообщений
|
У меня такой, незатейливый вопрос: как анимировать укус волка. Возможно это можно сделать посредствам функциии anim(ObjectPtr who, int anim, int direction), но я ненашел подходящего int anim. подскажите, если это вообще можно анимировать...
----- "Вы сильно промахнулись и случайно попали"
|
Отправлено: 11:48 - 6 Мая, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Это делается при помощи reg_anim. Для примера посмотри как сделана встреча с Френком в пустыне. Ещё на сайте в разделе документации есть пример скриптовой анимации от Communist'а. Он, правда, под ipp, но принцип тот же.
|
Отправлено: 13:26 - 6 Мая, 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Кто нибудь [косится на Wasteland Ghost] может привести рабочий пример, как при помощи интерфейсного режима создать кнопку (с обработкой событий и графикой). Несколько часов бьюсь - не получается.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 22:02 - 23 Мая, 2006
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Вот пример лифта, он выкидывает на одну карту, правда без графики. #include "..\headers\define.h" #define NAME 1402// 1360 #include "..\headers\command.h" procedure start; procedure critter_p_proc; procedure spatial_p_proc; procedure talk_p_proc; variable nam; procedure button_on; procedure button_off; procedure button_press1; procedure button_press2; procedure button_press3; procedure button_release; procedure empty_proc; procedure region_press1; procedure region_press2; procedure region_press3; procedure start begin end procedure critter_p_proc begin end procedure spatial_p_proc begin call talk_p_proc; begin end procedure talk_p_proc begin script_overrides; CreateWin ("test_wnd1",200,60, 231,285); SelectWin ("test_wnd1"); Display ("pcx/liftmenu.pcx"); AddButton ("test_btn", 8, 37, 99, 59); AddButtonGFX ("test_btn", "pcx/butlups1.pcx", "pcx/butlups1.pcx", "pcx/butlups1.pcx"); AddButtonProc ("test_btn", button_on, button_off, button_press1, button_release); addregion "test_reg1" {10,0, 231,285}; addregionproc("test_reg1", no_proc, no_proc, region_press1, empty_proc); ShowWin; AddButton ("test_btn1", 8, 97, 99, 59); AddButtonGFX ("test_btn1", "pcx/butlups2.pcx", "pcx/butlups2.pcx", "pcx/butlups2.pcx"); AddButtonProc ("test_btn1", button_on, button_off, button_press2, button_release); addregion "test_reg1" {10,0, 231,285}; addregionproc("test_reg1", no_proc, no_proc, region_press2, empty_proc); ShowWin; AddButton ("test_btn2", 8, 157, 99, 59); AddButtonGFX ("test_btn2", "pcx/butlups3.pcx", "pcx/butlups3.pcx", "pcx/butlups3.pcx"); AddButtonProc ("test_btn2", button_on, button_off, button_press3, button_release); addregion "test_reg1" {10,0, 231,285}; addregionproc("test_reg1", no_proc, no_proc, region_press3, empty_proc); ShowWin; end procedure button_press1 begin DeleteWin("test_wnd1"); load_map(MAPSTR_N_tpmb02, 22134); //MAPSTR_N_tpmb02 move_to(dude_obj, 25112, 0); end procedure button_press2 begin //FadeOut(1); DeleteWin("test_wnd1"); //FadeIn(1); //gfade_out(999); //load_map(MAP_New_Military_Base, 22134); load_map(MAP_New_MB_AR, 22312); move_to(dude_obj, 25112, 0); // gfade_in(999); end procedure button_press3 begin DeleteWin("test_wnd1"); //load_map(MAP_New_MB_AR, 22312); load_map(MAP_New_MB_AR, 22312); move_to(dude_obj, 21912, 1); end procedure button_release begin DeleteWin("test_wnd1"); end procedure button_on begin end procedure button_off begin end procedure region_press1 begin reg_anim_clear(dude_obj); DeleteWin("test_wnd1"); end procedure region_press2 begin reg_anim_clear(dude_obj); DeleteWin("test_wnd1"); end procedure region_press3 begin reg_anim_clear(dude_obj); DeleteWin("test_wnd1"); end procedure empty_proc begin end
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 22:27 - 23 Мая, 2006 | ИСПРАВЛЕНО: Pavel - 22:30 - 23 Мая, 2006
|
|
Spy
Реалист
Откуда: Все там будем... Регистрация: Май 2005
Всего: 374 сообщения
|
Без графики, т.е. не рисует окно с кнопками? А руками его отрисовать нельзя (как в самоделкине)? Насколько я помню, лифты - это проблема, и решить её - хорошее дело.
----- Хочешь, чтобы что-то было сделано хорошо - сделай сам.
|
Отправлено: 23:11 - 23 Мая, 2006
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
to Ray Вот здесь лежит простенький пример, иллюстрирующий самый правильный способ создания интерфейсного окна с одной кнопкой. Моя разработка. Окно красил валиком, кнопки выпиливал лобзиком to Spy
Цитата:
Насколько я помню, лифты - это проблема, и решить её - хорошее дело.
Лифты давно уже не проблема.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 18:49 - 24 Мая, 2006
|
|
Avenger666
Пользователь Регистрация: Май 2006
Всего: 12 сообщений
|
как реализовать respawn critter'a при каждом заходе на карту ?
|
Отправлено: 19:32 - 25 Мая, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
То есть если криттера убивают, то при следующем заходе он был снова живой? В map_enter_p_proc поставить create_obj_pid и создавать криттера при каждом заходе на карту, а в map_exit_p_proc убивать его перед каждым выходом с карты (если он не был убит раньше).
----- hit me, nail me, make me god
|
Отправлено: 4:35 - 26 Мая, 2006
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Я второй раз пишу об этой проблеме (насколько я помню). Похоже, кроме меня с ней никто не сталкивался. Итак, захожу в диалог, при наведении мыши на вариант ответа, он выделяется желтым. Это нормально, так и должно быть. Но переводя мышь на другой вариант ответа, я замечаю, что этот вариант не стал обратно зеленым, а остался желтым. и так со всеми вариантами ответов. Есть идеи? Сие происходит в AL.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:15 - 2 Июня, 2006
|
|
Avenger666
Пользователь Регистрация: Май 2006
Всего: 12 сообщений
|
как сделать чтобы красть у critter'a было сложнее или что за это отвечает (м.б. percepection например?), может как-то можно реализовать кражу через roll_vs_skill ?
|
Отправлено: 13:19 - 4 Июня, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: procedure use_skill_on_p_proc begin if (action_being_used == SKILL_STEAL) then begin if /* ваше условие на удачное воровство */ then begin /* все, дальше движок сам проводит кражу или пишем свой обработчик кражи с использованием интерфейсных функций */ end else begin script_overrides; /* заход в режим кражи невозможен */ end end end
P.S. А можно ввсети тэг code хотя бы просто как делающий шрифт моно... каким-то?
----- hit me, nail me, make me god
|
Отправлено: 17:02 - 4 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
ЭЭЭ Тут такое предложеньице есть... Прочитал весь топик аж упарился, и посетила такая мысля, может создать раздел в котором бы лежали готовые, отлаженные скрипты с комментариями для общего пользования... Ну эт чтоб лисапед не изобретать... Заодно и народ будет смотреть и какие нить скрипты доводить до ума сообща, хотя нет, для доводки этот раздел есть, а в том только конечные варианты писать... Например вот смотрю лифты многим нужны, былоб неплохо такой скрипт получить с описанием и всеми ресурсами. А то уродовать те что в фолле есть не хочется...
----- За сим прощаюсь, Олег.
|
Отправлено: 21:13 - 6 Июня, 2006
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
2 Олег1969 1) Оригинальные лифты прошиты двиге, так что изуродовать можно двиг . 2) Рабочий скрипт лифта я привел в пришлом посте этой темы, там только анимации стрелки нет, нет времени сделать. 3) А зачем тебе рабочие скрипты с комментариями? Самому лень разбираться? Там ведь нет ничего сложного . 4) Исходники и так есть и к Фаллауту, и к патчу, и к "Новому взгляду"... Тебе мало? ЗЫ: Действительно, зачем изобретать велосипед?
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 1:41 - 7 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Цитата: Quote: from Pavel on 1:41 - 7 Июня, 2006 2 Олег1969 1) Оригинальные лифты прошиты двиге, так что изуродовать можно двиг . 2) Рабочий скрипт лифта я привел в пришлом посте этой темы, там только анимации стрелки нет, нет времени сделать. 3) А зачем тебе рабочие скрипты с комментариями? Самому лень разбираться? Там ведь нет ничего сложного . 4) Исходники и так есть и к Фаллауту, и к патчу, и к "Новому взгляду"... Тебе мало? ЗЫ: Действительно, зачем изобретать велосипед?
Тут, смотрю, есть некоторое недопонимание... 1. Доку читал, знаю... 2.По поводу лифта... Скрипт видел, сижу разбираюсь интересно... 3. А затем, что тратится лишнее время которое можно былоб потратить подругому... 4. Угу, есть, копаю... Но опять, же, время время! Есть вещи которые уже написаны и доведены до ума! Чем сидеть и самому лепить, вычленять ошибки и т.д и т.п.... Причем имеется ввиду не просто исходник вообще, а какаято конкретная ситуация... ЗЫ: Будем изобретать велосипед...
----- За сим прощаюсь, Олег.
|
Отправлено: 8:40 - 7 Июня, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: 3. А затем, что тратится лишнее время которое можно былоб потратить подругому...
А времени тех людей, что тебе комменты к исходникам писать будут, тебе не жалко? Моддинг Фола - он не для ленивых. Кстати, по поводу готовых скриптов. Чем тебя FAQ по скриптам не устраивает?
|
Отправлено: 12:38 - 7 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Цитата: Quote: from Wasteland Ghost on 12:38 - 7 Июня, 2006 [quote]3. А затем, что тратится лишнее время которое можно былоб потратить подругому...
А времени тех людей, что тебе комменты к исходникам писать будут, тебе не жалко? Моддинг Фола - он не для ленивых. Кстати, по поводу готовых скриптов. Чем тебя FAQ по скриптам не устраивает?[/quote] Мдя... Ни кого не заставляю писать комменты к уже готовым скриптам... Просто когда меня учили писать программы то твердили "пишите комментарии к своим исходникам, а то сами потом в них будете плавать", поэтому я и привык, что если есть текст, то и должны писаться комментарии к нему... Ну в принципе нет ну и не надо... А по поводу факи так там обычные стандартные процедурки описаны... А вот хотелось бы видеть, что нибудь особенное, как вот в частности работа с лифтами без движка или например тут видел скриптик по движению по маршруту, отчень интересное решение! Вот что хотелось бы увидеть!
----- За сим прощаюсь, Олег.
|
Отправлено: 14:00 - 7 Июня, 2006
|
|
Pavel
Модератор
Откуда: Одесса Украина Регистрация: Май 2004
Всего: 368 сообщений
|
Олег Действительно, когда меня учили програмировать, то же говорили, что нужно писать комментарии. Но прошло время и смысл в их написании фактически отпал.
Цитата: А вот хотелось бы видеть, что нибудь особенное, как вот в частности работа с лифтами без движка или например тут видел скриптик по движению по маршруту, отчень интересное решение! Вот что хотелось бы увидеть!
Отчень хорошо, судя из твоего поста - ты их увидел, в чем проблема? Либо я с годами потупел... что вряд ли, либо я не понимаю чего ты вообще хочешь... но ты вроде все видишь, либо ты не правильно излагаешь свои мысли... тебе судить Исходя из твоих многочисленных постов, ты хочешь всего и сразу... У меня напросился вопрос: а зачем тебе столько?
Цитата: А по поводу факи так там обычные стандартные процедурки описаны...
На то он и FAQ, что бы в нем стандарное объяснять. FAQ - это ведь по Русски: часто задаваемые вопросы. Так что таким скриптам, как лифт - в нем не место. И вообще, давай определимся. Вижу ты во многом хочешь разобраться, но в итоге начинаешь заоффтопливать форум, а это противоречит Правилам . Давай так, если у тебя есть конкретный вопрос по скриптам - задавай, а если не конкретный вопрос - пиши на мыло. Потом сам создашь топик по результатам общения, если будет желание, в чем я сомневаюсь .
----- В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...
|
Отправлено: 0:05 - 8 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Возник вопрос в скрипте, в котором я ковыряюсь, есть строка Scenery_Creation_Ptr:=tile_contains_pid_obj(CAR_POS_IN_MAP,0,PID_DRIVABLE_CAR); компилятор преобразует ее вот в это Scenery_Creation_Ptr:=tile_contains_pid_obj( 24915 ,0, (33555441) ); и потом грязно ругается, что неправильно расставлены скобки.... В чем проблема то? Зачем он туда лишние скобки пихает? Причем он значение PID_DRIVABLE_CAR везде заключает в скобки при подстановке... ай чет глюкнуло...
----- За сим прощаюсь, Олег.
|
Отправлено: 14:17 - 9 Июня, 2006 | ИСПРАВЛЕНО: Oleg1969 - 14:25 - 9 Июня, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: В чем проблема то? Зачем он туда лишние скобки пихает?
Затем, что в itempid.h или в scenpid.h есть такая строка
Код:
#define PID_DRIVABLE_CAR (33555441)
Однако этот факт не должен вызывать ошибку, ищите баг в другом месте.
----- hit me, nail me, make me god
|
Отправлено: 14:56 - 9 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Цитата: Quote: from Alan Killenger on 14:56 - 9 Июня, 2006 [quote]В чем проблема то? Зачем он туда лишние скобки пихает?
Затем, что в itempid.h или в scenpid.h есть такая строка
Код:
#define PID_DRIVABLE_CAR (33555441)
Однако этот факт не должен вызывать ошибку, ищите баг в другом месте.[/quote] ну вообщето переменной присваивается значение стоящее в скобках... Ну ладно это особенности компилятора... Кстати компилятор и строку с ошибкой указывает именно вот эту... Будем копать дальше...
----- За сим прощаюсь, Олег.
|
Отправлено: 15:11 - 9 Июня, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: Кстати компилятор и строку с ошибкой указывает именно вот эту...
Поправка, компилятор сообщает о том, что он обнаружил ошибку находясь на этой строке, а не о том, что ошибка заключена в этой строке. Насчет скобок - никаких проблем, будь передаваемый параметр хоть трижды в скобках. Это раз, второе, что именно компилятор пишет в сообщении об ошибке читали? Откомпилировать отдельно только эту строку кода пытались? to Avenger Такая мысля, если интересно.
Код:
procedure use_skill_on_p_proc begin if (action_being_used == SKILL_STEAL) then begin /* Открываем диалог, но не с самим персонажем. */ /* То есть все воровство реализуем как диалог. */ /* Таким образом можно будет воткнуть любые */ /* условия кражи предметов, какие захочется. */ /* И сделать все это очень просто, но */ /* прийдется отказаться от привычного меню, */ /* которое всплывает при воровстве. */ end end
----- hit me, nail me, make me god
|
Отправлено: 17:47 - 9 Июня, 2006 | ИСПРАВЛЕНО: Alan Killenger - 18:53 - 9 Июня, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: ну вообщето переменной присваивается значение стоящее в скобках... Ну ладно это особенности компилятора...
Вообще-то, батенька, это не переменная, это макроимя. Читай ФАК или любую доку по препроцессорам. Означает сей факт, что если ты напишешь #define MY_DEF HORRIGAN_KOZEL То везде вместо MY_DEF препроцессор (компилятор тут отдыхает и умывает руки, не его это вотчина) подставит HORRIGAN_KOZEL. Препроцессор не выполняет вычислений, поэтому скобки в макросах - это хороший тон.
|
Отправлено: 12:39 - 10 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Цитата: Quote: from Wasteland Ghost on 12:39 - 10 Июня, 2006 [quote]ну вообщето переменной присваивается значение стоящее в скобках... Ну ладно это особенности компилятора...
Вообще-то, батенька, это не переменная, это макроимя. Читай ФАК или любую доку по препроцессорам. Означает сей факт, что если ты напишешь #define MY_DEF HORRIGAN_KOZEL То везде вместо MY_DEF препроцессор (компилятор тут отдыхает и умывает руки, не его это вотчина) подставит HORRIGAN_KOZEL. Препроцессор не выполняет вычислений, поэтому скобки в макросах - это хороший тон.[/quote] МММММ Мадам (или модемуазель?), под словом "компилятор" я имел ввиду общее понятие, с препроцессором, без него, мне без разници ... И если я могу чему-то присвоить какое-то значение то это для меня тоже переменная и неважно чем задается ей это значение... Давайте не будем цепляться к словам... Вот так вот, поэтому я и говорю, что это особенности компилятора и я их на данный момент изучаю... Спасибо всем кто откликнулся на мой вопрос, на данный момент он решон с помощью автора скрипта, в чем ему большое СПАСИБО! ЗЫ: Кстати у меня глупая особенность сначала изучить доступные доки и факи...
----- За сим прощаюсь, Олег.
|
Отправлено: 12:26 - 11 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Посмотрите в чем дело: Не хочет работать скрипт сирены компилятор крмпилит без проблем, логика не нарушена, а не работает... Или работает но не предсказуемо, когда захочет а не сразу после установленного бита.... /* Ñêðèïò ñèðåíû */ #include "D:\Fallout2\mod\scripts\headers\define.h" #include "D:\Fallout2\mod\scripts\HEADERS\command.h" #define NAME SCRIPT_TOKLAXON //1307 procedure start; procedure map_update_p_proc; procedure start begin end procedure map_update_p_proc begin //variable item; if (gvar_bit(GVAR_RESERVED_VAR59,bit_1)==1) then begin if obj_pid(self_obj) == PID_NS_LIGHT then create_object(PID_NS_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj)); else create_object(PID_EW_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj)); end end Вот такие пироги...
----- За сим прощаюсь, Олег.
|
Отправлено: 16:21 - 16 Июня, 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
На сколько я могу видеть, не все кодовые блоки begin ... end корректно закрыты. Попробуй так и сравни поведение (если правильно понял, куда относится else): procedure map_update_p_proc begin //variable item; if (gvar_bit(GVAR_RESERVED_VAR59,bit_1)==1) then begin if obj_pid(self_obj) == PID_NS_LIGHT then begin create_object(PID_NS_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj)); end else begin create_object(PID_EW_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj)); end end end
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 16:35 - 16 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
МММ Все закрыто правильно... Сколько бегинов столько и эндов... А еще мона почитать доку и увидеть, что бегин в условиях применяется только для обьединения в блоки... А причину я нашол. В маппере не работает, а вот в игре как часы заработало все...! В обчем маппер для тестов неподходит, кстати в доке это тоже написано... Грабли... Всем спасибо.
----- За сим прощаюсь, Олег.
|
Отправлено: 14:31 - 17 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Такой вопрос возник... Как долго могут выполняться скрипты (с какой скоростью) и что на это влияет? А то уже запарился, на простейших вещах то сразу срабатывает, то с тааааким запаздыванием, что ОЙ!!! И второй вопрос, пользуюсь у себя стандартными макросами по установке, проверке и снятию бит... На сколько сии операции медленны и имеет ли смысл перейти на обычные переменные для ускорения процесса? Битами у меня флаги на карте выставляются...
----- За сим прощаюсь, Олег.
|
Отправлено: 1:54 - 19 Июня, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: Как долго могут выполняться скрипты (с какой скоростью) и что на это влияет? А то уже запарился, на простейших вещах то сразу срабатывает, то с тааааким запаздыванием, что ОЙ!!!
Не знаю, у меня только однажды было серьезное запаздывание. Во время диалога мой скрипт читал каждую реплику, высеивая из нее нужную подстроку. Т.е. было сравнение строк нехилое количество раз. Хотя чисто интуитивно я всегда делаю привязки по времени к каким-нибудь обработчикам.
Цитата: И второй вопрос, пользуюсь у себя стандартными макросами по установке, проверке и снятию бит... На сколько сии операции медленны и имеет ли смысл перейти на обычные переменные для ускорения процесса? Битами у меня флаги на карте выставляются...
ИМХО bwor и bwand реализованиы как раз or и and, установка бита - установка числа, проверка наличия бита - bwand и сравнение двух чисел. Плохо только если делаешь shr, shl. А так - забей, пиши как удобно, на фоне общей неэффективности это все незаметно.
----- hit me, nail me, make me god
|
Отправлено: 16:00 - 19 Июня, 2006 | ИСПРАВЛЕНО: Alan Killenger - 17:01 - 19 Июня, 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ребята, подскажите, что я делаю не так? Какие-то проблемы с бартером. По плану персонаж предлагает Чузу купить плоскогубцы. Если тот соглашается, идет вызов режима бартера. Далее, если герой выменивает плоские, персонаж должен сказать что-то типа "Вот и молодец", если не вменивает - "Почему ты передумал?" В реале же получается так, что фраза персонажа вообще не появляется. Когда Чуз покупает плоскогубцы, в режиме бартера появляется фраза "Хорошая сделка, бла-бла-бла." По выходе из бартера она не стирается никоим образом. И реплика персонажа просто не появляется (вообще-то в истории диалога она присутствует, но вот на дисплее не высвечивается). Пытался делать по-всякому, результат нулевой. Вот кусок кода:
Цитата:
procedure inf_trade begin variable item; item:=create_object(PID_MULTI_TOOL,1,1); add_obj_to_inven(self_obj, item); gdialog_barter; call trade_bufer; end procedure trade_bufer begin Reply(" "); if (obj_is_carrying_obj_pid(dude_obj,PID_MULTI_TOOL)) then call Node030; else call Node031; end procedure Node030 begin Reply(mstr(780)); NOption(783,Node999,1); end procedure Node031 begin Reply(mstr(781)); NOption(782,Node999,1); end
Что я делаю неправильно, и как сделать правильно ;) ? Чтобы закончил торговать - получил адекватную фразу?
|
Отправлено: 23:04 - 23 Июня, 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
ЭЭЭ Я не спец, пока только начинающий, но судя по всему у тебя выдается стандартная фраза при бартере попробуй на входе в процедуру поставить script_overrides; может поможет... Это я пока понял из описания процесса... Счас попытаюсь посмотреть сам скрипт...
----- За сим прощаюсь, Олег.
|
Отправлено: 8:28 - 24 Июня, 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Проблема решена. Пусть, не слишком изящно, но решена. Просто в процедуре, следующей после выхода из бартера, добавил опцию [Далее]. После этого диалог отображается нормально. Кстати, в вышеприведенном примере, в процедуре trade_bufer не работал условный переход (где проверялось наличие плоскогубцев в инвентаре Чуза). Когда я перенес его в другую процедуру, все заработало. Такое впечатление , что после выхода из бартера половина скриптовых команд не отрабатывается.
|
Отправлено: 13:07 - 24 Июня, 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
И снова здрасте.) Такой вопрос. Стоят три НПС и напротив них еще двое. Чузен подбегает к троим и ведет диалог с одним из них, один из вариантов троица нападает на Чузена. (Они прописаны в одной команде) Вопрос: Как сделать так, чтоб два напротив напали на троих. (Они как бы враги и пользуются ситуевиной)
|
Отправлено: 7:36 - 15 Авг., 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Akkella Можно так: В момент, когда враги нападают на чуза устанавливается глобальная переменная - для того, чтобы союзники чуза знали, что началась драка (проверкf гвары в critter_p_proc), Ч чтобы друзья чуза нападали именно нав раговнужно сделать указательна врагов и экспоритровать его. Как это сделать, написано где-то в факах. Что-то типа этого: Скрипт врага: export variable enemy_ptr; procedure start begin ememy_ptr:=self_obj; end Скрипт друга: import variable enemy_ptr; procedure critter_p_proc begin if (globdl_var(GVAR_.....)==) then attack(enemy_ptr) end Можешь еще поглядеть, как реализован бой банды Лары и Тайлера. А проще всего записать друзей в группу дуда (маппером).
|
Отправлено: 8:54 - 15 Авг., 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
В команду записывать их бы не хотелось... Есть причины. Глобальными переменными почти не пользуюсь. Вернее она одна на город, не хотелось бы выделять под него бит. Правда если не будет вариантов, то маппером воспользуюсь...
|
Отправлено: 9:48 - 15 Авг., 2006
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Вместо ГВАР можно МВАРы использовать. Да и ни к чему на ГВАРах экономить, их можно добавлять сколько угодно.
|
Отправлено: 11:11 - 15 Авг., 2006
|
|
Hante
Пользователь Регистрация: Авг. 2006
Всего: 1 сообщение
|
Добрый день. Прочитал "FScript-HOWTO", все понятно. Скомпилировал скрипт, отправил его в Data\Scripts, прописал где надо. В редакторе пытаюсь повесить его на криттера и не обнаруживаю свой скрипт в списке. Так вот вопрос: а че, собсно, за хрень твориться в тридесятом государстве? Читал где-то, что это из-за path0000.dat, распаковал его, удалил - нет результата.
|
Отправлено: 14:58 - 18 Авг., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
FAQ Плюс данная тема. Если правильно подготовил Фол к модификации, вписал скрипт в скриптс.лст, то "ищи, должон быть".
|
Отправлено: 17:16 - 18 Авг., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Народ, а есть у кого-нибудь наработки и тех мысли касательно *управление боевым отрядом во время боя и вне боя", а то долго меня здесь не было мож придумали чего ? Или все по прежнему: мол анимация в бою не работает и нечего терять время на осмысление этой идеи?
|
Отправлено: 0:47 - 8 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Возникла небольшая проблема с LVAR-ами в скрипте... Есть скрипт для карты, в нем обьявлены LVAR-ы, в SCRIPTS.LST они прописаны, но когда пытаешся с ними работать то там только -1, как будто они не обьявлены... В чем может быть затык?
----- За сим прощаюсь, Олег.
|
Отправлено: 23:27 - 11 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Карту, часом, не из сохранёнки грузишь?
|
Отправлено: 13:25 - 12 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Нет. Сначала бегу к доку и открываю локацию на карте мира, а уж потом бегу к локации... Правда то место где открываю локацию гружу из сохраненки, но ведь они не связаны? Или я ошибаюсь? Кстати заменил на MVAR то там все работает... В чем же затык?
----- За сим прощаюсь, Олег.
|
Отправлено: 17:36 - 12 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 17:39 - 12 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Вроде, не должны. Но всё-таки попробуй новую игру начать.
|
Отправлено: 17:38 - 12 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Что-бы далеко не бегать, быстренько на выходе из арройо создал перса открывающего мою локацию. бегу в локацию, таже самая петрушка... LVAR нормально не работают... Привожу ниже скрипт карты, может что не то делаю посмотрите... #include "D:\Fallout2\mod\scripts\headers\define.h" #include "D:\Fallout2\mod\scripts\headers\updatmap.h" #include "D:\Fallout2\mod\scripts\headers\command.h" #include "D:\Fallout2\mod\scripts\headers\tomorrow.h" #define NAME SCRIPT_TOQUESTU //1316 #define CAR_POS_IN_MAP 20077 // #define CAR_ELEV_IN_MAP 0 // #define MVAR_Begin_Attack_Mike (0) // #define MVAR_Mike_Put (1) // #define MVAR_Mike_ID (2) // #define LVAR_Mike_Put (0) procedure start; procedure map_enter_p_proc; procedure map_update_p_proc; procedure map_exit_p_proc; procedure Set_Level_Map; export variable object_Mike // procedure start begin end procedure map_enter_p_proc begin Lighting; call Set_Level_Map; Check_Create_Car(CAR_POS_IN_MAP,CAR_ELEV_IN_MAP) end procedure map_update_p_proc begin display_msg("LVAR_Mike_Put:="+local_var(LVAR_Mike_Put)); // display_msg("MVAR_BA_Mike:="+map_var(MVAR_Begin_Attack_Mike)); Lighting; end procedure map_exit_p_proc begin end procedure Set_Level_Map begin variable Tomaps; if ((GAME_TIME_IN_DAYS-(global_var(GVAR_TOMORROW_DAYS)))<=3) and (local_var(LVAR_Mike_Put)<1) then begin inc_local_var(LVAR_Mike_Put); object_Mike:=create_object_sid(PID_MIKE,18491,0,-1); set_map_var(MVAR_Mike_ID,object_Mike); anim(object_Mike,ANIMATE_ROTATION,2); create_object_sid(PID_BED_4,18085,0,-1); create_object_sid(PID_WOOD_FIRE,18486,0,-1); Tomaps:=create_object(PID_TOMORROW_MAP,0,0); add_mult_objs_to_inven(object_Mike,Tomaps,1); end override_map_start_hex(19284,0,5); end В скриптс.лст все прописано... Скрипт проще некуда... ЗЫ: На MVAR внимания не обращайте... Это так, замена (Добавление от 21:28 - 12 Сент., 2006.) После непродолжительных экспериментов пришол к выводу, что данная проблема касается только скрипта карты. Во всех остальных скриптах обьектов находящихся на карте все отлично работает... Кто нить еще пользовался LVARами в скриптах карт? И как оно? Или это характерно только для моей карты?
----- За сим прощаюсь, Олег.
|
Отправлено: 20:42 - 12 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Просмотрел все бисовские скрипты карт. Ни в одном нет работы с LVARами, только с MVARами или GVARами... Это о чем нить говорит? Может LVARы нельзя использовать в скриптах карт?
----- За сим прощаюсь, Олег.
|
Отправлено: 23:42 - 12 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А у тебя оно вообще компилится?
Код:
export variable object_Mike //
Цитата: В скриптс.лст все прописано...
А ты тут запость для контроля, так сказать. Щас проверить не могу, но сильно сомневаюсь в наличии подобных ограничений. Возьми скрипт карты artemple. Пропиши ему пару-тройку ЛВАР в скриптс.лст. Добавь туда запись/чтение/вывод. Убедись, что нет никаких лишних файлов типа патча000 или завалящего artemple.sav в папке DATA\MAPS или где-там-у-тебя-мод (бывает, если Фол падает). Убедись, что в cfg все пути правильные. Начни новую игру.
|
Отправлено: 11:25 - 13 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
ХМ... Вообще то да, компилиться... А что там такого? Вроде экспортирую переменную для общего пользования... Что не так? Все работает, просто для сохранения нужно было переделать на LVARы и тут затык... Постю конец ЛСТ... ccKevin.int ; Kevin in Navarro # local_vars=8 csAlarm.int ; Navarro base on alert lights # local_vars=1 ciQunWch.int ; Quincy Locker Watch Script # local_vars=1 ciRulWch.int ; Raul Locker Watch Script # local_vars=1 ciCmdWch.int ; Commanded Locker Watch Script # local_vars=1 SSStat.int ; NCR Statue # local_vars=0 ctFob.int ; Fob EXP Spatial Script # local_vars=1 ctPlans.int ; Vertibird EXP Spatial Script # local_vars=1 ctK9Part.int ; K9 Part EXP Spatial Script # local_vars=1 csArea2.int ; Script to signal if dude enters an area # local_vars=0 csOpen2.int ; Script to signal if dude uses door w/o permis # local_vars=1 ctSound.int ; Soundproof Room Spatial Script # local_vars=1 csOpen3.int ; Script to signal if dude uses door w/o permis # local_vars=1 ECTlkMon.int ; Talking Moonshiners # local_vars=8 ziWeakLk.int ; Generic Weak Lock Watch Script # local_vars=1 ziMedmLk.int ; Generic Medium Lock Watch Script # local_vars=1 dcCarnKd.int ; Carny Kid - The Den # local_vars=1 ciDocWch.int ; Raul Locker Watch Script # local_vars=1 ziHardLk.int ; Generic Hard Lock Watch Script # local_vars=1 CIMine.int ; Mines in Navarro # local_vars=6 niBisHLk.int ; New Reno Bishop Hard Locker # local_vars=1 niBisHDr.int ; New Reno Bishop Hard Locked Door # local_vars=6 ntRicRom.int ; New Reno Richard Wright Room Spacial # local_vars=1 entony.int ; Captain Anthony Fassard BrokenHills # local_vars=4 cesaer.int ; Vertibird menu for player # local_vars=4 ziVrTrnk.int ; Pilotable Vertibird for player # local_vars=4 maria.int ; Officer Maria from Navarro # local_vars=4 pilot.int ; Air strip guard from Navarro # local_vars=4 WTPlTrp15.int ; Plasma Floor Trap Level 2 of Seirra (Center) # local_vars=0 WTPlTrp16.int ; Plasma Floor Trap Level 2 of Seirra (Center) # local_vars=0 WTPlTrp17.int ; Plasma Floor Trap Level 2 of Seirra (Center) # local_vars=0 WTPlTrp18.int ; Plasma Floor Trap Level 2 of Seirra (Center) # local_vars=0 viWell.int ; Vault City Courtyard Well # local_vars=0 SIPtbox2.int ; box where Merk hides your car trunk sutff # local_vars=9 giWell.int ; Gecko's Well # local_vars=0 toquestu.int ; скрипт карты toquestu.map # local_vars=2 tomike.int ; Майк, дает квест на поиск # local_vars=3 tomaps.int ; скрипт карты с местом поселения # local_vars=3 tomonste.int ; скрипт монстров на карте toquestu.map # local_vars=3 Кстати в ФГеке я так понял есть проверка на соответствие, он на него не ругается. А с артемпле приду домой попробую...
----- За сим прощаюсь, Олег.
|
Отправлено: 17:23 - 13 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 17:37 - 13 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: А что там такого? Вроде экспортирую переменную для общего пользования... Что не так?
Точки с запятой нет.
|
Отправлено: 18:47 - 13 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Странно, а у меня и так работает... Ну в обчем проверил я на артемпле... Та-же самая петрушка... LVAR-ы в скрипте карт не работают! Проверьте пожалуста у себя, что-бы быть уверенным на 100%...
----- За сим прощаюсь, Олег.
|
Отправлено: 19:06 - 13 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Ну как ? Кто нить проверил еще? Это я по поводу LVAR... Кстати у меня еще такой вопрос возник по поводу диалогового режима... В этом режиме возможно проверять что есть у криттера в мешке? а то у меня вот такая конструкция не хочет работать... Да старты диалогового режима сделаны это уже переход... procedure DialogStart begin if (obj_is_carrying_obj_pid(self_obj,PID_TOMORROW_MAP)==0) then call Node004; //если заданный обьект в мешке отсутствует то переход на Node004 if local_var(LVAR_Mike_Talk)==0 then Reply(2); else Reply(random(28,30)); if local_var(LVAR_Mike_Talk)==0 then call Node001; // else if local_var(LVAR_Mike_Talk)==1 then call Node002; // else if local_var(LVAR_Mike_Talk)==2 then call Node003; // end Вот первый if с переходом на ноду004 не срабатывает, хотя обьекта у криттера нет... Кстати а гдеб почитать об ограничениях диалогового режима...
----- За сим прощаюсь, Олег.
|
Отправлено: 22:44 - 14 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Конструкция кошмарная сама по себе . Вообще в процедуре должен быть или вызов другой процедуры, или Reply + Options.
|
Отправлено: 9:12 - 15 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Цитата: Quote: from Wasteland Ghost on 9:12 - 15 Сент., 2006 Конструкция кошмарная сама по себе . Вообще в процедуре должен быть или вызов другой процедуры, или Reply + Options.
Ага, согласен, кошмарная... Просто прилепил на скору руку, проверить одну мыслю... А оно не работат... Переделал, в нормальный вид привел, теперь все работат... Пришол к выводу. Могу сказать что нуно Reply + все остальное, а в перемешку не работат... Вот что у меня получилось окончательно... : procedure DialogStart begin if local_var(LVAR_Mike_Talk)==0 then Reply(2); else if local_var(LVAR_Mike_Talk)==3 then Reply(random(200,204)); else Reply(random(28,30)); if local_var(LVAR_Mike_Talk)==0 then call Node001; // else if local_var(LVAR_Mike_Talk)==1 then call Node002; // else if local_var(LVAR_Mike_Talk)==2 then call Node003; // else if local_var(LVAR_Mike_Talk)==3 then call Node004; // end Я так думаю, эта конструкция лучче выглядит... Можно конечно еще улучшить но лениво...
----- За сим прощаюсь, Олег.
|
Отправлено: 10:43 - 15 Сент., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Почему пациент мрет при применении стимпаков? Кусок скрипта пациента. procedure use_obj_on_p_proc begin variable UsedItem_0; variable UsedItem_1; display_msg("One" + " LVAR_Diagnosed_Roge =" + local_var(LVAR_Diagnosed_Roge) + " LVAR_Wounded_Roge =" + local_var(LVAR_Wounded_Roge) + " global_var(789)=" + global_var(789)); if( local_var(LVAR_Diagnosed_Roge) == 2) and (has_skill( dude_obj, SKILL_DOCTOR) >= 60) and (global_var(789) == 16) then begin if( local_var(LVAR_Wounded_Roge) == 0 ) then begin UsedItem_0 := obj_being_used_with; if ( obj_pid(UsedItem_0) == PID_STIMPAK) then begin set_local_var(LVAR_Wounded_Roge, 1); float_msg(dude_obj,message_str(1595,249),4); end else begin if ( obj_pid(UsedItem_0) != PID_STIMPAK) then begin float_msg(dude_obj,message_str(1595,250),4); set_global_var(788,-1); kill_critter(self_obj, 48); end end end if( local_var(LVAR_Wounded_Roge) ==1 ) then begin UsedItem_1 := obj_being_used_with; script_overrides; if( obj_pid(UsedItem_1) == PID_MEDICAL_SUPPLIES) then begin set_local_var(LVAR_Wounded_Roge, 2); float_msg(dude_obj,message_str(1595,249),4); end else begin if( obj_pid(UsedItem_1) != PID_MEDICAL_SUPPLIES ) then begin float_msg(dude_obj,message_str(1595,250),4); set_global_var(788,-1); kill_critter(self_obj, 48); end end end end display_msg("Two" + " LVAR_Diagnosed_Roge =" + local_var(LVAR_Diagnosed_Roge) + " LVAR_Wounded_Roge =" + local_var(LVAR_Wounded_Roge) + " global_var(789)=" + global_var(789)); end
|
Отправлено: 23:20 - 17 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Опять диалоговый режим... Есть такой кусок... procedure Node240 begin Reply(240); gsay_option(NAME,241,Remuv,-1); gsay_option(NAME,242,Node5271,-1); gsay_option(NAME,25,DialogEnd,-1); end procedure Remuv begin variable var0; var0:=create_object(PID_SUPER_STIMPAK,0,0); add_mult_objs_to_inven(dude_obj,var0,1); var0:=obj_carrying_pid_obj(dude_obj,PID_TOMORROW_MAP); add_mult_objs_to_inven(self_obj,var0,1); rm_obj_from_inven(dude_obj,var0); call Node250; end procedure Node250 begin Reply(250); gsay_option(NAME,251,Node260,-1); gsay_option(NAME,22,DialogEnd,-1); end Все отлично работает... НО! При любой попытке выхода из локации на мировую карту происходит вылет в систему... Ремиш процедуру Remuv, и корректируешь переход на Node250 все работает. В чем может быть глюк в процедуре Remuv? Там же нет ничего сложного?...
----- За сим прощаюсь, Олег.
|
Отправлено: 1:49 - 18 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Код:
procedure Remuv begin variable var0; var0:=create_object(PID_SUPER_STIMPAK,0,0); add_mult_objs_to_inven(dude_obj,var0,1); var0:=obj_carrying_pid_obj(dude_obj,PID_TOMORROW_MAP); add_mult_objs_to_inven(self_obj,var0,1); rm_obj_from_inven(dude_obj,var0); call Node250; end
Ну, во-первых, объект сначала убирают из инвентаря, а затем помещают его в инвентарь другого объекта:
Код:
restock_obj := obj_carrying_pid_obj(source, the_pid); restock_trash := rm_mult_objs_from_inven(source, restock_obj, restock_amt); add_mult_objs_to_inven(target, restock_obj, restock_amt);
Вообще, посмотри COMMAND.H, секцию "General commands restocking inventory". Потому что так просто удалять объект из инвентаря нельзя -- если он в руке или "одет", анимация сглючит. Не смертельно, но некрасиво. ЗЫ Кстати, там кое-где в макросах ошибочки есть: вместо who_obj используется self_obj. Так что использовать их надо осторожно . И ошибки исправить .
|
Отправлено: 10:47 - 18 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Цитата:
Ну, во-первых, объект сначала убирают из инвентаря, а затем помещают его в инвентарь другого объекта: Вообще, посмотри COMMAND.H, секцию "General commands restocking inventory". Потому что так просто удалять объект из инвентаря нельзя -- если он в руке или "одет", анимация сглючит. Не смертельно, но некрасиво. ЗЫ Кстати, там кое-где в макросах ошибочки есть: вместо who_obj используется self_obj. Так что использовать их надо осторожно . И ошибки исправить .
Ну вообще-то делал как вы с пробками показывали... А за подсказку спасибо, бум посмотреть... Кстати я выкрутился тем, что сначало удалял, а потом создавал снова... Несколько такой, заход не через то место...
----- За сим прощаюсь, Олег.
|
Отправлено: 13:38 - 18 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
С пробками? С крышками/бабками/тугриками? Так там можно, там логика другая.
|
Отправлено: 10:31 - 20 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
ЭЭЭЭ Не уловил разници... Что пробки, что стимпаки сие есть инвентарь и лежит в мешке... В чем разность логики? Просветите пожалуста Уточняю, рассматривается мешок, а не руки и тело, там да другая логика, сначало лучче снять, а потом удалять...
----- За сим прощаюсь, Олег.
|
Отправлено: 14:22 - 20 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Для работы с крышками есть функция item_caps_adjust. И тут уже не важно, дал ты сначала или отнял. Вообще движок деньги как-то отдельно обрабатывает. Как -- уже вопрос к двиглоковырятелям. С объектами просто надо помнить логику. Удаление: 1. Получил указатель. 2. Убрал из рук. 3. Убрал из инвентаря. 4. Удалил. Перемещение: 1. Получил указатель. 2. Убрал из рук. 3. Убрал из инвентаря. 4. Положил в другой инвентарь.
|
Отправлено: 16:05 - 20 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
А что есть за такая процедура combat_is_starting_p_proc и combat_is_over_p_proc? combat_p_proc - выполняется во время боя, а эти когда и что делают? В описаниях ничего не нашол про них... Просветите пожалуста, вдруг нужная штука... ЗЫ: Судя по названиям они вызываются при начале и конце боя?
----- За сим прощаюсь, Олег.
|
Отправлено: 0:22 - 22 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Угу. Проверяется просто: запихиваешь в эти процедуры display_msg("combat is starting") и display_msg("combat is over") соответственно. Ну и смотришь ;).
|
Отправлено: 8:48 - 22 Сент., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Мне нужно в сюжете использование сотового телефона. Вот кусок скрипта:
Код:
procedure use_p_proc begin call talk_p_proc; end procedure talk_p_proc begin script_overrides; start_gdialog(5,dude_obj,-1,-1,-1); GSay_Start; call opt; GSay_End; End_Dialogue; end procedure opt begin gsay_reply(-1,"(ў®§®¦лҐ ¤Ґ©бвўЁп)"; gsay_option(-1, "Ћв«®¦Ёвм ®ЎЁ«Єг", enj, 0); giq_option(6, -1,"‡ў®Ёвм Їа®ЇгйҐл© §ў®®Є", prop, 0); giq_option(6, -1, "Џ®§ў®Ёвм ў Ё«ЁжЁо", enj, -1); giq_option(5, -1, "‚л§ў вм бЄ®аго Ї®б®йм", enj, -1); end
Если телефон использовать из руки при закрытом инвентаре то все хорошо. Открывается окно диалога и все как надо. А если телефон использовать из открытого инвентаря, то к сожалению окно диалога рисуется частично под окном инвентаря частично поверх. Получается некрасиво. Полазил по BIS_help в поисках чего-нибудь подходящего чтоб из скрипта перед вызовом диалога закрыть окно инвентаря, или как то иначе решить проблу не чего подходящего не нашел, возможно не по глазам. Мож кто что подскажет?
|
Отправлено: 14:40 - 24 Сент., 2006 | ИСПРАВЛЕНО: Keha - 14:42 - 24 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Пока не знаю чем помочь, но такая-же проблема была в моде EPA со скриптом для буклета-путеводителя по ЕРА, вышло обновление, посмотри может там это уже решено?...
----- За сим прощаюсь, Олег.
|
Отправлено: 21:04 - 24 Сент., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Код:
call talk_p_proc;
Плохо доку смотрел, плохо . Не надо делать явный вызов talk_p_proc, для этого есть dialogue_system_enter. ЗЫ EPA, EPA... обижаете отечественного разработчика . Про ступку в первой версии НВ забыли?
|
Отправлено: 8:18 - 25 Сент., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Большое спасибо, с dialogue_system_enter все завработало так как нужно.
|
Отправлено: 16:20 - 25 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Хм... Не предполагал, что dialogue_system_enter можно с предметами использовать... Думал, что только с криттерами... Спасибо за наводку...
----- За сим прощаюсь, Олег.
|
Отправлено: 21:01 - 25 Сент., 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Чего-то запутался... С target_obj и source_obj Я перекладываю в инвентарь НПС пулемет Процедура pickup_p_proc Кто я и кто пулемет? Далее: Процедура destroy_p_proc НПС погибает после того, как чузен выпустил в него содержимое огнемета. Чузен это target_obj или source_obj Оружие от которого погиб НПС это target_obj или source_obj Единственное, что нашел: http://www.teamx.ru/cgi-bin/ikonboard/topic.cgi?forum=14&topic=41&start=30
|
Отправлено: 22:05 - 25 Сент., 2006 | ИСПРАВЛЕНО: Akkella - 22:16 - 25 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
по первому пункту, а причем тут пулемет? 8) Он просто обьект, источник чузен или кто там его передает, а приемник непесь... Ай стоп! Тут же pickup_p_proc А ну тадыть для непися чузен будет source_obj вызвавший процедуру pickup_p_proc. По второму вопросу. Ну тут вроде как просто, если destroy_p_proc вызвали действия чузена, то destroy_p_proc в скрипте непися вернет указатель на source_obj, то бишь чузена. А пулемет, это просто указатель чем было произведено действие на непися... ЗЫ: не совсем понял в чем проблема, то?
----- За сим прощаюсь, Олег.
|
Отправлено: 1:22 - 26 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 2:19 - 26 Сент., 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Проблема в том, что и в первом и во втором случае нужно получить указатель на пулемет или огнемет. Во втором случае, через тернии удалось получить только тип повреждения...
|
Отправлено: 6:10 - 26 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Угу пнятна, ну тут логика такая: Смотрим кто нанес повреждение, ну а потом смотрим что именно у него в активной руке. Как правило у него там и есть пулемет... Интересно, а зачем тебе указатель на пулемет для мертвого обьекта? Если решать от чего умирать то вполне достаточно знать тип повреждения... Я так думаю... ЗЫ: И все равно я не понял сути проблемы Имея указатель на криттера, практически всегда можно узнать, что у него в карманах... Внимательней почитай доку по функциям BISскриптов, там почти все есть... Дока есть тут на сайте. ЗЗЫ: Вот например кусочек из нее: "obj_carrying_pid_obj(ObjectPtr who, int pid)" -проверяет есть ли предмет с таким пидом в инвентаре или нет, если есть то возвращает указатель на него...
----- За сим прощаюсь, Олег.
|
Отправлено: 8:46 - 26 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 9:03 - 26 Сент., 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Тка... Все сначала. Попробуем такую ситуацию: Чуз вставляет динамит НПС. Взрыв. Вариант1 НПС не погиб Вариант2 НПС погиб Нужно при случае когда взрыв или огонь и смерти НПС уничтожался весь инвентарь. Процедуры уничтожения инвентаря не требуется. Теперь понятно?
|
Отправлено: 17:18 - 26 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Эта ну тут совсем не причем чуз... Будет работа с damage_p_proc, source_obj будет динамит... проверку делашь и переход на уничтожение инвентаря... Кстати destroy_p_proc вызывается у меня тогда когда выходишь из combat mode... Это мои наблюдения, может я делаю что нетак? А да эта процедура обрабатывается самим движком. ЗЫ: Это логические выкладки, на практике не проверялось, так как небыло надобности...
----- За сим прощаюсь, Олег.
|
Отправлено: 20:29 - 26 Сент., 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Дак самое главное! Как сделать проверку, что НПС ласты склеил? А то получается, что он еще живой, но уже без инвентаря
|
Отправлено: 21:49 - 26 Сент., 2006 | ИСПРАВЛЕНО: Akkella - 21:49 - 26 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
РРРРР ... Так те нуно узнать что он кирдык?! Раньше мона было сказать? if (critter_state(object_непись)==CRITTER_IS_DEAD) then так далее пнятна?... object_непись - это есть указатель на непися... ставиш в криттер_п_проц и проверяешь живой он или как. можно еще в дамадж_п_проц можно в дестрой_п_проц Блин! Доку читал? Вот это http://www.teamx.ru/rus/bd/bis_help.shtml
----- За сим прощаюсь, Олег.
|
Отправлено: 22:12 - 26 Сент., 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Вроде оно... Если ставлю в дамадже. Делаю проверку на тип повреждений, если взрыв или огонь, то проверка на кирдык, делит инвентарь. Черт. Все легко оказывается. Завтра проверю, что выйдет. Доку похоже скоро наизусть знать буду...
|
Отправлено: 22:25 - 26 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
Неа, лучче наверно сначала на кирдык, а потом на все остальное... Структура процедуры будет понятней и проще... А можно ваще все в один иф заталкать типа если тип дамажа огонь или взрыв и неписю кирдык то делаем то-то и то-то иначе другое... Примерно так... ЗЫ: А доку просто знать наизусть эт фигня... Вот научится всем этим пользоваться - трудно... Потеть нуно, вот тож сижу и потею...
----- За сим прощаюсь, Олег.
|
Отправлено: 0:09 - 27 Сент., 2006
|
|
Wertel
Пользователь Регистрация: Сент. 2006
Всего: 16 сообщений
|
Взял скрипт Мирии из AL и декомпелировал,немного редоктировал и он обратно не хочет компелироваться.Побробовал без редоктирования,тоже не хочет.И ещё там в двух местах прописано отображение брони,где ошибка?
|
Отправлено: 15:19 - 28 Сент., 2006
|
|
Oleg1969
Пользователь
Откуда: Саратов Регистрация: Май 2006
Всего: 168 сообщений
|
А что компилятор пишет? Уж дюже ты неинформативно написал...
----- За сим прощаюсь, Олег.
|
Отправлено: 16:50 - 28 Сент., 2006
|
|
Wertel
Пользователь Регистрация: Сент. 2006
Всего: 16 сообщений
|
Вот что пишет-Stack Overflow!
|
Отправлено: 17:14 - 28 Сент., 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Будешь и дальше так же лаконично описывать - тебе никто не поможет. Начинать надо с производителя и версии компилятора, а так же декомпилятора. И фрагмента кода до изменения и после изменения. И того, собираются ли другие скрипты или тоже - нет.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 17:29 - 28 Сент., 2006
|
|
Wertel
Пользователь Регистрация: Сент. 2006
Всего: 16 сообщений
|
Декомпилятор-int2ssl_1.52,компилятор BISовский официальный.Все остальпые срипты нормально работают,Мирия даже без изменений не компелируется!
|
Отправлено: 17:40 - 28 Сент., 2006
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
1. Возьми в файловом разделе int2ssl v1.54. В 1.52 была пара неприятных багов. 2. Там же возьми нормальный компилятор от Anchorit'a. В BIS'овском тоже есть пара неприятных багов. 3. Сообщи результат.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 18:41 - 28 Сент., 2006 | ИСПРАВЛЕНО: Alchemist - 19:01 - 28 Сент., 2006
|
|
Perceptron
Модератор
Откуда: Ivanovo Регистрация: Май 2003
Всего: 502 сообщения
|
В утилях валяется версия 1.54. Попробуй ее.
|
Отправлено: 18:48 - 28 Сент., 2006
|
|
Wertel
Пользователь Регистрация: Сент. 2006
Всего: 16 сообщений
|
Всё получилось,большое спасибо.Остался вопрос по поводу отображения брони-дважды прописано.
|
Отправлено: 18:54 - 28 Сент., 2006
|
|
Panzer
Пользователь
Откуда: Санкт-Петербург Регистрация: Март 2005
Всего: 9 сообщений
|
Уважаемые жители форума. Я совсем недавно решил разобраться в моддинге фолла, скачал много программ, кое-какие документации и начал самообучение, так сказать. Начал читать руководство о скриптах вот это, однако дочитав до места где говориться о каком-то файле define.h, вошел в ступор. Что это за файл? Где его взять? Написано: в редакторе, в папке хедс, однако там вообще папок нет, вот и прошу помощи в нахождении данного файла. З.Ы. Извините что не прочитал все 66 страниц, возможно там был ответ, просто мое время пребывания в интернете очень ограничено, и я просто быстрее получу ответ если все таки спрошу....
----- Столбом огня и серы мир взлетел на воздух В чудо верить никогда не поздно...
|
Отправлено: 5:28 - 18 Окт., 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
*.h файлы - это файлы заголовки (они же хэадеры). В этих файлах ведется объявление констант и макросов (макроопределений). Изначально редактор карт от BIS поставлялся в архиве вместе с исходниками скриптов и компилятором. TeamX разделила архив на отдельные части: исходники скриптов и сам редактор карт. Если вы скачаете архив с исходниками, то увидите в нем каталог header (или что-то в этом роде), в котором и будут лежать эти заголовки. О том, зачем нужны эти заголовки и как их использовать, написано в доке по препроцессору, которая прилагается к "Fallout Scripts: How To?".
----- hit me, nail me, make me god
|
Отправлено: 8:35 - 18 Окт., 2006
|
|
Panzer
Пользователь
Откуда: Санкт-Петербург Регистрация: Март 2005
Всего: 9 сообщений
|
Все нашел, да и еще все скрипты игры там есть))) Спасибо за помощь)
----- Столбом огня и серы мир взлетел на воздух В чудо верить никогда не поздно...
|
Отправлено: 18:47 - 19 Окт., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Panzer Не надо необоснованно использовать жирный шрифт. Не забудь скачать отсюда "довесок" от Haenlomal'а. Ибо у БИС там не последней версии скрипты.
|
Отправлено: 8:53 - 20 Окт., 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
У меня такой вопрос: В обработчике криттеров combat_p_proc, fixed_param == 1 это:
Цитата:
COMBAT_SUBTYPE_WEAPON_USED (1) - было использовано оружие.
Так вот, кто знает действительно ли это так и параметр возвращается. В скриптах фолла подобного нет. Я сколько не изгалялся так рабочего результата и не добился.
Код:
procedure combat_p_proc begin if (fixed_param == 1) then begin display_msg("Weapon used" ) ; end end
Во время боя (после использования оружия ничего не выводится). Неужто я настолько забыл скриптинг Надо исправляться
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:08 - 8 Ноября, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
На всякий случай, что я некогда получил в результате собственных экспериментов.
Цитата: combat_p_proc fixed_param == 1 ??? fixed_param == 2 Успешное попадание собственника скрипта по своей цели, и только это. target_obj == тот, в кого попали (именно попали, а не хотели попасть), не знаю как насчет очереди. fixed_param == 3 ??? fixed_param == 4 Начало хода собственника скрипта. В том случае, если собственник ход пропустил, обработчик вызван не будет. target_obj == self_obj. fixed_param == 5 Если наступает, то это самое начало боя, до того, как fixed_param == 4. Это значит то, что персонаж еще не определен с тем, как он вступает в бой, на чъей он стороне. Более понятно скриптовикам: событие наступает тогда, когда персонаж оказывается в битве, причем его TEAM_NUM в битве не учавствует, и его в битву никто не втравливал. target_obj == self_obj. source_obj == при любом fixed_param это тот, кто был target_obj в прошлый раз (во время прошлого вызова combat_p_proc в этом же скрипте при любом fixed_param).
Код:
procedure combat_p_proc begin if (fixed_param == 1) then begin display_msg("Weapon used" ) ; end end
Или я ничего не понял, или здесь не хватает target_obj или source_obj? P.S.
Цитата: COMBAT_SUBTYPE_WEAPON_USED (1) - было использовано оружие.
А это достоверно? Вспомнить хотя бы obj_can_hear_obj и obj_can_see_obj.
----- hit me, nail me, make me god
|
Отправлено: 1:53 - 9 Ноября, 2006 | ИСПРАВЛЕНО: Alan Killenger - 2:57 - 9 Ноября, 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Цитата: Или я ничего не понял, или здесь не хватает target_obj или source_obj?
А они разве там нужны? Этот код написан в Obj_dude. Покрайней мере fixed_param == 2 и fixed_param == 4 работают и без target_obj или source_obj.
Цитата: А это достоверно? Вспомнить хотя бы obj_can_hear_obj и obj_can_see_obj.
А вот это я как раз и спрашивал. (см. пред. пост) В доке от WG написанно именно это. Но с другой стороны, сколько я не пытался так у меня по fixed_param == 1 ничего не сработало. Что самое интересное: в доке идущей с маппером и описывающей "Script Action Descriptions" нет упоминания о COMBAT_SUBTYPE_WEAPON_USED.
Цитата: Combat: Combat is occurring, and one of the combat sub-actions has occurred. These actions allow the script to react to combat (even though combat attack/etc. choices are actually handled in the engine). They are: • HIT_SUCCEEDED -- The scripts’ object successfully hit it’s target. This can be used to do extra damage (radiation, for example), or to count the attacks that succeed. • SEQUENCING – Combat sequencing is being checked (to see if critters want to enter/exit combat). • TURN – A combat turn is just about to start. You can override the default turn behavior here to prevent a critter from reacting to combat (or to cause them to do something special). • NONCOM_TURN – (UNUSED).
P.S. Тогда у меня более общий вопрос: Можно ли узнать, что игрок стрелял из оружия? Причём не только при попадании в цель но и при промахе?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:23 - 9 Ноября, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: в доке идущей с маппером и описывающей "Script Action Descriptions" нет упоминания о COMBAT_SUBTYPE_WEAPON_USED
Часть того, что описано в доке, взята напрямую из заголовков БИС. Проверялось далеко не всё, так что дополнения и исправления приветствуются .
Цитата: Можно ли узнать, что игрок стрелял из оружия? Причём не только при попадании в цель но и при промахе?
"Изнашиваемое оружие", да? У Рейвена в своё время так и не получилось это узнать, т.к. сам момент выстрела уловить, вроде как, нельзя, а дамаж_п_проц вызывается только при нанесении повреждения, т.е. если удар был поглощён бронёй, то процедура эта не вызовется. Тем более не вызовется она при промахе. ЗЫ Кстати, проверять параметры надо не только в скрипте Дуда, но и в скрипте "жертвы".
|
Отправлено: 11:55 - 10 Ноября, 2006
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Цитата: "Изнашиваемое оружие", да?
Нет, но близко Мои цели более прозаичны. Мне в принципе хватит и отслеживания при попадании, но хотелось бы знать всё
Цитата: ЗЫ Кстати, проверять параметры надо не только в скрипте Дуда, но и в скрипте "жертвы".
Нет, не надо. Достаточно в скрипте дуда написать
Код:
if (fixed_param == 2) then begin //код end
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 14:49 - 10 Ноября, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: Нет, не надо.
Нет, надо . Я говорю об экспериментальном выяснении смысла параметров. Потому как не ясно, например, COMBAT_SUBTYPE_WEAPON_USED - было ли использовано оружие объектом или на объекте. Если бы у меня было время , я бы прописала все эти варианты в скриптах и Дуда, и жертвы. И устроила бы битву века .
|
Отправлено: 11:20 - 14 Ноября, 2006
|
|
Austin
Пользователь
Откуда: Москва Регистрация: Сент. 2006
Всего: 44 сообщения
|
Я тут пишу мод брони для Маркуса, и возникла проблема. Состоит она вот в чем. Я хочу, чтобы после изготовления брони не просто менялся внешний вид Маркуса (это у меня получилось), но и повышались его характеристики (класс брони, сопротивляемость и пр.). Сначала я пробовал сделать все это через скрипты, с помощью set_critter_stat(ObjectPtr who, int stat, int amount). Для проверки я написал в той процедуре, в которой на Маркуса одевалась броня: set_critter_stat(Marcus_Ptr, STAT_max_move_points, 3) - дал ему три очка действия. Скомпилировал, запустил, посмотрел на экранчик управления у Маркуса - очков действия так и осталось 9. Пробовал с другими параметрами - то же самое. Почему-то эта функция не работает на Маркусе. Еще я пробовал просто создать новый итем брони и прописать в нем все характеристики. Создал. Одеваю сам - превращаюсь в мутанта в броне. Даю Маркусу - не хочет одевать. Вопрос в следующем: 1) Можно ли сделать так, чтобы Маркус согласился одеть броню, которая у него в инвентаре? Причем не любую, а именно ту, которую я создал?. 2) Если первое никак невозможно, то почему на Маркусе не работает функция set_critter_stat и как можно поднять ему характеристики через скрипты?
|
Отправлено: 18:48 - 16 Ноября, 2006 | ИСПРАВЛЕНО: Austin - 18:50 - 16 Ноября, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Документация по созданию партийца для начинающих моддеров. AP -- производная характеристика. Менять производные характеристики непосредственно нельзя. По крайней мере у меня это не получалось. Если так хочется поднять AP, можно попробовать повесить на Мркуса перк "Action Boy". Кажется, перки вешаются не только на Дуда.
|
Отправлено: 9:39 - 17 Ноября, 2006
|
|
Austin
Пользователь
Откуда: Москва Регистрация: Сент. 2006
Всего: 44 сообщения
|
Цитата: Quote: from Wasteland Ghost on 9:39 - 17 Ноября, 2006 AP -- производная характеристика. Менять производные характеристики непосредственно нельзя. По крайней мере у меня это не получалось. Если так хочется поднять AP, можно попробовать повесить на Мркуса перк "Action Boy". Кажется, перки вешаются не только на Дуда.
Попробовал добавить перки - заработало! Выход найден. Спасибо!
|
Отправлено: 11:36 - 17 Ноября, 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Вот это нашел в скрипте дуда: has_trait(1, dude_obj, 0) Описание команды в доке: int has_trait(int trait_type, ObjectPtr who, int trait) - вернуть значение указанного свойства Аргументы: trait_type - тип трейта: TRAIT_PERK (0) TRAIT_OBJECT (1) TRAIT_TRAIT (2) who - указатель на криттера trait - если trait_type = TRAIT_PERK - номер перка (см. DEFINE.H раздел Perk Trait Types) если trait_type = TRAIT_TRAIT - номер трейта (см. DEFINE.H раздел Trait Types) если trait_type = TRAIT_OBJECT - номер особого свойства: Возвращаемое значение: если trait_type = TRAIT_PERK ли trait_type = TRAIT_TRAIT - проверяет наличие перка/трейта если trait_type = TRAIT_OBJECT: OBJECT_AI_PACKET (5) - возвращает номер AI OBJECT_TEAM_NUM (6) - возвращает номер команды OBJECT_CUR_ROT (10) - возвращает направление взгляда (0...5) OBJECT_VISIBILITY (666) - возвращает видимость (TRUE, FALSE) OBJECT_CUR_WEIGHT (669) - возвращает текущий вес Вопрос: Что за особое свойство 0 в TRAIT_OBJECT
|
Отправлено: 20:08 - 20 Ноября, 2006 | ИСПРАВЛЕНО: Akkella - 20:10 - 20 Ноября, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Цитата: если trait_type = TRAIT_OBJECT: OBJECT_AI_PACKET (5) - возвращает номер AI OBJECT_TEAM_NUM (6) - возвращает номер команды OBJECT_CUR_ROT (10) - возвращает направление взгляда (0...5) OBJECT_VISIBILITY (666) - возвращает видимость (TRUE, FALSE) OBJECT_CUR_WEIGHT (669) - возвращает текущий вес
Ну вот оно и особое свойство. Следует понимать, ято это свойство не системы SPECIAL, а просто технический переключатель, позволяющий получить доступ к некоторым техническим параметрам реализации NPC в игре. Каким именно - выше описано. Или я не въехал? Какое "особое свойство 0"?
----- hit me, nail me, make me god
|
Отправлено: 20:53 - 20 Ноября, 2006 | ИСПРАВЛЕНО: Alan Killenger - 21:54 - 20 Ноября, 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Alan Killenger В скрипте дуда есть следующая функция (в расчете желудка) has_trait(1, dude_obj, 0) Это означает, что она возвращает значение особого свойства дуда под номером 0. Так вот: Что это за свойство?
|
Отправлено: 21:18 - 20 Ноября, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
В случае trait_type == TRAIT_PERK тот аргумент попросту неиспользуется. Пиши там все, что захочется. Общепринято писать в таких случаях 0, но разницы никакой.
----- hit me, nail me, make me god
|
Отправлено: 0:22 - 21 Ноября, 2006
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Alan Killenger Тут случай TRAIT_OBJECT. И аргумент используется в расчетах.
|
Отправлено: 7:26 - 21 Ноября, 2006
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
А, въехал наконец. То есть вы декомпилировали скрипт дуда и нашли недокументрованное значение параметра? Чудненько. В таком случае, если ответ имеется, его определенно прийдется подождать. Тут давным-давно где-то база была по ковыряниям... уж не знаю, есть ли она сейчас... вроде fallout offcode... черт, не помню. Там скриптовики ковырятели записывали свои заметки, там надо либо посмотреть, может что по теме найдете, либо записать ваши наблюдения... на память потомкам.
----- hit me, nail me, make me god
|
Отправлено: 11:36 - 21 Ноября, 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Не работает желудок. Там в коде целая куча ошибок. Например, там везде сравниваются указатель и PID . Забей на этот код .
|
Отправлено: 13:08 - 21 Ноября, 2006
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Я хотел задать характеристики персонажа то есть self через скрипт например все параметры в PID персонажа ставить в ноль а потом скриптом их задавать пример Эти характеристики не задаются, это вообще осуществимо может нужно как то по-другому или это движок, а если движок, то может байтик какой-нибудь поменять set_critter_stat(self_obj, STAT_current_hp, 200); set_critter_stat(self_obj, STAT_st, 10); set_critter_stat(self_obj, STAT_pe, 10); set_critter_stat(self_obj, STAT_en, 10); set_critter_stat(self_obj, STAT_ch, 10); set_critter_stat(self_obj, STAT_iq, 10); set_critter_stat(self_obj, STAT_ag, 10); set_critter_stat(self_obj, STAT_lu, 10); Эти характеристики задать можно critter_mod_skill(self_obj, SKILL_SMALL_GUNS, 100); critter_mod_skill(self_obj, SKILL_BIG_GUNS, 100); critter_mod_skill(self_obj, SKILL_ENERGY_WEAPONS, 100); critter_mod_skill(self_obj, SKILL_UNARMED_COMBAT, 100); critter_mod_skill(self_obj, SKILL_MELEE, 100); critter_mod_skill(self_obj, SKILL_THROWING, 100); critter_mod_skill(self_obj, SKILL_FIRST_AID, 100); critter_mod_skill(self_obj, SKILL_DOCTOR, 100); critter_mod_skill(self_obj, SKILL_SNEAK, 100); critter_mod_skill(self_obj, SKILL_LOCKPICK, 100); critter_mod_skill(self_obj, SKILL_STEAL, 100); critter_mod_skill(self_obj, SKILL_TRAPS, 100); critter_mod_skill(self_obj, SKILL_SCIENCE, 100); critter_mod_skill(self_obj, SKILL_REPAIR, 100); critter_mod_skill(self_obj, SKILL_CONVERSANT, 100); critter_mod_skill(self_obj, SKILL_BARTER, 100); critter_mod_skill(self_obj, SKILL_GAMBLING, 100); critter_mod_skill(self_obj, SKILL_OUTDOORSMAN, 100);
|
Отправлено: 20:13 - 4 Июля, 2007
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Базовые характеристики явно задать нельзя. Но для каждой из них можно установить аддитивный модификатор, который может принимать и отрицательные значения. Попытку выхода результирующего значения за пределы 1...10 ограничит движок.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 21:16 - 4 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist Вы можете показать пример как установить аддитивный модификатор?
|
Отправлено: 21:26 - 4 Июля, 2007
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Код:
variable adj; adj := -1; set_critter_stat(self_obj, STAT_pe, adj);
Уменьшить значение Perception на единицу.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 14:20 - 5 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist variable adj; adj := -1; set_critter_stat(self_obj, STAT_pe, adj); Сделал все так же но stat не увеличивается и не уменьшается (Добавление от 15:33 - 5 Июля, 2007.) Кто нибудь знает как одет броню персонажа через скрипт Не заменить вид персонажа а именно одеть Вот как я делал но что то не получается wield_obj((critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, tile_num(self_obj), elevation(self_obj))); wield_obj((critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, 0, 0)); И даже так add_obj_to_inven(self_obj, (critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, 0, 0))) add_obj_to_inven(self_obj, (critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, tile_num(self_obj), elevation(self_obj))));
|
Отправлено: 15:14 - 5 Июля, 2007
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Цитата: Я декомпелирую скрипты fallout1
Надо было вот с этого начинать. В F1 базовыми характеристиками действительно заведует движок и только движок. В F2 же этот код вполне работает. -- Update --
Код:
variable armour; armour := create_object(PID_METAL_ARMOR, 0, 0); add_obj_to_inven(self_obj, armour); wield_obj(obj_carrying_pid_obj(self_obj, PID_METAL_ARMOR));
Со скриптами -- детский сад. Твои примеры сводятся к wield_obj(false) и add_obj_to_inven(self_obj, false). Если не понимаешь синтаксиса языка, посмотри для начала, как это сделано в исходниках. Благо, доступ к ним имеется, да и декомпилятор в помощь.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 16:57 - 5 Июля, 2007 | ИСПРАВЛЕНО: Alchemist - 18:46 - 5 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist > Надо было вот с этого начинать. В F1 базовыми характеристиками действительно заведует движок и только движок. В F2 же этот код вполне работает. variable adj; adj := -1; set_critter_stat(self_obj, STAT_pe, adj); Я это делаю в fallout2 но ничего не изменяет в map_enter_p_proc variable adj; adj := -1; set_critter_stat(self_obj, STAT_st, adj); Сила персонажа critter_p_proc в proto файле персонажа сила = 8 Чтобы проверить изменяет ли он или нет if (get_critter_stat(self_obj, STAT_st )==8) then float_msg(self_obj,"сила равна 8", 3); else float_msg(self_obj,"сила неравна 8", 3); Он выдает это float_msg(self_obj,"сила равна 8", 3); > детский сад. Эх, давненько это было > Если не понимаешь синтаксиса языка, посмотри для начала, как это сделано в исходниках Ну что ж посмотрю
|
Отправлено: 19:41 - 5 Июля, 2007
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Цитата: Я это делаю в fallout2 но ничего не изменяет в map_enter_p_proc
Для криттера этот обработчик может и не вызываться. Выбери другой. Это раз. Данная операция вообще имеет смысл только для dude_obj. Это два. Контролировать значения параметров надёжнее всего через окошко персонажа. Это три. Плохой, но рабочий пример обращения с базовой характеристикой персонажа можно посмотреть в скрипте Pariah Dog. Только обрати внимание, что их там два: один для локации, другой -- для собаки. Это четыре.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 20:19 - 5 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Выяснил что self_obj через скрипты нельзя повышать или понижать характеристики а dude_obj можно (Добавление от 22:14 - 5 Июля, 2007.) Ну и последний вопрос как сделать так чтобы единицы здоровья больше 100 не повышались. Пробывал так while (get_critter_stat(dude_obj, STAT_max_hp) > 100) do begin set_critter_stat(dude_obj, STAT_max_hp, - (1)); end не получилось но зато Windiws XP висанул а писали что никогда не виснет если хотите это проверить перепишите в скрипт dude_obj в проседуру critter_p_proc еще пробывал так if (get_critter_stat(dude_obj, STAT_current_hp) > 100) then begin set_critter_stat(dude_obj, STAT_current_hp ,100); end и так if (get_critter_stat(dude_obj, STAT_max_hp) > 100) then begin set_critter_stat(dude_obj, STAT_max_hp,100); end Так вот это реализуемо? Может байтик поменять в fallout2.exe
|
Отправлено: 21:11 - 5 Июля, 2007
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Цитата: ObjectPtr self_obj - возвращает указатель на объект, в скрипте которого выполняется ObjectPtr dude_obj - возвращает указатель на игрока
Чиатй доку и внимательно смотри пост Alchemist'а.
Цитата: не получилось но зато Windiws XP висанул а писали что никогда не виснет если хотите это проверить перепишите в скрипт dude_obj в проседуру critter_p_proc
У меня мощности компьютера вполне хватает, чтобы закрыть "подвисший" процесс. Это раз. Обработчик critter_p_proc выполняется всегда, причём несколько раз в секунду (хм... 10 раз? по тикам что-ли...) Отсюда такие результаты. Это два (заразно, блин )
Цитата: Может байтик поменять в fallout2.exe
Блин. Что все так бросаются этой фразой. Хоть бы раз посмотрели на fallout2.exe в дизассемблереном виде и попытались там что-то найти. А также попробывали повозиться с отладчиками или REC Studio...
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 23:37 - 5 Июля, 2007 | ИСПРАВЛЕНО: Ray - 22:39 - 5 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Ray > Чиатй доку и внимательно смотри пост Alchemist'а. Доку читал и пост перечитал то есть нельзя получается > Блин. Что все так бросаются этой фразой. Хоть бы раз посмотрели на fallout2.exe в дизассемблереном Смотрел ниче не понял очень много цифр > виде и попытались там что-то найти. А также попробывали повозиться с отладчиками или REC Studio... Не я в этом полный ноль так я и задал этот вопрос знающим на него ответ Так можно или нет?
|
Отправлено: 0:04 - 6 Июля, 2007
|
|
Spy
Реалист
Откуда: Все там будем... Регистрация: Май 2005
Всего: 374 сообщения
|
Цитата: Так можно или нет?
Конечно можно! Только байтиком тут, боюсь, необойдётся. Чтобы исправить что-то в движке как следует (т.е. так, чтобы потом не было глюков), нужно обладать недюжим интеллектом, памятью, кучей времени и страстным желанием. Практика показывает, что сочетается всё это в одном человеке чрезвычайно редко. Так что я предложу тебе забыть идею про "байтик в движке".
----- Хочешь, чтобы что-то было сделано хорошо - сделай сам.
|
Отправлено: 2:02 - 6 Июля, 2007 | ИСПРАВЛЕНО: Spy - 2:05 - 6 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Spy > Так что я предложу тебе забыть идею про "байтик в движке". Прям как в анекдоте - Хорошее пальто было - Да (печально) - Ну и хрен сним to All Еще пара вопросов вы уж меня не rtfm вопросы у меня не банальные то есть не такие как скомпилировать скрипт или что такое макрос Мне в процедуре combat_p_proc зделать проверку если на self было использовано оружие то есть ударили или выстрелили пример если на self было использовано оружие отравленное копье то повысить отравление self if (weapon_dmg_type(DMG_normal_dam == obj_pid(PID_SPEAR))) then critter_dmg(dude_obj, 50, DMG_normal_dam); Но тут нужно через какойто параметр fixed_param И еще Мне нужно чтобы чуз с одной карты скриптово появился скриптово на другой Пример в наваро но на 2 elevation load_map(Имя_карты,параметр) load_map("Navarro",0); но он загрузит первый ELEVATION dude окажется на бензакалонке а мне нужен 2 или 3 И вот вопросик который я давно хочу задать можно ли сделать проверку у партийуев да у любого персонажа маркус в процедуре combat_p_proc если в руках пулемет и он стреляет в цель а рядом есть сопартийцы 1 вариант убрать оружие и взять другое 2 вариант атаковать другого 3 вариант вывести float и изменить значение GVAR выдает сообщение разайдись GVAR меняется а в скриптах партийцев Если гвара такая то или атаковать других или атайти от цели на 5 tile А то если у него в руках пулемет э таж смерть для всей команды Жмем на dude выбираем бинокль создается окошко как в Mrfixit Там команды если в партии есть маркус то есть команды для маркуса если в партии то тото.... И еще есть команды для всех Пример именно в бою Разойдись или отступаем и все партийцы убегают с карты Или приказ ленни подлечи вика и ленни бежит и лечит Так вот это возможно реализовать я буду пробывать но просто ответье пример Это нельзя реализоватьююю а за это отвечает движок или вот это можно и сделать Кто нибудь может скинуть оригинальные текста fallout1 папку game Ну очень надо
|
Отправлено: 10:35 - 6 Июля, 2007 | ИСПРАВЛЕНО: Jordan 63 - 10:38 - 6 Июля, 2007
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Возможно все, дерзай. У меня, когда я писал партийцев, кроме всего прочего, была идея реализации г.и. для командования. Но не хватило времени. Так что доки в руки и вперед.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 14:55 - 6 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Еще 40 вопросов от Jordan 63 ) Хотел реализовать если у персонажа клинта в руке пулемет и дистанция то есть если dude стоит рядом с врагом примерно <= 3 tile тогда клинт убирает оружие и идет в рукопашку. Без дистанции все отлично работает а вот с дистанцией проблемы fallout2 вылетает я знаю это мой косяк а вот примеры что не так procedure combat_p_proc begin if (critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)!=0) then begin if (obj_carrying_pid_obj(self_obj, PID_MINIGUN)) а вот примеры and (tile_distance(tile_num(dude_obj), tile_num(obj_pid(PID_DOG)))<=3) then and (tile_distance_objs((obj_pid(PID_DOG)), dude_obj) <=3) then //inven_unwield(self_obj); rm_obj_from_inven(self_obj, obj_carrying_pid_obj(self_obj, PID_MINIGUN)); end end А вот скрипт http://jordan631.narod.ru/party.rar копируйте в папку data и начинайте новую игру
|
Отправлено: 18:15 - 6 Июля, 2007 | ИСПРАВЛЕНО: Jordan 63 - 18:31 - 6 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Как организовать проверку if dude находтится на карте мира в такой то координате но меньше чем в такой то then Пример который не сомпилится ругается что ошибка then if ((worldmap_xpos == 11) and (worldmap_ypos == 9)) > and < ((worldmap_xpos == 493) and (worldmap_ypos == 349)) then
|
Отправлено: 13:40 - 8 Июля, 2007
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Я бы на месте компилера ещё не так ругалась . Что это за конструкция такая?
Цитата: > and <
Большая просьба грамотно, чётко и полно формулировать вопросы. Если не можешь сформулировать свой вопрос, это означает, что ты сам пока не понимаешь, что тебе нужно.
|
Отправлено: 20:16 - 9 Июля, 2007
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Возник такой вопрос. Привязал скрипт к оружию (возьмем просто для примера нож) Одна локальная переменная содержит некое число (не проблема) В скрипте дуда при определенных условиях в процедуре combat записывается в одну глобальную переменную флаг, а во вторую указатель. В скрипте оружия при обновление карты во время боевого режима (по идее несколько раз за ход) идет проверка на эти гвары и изменяется локальная переменная. Вернее должна менятся,но почему-то процедура map_update_p_proc в скрипте предмета не работает. Сам предмет находится в активной руке дуда. Есть ли данные или опыт по этому вопросу? На всякий случай код: procedure start; procedure map_update_p_proc; procedure start begin end procedure map_update_p_proc begin display_msg(message_str(1, 100)); if global_var(775)>0 and global_var(776)==self_obj then begin set_local_var(0, local_var(0)+1); set_global_var(755, 0); set_global_var(776, 0); display_msg(message_str(1, 859)); if local_var(0)==1 and random(local_var(0), 10)==local_var(0) then begin set_local_var(0, 0); display_msg(message_str(1, 850)); destroy_object(self_obj); end end end
|
Отправлено: 20:55 - 9 Июля, 2007 | ИСПРАВЛЕНО: Akkella - 22:49 - 9 Июля, 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Akkella global_var(776)==self_obj Это нормально ? Может тут процесс прерывается? Глобальные вары, там всегда работают. Просто вары тоже variable eklmn тоже. Jordan 63
Цитата: И еще есть команды для всех Пример именно в бою Разойдись или отступаем и все партийцы убегают с карты
anim(self_obj, ANIM_jump_begin, LVar2); jump_begin не использована в оригинале и сюда можно встроить свою анимацию, а затем ее скриптово проигрывать. "Рисуещь" анимацию под джамп(прыжок) в ручную, в смысле перииначиваещь обычную ходьбы/бега (не помню почему она так просто не подходит)(у меня где-то на Анклавера есть) и создаещь иллюзию перемешения, т.е. телепортирующь критера вручную-скриптово, а затем проигрываещь анимацию скриптово, хм, наоборот проигрываещь свою анимацию и затем телепортируещь, подобрав клетку. Но это коряво будет выглядеть в большей или меньшей степени так как синхронизировать их до идеала тоже самое, что подпрыгнуть и схватить пролетающюю мимо пулю - я не смог. Нормально внедряется только команда "Стоять и Недышать" Это предел: (если я код не попутал) procedure combat_p_proc begin /* if (fixed_param == 3) then begin float_msg(self_obj, "Sir!!! fixed_param = 3", 6); reg_anim_clear(self_obj); end If (fixed_param == 5) then begin float_msg(self_obj, "Sir!!! fixed_param = 5", 6); end */ // ждать приказ. if global_var(GVAR_WARCRAFT) == 1 then begin script_overrides; critter_injure( self_obj,DAM_KNOCKED_DOWN); anim(self_obj,ANIMATE_ROTATION,rotation_to_tile(tile_num(self_obj),tile_num(dude_obj))); anim(self_obj, ANIM_stand, rotation_to_tile(tile_num(self_obj),tile_num(dude_obj))); critter_injure( self_obj,DAM_KNOCKED_DOWN); //good //float_msg(self_obj, "Ok, I'm stand, Sir, Ok", 6); end //действовать самостоятельно. if global_var(GVAR_WARCRAFT) == 2 then begin critter_injure( self_obj,DAM_KNOCKED_OUT); //anim(self_obj, ANIM_stand, rotation_to_tile(tile_num(self_obj),tile_num(dude_obj))); critter_injure( self_obj,DAM_KNOCKED_OUT); float_msg(self_obj, "UYUYOYUrrrr, Sir", 6); end // исполнять приказ: Ко мне. if global_var(GVAR_WARCRAFT) == 3 then begin script_overrides; critter_injure( self_obj,DAM_KNOCKED_DOWN); LVar2 := rotation_to_tile(tile_num(self_obj),tile_num(dude_obj)); //float_msg(self_obj, "Sir!!! obj_get_rot(self_obj)=" + LVar2, 6); If (fixed_param == 4) then begin anim(self_obj, ANIMATE_ROTATION, rotation_to_tile(tile_num(self_obj),tile_num(dude_obj))); move_to(self_obj, tile_num_in_direction(tile_num(self_obj),LVar2,5), elevation(dude_obj)); anim(self_obj, ANIM_jump_begin, LVar2); set_global_var(GVAR_WARCRAFT,1); while (time_control_of_anim_combat <=1000) do begin time_control_of_anim_combat:= (time_control_of_anim_combat +1); if time_control_of_anim_combat == 900 then anim(self_obj,ANIM_swing_anim, LVar2); end end critter_injure( self_obj,DAM_KNOCKED_DOWN); end end Зато для раздачи команд можно использовать интерфейсные команды. ps Обработчик critter_p_proc срабатывает не менее ста раз в реальную секунду. ЕМНИП.
|
Отправлено: 0:26 - 10 Июля, 2007
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Цитата: global_var(776)==self_obj Это нормально ? Может тут процесс прерывается? Глобальные вары, там всегда работают. Просто вары тоже variable eklmn тоже.
Все нормально. В эту гвару указатель записывается.... Но мар апдейт не работает в принципе, посольку даже тестовое сообщение не выводит, которое должно выводиться при любых условиях. Может еще есть идеи?
|
Отправлено: 18:05 - 10 Июля, 2007
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Если мне не изменяет мой склероз, map_update во время боя не работает. А вообще, для предметов, находящихся в инвентаре, не вызываются очень даже многие обработчики. Инвентарь практически полностью обрабатывает движок. Кстати, многое зависит от подтипа предмета. Для misc-предметов, например, обработчик use вызывается, а для drug -- нет.
|
Отправлено: 9:15 - 12 Июля, 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Wasteland Ghost > Большая просьба грамотно, чётко и полно формулировать вопросы. Если не можешь сформулировать свой вопрос, это означает, что ты сам пока не понимаешь, что тебе нужно. Когда dude перемещается по карте мира то происходят случайные встречи грузится такая то карта и такие то персонажи а я хотел это так сказать отследить и переделать случайные встречи через скрипт только неспрашивайте зачем через недельку увидите. Так вот сообственно вопрос делаем скрипт и привязываем к картам случайных встреч пример в процедуре map_enter_p_proc пишем if (cur_map_index == MAP_RND_DESERT_1) and dude находиться в токой то координате на карте мира then Зато для раздачи команд можно использовать интерфейсные команды. Я так и делаю а вот насчет проигрываещь анимацию скриптово, а если сделать так lvar_bit(1,bit_1) set_lvar_bit_on(1,bit_1) set_gvar_bit_off(1, bit_1) приказ ко мне set_lvar_bit_on(1,bit_1) if lvar_bit(1,bit_1) then begin animate_move_to_tile(tile_num(dude_obj)) set_gvar_bit_off(1, bit_1) end Хотел реализовать если у персонажа клинта в руке пулемет и дистанция то есть если dude стоит рядом с врагом примерно <= 3 tile тогда клинт убирает оружие и идет в рукопашку. Ктонибудь знет как это сделать? И последний вопрос ктонибудь пришлите английские текста fallout1 точнее папку game ну очень надо У меня готовы все скрипты fallout1 то есть приведены к более менее исходному коду но осталось сделать CRITRPID.H а для этого нужно pro_crit.msg и maps.н
|
Отправлено: 15:24 - 12 Июля, 2007
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Прошу прощение за дезу. map_update работает во время боя и у криттеров и у предметов. Как обычно, дело в элементарной ошибке, не тот скрипт подключил. Все нормально, указатель и флаг передается в скрипт редмета, где, если указатели совпадают происходит расчет износа по флагу (кол-во выстрелов/ударов) Если износ критический предмет исчезает. Проблема износа теперь полностью решена, но остались еще две. 1 Оружие или броня разлетаются во время обновления (примерно два-три раза в минуту), а не во время удара/попадания 2 Серьезней.ю Теперь оружие и броню в кучи не складируешь, они занимают отдельный слот. Боюсь эти задачи нерешеные и если с первым можно мириться (Ну, ударил, а нож разлетелся через несколько секунд), то вторая портит геймплей. Впрочем, эта задача нерешаемая. И ее можно стерпеть, тем более этот способ позволяет использовать максимум 8 гвар...
|
Отправлено: 18:03 - 12 Июля, 2007
|
|
JSilver
Пользователь
Откуда: Moscow Регистрация: Июль 2007
Всего: 20 сообщений
|
есть такая функция: tile_contains_pid_obj (tile, elev, pid) "Возвращает указатель на первый объект с идентификатором прототипа (pid) находящийся на заданном тайле и этаже." вопрос: 1. существует ли возможность получить указатель не на первый, а на второй и далее объекты? 2. если не существует - тогда существует ли хотя бы возможность узнать - а есть ли в этом тайле еще другие объекты того же pid'а? условие: верхний объект, естественно, нельзя передвигать, уничтожать и прочее, т.е. делать второй - первым (вследствие отсутствия бывшего первого) и обрабатывать его уже как первый.
|
Отправлено: 7:27 - 14 Июля, 2007
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Цитата: Quote: from Akkella on 18:03 - 12 Июля, 2007 2 Серьезней.ю Теперь оружие и броню в кучи не складируешь, они занимают отдельный слот.
Вот об этом я тебе и говорил, когда говорил почитай темы. Эта проблема уже обсуждалась.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 23:03 - 14 Июля, 2007
|
|
JSilver
Пользователь
Откуда: Moscow Регистрация: Июль 2007
Всего: 20 сообщений
|
"будь проклят тот день, когда я сел за баранку этого пылесоса!" (C) проблема. прочитав где-то мимолетом про "stored_node", захотел ее поюзать. запоминалку оной ноды вешаю на timed_event. почему? потому что мне нравится, когда моргание экрана на черный и обратно не сопровождается дополнительным морганием диалогового окна. сам же разговор всегда завершаю обнулением этой переменной, на всякий случай, чтобы грязи не было (перед эндом critter_talk_proc'ы). все хорошо, все прекрасно работает, если бы не одно "но": если я выхожу из разговора по "нулю" - то таймер_евент, вызванный в последней ноде, до которой дошел разговор, - не запускается. startcritical-endcritical пробовал, поднять строчку add_timer_event в самый верх процедуры - тоже пробовал, ничего не получается! прописывать эту сторед_ноде в самой процедуре вместо вызова таймер_евента - не хочу: все остальные моменты работают хорошо, а думать где у меня может мусор остаться в разговоре и в следующий раз он начнется не сначала - тоже не хочу. если, конечно, есть какие-то шансы это не хочу сохранить. что за пакость такая с нулем?
|
Отправлено: 16:33 - 21 Июля, 2007
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Выход из диалога после нажатия кнопки 0 - это злой баг. Долго рассписывать не буду, но там видимо проблемы из-за того, что ранее запланированная фича для фолла была обрезана. При нажатии на ноль функция вылетает с ошибкой и из-за этого диалог закрывается. Для своего будущего (надеюсь) мода я эту пакость исправил. В двиге достаточно поменять один байт. На память не помню - посмотрю в записях, напишу.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 19:42 - 21 Июля, 2007
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Цитата: Выход из диалога после нажатия кнопки 0 - это злой баг. Долго рассписывать не буду, но там видимо проблемы из-за того, что ранее запланированная фича для фолла была обрезана. При нажатии на ноль функция вылетает с ошибкой и из-за этого диалог закрывается. Для своего будущего (надеюсь) мода я эту пакость исправил. В двиге достаточно поменять один байт. На память не помню - посмотрю в записях, напишу.
Напиши плз. Вообще в Исследования побольше информации о движке, наверняка много нарыл. Делиться надо)
|
Отправлено: 21:05 - 21 Июля, 2007
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Выключение кнопки 0 в диалогах: Offset: 0x36C48 Старое значение: 0x30 Новое значение: 0x31 P.S О результатах доложить
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 21:40 - 21 Июля, 2007
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Цитата: Выключение кнопки 0 в диалогах: Offset: 0x36C48 Старое значение: 0x30 Новое значение: 0x31 P.S О результатах доложить
Поставил себе. Проверил три диалога. 0 не работает
|
Отправлено: 22:31 - 21 Июля, 2007
|
|
JSilver
Пользователь
Откуда: Moscow Регистрация: Июль 2007
Всего: 20 сообщений
|
что ж, пришлось переделать по другому. отключать ноль переправляя экзешник - не буду: я этот ноль сам регулярно использую, когда надо побыстрее послать надоедливого криттера не вдаваясь в подробности, на что он там обидится и т.п. ==================== возник гораздо более серьезный вопрос: found -- это дохлый криттер, валяющийся в клетке, если у него непустое инвентори, найденный методом: found:=metarule3((106),tile_num(xxxxx),elevation(dude_obj),0); next -- это попытка получить указатель на следующего криттера валяющегося тут же. next:=metarule3((106),tile_num(found),elevation(dude_obj),found); после драки у меня некоторые криттеры раскиданы поодиночке, а в одном дверном проеме я специально положил целую пачку народу, чтобы проверить работу скрипта. очень долго не мог понять, какого фига происходит не то что я хочу. решил проверить: display_msg("f: " + found + " n: " + next); оказалось, что при любом раскладе f == n. ВСЕГДА! бред какой-то! там же черным по белому (белым по синему) прописано "Next_Critter"!!! Что происходит??? что делать - не понимаю. есть вариант уничтожать каждого отработанного криттера, но это очень некрасиво выглядит: идет партиец а вокруг него трупы пачками прямо на глазах исчезают, не уничтожать верхний трупешник - тогда нет возможности обратиться к следующему. Я был согласен уничтожать только одного - верхнего, если под ним кто-то еще валяется - это бы выглядело нормально - какая разница сколько именно трупов образуют кляксу на одном месте, одним больше - одним меньше, - никто и не заметит, но для этого надо, чтобы found и next - отличались! А у меня - равны! Помогайте!!
|
Отправлено: 22:33 - 21 Июля, 2007 | ИСПРАВЛЕНО: JSilver - 22:40 - 21 Июля, 2007
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Господа исследователи! Убедительная просьба не сваливать всё в одну кучу. Ray, пожалуйста, продублируй инфу о кнопке 0 в теме по смещениям. JSilver, если ты серьёзно собрался заняться исследованием метарулей, создай отдельную тему в соответствующем разделе.
|
Отправлено: 10:50 - 22 Июля, 2007
|
|
JSilver
Пользователь
Откуда: Moscow Регистрация: Июль 2007
Всего: 20 сообщений
|
Цитата: Quote: from Wasteland Ghost on 10:50 - 22 Июля, 2007 Господа исследователи! Убедительная просьба не сваливать всё в одну кучу. JSilver, если ты серьёзно собрался заняться исследованием метарулей, создай отдельную тему в соответствующем разделе.
все бы ничего, но тому были две помехи: 1. новичок, не написавший и десяти сообщений, а уже возомнивший себя "исследователем" мне, мягко говоря, был бы очень странен. 2. особенно, если этот новичок запостит в "исследования" сообщение не типа "я нашел такую фичу, она круто работает, сообщаю остальным на радость", а, наоборот, "я хотел сделать то и то и у меня ничего не получилось". но, раз так надо - я продублирую свой пост там. поскольку темы про метарули не нашел - начну новую.
|
Отправлено: 15:29 - 22 Июля, 2007
|
|
Akkella
Пользователь Регистрация: Авг. 2006
Всего: 175 сообщений
|
Цитата: Вот об этом я тебе и говорил, когда говорил почитай темы. Эта проблема уже обсуждалась.
Я весь форум читал... Тут возникла проблема посерьезней... Нужно удалять все оружие в игре и запихивать новое. То, что уже есть на картах, без привязанного скрипта. А то, что добавляешь, со скриптом... Немного в тупике...
|
Отправлено: 17:55 - 22 Июля, 2007
|
|
JSilver
Пользователь
Откуда: Moscow Регистрация: Июль 2007
Всего: 20 сообщений
|
Цитата: Тут возникла проблема посерьезней... Нужно удалять все оружие в игре и запихивать новое. То, что уже есть на картах, без привязанного скрипта. А то, что добавляешь, со скриптом... Немного в тупике...
а нельзя вместо этого перекомпилить скрипт чузена, вставив туда проверку: "если чузен взял что-то в руки, и если это что-то = оружие, то если у этого чего-то скрипт не привязан, то этому чему-то скрипт привязать". в соответствии с его пидом, типом и другими твоими идеями. а то, что у него в стеке до сих пор валялось поскладированное штабелями - так штабелями и останется, не начиная занимать собственную единичную позицию. еще более правильно, хотя может и более сложно - это уж тебе решать - привязывать этот скрипт не в тот момент, когда чуз это в руки взял - может он просто два ствола сравнить хотел, у кого дамаж/дальность покруче, а в момент первого выстрела из этого ствола. извиняй, если не в кассу, поскольку я в скриптописании еще абсолютный профан, то это чисто общие соображения, а возможно ли оно к закодированию - у меня ни малейшего понятия.
|
Отправлено: 19:31 - 22 Июля, 2007
|
|
Rosetau
Пользователь Регистрация: Июль 2007
Всего: 1 сообщение
|
привет подскажите пожалуйста скачал компиль скриптов. написал в блокноте код с фака - компилю - "ssl not found" фаел есессно лежит в той же директории что и компиль что делаю не так?
|
Отправлено: 19:49 - 27 Июля, 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Подкажите, как воспользоваться tile_in_tile_rect({int tile1}, {int tile2}, {int tile3}, {int tile4}, {int tile}) правильно. Не происходит ожидаемого события, с этим прямоугольником может там гексы задаются в определенном порядке? Код: #define tile_1 (13694) // 13694 #define tile_2 (13690) // 13690 #define tile_3 (15490) // 15490 #define tile_4 (15494) // 15494 if fixed_param == event_timer_12 then begin rm_fixed_timer_event(self_obj, event_timer_12); if (global_var(GVAR_DOOR_DWELLER_VAULT) <= 2) then begin if (tile_in_tile_rect(tile_1, tile_2, tile_3, tile_4, tile_num(dude_obj)) == True) then begin set_global_var(GVAR_DOOR_DWELLER_VAULT, 5); // Закрыть и Запереть дверь. obj_close( self_obj ); obj_lock( self_obj ); // Анимация закрытия двери. reg_anim_func(1, 1); reg_anim_animate_reverse(self_obj, 0, 9); reg_anim_func(3, 0); end else begin add_timer_event(self_obj, game_ticks(5), event_timer_12); end end end
Цитата: что делать - не понимаю. есть вариант уничтожать каждого отработанного криттера, но это очень некрасиво выглядит: идет партиец а вокруг него трупы пачками прямо на глазах исчезают, не уничтожать верхний трупешник - тогда нет возможности обратиться к следующему. Я был согласен уничтожать только одного - верхнего, если под ним кто-то еще валяется - это бы выглядело нормально - какая разница сколько именно трупов образуют кляксу на одном месте, одним больше - одним меньше, - никто и не заметит, но для этого надо, чтобы found и next - отличались! А у меня - равны!
А просто перемешать труп на гекс два в сторону не судьба?
|
Отправлено: 0:31 - 28 Июля, 2007 | ИСПРАВЛЕНО: Dar - 0:35 - 28 Июля, 2007
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Цитата: Подкажите, как воспользоваться tile_in_tile_rect({int tile1}, {int tile2}, {int tile3}, {int tile4}, {int tile}) правильно. Не происходит ожидаемого события, с этим прямоугольником может там гексы задаются в определенном порядке?
Правильный порядок обхода важен. А так же нужно следить, чтобы зона была строго прямоугольной. Вот мой работающий вариант: #define dude_near_hatch_1 (tile_in_tile_rect(9717, 9712, 10717, 10712, dude_tile)) Очередность обхода сам вычислишь.
|
Отправлено: 10:55 - 28 Июля, 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Спасибо, Sokil помогло 1,2 указываются "горизонтали" слева направо. 3,4 указываются "горизонтали" слева направо. Мой четвертый по периметру достаточно было поменять с третьим.
|
Отправлено: 13:24 - 28 Июля, 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Еще вопрос, наверно глупый, но таки спрошу, можно ли "отсрочить" скриптово запуск финальной картиноки смерти игрока, просто пишу critter_dmg(dude_obj, dmg, DMG_laser); но свой труп разрезаный на части не успеваю разглядеть. Хоть бы секунд пять выйграть?
|
Отправлено: 0:46 - 3 Авг., 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Если в скрипте критера написать procedure map_enter_p_proc begin kill_critter(self_obj, ANIM_fall_back_sf); end То этот скрипт, не будет привязан к трупу так или нет? Мне нужен оскриптованный труп, как его получить?
|
Отправлено: 17:58 - 7 Авг., 2007
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Попробуй ручками изменить вид анимации на картинку трупа. PS Вообще-то после смерти скрипт всё ещё привязан к трупу, только не все обработчики вызываются.
|
Отправлено: 17:52 - 8 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Ну и последний вопрос как сделать так чтобы единицы здоровья больше 100 не повышались. Я задавал этот вопрос в этой теме но никто не ответил как это сделать кому интересно нашел ответ В скрипте dude procedure critter_p_proc begin while (get_critter_stat(dude_obj,STAT_current_hp) > 100) do begin critter_heal(dude_obj, -1); end end
|
Отправлено: 22:28 - 8 Авг., 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Wasteland Ghost Спасибо , но увы это не то. Я просто хотел "похороны" сделать, типа смотришь в бинокль несколько раз - скрипт считает и все. Но и возможно обыскать при этом. А оказалось и description_p_proc и push_p_proc и talk_p_proc не работают, ну последняя логично. А с иллюзией трупа, его карманы не рассмотришь, иначе чем через скилл. Ладно, обойдусь без "похорон" , - не принципиально.
Цитата: Ну и последний вопрос как сделать так чтобы единицы здоровья больше 100 не повышались.
А при этом в характеристиках показывает 101/100, 102/100, 120/100 и когда будещь лечиться до полного в Пипбое, то потом будет считать назад и у тебя на глазах будут убывать жизни, что будет отображаться на панели интерфейса. ЗЫ: мне тоже хотелось выставить фиксированное чиcло НP по каждой расе.
|
Отправлено: 0:04 - 10 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
когда будещь лечиться до полного в Пипбое, то потом будет считать назад и у тебя на глазах будут убывать жизни, что будет отображаться на панели интерфейса. Эх а вот об этом я неподумал после полного выздоровления ждать пока жизнь упадет до 100 а если сделать экранчик вызывается когда используешь бинокль на dude и там сделать вариант ответа отдохнуть до выздоровления когда нажимаешь повышается жизнь и увеличивается время пример если жизнь равна 1 то увеличеть ее на 99 и увеличить время на 5 дней и так до ста проверок
|
Отправлено: 11:12 - 10 Авг., 2007 | ИСПРАВЛЕНО: Jordan 63 - 11:20 - 10 Авг., 2007
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Jordan Сделать можно, но действия двига ты этим не отменишь, начиная с того, что в пипбой заходить не запретищь. А так можно весь пипбой по его функциональности в оскриптованный итем загнать при желании. Хм, кроме автокарт - не велика потеря. Ну или допустим можно отключить чисто пипбой в двиге. А не пипбой на пару со сменой анимации. Но это врятли, хотя не знаю. Еще в интерфейсном меню, (то которое в низу экрана в процессе игры у нас) еще есть смена цвета жизней. Но тогда в характеристиках все равно будет 140/100 150/100. Если бы можно было исправить в двиге сразу на 100 максимум или в скриптах срабатывали изменения вторичных статов, но они вроде все не работают, работают только измения первичных статов типа: Сила Ловкость, Выносливость...... Хм, If get_critter_stat(dude_obj, STAT_max_hp) >= 31 then Begin set_critter_stat(dude_obj, STAT_max_hp, 30); end Если STAT_max_hp считается вторичным то это не сработает, а скорее всего оно так и есть, ведь он зависит от силы и выносливости. Если сработает, то покажет в характеристиках.
|
Отправлено: 15:48 - 10 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Dar А так можно весь пипбой по его функциональности в оскриптованный итем загнать при желании. буду пробывать через say режим Но тогда в характеристиках все равно будет 140/100 150/100. Ну и ладно это же чисто визуально мне это впечатление не испортит Если бы можно было исправить в двиге сразу на 100 максимум Я думаю можно но я не двиглоковырятель If get_critter_stat(dude_obj, STAT_max_hp) >= 31 then Begin set_critter_stat(dude_obj, STAT_max_hp, 30); end Я сначала тоже так пытался но не работает
|
Отправлено: 17:30 - 10 Авг., 2007
|
|
Dweller
Пользователь
Откуда: Е-бург Регистрация: Июль 2007
Всего: 29 сообщений
|
Кто нибудь может мне, тупому человеку, обьяснить как работают случайные проверки на характеристики (броски кубика, как сказано в доке)? Единственное, что приходит в голову, что это random, возвращающий 4 значения, и как-то связаный с характеристиками. Отсюда и вопрос: как?
----- Не нужна мне эта подпись
|
Отправлено: 21:51 - 10 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Хотел сделать если персонажа ударяешь копьем то он отравлялся и терял жизни но не работает подскажите где ошибка procedure combat_p_proc begin if (fixed_param == COMBAT_SUBTYPE_HIT_SUCCEEDED) then begin if (obj_pid(critter_inven_obj(source_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SPEAR) or (obj_pid(critter_inven_obj(source_obj,INVEN_TYPE_LEFT_HAND)) == PID_SPEAR) then set_global_var(456, 1); end if (fixed_param == COMBAT_SUBTYPE_TURN) and (global_var(456) == 1) then critter_heal(self_obj, -5); display_msg("Текущее здоровье " + (get_critter_stat(self_obj, STAT_current_hp))); end И еще один вопрос если pro файлы из fallout2 заменить на fallout1 то их нельзя редактировать а также сохранять игру потому что они отличаются есть ли такая программа которой можно открыть pro файлы fallout1 и сохранить что бы они работали в fallout2
|
Отправлено: 21:39 - 12 Авг., 2007 | ИСПРАВЛЕНО: Jordan 63 - 22:27 - 12 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Есть такие макросы worldmap_xpos возвращает координату x текущего местоположения на карте мира worldmap_ypos возвращает координату x текущего местоположения на карте мира Как узнать координаты я склеил мировую карту и открыл в паинте там можно узнать координаты. Мне нужно узнать на какой клетке находиться dude то есть узнать координаты клетки но как их правильно записать нужно узнать координаты каждого угла клетки такая конструкция нормальная if ((worldmap_xpos >= 150) and (worldmap_ypos <= 50) or (worldmap_xpos >= 200) and (worldmap_ypos <= 50) or (worldmap_xpos >= 200) and (worldmap_ypos <= 100) or (worldmap_xpos >= 150) and (worldmap_ypos <= 100)) then call Node001; и так if (worldmap_xpos >= 150) and (worldmap_ypos <= 50) and (worldmap_xpos >= 200) and (worldmap_ypos <= 50) and (worldmap_xpos >= 200) and (worldmap_ypos <= 100) and (worldmap_xpos >= 150) and (worldmap_ypos <= 100) then call Node001; и даже так if ((worldmap_xpos >= 150) and (worldmap_xpos <= 200) and (worldmap_ypos >= 50) and (worldmap_ypos <= 50) or ((worldmap_xpos >= 200) and (worldmap_xpos <= 150) and (worldmap_ypos >= 100) and (worldmap_ypos <= 100))) then call Node001; Если dude находиться на мировой карте в таких координатах то выполнить node001 Он выполняет node001 и в клетке и вне клетке а мне нужно чтобы он выполнял node001 Только в этой клетке кто знает помогите как правильно раствить >= , <= and и or.
|
Отправлено: 20:25 - 14 Авг., 2007
|
|
Freeman
Пользователь Регистрация: Февр. 2007
Всего: 24 сообщения
|
Я для Фаллаута скриптов никогда не писал, но могу предположить, что нужный код выглядит вот так: if (worldmap_xpos >= 150) and (worldmap_xpos <= 200) and (worldmap_ypos >= 50) and (worldmap_ypos <= 100) then call Node001;
|
Отправлено: 3:44 - 15 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Freeman Работает! Спасибо!
|
Отправлено: 9:35 - 15 Авг., 2007
|
|
Dweller
Пользователь
Откуда: Е-бург Регистрация: Июль 2007
Всего: 29 сообщений
|
Вопрос об интерактивности критеров: как наилучшим образом отправлять критеров спать? Можно прописать каждому критеру sleep_point и сделать проверку, если время ночь, то иди в кровать и спи. Но это геморно, к тому же, если много критеров с одним скриптом, то они улягутся все в одну кровать Хе-хе так что можно сделать такую проверку: если ночь, то критер становится невидимым. Однако странно получается, днем город полон жизни, а ночью вымирает. Этому есть решение - сделать противоположный скрипт-если ночь, то критер появляется. И привязать его к критеру, валяющемуся на кровати. То есть днем виден один критер, а ночью совсем другой. И все проверки поместить в процедуру map_enter, a также в процедуру critter_p_proc с дополнительной проверкой, если критер не виден на экране, то исчезай/появлялся. Правда это выглядит не очень - вот криттер около тебя, сдвинул чуть чуть экран в сторону, вернулся - а его уже нет. (Добавление от 15:20 - 18 Авг., 2007.) Вот еще: можно сделать так: если время ночь, то криттеры все сваливают за пределы карты, то есть получается, что они специально ждут чуза, пока он не посетит их город, а потом сваливают спать. Да и к тому же экспериментируя с animation_walk я понял, что если криттер стоит далеко от нужной точки, то двиг подумает, что добраться до туда нельзя. Следовательно есть риск, что криттер останется стоять всю ночь на своей дневной позиции. Трудоголик, е-мое... Ну так вот, какие еще способы есть уложить критера спать? И какими пользуетесь вы, товарищи модеры? Хочется выбрать наилучший.
----- Не нужна мне эта подпись
|
Отправлено: 15:05 - 18 Авг., 2007
|
|
Dweller
Пользователь
Откуда: Е-бург Регистрация: Июль 2007
Всего: 29 сообщений
|
Блин! Идея со спящими критерами накрылась. Критеры не хотят укладываться на кровати. Залезают под них :-[ Прийдется всех укладывать на драные матрасы и на подстилки. А так хотелось, что бы они спали по-человечески!
----- Не нужна мне эта подпись
|
Отправлено: 17:17 - 18 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Dweller Блин! Идея со спящими критерами накрылась. Критеры не хотят укладываться на кровати. Залезают под них :-[ Прийдется всех укладывать на драные матрасы и на подстилки. А так хотелось, что бы они спали по-человечески! Посмотри скрипт мис бишоп когда ее разводишь то она корректно лежит на кровати
|
Отправлено: 0:59 - 19 Авг., 2007
|
|
Dweller
Пользователь
Откуда: Е-бург Регистрация: Июль 2007
Всего: 29 сообщений
|
Спасибо. Попробывал положить криттеров скриптово, они кладутся. Так что обычные криттеры будут спать на нормальных кроватях, а вот дикари все равно будут ютиться на ковриках, потому что на их узкие кровати они целиком не помещаются.
----- Не нужна мне эта подпись
|
Отправлено: 12:42 - 19 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Можно ли скриптово увеличивать и понижать цену в процентах пример Если навык торговли меньше 100 тогда цена кожанной брони будет стоить на 10 процентов больше от стоимости этой вещи заданной в прототипе if (has_skill(dude_obj, SKILL_BARTER) < 100) then item_caps_adjust(dude_obj, -proto_data(PID_LEATHER_ARMOR, it_cost)); В какой то теме читал что можно export и import процедур если кто то знает поделитесь как это сделать
|
Отправлено: 22:37 - 19 Авг., 2007 | ИСПРАВЛЕНО: Jordan 63 - 23:30 - 19 Авг., 2007
|
|
Dweller
Пользователь
Откуда: Е-бург Регистрация: Июль 2007
Всего: 29 сообщений
|
Вроде если вызывать бартер из скрипта, то есть возможность установить какой-то модификатор, вроде бы он может быть положительным или отрицательным, и выражается в процентах. Правда так изменяется цена всех предметов, а не одного.
----- Не нужна мне эта подпись
|
Отправлено: 11:26 - 20 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Dweller
Цитата: Вроде если вызывать бартер из скрипта, то есть возможность установить какой-то модификатор,
Это я знаю но я хочу сделать торговлю полностью через скрипты + say режим Друг, когда же ты научишься правильно цитировать? WG
|
Отправлено: 13:53 - 20 Авг., 2007
|
|
JSilver
Пользователь
Откуда: Moscow Регистрация: Июль 2007
Всего: 20 сообщений
|
раз уж речь зашла о ценах - вспомнился скрипт Ренеско и его "скидки", которые выводят все предметы в ноль баксов. Что я такое в этом скрипте проглядел? Карма, реакция, прочие модификаторы... где заковыка? Сделал другого криттера, прописал ему аналогичные вещи как и у Ренеско - не получается, в приказном порядке записал реакцию на дюда больше сотни, бартер модификатор ставил как у Ренеско в этой ноде и даже более высокий - все равно не получается! Очень маленькими цены сделать удается, а вот совсем нулевыми, как при "скидках" - ни в какую! Чем так уникален Ренеско, подскажите кто-нибудь?
|
Отправлено: 2:29 - 21 Авг., 2007
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Jordan 63 Раз ты делаешь торговлю полностью через диалог, то и деньги ты с игрока снимаешь через диалог. И ничто тебе не мешает в этот момент изменять вычитаемую сумму как тебе угодно.
|
Отправлено: 9:55 - 21 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Wasteland Ghost
Цитата:
И ничто тебе не мешает в этот момент изменять вычитаемую сумму как тебе угодно.
Я просто хотел упростить реализацию. Конечно можно для каждого предмета определить цену а потом увеличивать или понижать ее но это муторно хотя реализуемо. А с процентами будет проще.
|
Отправлено: 10:46 - 21 Авг., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
To All Кто нибудь знает какие global var в fallout2 движковые которые прошиты в движке типа GVAR_RUNNING_BURNING_GUY И дополнительный вопрос как вычитать в процентах item_caps_adjust(dude_obj, -5% от 350) Если это возможно то как правильно записать
|
Отправлено: 13:58 - 10 Сент., 2007
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Цитата: Кто нибудь знает какие global var в fallout2 движковые которые прошиты в движке
Точно и с уверенностью могу сказать: За машину отвечают: 439 455 456 453 (эти видел лично) Также ещё эти (лично не проверял, но в двиге видел): 491 18 7 494 47 И ещё все гвары репутации, а также ещё несколько, номера которых не указаны явно.
Цитата: И дополнительный вопрос как вычитать в процентах item_caps_adjust(dude_obj, -5% от 350)
item_caps_adjust(dude_obj, (350-(350/100*5)))
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 17:40 - 10 Сент., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Ray
Цитата: item_caps_adjust(dude_obj, (350-(350/100*5)))
Испытал на клинте в процедуру procedure map_enter_p_proc begin item_caps_adjust(dude_obj, 350); item_caps_adjust(dude_obj, (350-(350/100*5))); end Получилось 685 монет Пробывал так item_caps_adjust(dude_obj, 100); item_caps_adjust(dude_obj, (100-(100/100*5))); То есть должно получиться 95 а получается 195 на 100 монет больше Это моя ошибка или твоя Если не сложно можешь составить весь список движковых гвар или посоветуй программу которой можно покавырять двиг на наличие global var
|
Отправлено: 20:01 - 10 Сент., 2007
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Цитата: procedure map_enter_p_proc begin item_caps_adjust(dude_obj, 100); item_caps_adjust(dude_obj, (100-(100/100*5))); end То есть должно получиться 95 а получается 195 на 100 монет больше Это моя ошибка или твоя
[Ray удивлённо смотрит в монитор] Ты вообще понимаешь что делают те или иные функции? Ты добавил 100 монет, а потом добавил ещё 95. Как результат стало 195.
Цитата:
item_caps_adjust(dude_obj, 100); // + 100 монет item_caps_adjust(dude_obj, (100-(100/100*5))); // + 95 монет (100-5%)
Читать надо что пишешь... И вообще, не знать формулу процентов? Y X = -- * Z % 100 %
Цитата: Если не сложно можешь составить весь список движковых гвар или посоветуй программу которой можно покавырять двиг на наличие global var
1)Список составлять не буду - для этого надо перелопатить и перебрать весь двиг... 2)ДизАсм + REC
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 21:29 - 10 Сент., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Ray Ошибся признаю
Цитата: 2)ДизАсм + REC
Где можно скачать REC? Искал в nigme так и ненашел.
|
Отправлено: 8:57 - 11 Сент., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Пробывал сделать чтобы клинт не стрелял из пулемета если растояние между dude и целью меньше 5 тайлов procedure map_enter_p_proc begin party_add(self_obj); end procedure combat_p_proc begin if (tile_distance_objs(dude_obj, target_obj) < 5) then begin inven_unwield(self_obj); rm_obj_from_inven(self_obj, obj_carrying_pid_obj(self_obj, PID_MINIGUN)); end end Но клинт стреляет в цель хотя dude находиться рядом c целью а если сделать так if (tile_distance_objs(dude_obj, target_obj) > 5) then begin inven_unwield(self_obj); rm_obj_from_inven(self_obj, obj_carrying_pid_obj(self_obj, PID_MINIGUN)); end end Клинт убирает оружие хотя расстояние между ними меньше 5 тйлов Где я допустил ошибку? И еще обьясните что такое масивы зачем они нужны и приведите пример? И что такое парсер зачем он нужен и тоже приведите пример.
|
Отправлено: 21:33 - 22 Сент., 2007 | ИСПРАВЛЕНО: Jordan 63 - 14:44 - 23 Сент., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Кто нибудь может выложить наработки по устранению привязки номеров скриптов. В .h файле или выложить пример скрипта.
|
Отправлено: 21:24 - 30 Окт., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Как сделать чтобы если при компиляции в скрипте ошибка то создавался файл а в нем было написано ИМЯ_СКРИПТА.ssl и на какой строчке ошибка Вот мой батник @echo off @copy *.ssl *.c @for %%f in (*.c) do cpp32 %%f >> cpp32.log @for %%f in (*.i) do sslc %%f @del *.c @del *.i rem @del cpp32.log
|
Отправлено: 20:33 - 19 Дек., 2007
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
@for %%f in (*.i) do sslc %%f >> sslc.log
|
Отправлено: 11:22 - 20 Дек., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Anchorite Я все сделал как ты написал вот батник @echo off @copy *.ssl *.c @for %%f in (*.c) do cpp32 %%f >> compile.log @for %%f in (*.i) do sslc %%f >> sslc.log @del *.c @del *.i rem @del compile.log Он создает sslc.log и в нем такая запись *** THERE WERE ERRORS (1 of them) А я хотел чтобы он указывал имя скрипта(в котором ошибка) и на какой строчке ошибка как в коммандной строке ARADESH.i(9557): Error! expecting ';'.
|
Отправлено: 12:25 - 20 Дек., 2007
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Так попробуй @for %%f in (*.i) do sslc %%f >> sslc.log 2>&1
|
Отправлено: 10:30 - 21 Дек., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Anchorite Спасибо все работает!
|
Отправлено: 11:41 - 21 Дек., 2007
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Если через скрипт карты скриптово создавать плитку пола т.е create_object_sid то он нормально не лежит т.е она создается между полом и крышей по середине. Вот скриншот http://jordan631.narod.ru/scr00000.JPG Част скрипта artemple.ssl procedure map_enter_p_proc begin if (map_first_run) then begin call Initial_Inven; end Lighting; override_map_start_hex(17488, 0, 5); set_global_var(GVAR_LOAD_MAP_INDEX,0); create_object_sid(67108866, 19097, elevation(dude_obj), -1); end Вот здесь исходники скриптов из мода Ф1 на движке Ф2 http://jordan631.narod.ru/Source.rar Чтобы скомпилировать запустите ssl\Compile.bat Откомпилированные скрипты появятся в папке scripts У некоторых людей появляется ошибка "синтаксическая ошибка" при компиляции скриптов(у меня такая ошибка не возникает) вот вопрос почему такая ошибка возникает?
|
Отправлено: 10:53 - 4 Янв., 2008 | ИСПРАВЛЕНО: Jordan 63 - 11:27 - 4 Янв., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Если кому интересно здесь лежит скрипт клинта только теперь диалог у него сделан через say режим. http://jordan631.narod.ru/say.rar В папке Scripts лежит исходник и файл с макросами. Установка распакуйте архив в каталог игры и начните разговор с клинтом. Может это кому пригодиться.
|
Отправлено: 20:14 - 4 Янв., 2008
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Я тут столкнулся с неким багом. Похоже, в скриптах прикреплённых к карте, LVARs не работают. Слыхал кто-нибудь про такое?
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:57 - 9 Янв., 2008
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Цитата:
Если через скрипт карты скриптово создавать плитку пола т.е create_object_sid то он нормально не лежит т.е она создается между полом и крышей по середине.
Она нормально лежит. Просто эта плитка является объектом, который находится БЛИЖЕ к тебе, чем остальные объекты и поэтому рисуется ПОЗЖЕ. Поэтому и возникает такой забавный эффект.
|
Отправлено: 9:33 - 10 Янв., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: Я тут столкнулся с неким багом. Похоже, в скриптах прикреплённых к карте, LVARs не работают. Слыхал кто-нибудь про такое?
Видела такое сама.
|
Отправлено: 13:36 - 10 Янв., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Я тут сделал скрипт сундука в который можно добавлять предметы и изменять их без перекомпиляции скрипта. Но это не совсем скрипт сундука я взял скрипт удалил импортную переменную и условия при котором создаются предметы что бы было проще тестировать загрузите скрипт и обворуйте клинта там должны появиться предметы. Лежит здесь. http://jordan631.narod.ru/data.rar Установка распакуйте архив в папку игры Пока в скрипте прописано 7 предметов но можно сколько угодно чтобы добавить или изменить предмет смотрите acklint.msg там все закоментировано в папке scripts лежат исходники скрипта. Так же в файле acklint.msg необязательно писать по английски можно и по русски но нужно изменить вот это PID_LEATHER_ARMOR на это кожаная броня в двух местах так и с отстальными предметами А теперь вопрос как сделать так чтобы скрипт считывал не так # Название предмета {100}{}{PID_LEATHER_ARMOR} # Минимальное количество предметов {101}{}{1} # Максимальное количество предметов {102}{}{2} # Вероятность появления предмета в процентах {103}{}{100} Т.е с каждой строки А вот так с одной строки {100}{}{PID_LEATHER_ARMOR|1|2|100} или так {100}{}{PID_LEATHER_ARMOR,1,2,100}
|
Отправлено: 14:12 - 14 Янв., 2008 | ИСПРАВЛЕНО: Jordan 63 - 18:50 - 15 Янв., 2008
|
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Как в процедуру atoi procedure atoim(variable ostr, variable bstr) begin variable begin i; str; val; end str:=bstr; while (ostr!=str and ostr<=str+":" and ostr>=str+"0" do begin while not((ostr>str+i and ostr<str+(i+1)) or ostr==str+i) and i<9 do i+=1; str+=i; val:=val*10+i; i:=0; end return val; end #define atoi(x) atoim(x,"" Вставить проверку (atoi(message_str(SCRIPT_GLOBAL_VARS, 100))); если строчка 100 в скрипте с номером 567 пустая тогда читать строчку 100 в скрипте с номером 345 если и это пустая тогда читать строчку 100 в скрипте с номером 961
|
Отправлено: 12:09 - 4 Фев., 2008 | ИСПРАВЛЕНО: Jordan 63 - 12:11 - 4 Фев., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Это надо делать не в atoi, а с помощью atoi.
|
Отправлено: 17:15 - 4 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Wasteland Ghost
Цитата: Это надо делать не в atoi, а с помощью atoi.
Как это можно сделать? Если не трудно покажи пример.
|
Отправлено: 2:48 - 5 Фев., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Я не знаю, что конкретно ты имел ввиду, говоря "пустая", поэтому... if not(message_str(567, 100) == "Error" or message_str(567, 100) == "") then begin // если строка есть и она не пустая val := atoi(message_str(567, 100)); end else if not(message_str(345, 100) == "Error" or message_str(345, 100) == "") then begin val := atoi(message_str(345, 100)); end else if not(message_str(961, 100) == "Error" or message_str(961, 100) == "") then begin val := atoi(message_str(961, 100)); end Примитивно, но должно работать. :) Ray, больше так не делай.
|
Отправлено: 11:04 - 5 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Wasteland Ghost А как в саму atoi вставить эту же проверку. Пример я пишу set_global_var(atoi(message_str(961, 100), 1); И что бы atoi в самой процедуре сама смотрела все мсг на этой строке но не именно на 100 а любую какая будет Я просто хотел сделать так будет один мсг где прописаны гвары (самый главны) а также будут несколько пустых мсг где можно вписывать номера гвар т.е что бы не записывать их в главный файл а в другой и atoi должна посмотреть все мсг и если эти мсг на таких то строках пустые значит читать главный файл.
|
Отправлено: 11:22 - 5 Фев., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Нельзя такие сугубо конкретные вещи загонять в базовую процедуру! Это как минимум некрасиво, а как максимум чревато несовместимостью, узостью и глюкавостью. Лучше напиши свой макрос. Например #define get_gvar_from_msg(x) if not(message_str(567, x) == "Error" or message_str(567, x) == "") then begin \ val := atoi(message_str(567, x)); \ end \ else if not(message_str(345, x) == "Error" or message_str(345, x) == "") then begin \ val := atoi(message_str(345, x)); \ end \ else if not(message_str(961, x) == "Error" or message_str(961, x) == "") then begin \ val := atoi(message_str(961, x)); \ end
|
Отправлено: 0:18 - 6 Фев., 2008
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Wasteland Ghost За смайлики прошу прощения, а тэг code - издевательство над пользователями
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 20:14 - 6 Фев., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Убрала тэг. Нет, определённо, люблю я свою Мозиллу-тормозиллу. Скольких оперно-иешных глюков не вижу...
|
Отправлено: 21:21 - 6 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Я тут сделал счетчик дней и он выводит осталось 180 дней и каждый день уменьшается но вот проблема слово то дней не изменяется а хотелось бы что бы например остался 161 день или осталось 23 дня т.е нормально взависимости от дней выводил надпись. Как это можно сделать? Переделал воровство так что теперь воровство происходит через диалог и мы можем задавать при каком скиле предмет будет виден любые условия. Пока черновая версия просто начните разговор с клинтом. Можно доделать скрипт при каком условии сколько опыта получит что угодно пишите свои идеи. В папке scripts есть исходники. Установка распакуйте архив каталог игры http://jordan631.narod.ru/Steal.rar P.S. Следущая наработочка будет по изменению бартера оставайтесь на волне у меня еще несколько наработок в стадии доделки. Файл в архиве 1.h с помощью программы f-Geck лучше не открывать смотрите в простом блокноте
|
Отправлено: 16:30 - 8 Фев., 2008 | ИСПРАВЛЕНО: Jordan 63 - 21:06 - 8 Фев., 2008
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Цитата: нормально взависимости от дней выводил надпись. Как это можно сделать?
Например так. В скрипте:
Код:
variable word; // SVAR для верного слова variable remn; // SVAR для остатка remn := global_var(GVAR_DayCounter) % 10; if (remn > 4) then begin word : = 3; end else begin if (remn > 1) then begin word := 2; end else begin if (remn == 1 and global_var(GVAR_DayCounter) != 11) then begin word := 1; end else begin word := 3; end end end display_msg(mstr(400+word) + global_var(GVAR_DayCounter) + mstr(410+word));
А в MSG:
Код:
{401}{}{Остался } {402}{}{Осталось } {403}{}{Осталось } {411}{}{ день.} {412}{}{ дня.} {413}{}{ дней.}
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 14:24 - 9 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist А можешь выложить полный скрипт! Или на мыло кинь! А то я его и так и эдак а он не компилится а найти ошибку никак не могу.
|
Отправлено: 16:43 - 12 Фев., 2008
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
"Всего" скрипта не существует. Я просто привёл алгоритмический пример. Проблема твоя, вероятнее всего, в том, что для нормальной работы макроса mstr нужно прописать define для данного скрипта в scripts.h и, соответственно, define в голове самого скрипта. Вот пример, который точно соберётся на "голом" sslc без препроцессора. Только одна процедура, которую ты уже сам должен вызвать их какой-либо функции скрипта.
Код:
// Вместо 666 пропишешь номер своей GVAR // Вместо 111 пропишешь номер своего MSG procedure DispRemain begin variable word; // SVAR для верного слова variable remn; // SVAR для остатка remn := global_var(666) % 10; if (remn > 4) then begin word := 3; end else begin if (remn > 1) then begin word := 2; end else begin if (remn == 1 and global_var(666) != 11) then begin word := 1; end else begin word := 3; end end end display_msg(message_str(111, 400+word) + global_var(666) + message_str(111, 410+word)); end
P.S. А ещё в предыдущем примере в одном присвоении я опечатался, вставив лишний пробел между ':' и '='.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 19:08 - 13 Фев., 2008 | ИСПРАВЛЕНО: Alchemist - 19:11 - 13 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist
Цитата:
P.S. А ещё в предыдущем примере в одном присвоении я опечатался, вставив лишний пробел между ':' и '='.
Вот из за этого он и некомпилился Теперь все компилится надпись выводит но не совсем, когда первый раз смотришь бинокль он выводит eror а когда пропускаешь день все нормально. Вот часть скрипта procedure description_p_proc begin script_overrides; call Node001; end procedure Node001 begin variable word; // SVAR для верного слова variable remn; // SVAR для остатка variable GVAR_DayCounter; GVAR_DayCounter := GVAR_DAYS_TO_VAULT13_DISCOVERY; remn := global_var(GVAR_DayCounter) % 10; if (remn > 4) then begin word := 3; end else begin if (remn > 1) then begin word := 2; end else begin if (remn == 1 and global_var(GVAR_DayCounter) != 11) then begin word := 1; end else begin word := 3; end end end display_msg(mstr(400+word) + (global_var(GVAR_DAYS_TO_VAULT13_DISCOVERY) - GAME_TIME_IN_DAYS) + mstr(410+word)); end Част мсг {401}{}{Остался } {402}{}{Осталось } {403}{}{Осталось } {411}{}{ день.} {412}{}{ дня.} {413}{}{ дней.} vault13.gam GVAR_DAYS_TO_VAULT13_DISCOVERY :=180; // (1009) А вот скриншоты http://jordan631.narod.ru/scr00001.JPG http://jordan631.narod.ru/scr00000.JPG
|
Отправлено: 15:58 - 15 Фев., 2008
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Во-первых, раз ты выводишь не просто содержимое переменной, а (global_var(GVAR_DAYS_TO_VAULT13_DISCOVERY) - GAME_TIME_IN_DAYS), то вместо того, чтобы присваивать локальной переменной номер GVAR, лучше бы совал туда сразу результат вычета. И дальше работал уже с ним. А то алгоритм у тебя поломанный получается. На счёт Error сказать что-то сложно. Похоже, что по какой-то причине, сразу после инициализации игры mstr(410+word) удаётся извлечь строку из MSG, а mstr(400+word) -- нет. Очевидный глюк, но что может быть источником, умозрительно не подскажу. Можешь попробовать сначала сделать конкатенацию строки в три прихода в локальную переменную, а уже её содержимое выводить. А ещё проверь, нет ли у тебя часом в соответствующей MSG дубликатов строк с номерами на 400.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 15:43 - 16 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist Я сделаю так если гвара равна 180 то вывести строку осталось, а остальное пусть алгоритм делает. Так получается можно не только выводить дней но и монет. А есть ли универсальный алгоритм как атои прописываешь строку и число а он уже сам все делает. А возможно ли через мсг вызвать процедуру?
|
Отправлено: 16:59 - 16 Фев., 2008
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
Цитата: Я сделаю так если гвара равна 180 то вывести строку осталось, а остальное пусть алгоритм делает.
Как временное решение пойдёт, но, если собираешься в будущем мод релизить в публичный доступ, лучше разобраться в причинах. Слишком уж экзотично смотрится, чтобы быть скриптонезависимым багом.
Цитата: А есть ли универсальный алгоритм как атои прописываешь строку и число а он уже сам все делает.
В смысле, чтобы автоматически склонение определялось? Да ну, брось, у тебя не так много строк будет, чтобы делать эвристику подобного уровня. Тем более, на SSL. Приведённый выше алгоритм достаточно универсален. Передаёшь ему число, а на выходе получаешь индекс в массиве строк. А уж какой номер строки брать за базу -- выбираешь в зависимости от объекта.
Цитата: А возможно ли через мсг вызвать процедуру?
Косвенный вызов по имени процедуры стандартом языка поддержан. А будешь ты грузить эту строку из MSG или вводить прямо в скрипт -- твоё дело. Хотя, конечно, хранить в MSG вещи, от которых зависит стабильность системы, не стоило бы. Но технически это вполне возможно.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 18:56 - 16 Фев., 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Alchemist
Цитата: Как временное решение пойдёт, но, если собираешься в будущем мод релизить в публичный доступ, лучше разобраться в причинах. Слишком уж экзотично смотрится, чтобы быть скриптонезависимым багом.
Буду разбираться в чем дело.
Цитата: Косвенный вызов по имени процедуры стандартом языка поддержан. А будешь ты грузить эту строку из MSG или вводить прямо в скрипт -- твоё дело. Хотя, конечно, хранить в MSG вещи, от которых зависит стабильность системы, не стоило бы. Но технически это вполне возможно.
Покажи пример как это сделать.
|
Отправлено: 19:14 - 16 Фев., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: Похоже, что по какой-то причине, сразу после инициализации игры mstr(410+word) удаётся извлечь строку из MSG, а mstr(400+word) -- нет. Очевидный глюк, но что может быть источником, умозрительно не подскажу.
Был у меня такой глюк на больших мсг. Точнее, на мсг с большими номерами строк. Странный глюк. Отписывалась где-то на форуме, кажется, в исследованиях. Можно поискать. Решение так и не найдено. Ну и кроме того может быть элементарная бага где-то при инициализации word.
Цитата: Покажи пример как это сделать.
variable stored_node; ... stored_node := node001; ... call stored_node;
|
Отправлено: 23:36 - 17 Фев., 2008
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Может всё-таки: call stored_node; ?
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 19:56 - 20 Фев., 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
2Ray Спасибо, исправила.
|
Отправлено: 20:27 - 21 Фев., 2008
|
|
Alchemist
Модератор
Откуда: Арзамас-17 Регистрация: Дек. 2004
Всего: 298 сообщений
|
2Wasteland Ghost:
Цитата: Был у меня такой глюк на больших мсг.
Я помню. Но в данном случае никто не мешает проверить, тот ли глюк или же -- нет, банально загрузив строки числительных из отдельной маленькой MSG.
----- /// What'ya be sain'? Vault 100+? We need nothing o'that!
|
Отправлено: 5:46 - 23 Фев., 2008
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Как мне откомпилировать сразу все скрипты?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 3:29 - 16 Марта, 2008
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Пакетным файлом.
----- hit me, nail me, make me god
|
Отправлено: 8:42 - 16 Марта, 2008
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
А поподробней?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 18:17 - 16 Марта, 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Посмотри батники (*.bat) в исходниках скриптов Ф2 от БИС.
|
Отправлено: 19:45 - 16 Марта, 2008
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Да смотрел вроде... Там один только call :-) на компайлер там вообще нигде ссылки нет... Что мне нужно в батнике написать, чтобы все скрипты один за другим через препроцессор с компайлером пропустить?
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 13:28 - 17 Марта, 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
А ты все батники посмотри. Включая те, что в папках городов и тот, что в папке компилера.
Цитата: Что мне нужно в батнике написать, чтобы все скрипты один за другим через препроцессор с компайлером пропустить?
Ровно то самое, что написано в батниках БИС.
|
Отправлено: 10:16 - 18 Марта, 2008
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Пример. Открытие в текстовом редакторе всех текстовых файлов в каталоге.
Цитата: set my_dir=c:\temp set my_editor=c:\program files\blablabla.exe for %%i in ("%my_dir%\*.txt") do ( call "%my_editor%" %%i )
За деталями обращайся в встроенный виндовый хэлп.
----- hit me, nail me, make me god
|
Отправлено: 17:46 - 18 Марта, 2008 | ИСПРАВЛЕНО: Alan Killenger - 18:56 - 18 Марта, 2008
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Компилирую все скрипты (версия 1.02д). В папке со скриптами ТОЛЬКО оригинальные скрипты, и ТОЛЬКО оригинальные Хедеры. Но тем не менее несколько скриптов отказываются компилироваться, ссылаясь на разные ошибки типа андефайнед симбол. В чем проблема? Разве оригинал не должен компилироваться нормально? Скрипты: DENBUS1.SSL Error! Undefined symbol CAR_DENBUS1_HEX DENBUS2.SSL Error! Undefined symbol CAR_DENBUS2_HEX GENERIC.SSL Error! Undefined symbol LVAR_Herebefore GENFFLD.SSL Error! Mismatched parenthesis. NEWR1.SSL Error! Undefined symbol CAR_NEW_RENO1_HEX NEWR2.SSL Error! Undefined symbol CAR_NEW_RENO2_HEX NEWR3.SSL Error! Undefined symbol CAR_NEW_RENO3_HEX NEWR4.SSL Error! Undefined symbol CAR_NEW_RENO4_HEX PEASANT.SSL Error! Undefined symbol TEAM_ RAIDERS1.SSL Error! Undefined symbol CAR_RAIDERS_CAMP_ELEV_SECRET SPRTRP0.SSL Error! Mismatched parenthesis. TALK.SSL Error! Undefined symbol TEAM_ WAYPNT.SSL Error! Undefined symbol self_tile
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 14:44 - 29 Марта, 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Это ставил? БИСы исходники по сусекам соскребали, там всё что угодно может быть.
|
Отправлено: 16:33 - 29 Марта, 2008
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Цитата: Quote: from binyan on 14:44 - 29 Марта, 2008 Компилирую все скрипты (версия 1.02д).
Ставил. Значит и там недочеты есть.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 18:59 - 29 Марта, 2008
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Повидимому проблема в том, что в оригинальных сырцах (файл F2_scripts.rar) заголовки лежат в папочке headerS, а в патченных (файл F2_scripts_102d) - в папочке header. Попробуй перенести содержимое папки header в headers, а header удали за ненадобностью.
|
Отправлено: 20:07 - 29 Марта, 2008
|
|
binyan
Пользователь
Откуда: Israel Регистрация: Март 2005
Всего: 292 сообщения
|
Хех, ну яж не новичок в моддинге. Пробовал. И все заголовки в Хедерс, и все заголовки в Хедер, и обе папки пробовал оставлять - результат один. Вышеуказанные скрипты не компилятся из-за вышеуказанных ошибок.
----- ...выражая озадаченность, граничащую с озабоченностью..
|
Отправлено: 22:07 - 29 Марта, 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Цитата:
DENBUS1.SSL Error! Undefined symbol CAR_DENBUS1_HEX DENBUS2.SSL Error! Undefined symbol CAR_DENBUS2_HEX GENERIC.SSL Error! Undefined symbol LVAR_Herebefore GENFFLD.SSL Error! Mismatched parenthesis. NEWR1.SSL Error! Undefined symbol CAR_NEW_RENO1_HEX NEWR2.SSL Error! Undefined symbol CAR_NEW_RENO2_HEX NEWR3.SSL Error! Undefined symbol CAR_NEW_RENO3_HEX NEWR4.SSL Error! Undefined symbol CAR_NEW_RENO4_HEX PEASANT.SSL Error! Undefined symbol TEAM_ RAIDERS1.SSL Error! Undefined symbol CAR_RAIDERS_CAMP_ELEV_SECRET SPRTRP0.SSL Error! Mismatched parenthesis. TALK.SSL Error! Undefined symbol TEAM_ WAYPNT.SSL Error! Undefined symbol self_tile
Это все в исходниках есть в файле UPDATMAP.H #define CAR_NEW_RENO1_HEX (25321) #define CAR_NEW_RENO2_HEX (9509) #define CAR_NEW_RENO3_HEX (30894) #define CAR_NEW_RENO4_HEX (16068) Error! Undefined symbol LVAR_Herebefore - это в самом скрипте Выложи этот твой архив посмотрю, конечно если это не секрет.
|
Отправлено: 23:18 - 29 Марта, 2008
|
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
У меня эти же скрипты и я так же ставил обновление 1.02 и все компилится. Это я на скрипты бис поставил скрипты 1.02 и добавил компилятор и препрцессор для удобства, просто копируй скрипты в папку scripts и жми compile. http://jordan631.narod.ru/f2ssl.7z Потом сделаю батник что бы компилить, сразу все скрипты.
|
Отправлено: 12:16 - 30 Марта, 2008
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата: Потом сделаю батник что бы компилить, сразу все скрипты.
А чем buildall.bat не угодил?
|
Отправлено: 12:22 - 30 Марта, 2008
|
|
Jordan 63
Пользователь
Откуда: Россия, Самара Регистрация: Июль 2007
Всего: 228 сообщений
|
Wasteland Ghost
Цитата: А чем buildall.bat не угодил?
Да я в нем не разобрался. Мне проще самому сделать. (Добавление от 13:42 - 30 Марта, 2008.) Обновил архив в нем были ошибки не все файлы компилировались можно скопировать скрипты в папку Compile и нажать Compile.bat, скомпилить все скрипты надо запустить Compile_All.bat. Если будут ошибки пиши. (Добавление от 13:43 - 30 Марта, 2008.) Качать по старой ссылке!
|
Отправлено: 12:28 - 30 Марта, 2008
|
|
|
|