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


Форум TeamX » Тех. поддержка » Скрипты (Все вопросы по скриптингу - сюда)

Переход по темам
<< Пред. След. >>
Единственная страница этой темы

 
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
Perceptron
Модератор

Откуда: Ivanovo
Регистрация: Май 2003

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

2 binyan:
Туториал по скриптам. Настоятельнейше рекомендую.

-----
Into The New Year - With A New Vision!
Документация по скриптам, туториал по скриптам, вопросы по скриптам, FAQ по моддингу, "Утилиты", fallmods-tutor.

Отправлено: 23:58 - 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 сообщений

Я конечно може