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

Я конечно может быть тупойи нехрена не понимаю ,но у меня следующии вопрос.

Написал я простой скрипт (хелоу ворд), откомпилировал ( если расширение инт - это откомпилированый скрипт?) засунул в маппер, открываю его и какбыло сказанно, жму s e , выбираю, и.... нет его в выпадающем списке.... что делать, а? где я мог допустить ошибку?

В следующий раз прогоняй текст сообщения через Word или что-нибудь в этом духе. Читать же невозможно!
WG

Отправлено: 15:41 - 6 Фев., 2006
Inviolatum
Пользователь

Регистрация: Янв. 2006

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

Скорее всего ты не прописал скрипт в scripts.lst
Как это сделать и зачем смотри тут и тут

Отправлено: 16:57 - 6 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Если можно пожалуйста разъясните тут что можно о процедуре combat_p_proc
В FScript-HOWTO она не освещена, а из того что есть о ней в доке, понял мало:

combat_p_proc - выполняется во время боя. Номер конкретного события, вызвавшего функцию, передаётся в качестве параметра fixed_param:
fixed_param = COMBAT_SUBTYPE_WEAPON_USED (1) - было использовано оружие
fixed_param = COMBAT_SUBTYPE_HIT_SUCCEEDED (2) - успешное попадание
fixed_param = COMBAT_SUBTYPE_SEQUENCING (3) - проверяется боевая последовательность
fixed_param = COMBAT_SUBTYPE_TURN (4) - начало хода
fixed_param = COMBAT_SUBTYPE_NONCOM_TURN (5) - неизвестно (используется у любимцев Мельхиора, возможно, означает ход игрока)

Как понял доку процедура всплывает при 1) было использовано оружие, 2)успешное попадание, 3) проверяется боевая последовательность,4) начало хода,...

Как из этой процедуры узнать этот fixed_param? Точнее можно ли из combat_p_proc узнать какой боевой скил был использован при а) атаке , б) нанесении повреждения? (интересует атака и нанесение повреждения со стороны obj_dude по врагу)

Отправлено: 19:48 - 9 Фев., 2006 | ИСПРАВЛЕНО: Keha - 19:58 - 9 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Keha

Туда можно дофига насовать, правда не все будет работать анимации например не будут вроде как они во время боя совсем никак.

Вот тебе частный случай:

procedure combat_p_proc
begin
variable tmp_armor;
tmp_armor:=critter_inven_obj(dude_obj, INVEN_TYPE_WORN);
add_timer_event(self_obj, 1, 2);
if  (fixed_param  ==  4)  or  (fixed_param == 3) then begin
if  (obj_is_carrying_obj_pid(self_obj, mech_armor_pid) == 1 ) then begin
wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, mech_armor_pid));
display_msg("Bot set brain control");
end
if  (obj_is_carrying_obj_pid(self_obj, Android_armor_pid) == 1 ) then begin
wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, Android_armor_pid));
display_msg("Bot set brain control");
end
     if  obj_pid(tmp_armor)==  mech_armor_pid   then begin
     metarule3(107, self_obj, 16777282, 0);
     end
     if  obj_pid(tmp_armor)==  Android_armor_pid   then begin
     metarule3(107, self_obj, 16777336, 0);
     end
end      
end    

Отправлено: 22:12 - 9 Фев., 2006 | ИСПРАВЛЕНО: Dar - 22:14 - 9 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Большое спасибо.
Понял правдо в примере не все:

procedure combat_p_proc begin

присвоение перем. tmp_armor указателя одетой на чузе брони.
variable tmp_armor:=critter_inven_obj(dude_obj, INVEN_TYPE_WORN);

добавить событие по таймеру (носителю скрипта, задержка=1тик, инфо=2)
add_timer_event(self_obj, 1, 2);

    Если ф_п=4 или 3 то
    if  (fixed_param  ==  4)  or  (fixed_param == 3) then begin

        если количество мех_арморов в инвентаре носителя скрипта = 1 то
         if  (obj_is_carrying_obj_pid(self_obj, mech_armor_pid) == 1 ) then begin
           
                  Чюз экипируется в эту мех_арморину
                  wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, mech_armor_pid));

                    написать: "Бот установил майнд контрол" - Это что арморина гипнознула чюза заставив его одется в нее &#61514; ?
                   display_msg("Bot set brain control";
          end
     
          если количество андроид_арморов в инвентаре владельца скрипта = 1 то  
          if  (obj_is_carrying_obj_pid(self_obj, Android_armor_pid) == 1 ) then begin

                   То Чюз экипируется в эту арморину  
                    wield_obj_critter(dude_obj, obj_carrying_pid_obj(dude_obj, Android_armor_pid));
         
         написать: "Ктото влип?"
         display_msg("Bot set brain control";
         end

     Если мех армор была изначально надета то
    If  obj_pid(tmp_armor)==  mech_armor_pid   then begin
   
       
        metarule3(107, self_obj, 16777282, 0);

meta3_switch = METARULE3_ART_SET_BASE_FID_NUM (107), владелец скрипта, FID=16777282, meta3_par = 0:
изменить базовый номер FID (идентификатора фрейма)

Изменить базовый идентификатор фрайма? хмм?
Здесь не понял что делается? заменяется картинка у критера?        
        end
   

      if  obj_pid(tmp_armor)==  Android_armor_pid   then begin
    metarule3(107, self_obj, 16777336, 0);
    end
end      
end  

В целом не уверен что понял весь скрипт.
О том что тут делает metarule3 у меня только разные предположения.
В части скрипта используется указатель dude_obj, а в части self_obj,.
Это кусок для скрипта Obj_dude(Чуза)? Или любого другого критера?
Если Чуза то понятно. Но зачем тогда указатель self_obj?

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

Отправлено: 15:05 - 10 Фев., 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Цитата:
В целом не уверен что понял весь скрипт.
О том что тут делает metarule3 у меня только разные предположения.
В части скрипта используется указатель dude_obj, а в части self_obj,.
Это кусок для скрипта Obj_dude(Чуза)? Или любого другого критера?

1. У metalure есть несколько функций, по моему, но в данном случае она меняет ФИД - т.е. внешний вид, анимацию, называй как хочешь.
2. Тут я тебя не понял...Ты ж сам выше ответил. self_obj - это указатель на носителя скрипта dude_obj - указатель на чуза.


-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 23:11 - 10 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Да это скрипт дюда.  self_obj было лень испаравлять - разницы то никакой для этого скрипта.

Цитата:
"Бот установил майнд контрол" - Это что арморина гипнознула чюза заставив его одется в нее &#61514; ?


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

из этого появилось а не сделать игрока Андроидом.
И я поковырявшись в Mynah'х - скриптах мечвариора  стал эксперементировать на предмет неснимаемой брони. Теперь  она почти не снимается. :-/

Можешь заменить mech_armor_pid на пид обыкновенной брони, убить add_timer_event(self_obj, 1, 2); , исправить фиды  на соответственные и загнать это в скрипт дюда и посмотреть что получится.

>>Изменить базовый идентификатор фрайма? хмм?
>>Здесь не понял что делается? заменяется картинка >>у критера?

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

>>добавить событие по таймеру (носителю скрипта, >>задержка=1тик, инфо=2)
>>add_timer_event(self_obj, 1, 2);

Это вызов procedure timed_event_p_proc параллельно. К идушим ниже в рамках сомбат проки
fixed_param не относится. Мне нужно просто что бы дюд был всегда одет постоянно и снять с себя броню не мог поэтому у меня экиперовать и т.п. напихано почти вовсех процедурах (в которые это имело смысл засовывать).

Цитата:
Не уверен правильно ли понимаю как работает событие по таймеру [и далее].


Начался бой - произошла усилием двига инициация сомбат проки после того как у тебя кончились актион поинты(правда кто нибудь может успеть походить еще это я еще не выяснил точно),
выполнилась сомбат прока целиком
Начала работать procedure timed_event_p_proc  спустя один тик - меньше нельзя повиснет комп :-\
там тоже самое- т.е "экипировать".
на втором и третьем и т.п ходах timed_event_p_proc
уже будет работать на первом не факт. Выполнятся с сомбат прокой они будут обе.

Если чего нибудь пропустил переспрашивай, но проше  увидеть процедуру в действии.

Отправлено: 23:15 - 10 Фев., 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Цитата:
И я поковырявшись в Mynah'х - скриптах мечвариора  стал эксперементировать на предмет неснимаемой брони. Теперь  она почти не снимается. :-/

Можно узнать что значит "Почти" ?

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 23:19 - 10 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

binyan

При перекладывании брони в инвентаре в окошке можно увидеть себя в костюме 13 волта.
Это раз - но это фигня.

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

Отправлено: 23:44 - 10 Фев., 2006 | ИСПРАВЛЕНО: Dar - 14:52 - 11 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Dar спасибо большое, за разъяснения.

А не подскажет кто-нибудь способ проверки какая инвентарная рука в данный момент активна? Или что за вещь экипирована в активной руке?
-----------------------------------------------------------
близкая ситуация есть в Ф2 на входе в НКР.
Там гвард как то смотрит наличие оружия в активной руке; просит убрать если оно присутствует.

При этом если в неактивной руке оружие есть, это того гварда не волнует, его волнует только активная рука.

А как это реализуется? Насколько понимаю такая вещь как

#define critter_is_armed(x)      
(((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \
((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))

здесь не проканывает, ведь если я правильно понимаю critter_is_armed(x) проверяет обе руки, не различая какая из них активна?

Пытаюсь разобраться со скриптом этого НКРовского гварда(scgtegrd.ssl), как он смотрит именно активную руку, но пока много дыр в знаниях скриптов, и многое не понятно.

Отправлено: 13:21 - 11 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Keha

Согласно FAQ получить указатель на,  неактиную руку нельзя, можно только на активную.

Отправлено: 14:48 - 11 Фев., 2006 | ИСПРАВЛЕНО: Dar - 14:54 - 11 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Упс, спасибо большое, проглазел этот момент.

Отправлено: 16:18 - 11 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Вроде как это не должно работать - а работает.

procedure use_skill_on_p_proc
begin
script_overrides;
if using_skill(self_obj, 7) or using_skill(self_obj, 6) or using_skill(self_obj, 10) then
begin
script_overrides;
display_msg("This no can";
end
//чтобы на критера можно было юзать науку или ремонт нужно ставить в про  флаги steal, drop  и какой либо третий.
if (action_being_used == 13) and (obj_pid(self_obj) == 16777819) then call talk_p_proc;
if (action_being_used == 12) and (obj_pid(self_obj) == 16777819) then float_msg(self_obj, "Hi", 4);
if (action_being_used == 13) and (obj_pid(self_obj) == 16777817) then float_msg(self_obj, "My car is best", 4);
end

Отправлено: 21:45 - 18 Фев., 2006
Ray
Модератор

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

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

И в чём же вопрос? Почему данный пример работает таки?

Кстати, вот давно хотел спросить: есть ли в скриптах команды позволяющие прервать выполнение процедуры (continue, halt, etc.)?

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 22:56 - 18 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

>>И в чём же вопрос? Почему данный пример работает таки?

Ага - просто в доке было написано что  using_skill(self_obj, 7) or using_skill(self_obj, 6)
не работает(со скрипта подопытного кролика оно работает).

И про pro-файлы  нигде вроде не было упомянуто,  как разрешить применение на критера того или иного скила (науки или ремонта). Моя про это скпрашивал раньше - как бы себе и ответил.

И вопрос  на засыпку,  вот для чего может пригодится пид дюда со скриптовой точки зрения?
Что с ним полезного можно сделать чего так нельзя?

Отправлено: 1:40 - 19 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Для чего все это мне надо описано в разделе Проэкты\повышение реалистичности.

Чюзен проводит успешную атаку по критеру нанося дамаж.
1?) Мне нужно скриптово определить скил, по которому проходит оружие, которым Чюз дамажнул критера.

Как просто реализовать определение скила нанесшего домаж оружия я не нашел, может проглазел, поэтому пишу как это я делаю через жо…. - чердак:

procedure combat_p_proc begin
 variable wip; - перем. для указателя на предмет в активной руке. 
    if (fixed_param == 2) then begin - если combat_p_proc вызвана успешным попаданием то
      wip:=critter_inven_obj(self_obj,1);- присваиваю переменной wip указатель на предмет в правой руке.
        if wip == 0 then begin - если wip все еще равна 0(правая рука оказалась неактивной) то
        wip:=critter_inven_obj(self_obj,2);стало быть активна левая рука и в wip записываем указатель на предмет из нее.
        end
 
Далее определять скил (по которому проходит находящееся в ативной руке оружие) хотел выдергивая данные из прошника при помощи proto_data(obj_pid(wip),х); где х номер данных из прошника.
-----------------------------------------------------------------
2?) но поглядев на то что моржно выдернуть:

#define it_pid (0)
#define it_name (1)
#define it_description (2)
#define it_fid (3)
#define it_light_distance (4)
#define it_light_intensity (5)
#define it_flags (6)
#define it_flags_ext (7)
#define it_sid (8)
#define it_type (9)
#define it_data (10)
#define it_material (11)
#define it_size (12)
#define it_weight (13)
#define it_cost (14)
#define it_inv_fid (15)
#define it_weapon_range (555)

похоже по этим данным четкого определения скила не выйдет - так как это не все данные из прошника оружия, тут
нет например данных о типе дамажа наносимого оружием, итп.
------------------------------------------------------------------
3?) Да и например при выдергивании инфы из it_flags_ext при помощи proto_data(obj_pid(wip), 7); получается число с которым я не разобрался.

О it_flags_ext описано в формате про файлов:
Flags Ext (дополнительные флаги)
Item Flags (флаги предметов):
0x08000000 – Hidden Item (предмет является «скрытым»)
Action Flags (флаги действий):
0x00001000 – Use On Smth (объект можно использовать на что-либо)
0x00002000 – Look (объект можно осмотреть)
0x00004000 – Talk (с объектом можно поговорить)
0x00008000 – PickUp (объект можно поднять)
0x00000800 – Use (объект можно использовать)
Weapon Flags (флаги оружия):
0x00000100 – Big Gun (оружие относится к классу Big Guns)
0x00000200 – 2Hnd (оружие относится к классу двуручных)
Primary Attack Type (тип основной атаки):
0x00000000 – stand
0x00000001 – throw punch
0x00000002 – kick leg
0x00000003 – swing anim
0x00000004 – thrust anim
0x00000005 – throw anim
0x00000006 – fire single
0x00000007 – fire burst
0x00000008 – fire continuous
Secondary Attack Type (тип дополнительной атаки):
0x00000000 – stand
0x00000010 – throw punch
0x00000020 – kick leg
0x00000030 – swing anim
0x00000040 – thrust anim
0x00000050 – throw anim
0x00000060 – fire single
0x00000070 – fire burst
0x00000080 – fire continuous

У меня proto_data(obj_pid(wip), 7) выдернуло число: 41478
Это число соответствовало самомоднутому стволу у которого я выставил Primary Attack Type = fire single, Secondary Attack Type отсутствовала. Как то можно расшифровать это 41478? чтоб понять где в нем  Primary, Secondary Attack, Weapon Flags и прочее ?
-----------------------------------------------------------------
В итоге решил пока тупо принудительно сопоставить каждому названию оружия скил по которому оно проходит через if но правда ifов многовато получится.

Для определения скила в этом случае достаточно выдернуть из прошника название оружия при помощи proto_data(obj_pid(wip), 7) и далее, через ifовую сопаставительную (название - скил) таблицу получить скилл.
---------------------------------------------------------------
4?) Но тут возникают очередные проблы.
например копьем можно колоть, а можно его метать. Что должно соответствовать разным скилам (метание и холодное оружие).

Может кто знает скриптовые маневры которыми можно бы было выяснить какая текущая атьака (метание или укол в случае копья) включена на оружии?  
----------------------------------------------------------------
5?) Проблема определения скила при метании. - Еше один подводный камень на который наткнулся.

При метании, оружия в руке не остается, и соответственно моя система определяет скил как рукопашку.
Стало быть мне надо как то организовать запоминание указателя на оружие зарание еще до атаки,
и чтоб указатель исправлялся при каждой смене оружия в руке, или изменении активной руки.
А как это "при каждой смене" обстряпать пока не представляю.

Отправлено: 16:30 - 24 Фев., 2006 | ИСПРАВЛЕНО: Keha - 16:57 - 24 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

А что critter_p_proc (выполняется постоянно - несколько раз в секунду) в бою не выполняется?

Чтоб что то переодично проверять в боевке (combat_p_proc) то только через timer_event ?

add_timer_event(ObjectPtr obj, int time, int info) где time - задержка выполнения (в игровых тиках)

Чему равен игровой тик? Хотяб приблизительно? Доли секунды, секунды, минуты?

Отправлено: 17:14 - 26 Фев., 2006
Strongholder
Прилипала MkII

Откуда: Nelly's Bar
Регистрация: Май 2004

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

Строго AFAIR:
1) c_p_p в бою не выполняется.
2) Игровой тик = 10 мс. Т.е. 100 тиков = 1 с.

-----
Живущий в стране эльфов. Несмотря ни на что.

Отправлено: 17:26 - 26 Фев., 2006
Aman
Пользователь

Откуда: Киев
Регистрация: Апр. 2005

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

По-моему все-таки 1 тик=0,1 сек, 10 тиков = секунда.

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

Отправлено: 18:44 - 26 Фев., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:

2) Игровой тик = 10 мс. Т.е. 100 тиков = 1 с.


Неверно. В секунде 10 тиков.

Отправлено: 18:45 - 26 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Спасибо большое.
--------------------------------
Пытаюсь организовать в боевом режиме
аналог critter_p_proc - чтоб можно было постоянно выполнять определенный блок команд, но вот толи сам корявый то ли:

variable st;
variable q;

procedure combat_p_proc begin
  if st == 0 then begin
       st:=1;    
       add_timer_event(self_obj,5,44); отсюда тайм ивент должен добавлятся только при старте боевки так как далее st будет равна 1 и сюда програма заходить не будет
   end  
end

procedure timed_event_p_proc begin
   if (fixed_param == 44) then begin
      q:=q+1; эту и следующую строчку написал для проверки циклится тайм ивент в боевке или нет
      display_msg("n="+q);
      add_timer_event(self_obj,5,44); - зацикливание таймивента на себя через каждые 5 тиков
      *блок команд* как я пологал если сунуть сюда какие то команды то они во время боевки будут переодично выполнятся с установленым в add_timer_event(self_obj,периуд,44) периудом, но на практике выполняется только раз.
   end
end

procedure critter_p_proc begin
        rm_fixed_timer_event(self_obj,44); к_п_п включается как только боевка отключается и потому эту процедуру удобно использовать на остановку зацыкливания тайм ивента после прекращения боевки, заодно тут же нулим переменную st
        st:=0;
end

Почему у меня не циклится тайм ивент в боевке? Или тики это игровое а не машинное время, и во время турна они не тикают? А тикают только со сменой турна дискретно?

А то у меня q меняется как раз с преходами турнов почемуто.  

Отправлено: 19:11 - 26 Фев., 2006 | ИСПРАВЛЕНО: Keha - 21:45 - 26 Фев., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

В бою работает только combat_p_proc, емнип.

Отправлено: 10:35 - 27 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

void AddButtonProc(string btn_name, procedure button_on, procedure button_off, procedure button_press, procedure button_release) - связывает с кнопкой btn_name процедуры для обработки событий
Аргументы:
btn_name - имя кнопки, например, "test_btn"
button_on, button_off, button_press, button_release - имена процедур для обработки наведения, убирания, нажатия и отпускания мыши


Можно ли AddButtonProc прилепить к существующим фолаутовским кнопкам?

Если можно, то очень интересует названия(btn_name) двух кнопок:
1) левая красная кнопка - изменяет активную руку.
2) кнопка "далее" в открытом инвентаре - которая закрывает окно инвентаря.

Отправлено: 15:49 - 27 Фев., 2006 | ИСПРАВЛЕНО: Keha - 15:53 - 27 Фев., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Нет.

Отправлено: 16:19 - 27 Фев., 2006
Mynah
Модератор

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

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

>>В бою работает только combat_p_proc, емнип.
Фига:) Таймед евенты работаю тоже. Только странно как-то.

-----
Scio me nihil scire

Отправлено: 22:01 - 27 Фев., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

>>Только странно как-то

Дык, ход игрока неприкасаем, а остальное струкитурировано по fixed_param(которые для combat_p_proc ).  вот они(timer_event) "структурированно" и работают.

Отправлено: 0:06 - 28 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Тайм ивент в кобмбате работает, проверено на приведенном мной скрипте, правда работает совсем не так, как хотелось бы.  Как я понял игра начинает обрабатывать сколько тиков прошло только при нажатии перехода хода. Те тик - это именно игровое время, которое в мирной ситуации тикает непрерывно, а в бою тикает скачками(дискретно) только с нажатием перехода хода. Пока *некст турн* не нажат игровое время замирает и тики не тикают.

Было бы уже неплохо, если бы число прошедших тиков было привязано в боевке к числу истраченных экшен пойнтов. Но к сожалению трата экшен пойнтов, на тиканье тиков не влияет, а только *некст турн*.
Скорее всего каждый *некст турн* дискретно накидывает к игровому времени определенное число тиков. Чему равно это число в принципе можно попытаться выяснить экспериментально.

А из за того что время в тиках меняется дискретно, например если оно меняется с *некст турном* скачком на 10 тиков, то соответственно несколько тайм ивентовых событий из моего скрипта остаются в пролете, и срабатывает только одно из них на каждый турн.

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

Отправлено: 15:18 - 28 Фев., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Метод извлечения составных частей из полей прототипа объекта.
Возможно кому-то понадобится. Если же данный метод не кому не нужен то пост можно удалить.

Если мы хотим получить из прототипа объекта данные какого то определенного поля, то сталкиваемся с тем что proto_data возвращает эти данные в виде числа десятичного формата. А в описании формата файлов прототипов (Формат PRO-файлов Fallout2), поля представлены в виде чисел шестнадцатеричного формата. Причем одним полем - одним шестнадцатеричным числом зашифрованы сразу несколько данных(флагов).

Вот способ как из полученного с помощью proto_data десятичного числа
получить все эти шестнадцатеричные данные(флаги) по отдельности:

dec:= proto_data(int pid, int data_member)

flag1:=dec-(dec/16)*16; // последний знак шестнадцатеричного dec
flag2:=dec/16-((dec/16)/16)*16;  // предпоследний знак шестнадцатеричного dec
flag3:=(dec/16)/16-(((dec/16)/16)/16)*16; //третий с конца знак
flag4:=((dec/16)/16)/16-((((dec/16)/16)/16)/16)*16; //четвертый с конца знак
итд по мат индукции.

(Данные формулы работают корректно благодаря тому что в скриптах ssl операция / (деления) является целочисленной)

Например мы имеем pid копья, и хотим получить из 7го поля про-файла копья, два флага типов атаки(см Формат PRO-файлов Fallout2):

dec:= proto_data(pid копья, 7)

flag1:=dec-(dec/16)*16; // Primary Attack Type
flag2:=dec/16-((dec/16)/16)*16; // Secondary Attack Type

В итоге flag1 станет равным 4ке, что, если сверится с хелпом Формат PRO-файлов, соответствует атаке thrust (колоть); flag2 станет равным 5ке соответствующей атаке throw(метание).

Пример куска скрипта, на котором можно проверить работоспособность метода (вставлять в obj_dude_ssl):
-----------------------------------------------------------------------
procedure Check_wip;
procedure Check_wipon;
procedure dec_to_hex;

variable wip;

// процедура critter_p_proc в obj_dude_ssl уже существует, вам останется вставить в нее
//строку call Check_wipon;  


procedure critter_p_proc begin
  call Check_wipon;  
end

procedure Check_wipon begin // проверка на изменение экипировки активной руки
variable wip1;
wip1:=wip;
call Check_wip;  
  if not(wip == wip1) then begin              
     display_msg("you ekipirovalis "+proto_data(obj_pid(wip),1));  
     call dec_to_hex;
  end  
end

procedure Check_wip begin // запоминание указателя на предмет в активной руке
 wip:=critter_inven_obj(self_obj,1);
   if wip == 0 then begin
      wip:=critter_inven_obj(self_obj,2);
   end  
end

procedure dec_to_hex begin

   variable dec;
   variable at1;
   variable at2;

   dec:=proto_data(obj_pid(wip),7);
 
   at1:=dec-(dec/16)*16; // использование метода для флага первого типа атаки
   at2:=dec/16-((dec/16)/16)*16; //для флага второго типа атаки

   if at1 == 0 then begin
   display_msg("attack type1  =  none");
   end else if at1 == 1 then begin
   display_msg("attack type1  =  punch");
   end else if at1 == 2 then begin
   display_msg("attack type1  =  kick leg");
   end else if at1 == 3 then begin
   display_msg("attack type1  =  swing");
   end else if at1 == 4 then begin
   display_msg("attack type1  =  thrust");
   end else if at1 == 5 then begin
   display_msg("attack type1  =  throw ");
   end else if at1 == 6 then begin
   display_msg("attack type1  = fire single");
   end else if at1 == 7 then begin
   display_msg("attack type1  =  fire burst");
   end else if at1 == 8 then begin
   display_msg("attack type1  =  fire continuous");
   end

   if at2 == 0 then begin
   display_msg("attack type2  =  none");
   end else if at2 == 1 then begin
   display_msg("attack type2  =  punch");
   end else if at2 == 2 then begin
   display_msg("attack type2  =  kick leg");
   end else if at2 == 3 then begin
   display_msg("attack type2  =  swing");
   end else if at2 == 4 then begin
   display_msg("attack type2  =  thrust");
   end else if at2 == 5 then begin
   display_msg("attack type2  =  throw ");
   end else if at2 == 6 then begin
   display_msg("attack type2  = fire single");
   end else if at2 == 7 then begin
   display_msg("attack type2  =  fire burst");
   end else if at2 == 8 then begin
   display_msg("attack type2  =  fire continuous");
   end

end
-----------------------------------------------------------------------
Приведенный кусок скрипта в мирном режиме через critter_p_proc и вызываемую из нее Check_wipon постоянно проверяют активную руку на предмет изменения экипировки.( те либо на смену предмета в активной руке, либо на смену самой активной руки). В случае изменения экипировки активной руки приведенный кусок скрипта выводит три сообщения:  

*вы экипировались +(название предмета)
*attack type1  = (тип первой атаки экипированного предмета)  
*attack type2  = (тип второй атаки экипированного предмета)  

Могу разъяснить подробней как получаются формулы для flag1, flag2, flag3,... ,
и все что будет непонятно.

Отправлено: 11:23 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 11:48 - 2 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Пардон, но это конкретное извращение . Посмотри в заголовках БИС как реализована побитовая запись/чтение. Вот тебе пример:

// --- дефайны где-нить в h ---
#define MAXINT 4294967295                 //Max int
#define INV(x) (MAXINT - x)               //An inverse function
// get bit state
#define bit_state(x, the_bit)                          ((x bwand the_bit) != 0)
// switch bit on
#define set_bit_on(x, the_bit)                   x := x bwor the_bit
// switch bit off
#define set_bit_off(x, the_bit)                  x := x bwand INV(the_bit)
#define FLAG_BIG_GUN                             4
// --- конец дефайнов ---

// --- где-нить в программе ---
f_ext := proto_data(obj_pid(obj_ptr), it_flags_ext);
f_big_gun := get_bit(f_ext, FLAG_BIG_GUN);

Отправлено: 13:05 - 2 Марта, 2006
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

Keha: ...поля представлены в виде чисел шестнадцатеричного формата...

Число в шестнадцатеричном предствалении всегда можно перевести в десятичное и наоборот.


Primary Attack Type (тип основной атаки):
0x00000000 = 0 - stand
0x00000001 = 1 - throw punch
0x00000002 = 2 - kick leg
0x00000003 = 3 - swing anim
0x00000004 = 4 - thrust anim
0x00000005 = 5 - throw anim
0x00000006 = 6 - fire single
0x00000007 = 7 - fire burst
0x00000008 = 8 - fire continuous
Secondary Attack Type (тип дополнительной атаки):
0x00000000 =   0 - stand
0x00000010 =  16 - throw punch
0x00000020 =  32 - kick leg
0x00000030 =  48 - swing anim
0x00000040 =  64 - thrust anim
0x00000050 =  80 - throw anim
0x00000060 =  96 - fire single
0x00000070 = 112 -  fire burst
0x00000080 = 128 - fire continuous


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

flagExt:= proto_data(pid, 7)

primaryAtackType := flagExt bwand 15; /* 15 = 0x0000000F */
secondaryAtackType := flagExt bwand 240; /* 240 = 0x000000F0 */

Отправлено: 13:17 - 2 Марта, 2006 | ИСПРАВЛЕНО: Anchorite - 16:49 - 2 Марта, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Цитата:
Quote: from Wasteland Ghost


Пардон, но это конкретное извращение .


Большое спасибо. Я просто тут у народа спрашивал как выдергивать нужный флаг при помощи  proto_data. О существовании get_bit был не в курсе. Мне не кто не ответил, вот и решил изврашатся как получается .

Цитата:
Quote: from Anchorite
primaryAtackType := flagExt bwand 31; /* 31 = 0x0000000F */
secondaryAtackType := flagExt bwand 240; /* 240 = 0x000000F0 */

Сбасибо большое.

Отправлено: 13:37 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 13:45 - 2 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

2Keha Вообще говоря, советую бысто пробежаться глазами по БИСовым заголовкам. Там есть полезные готовые решения. get_bit, кстати, там нет. Есть gvar_bit, mvar_bit, lvar_bit и т.д.. А это уже моя переделка. Тем не менее, идея всё та же.

Отправлено: 13:49 - 2 Марта, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Протестил bwand
заменив свой изврат

at1:=dec-(dec/16)*16;
at2:=dec/16-((dec/16)/16)*16;

на

at1:= dec bwand 31; /* 31 = 0x0000000F */
at2:= dec bwand 240; /* 240 = 0x000000F0 */

Но почему-то bwand не всегда работает, в отличие от
моего изврата.

У меня на карте где тестил скрипт лежало гаус ружье,
метательный нож и копье.

Так для ружья гаусса и bwand, и мое/16, дают правильные значения. А вот для случая копья и метательного ножа мое /16 работает, а bwand похоже вырезает, что то не то, по значению превышающее 8ку. Так как не то что неверных значений не выводится, а вообще никаких.
*********************************
a2: вывести и для ножа и копья всетаки смог, ошибка была у меня. Забыл подправить ifы (a2 в случае bwand принимает значения не от 0 до 8 а уже от 0 до 128

А вот a1 по прежнему не выводится в них покакой то пречине для ножа и копья bwand заносит значения 20 и 21.  А значение a1 не должно превышать 8.

dec:=proto_data(obj_pid(wip),7);
at1:= dec bwand 31; /* 31 = 0x0000000F */
at2:= dec bwand 240; /* 240 = 0x000000F0 */

//at1:= get_bit(dec, 0);
//at2:= get_bit(dec, 1);

//at1:=dec-(dec/16)*16;
//at2:=dec/16-((dec/16)/16)*16;

display_msg("at1 = "+at1);
display_msg("at2 = "+at2);

Отправлено: 14:59 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 15:37 - 2 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Проверяй свою программу внимательнее . bwand не может "не работать" по определению .

Отправлено: 15:45 - 2 Марта, 2006
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

Да лажанулся я. Вместо 31 должно быть 15.  Лишний битик вырезал

Посыпаю голову пеплом

Отправлено: 16:51 - 2 Марта, 2006 | ИСПРАВЛЕНО: Anchorite - 16:57 - 2 Марта, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Почему у меня LVAR не сейвятся в сейвах ?

Все роботает хорошо, те лвара сохраняется при переходе с локации на локацию итп, но вот если записатся, и потом считаться то ее значение при загрузке игры теряется(обнуляется) .

В scripts.lst  число своих Лваров добавил -  запись    # local_vars=5 заменил на # local_vars=9.

Запись чтение в лвару осуществляется только в приведенной процедуре:

(obj_dude.int)
//уже были:
#define LVAR_Last_Digest_Time    (0)
#define DRTROY_INJECTION          (1)
#define CHECK_DUDE_V15ENT_LEVEL   (2)
#define CHECK_RNDBESS_FLOAT       (3)
#define TIMER_INIT_V13_SEQUENCE    (4)

// мои Лвары:
#define LVAR_count_GUN          (5)  
#define LVAR_count_UNARM       (6)
#define LVAR_count_MELE         (7)
#define LVAR_count_THROW      (8)  

procedure Check_add_to_skill begin
 variable rand;
 variable skilev;
 variable N_ LVAR;
 variable skill_count;
 
 skilev:=has_skill(self_obj,skil1);

 if skil1 == 0 then begin// если (0) - легкие стволы то
    N_ LVAR:=5; //то номер Лвара 5
 end else if skil1 >= 3 then begin
    N_ LVAR:=skil1+3; //номер лвара для остальных умений
 end

 rand:=random(0,180);
 display_msg("random = "+rand); // проверка для отладки
 if (rand >= skilev) then begin
 
     skill_count:=local_var(N_ LVAR); // ЧТЕНИЕ ИЗ ЛВАРЫ
     skill_count:=skill_count+1;
   
      if (skill_count >=(skilev+1)) then begin
      critter_mod_skill(self_obj,skil1,1);
      skill_count:=0;
      display_msg("+1 k skilu"+skil1);
      end  

      set_local_var(N_ LVAR,skill_count); // ЗАПИСЬ В ЛВАРУ
      display_msg("kopilka skilla "+skil1+" ravna "+skill_count);// для отладки
  end
end

Отправлено: 20:03 - 4 Марта, 2006 | ИСПРАВЛЕНО: Keha - 20:23 - 4 Марта, 2006
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

В сэйве сохраняются только GVARы. Как ты думаешь, почему все квэсты завязаны именно них?
И, кстати, заметная часть багов, оставшихся ещё от разработчиков как раз в том и заключается, что про этот факт банально забыли.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 13:01 - 7 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Алхимик, не сей панику . ЛВАР и МВАР сохраняются в мапах, т.е. в сейвах. Другое дело, что надо данный конкретный скрипт смотреть, ибо запись в ЛВАРы тут какая-то замудрённая .

ЗЫ Надеюсь, никто не путает LVAR (скриптовые переменные) и variable (локальные переменные)?

Отправлено: 14:48 - 7 Марта, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Да я уже пересадил свою задумку на Гвары. Но гваров число ограниченное, и из  соображения экономии приходится совать в одну гварину сразу несколько переменных.

Во всех же доках что я читал написано что Lвары  в сейвах сохраняются. А у меня те что из  obj_dude.int сохранятся не хотят.

Возможно причина именно в существовании некой привязки Lvara к "дому" - карте.

И в итоге возможно для "бродячего бездомного" - не привязанного к конкретной карте скрипта obj_dude.int, Lvarы не сейвятся.

Цитата:
Quote: from Wasteland Ghost
Другое дело, что надо данный конкретный скрипт смотреть, ибо запись в ЛВАРы тут какая-то замудрённая .
Можь и мудреная , но с Гварами работает. Что там мудреного то ? Получение номера LVARа - N_ LVAR ?

Все работает нормально: в приведенную процедуру приходит переменная skil1, которая может иметь значения 0, 3,4 и 5(номера скилов легкие стволы, безоружный бой, холодное и метиание). То что приходили именно эти значения проверял через display_msg("номер скила "+skil1);

при любом из приведенных значений N_ LVAR принимает один из номероов:

если skil1=0 то N_ LVAR=5
если skil1=3 то N_ LVAR=6
если skil1=4 то N_ LVAR=7
если skil1=5 то N_ LVAR=8

где:

#define LVAR_count_GUN          (5)  
#define LVAR_count_UNARM       (6)
#define LVAR_count_MELE         (7)
#define LVAR_count_THROW      (8)  

запись чтение :

skill_count:=local_var(N_ LVAR); // ЧТЕНИЕ ИЗ ЛВАРЫ
set_local_var(N_ LVAR,skill_count); // ЗАПИСЬ В ЛВАРУ

кроме того повторю что на гваразх тот же алгоритм работает те сейвится.
----------------------------------
Шас полезу проверю сейвятся ли у меня Lvars для "одомашненных" скриптов.

Отправлено: 15:04 - 7 Марта, 2006 | ИСПРАВЛЕНО: Keha - 15:34 - 7 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Просто ЛВАР у тебя девять, номер вычисляется как скилл + 3, а скиллов вообще-то 17 . В общем, тебе твои куски понятны, другим - не всегда, потому что они не весь скрипт видят .

ЗЫ Только не восприми мои слова, как намёк на то, что впредь надо постить весь скрипт .

Отправлено: 18:45 - 7 Марта, 2006
Ray
Модератор

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

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

И вообще, кто тебе сказал, что:


Цитата:

Но гваров число ограниченное



-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 0:10 - 8 Марта, 2006
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

2WG:
Цитата:
Надеюсь, никто не путает LVAR (скриптовые переменные) и variable (локальные переменные)

Пардон. Углядев конструкцию "variable N_ LVAR", именно так и перепутал. :/

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 6:27 - 8 Марта, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Цитата:
Quote: from Ray
И вообще, кто тебе сказал, что гваров число ограниченно


Дык где-то в хелпах вычитал. Помоему ограничение там связывали с прошивкой в движке. Т.е. есть офсетики в ехе.шнике где количество Гваров добавить можно?

Цитата:
Углядев конструкцию "variable N_ LVAR", именно так и перепутал.
Это у меня переменная для номера Лваров, но не сами Лвары.
----------------------------------------------------------------
Кстати протестил работу Лвара в диалоге на привязанный к критиру на карте скрипте. Скрипт был аналогичен тому что приведен в  FScript-HOWTO для освоения работы с Лварами. И чето оно у меня тоже глючит. Все-таки сейвится, но как правило со второго сейф/лоада. После первого сейф/лоада Лвара как правило не запоминается почему-то.

Надо попробовать приведенный в FScript-HOWTO скрипт с Лварой 1 в 1 протестить. Мож все-таки я криворукий.


Отправлено: 19:05 - 8 Марта, 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Насчет Гвар...Я тоже думал почему то что кол-во гвар ограниченное. НО это было полгода назад. Потом посмотрел ещё раз хелп. Кол-во СВОБОДНЫХ гвар ограниченно, но добавлять новые гвары никто не запрещал по моему =)

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 21:46 - 8 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Новые ГВАР добавлять можно. Открываешь VAULT13.GAM и добавляешь.

А вот вопрос сохраняются ли ЛВАР для obj_dude на самом деле интересен. Я так понимаю, что не сохраняются. Или сохраняются всё-таки? Кто может проверить и сказать железно? Анхорит, данные дуда в мапах не сохраняются? Или сохраняются?

Отправлено: 8:42 - 9 Марта, 2006
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

Не могу сказать с опредленностью.

Мне вообще интересно есть ли в сейвленных мапах описатели для скриптов групп 0 (s_system) и 2 (s_timed).

Если есть - тогда возможно и сохраняются.

Отправлено: 11:36 - 9 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Хмм... Я в сейвах, вообще-то, не разбиралась... Если мне не изменяет мой склероз, карты сохраняются в sav-файлах. Стало быть, надо сохраниться где-нить, например, в Храме и посмотреть соответствующий sav...

Отправлено: 13:53 - 9 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

Люди, помогите! Как сделать так, чтобы при выборе какого-нибудь варианта ответа в диалоге, человек атаковал бы Чузена. Смотрел в разных скриптах - там через ЛВАРы прописано все, да и как-то по-странному - в варианте ответа прописывается ЛВАРа = 2, а потом в critter_p_proc проверяется и если эта ЛВАРа = 2, то человек атакует Чуза. Пробовал писать так же, но ничего не выходит. Скажите, пожалуйста, и если возможно, покажите на примере, как можно реализовать атаку при выборе варианта ответа.

-----
Вскрытие показало - больной спал.

Отправлено: 21:43 - 16 Марта, 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

ИМХО ничто не мешает в выбранной опции диалога сразу напасть на чузена.
Т.е. у тебя есть допустим опция которая вызывает процедуру Nodexxx, внутри процедуры зовешь процедуру аттак. Бисовцы для этого использовали процедуру Node998.
Для чего сделаны лвары? Я думаю для того чтобы если ты выйдешь из диалога с помощью 0, на тебя всё равно нападали.


-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 22:27 - 16 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

1.Вот именно. В этом Ноде (998) прописана лвара. Если я вызываю процедуру Node998, а в ней прописан один только attack_complex, то экран виснет в режиме диалога (пустом) и никто никого не атакует!
2. Почему тогда ничего не пашет с лварами??? Вариант ответа в диалоге выбираю, диалог закрывается, и ничего не происходит! Все стоят как и стояли!

-----
Вскрытие показало - больной спал.

Отправлено: 0:25 - 17 Марта, 2006
Alan Killenger
Пользователь

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

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

Подвесь атаку на таймер с задержкой 0. Таймерные события чем хороши - сработают гарантированно и нейтрально.

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

Отправлено: 0:44 - 17 Марта, 2006
Sokil
Пользователь

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

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

2 ERA
Если ты говоришь, что сделал всё точно так же, а всё равно не работает, знаит, что-то ты пропустил.
Node998 нужна для установки лвары в боевое положение и корректного выхода из диалога. Если вызывать драку из диалога, естественно, ничего не получится. Attac ружно вызывать из critter_p_proc.
Вообще, переменную LVAR_Hostileм ожно изменить в любой ноде, но она сработает только по завершению диалога.

Если ты проверяешь работоспособность скрипта в мэппере - это не самый лучший вариант. Там многие функции не работают. Проверять нужно непостедственно в игре. Модифицируй скрипт Клинта, того самого "племенного пацана", стояцего у храма.
P.S. Эта тема уже где-то досконально разбиралась. Посмотри фак по модификации фола.  

Отправлено: 8:01 - 17 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

2 Sokil
Проверяю скрипты я в игре. Все факи пересмотрел - ничего не нашел.
З.Ы. Попробую вместо нового скрипта переписать скрипт Клинта.

2 Alan Killenger
Ты поподробнее рассказал бы, а то я новичок в скриптинге.

-----
Вскрытие показало - больной спал.

Отправлено: 17:55 - 17 Марта, 2006
Alan Killenger
Пользователь

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

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

Цитата:

#define FIXED_ATTACK /* какое-нибудь значение */

 ...
 /* там, где нужно вызвать атаку */
 add_timer_event(self_obj, 0, FIXED_ATTACK);
 ...

 procedure timed_event_p_proc begin
   if (fixed_param == FIXED_ATTACK) then begin
     attack_setup(self_obj, /* кого атакуем */);
   end
 end


Событие по таймеру выполнится сразу же после того, как игрок выйдет из режима диалога.

Не надо такие километровые буквы .
WG


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

Отправлено: 18:11 - 17 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

2 Sokil
Что-то какая-то фигня - у меня даже скрипт Клинта не компилится! Пробовал модифицировать его скрипт - тоже не компилится.
2 Alan Killenger
Значение-то какое ставить???
add_timer_event ставить в Ноде?

Пасибки!


-----
Вскрытие показало - больной спал.

Отправлено: 19:10 - 17 Марта, 2006
Alan Killenger
Пользователь

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

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

FIXED_ATTACK поставь любое значение, к примеру 1. Это нужно сугубо для того, вдруг ты еще что-нибудь захочешь на таймер подвесить.

add_timer_event - добавить событие по таймеру. Ставь инструкцию где угодно, хоть в диалоговой процедуре.

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

Отправлено: 19:29 - 17 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

1. Спасибо за таймер - все получилось!
2. Я дал криттеру алиен бластер, положил его ему в руку (БИС маппер), почему когда он на меня нападает - он меня гасит руками?
3. Может, не в тему, но почему после нескольких запусков Fallout 2 или после перезагрузки компа (редко), Fallout наотрез отказывается запускаться - пишет Fallout2 не является приложением win32. Приходится каждый раз переустанавливать экзэшник. (так случается со многими играми и не только у меня).
P.S. Сорри за офтоп.

4! Почему если я не объявляю процедуры (не НОДЫ) то все хорошо компилится и работает, а если объявляю - не компилится?

-----
Вскрытие показало - больной спал.

Отправлено: 20:06 - 17 Марта, 2006 | ИСПРАВЛЕНО: ERA - 20:40 - 17 Марта, 2006
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

3. Элементарно, Ватсон. Лечись от вирусов и троянов. Если текущий антивирус ничего не находит - меняй его на другой.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 20:19 - 17 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

2 Alchemist
Да не может быть - я систему несколько раз ЗАНОВО переустанавливал - каждый раз такая фигня!


(Добавление от 20:46 - 17 Марта, 2006.)


2 Alan Killenger
Ответь пожалуйста на мое сообщение на странице 52 (В конце).


-----
Вскрытие показало - больной спал.

Отправлено: 20:43 - 17 Марта, 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Вот такая проблема:
procedure add_weapon_options(variable num) begin
variable option_proc;
option_proc:= "WeaponOption"+num+"Selected";
gsay_option(-1, obj_name(self_item(weapons_pid_array(i))), option_proc , 49);
в скрипте есть пять процедур WeaponOptionXSelected (Где Х – 1,2,3,4,5) и процедура, в которой вызывается add_weapon_options(Х) пять раз.(С различными значениями Х)
Судя по результатам далога ( диалог заканчивается при клике на опцию вызывающую "WeaponOption"+num+"Selected", процедура не вызывается.
НО, если вместо gsay_option(-1, obj_name(self_item(weapons_pid_array(i))), option_proc , 49);

Написать конструкцию if else типа:
if num==1 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption1Selected, 49);

else if num==2 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption2Selected, 49);

else if num==3 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption3Selected, 49);

else if num==4 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption4Selected, 49);

else if num==5 then gsay_option(-1,obj_name(self_item(weapons_pid_array(i))), WeaponOption5Selected, 49);

То все прекрасно вызывается и работает…
Ваши соображения?
Я думаю потому что WeaponOptionXSelected - это процедура, а option_proc параметр.
Но всё же...Может в gsay_option нужно имя процедуры, а не сама процедура?
Эхх...если окажется что я прав, я который раз разочаруюсь в скриптах Фола =)


-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 20:51 - 17 Марта, 2006
Sokil
Пользователь

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

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

Цитата:

Что-то какая-то фигня - у меня даже скрипт Клинта не компилится! Пробовал модифицировать его скрипт - тоже не компилится.


А в какой директории у тебя измененный скрипт Клинта находится? Он просто может не находить заголовочные файлы (command.h и тому подобное)
Вообще - реализация такой штуки через timed_event эио излишнее усложнение. Оно и без того нормально работает. Чего-то ты упускаешь.
Цитата:

Я дал криттеру алиен бластер, положил его ему в руку (БИС маппер), почему когда он на меня нападает - он меня гасит руками?


Всё зависит от прототипа криттера. Насколько хорошо он владеет ием или иным видом оружия. Чтобы он стрелял из бластера, нужно искать криттера с хорошим показателем "энергетическое оружие". Параметры криттера просматриваются в мэппере. Edit -> Advanced.
Кстати, интересный момент. Если дать дикарю винтовку или наркоману - пистолет, то они просто исчезают, так как в фоле нет соответствующих картинок.

Отправлено: 20:57 - 17 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

2 Sokil
Спасибо за подсказку. С таймером все хорошо работает. Насчет скрипта Клинта - он у меня вместе с мапером шел, компилю правильно, как и свой скрипт. Просто у меня, если я не объявляю процедуры все компилится, а если объявляю - нет. Не знаешь, что за фигня?

Криттер у меня техник. Проблему я так решил - я дал ему в ОБЕ руки по алиен бластеру и все!

З.Ы. Не знаешь, как сделать так, чтобы этот техник убивал меня с первого удара, причем на тысяч 5 коцал бы. Пробовал через Атак_комплекс - все хорошо - убивается с первого удара на 5745 жизней, НО! криттер меня коцает (алиен бластером), жизни снимаются, и когда становится 000 жизней - только тогда Чузен падает и кровь растекается. При обычной атаке идет анимация убивания энергетическим оружием (скелет сгорает), а при атак_комплекс никакой анимации нет - 000 жизней и чуз просто оказывается на полу.

-----
Вскрытие показало - больной спал.

Отправлено: 21:52 - 17 Марта, 2006
Alan Killenger
Пользователь

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

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

Цитата:

Я дал криттеру алиен бластер, положил его ему в руку (БИС маппер), почему когда он на меня нападает - он меня гасит руками?


1. У криттера должен быть нужный пакет frm'ок?
2. У криттера должны быть соответствующим образом развиты скиллы (умения) в совокупе с правильно подобраным AI пакетом.
3. Есть активная рука, а есть не активная. Ложить оружие именно в активную руку, иначе неизвестно потом будет ли криттер им пользоваться. Какая активная, а какая - нет проверь сам методом тыка.

Цитата:

Может, не в тему, но почему после нескольких запусков Fallout 2 или после перезагрузки компа (редко), Fallout наотрез отказывается запускаться - пишет Fallout2 не является приложением win32. Приходится каждый раз переустанавливать экзэшник. (так случается со многими играми и не только у меня).


Было у меня такое, правильно Sokil сказал, вирусняк.

Цитата:

Почему если я не объявляю процедуры (не НОДЫ) то все хорошо компилится и работает, а если объявляю - не компилится?


Бес понятия. А какое именно сообщение выдает компилятор? Мы ведь здесь не ясновидящие. Где кусочек кода, чтобы мы могли посмотреть правильность написания?

Цитата:

Не знаешь, как сделать так, чтобы этот техник убивал меня с первого удара, причем на тысяч 5 коцал бы. Пробовал через Атак_комплекс - все хорошо - убивается с первого удара на 5745 жизней, НО! криттер меня коцает (алиен бластером), жизни снимаются, и когда становится 000 жизней - только тогда Чузен падает и кровь растекается. При обычной атаке идет анимация убивания энергетическим оружием (скелет сгорает), а при атак_комплекс никакой анимации нет - 000 жизней и чуз просто оказывается на полу.


Тут я не помошник, т.к. сам этого никогда не делал. Наврядли тебе вот так ответят, кстати. Эксперементируй сам. Дока по функциям от BIS тебе в руки и фантазия в помощь. Попробуй просто проиграть анимацию испепеления чузена. Попробуй поработать с damage_p_proc, экспериментируй одним словом. Да, и попробуй найти и посмотреть скрипт "случайной встречи в пустыне" чузена с Френком Хорриганом и скрипт "хранителя моста".

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

Отправлено: 13:01 - 18 Марта, 2006 | ИСПРАВЛЕНО: Alan Killenger - 14:07 - 18 Марта, 2006
Sokil
Пользователь

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

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

Собственно,  Alan Killenger на все вопросы ответил, но я немножко добавлю.
По поводу того, что не компиллируются скрипты с новыми нодами. Попробуй взять оригинальный не измененный скрипт (того же Клинта) и компильни его. Если не скомпиллится, значит как-то криво мэппер встал.
И потом, компиллятор выдает ошибки - смотри, на какую строку он указывает, и смотри, что там не так. Закомментируй эту строку (тут главное логику сильно не нарушать) и снова компильни. Если ошибка обнаружится в следующей строке, знаит, реально она где-то выше. Может, в объявлении процедур изначально что-то напутано.
Вообще, я пользуюсь оболочкой Fallout Script Editor и другим советую

А по поводу чудовищного дэмэжда тоже ничего посоветовать не могу. Такого рода эксерименты над Чузом не проводил. Мне он  живой нужен был

Отправлено: 14:05 - 18 Марта, 2006
ERA
Пользователь

Откуда: Россия, Краснодар
Регистрация: Март 2006

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

Спасибо, Sokil и Alan Killenger, вроде бы все сделал в первом скрипте. Работает.  Я компилю с echo off в батнике, поэтому ошибок не выдает, а просто не компилит. Кстати спасибо, что напомнил - echo я включу.
З.Ы.
Цитата:

Бес понятия. А какое именно сообщение выдает компилятор? Мы ведь здесь не ясновидящие. Где кусочек кода, чтобы мы могли посмотреть правильность написания?


А вдруг ясновидящие???


-----
Вскрытие показало - больной спал.

Отправлено: 14:40 - 18 Марта, 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Цитата:
3. Есть активная рука, а есть не активная. Ложить оружие именно в активную руку, иначе неизвестно потом будет ли криттер им пользоваться. Какая активная, а какая - нет проверь сам методом тыка.

Активная правая, сегодня проверял =))

П.С. И надеюсь что вы мой прошлый пост тут не пропустили? Интересно мнения узнать.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 21:29 - 18 Марта, 2006 | ИСПРАВЛЕНО: binyan - 21:31 - 18 Марта, 2006
Alan Killenger
Пользователь

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

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

Мое личное мнение: да [censored] его знает... странно, что ты разочаровался в этих скриптах, на них и надеятся бы не стоило .

Не хулигань.
WG


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

Отправлено: 0:49 - 19 Марта, 2006
Alan Killenger
Пользователь

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

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

Такой вот вопрос... Создаю криттера из скрипта карты. Криттер ходит разговаривает, все делает как надо... Одна только проблема - он не плотный, т.е. сквозь него можно ходить (хотя сам он ходить сквозь стены не может). Когда я создавал его не динамически, а правил карту - все было нормально. Может кто знает как сделать динамически созданного плотного криттера?

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

Отправлено: 1:14 - 20 Марта, 2006
Strongholder
Прилипала MkII

Откуда: Nelly's Bar
Регистрация: Май 2004

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

Заранее поставь его на карте, сделай невидимым, а когда нужно чтоб он появился - сделай видимым.

-----
Живущий в стране эльфов. Несмотря ни на что.

Отправлено: 1:26 - 20 Марта, 2006
Alan Killenger
Пользователь

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

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

Неприемлимо.

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

Отправлено: 1:33 - 20 Марта, 2006
Strongholder
Прилипала MkII

Откуда: Nelly's Bar
Регистрация: Май 2004

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

Хм. Почему? Скрипт у него ЕМНИП, если он невидим, блокируется. Атаковать он никого не будет, равно как и других гадостей делать. Проходить через него можно будет. И вообще, по сути он ничем никому мешать не должен.
Или, скажем, сделать его за пределами карты, затыкать вокруг блокерами, а когда нужно - переместить куда нужно...
Всё. Запас идиотских мыслей иссяк.

-----
Живущий в стране эльфов. Несмотря ни на что.

Отправлено: 1:57 - 20 Марта, 2006 | ИСПРАВЛЕНО: Strongholder - 1:58 - 20 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Пршник проверяй . Первый раз слышу, что Призраки появляются скриптово .

Отправлено: 8:37 - 20 Марта, 2006
Alan Killenger
Пользователь

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

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

Проверил, вместо create_object_sid(MY_PID, 0, 0, MY_SID) вызвал create_object_sid(MY_PID-10, 0, 0, MY_SID). Был создан кибердог, сквозь которого можно было свободно бегать. Так что... прикольно.

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

Отправлено: 21:11 - 21 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Глюки. Честное слово. Конкретные.

Давай подробно: что за Фол, не маппером ли тестишь, что за прошники, что за скрипт...

Отправлено: 15:24 - 22 Марта, 2006
Alan Killenger
Пользователь

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

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

Фол как Фол, 1.02d, поверх которого идут мои навороты. Тест идет именно в игре. Прошник любой. В скрипте карты, в map_enter_p_proc пихаю
Цитата:

if (global_var(MY_GVAR) == 0) then begin
 set_global_var(MY_GVAR, 1);
 create_object_sid(MY_PID, 0, 0, MY_SID);
end


Причем от PID'а ничего не зависит. Создавал так брамина без скрипта - все нормально. Ладно, ушел еще раз проверять скрипт.

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

Отправлено: 16:12 - 22 Марта, 2006
Alan Killenger
Пользователь

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

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

Как сделать безтелесного криттера:
Цитата:
procedure start;
procedure map_enter_p_proc;

procedure start begin
end

procedure map_enter_p_proc begin
 set_obj_visibility(self_obj, 1);
 critter_attempt_placement(self_obj, tile_num(self_obj), elevation(self_obj));
 set_obj_visibility(self_obj, 0);
end

А вот так он будет телесным:
Цитата:
procedure start;
procedure map_enter_p_proc;

procedure start begin
end

procedure map_enter_p_proc begin
 set_obj_visibility(self_obj, 0);
 critter_attempt_placement(self_obj, tile_num(self_obj), elevation(self_obj));
 set_obj_visibility(self_obj, 0);
end

Зря я грешил на create_object_sid.

P.S. Безтелесный криттер ничем не отличается от телесного кроме того, что сквозь него можно ходить. Безтелесный криттер будет стараться обходить препятствия, в том числе других телесных криттеров. С ним можно общаться, разглядывать его, красть у него и даже драться с ним. Никаких багов в скрипте (нехилом скрипте) безтелесного криттера мною не наблюдалось.

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

Отправлено: 1:28 - 23 Марта, 2006 | ИСПРАВЛЕНО: Alan Killenger - 2:36 - 23 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

А зачем тебе вообще играться с set_obj_visibility, если ты криттера создаёшь, а не прячешь/показываешь, как советовал Strongholder?

Отправлено: 9:25 - 23 Марта, 2006
Alan Killenger
Пользователь

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

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

Затем, что при скритовом создании я меняю только скрипт карты. А так - и скрипт и саму карту.

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

Отправлено: 11:02 - 23 Марта, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Это-то я понимаю . Но всё равно не понимаю, зачем тебе невидимость нужна. Из мап_энтер всё и так нормально делается, т.к. картинка потом обновляется.

А вообще...

Блин, долго же до меня доходило, что такое "плотный криттер" .

Вообще-то испокон веков под "плотными" объектами понимали объекты с флагом "TransNone" в прошнике . То, о чём говорит  Alan Killenger, это не "неплотность", это отсутствие блокиратора под криттером, т.е. фактически флаг "NoBlock". Если мы делаем криттера невидимым, то блокиратор под ним автоматически убирается, чтобы через невидимого криттера можно было ходить. Далее действительно баг: если мы сначала перемещаем криттера, а затем делаем его видимым, то блокиратор под ним так и не появляется. Если же сначала сделать криттера видимым, а потом переместить куда надо, всё будет нормально.

ЗЫ Попробуйте в Ф1 не выходя с карты рейдеров "встать на" Танди после её освобождения. Глюк-с .

Отправлено: 13:15 - 23 Марта, 2006
Alan Killenger
Пользователь

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

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

Цитата:
Это-то я понимаю . Но всё равно не понимаю, зачем тебе невидимость нужна. Из мап_энтер всё и так нормально делается, т.к. картинка потом обновляется.

А кто сказал, что мой криттер будет целый день торчать на одной карте? Вот именно для того мне невидимость и нужна, в том числе.

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

Отправлено: 18:26 - 23 Марта, 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

И я опять со своими ФИДами =) Как известно, имея указатель на криттера, мы можем получить всю информацию о нем. НО как имея только ПИД, мы можем получить ФИД?
Поидее нужно с помощью ПИДа получить указатель, и с помощью указателя получить ФИД. Но отсюда возникает вопрос - как получить указатель с помощью ПИДа?
Может меня конечно сильно проглючило, и существует обычная функция для этого, но ИМХО нет.
Так может попытаться сделать это с помощью creat_obj? Создаём криттера с определённым ПИДом, и...А на него то как указатель получить?

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 21:55 - 11 Апр., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Доки читать надо .

int (string) proto_data(int pid, int data_member) - возвращает значение данных из прототипа объекта
Аргументы:
pid - идентификатор прототипа объекта (см. CRITRPID.H - PID криттеров, ITEMPID.H - PID предметов, SCENEPID.H - PID элементов пейзажа)
data_member - номер данных  (см. Приложение)
Возвращаемое значение:
значение указанного поля из файла прототипа

FID под номером 3 .

Отправлено: 7:15 - 12 Апр., 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

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

-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 11:07 - 19 Апр., 2006
Sokil
Пользователь

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

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

Посмотри скрипт того чувачка, которвй на выходе из Храма испытаний предлагает Чузу подраться. Очень интересный скрипт. Ответ на твой вопрос в нем содержится. Название скрипта не помню, чтобы узнать, открой в мэппере соответствующую карту и опцию "Show all scripts" - ту, что в верхнем меню.
Для приличного совоения скриптового языка и его хитростей достаточно проштужировать всего 4 скрипта: наркомана из Дэна, Лару оттуда же, Мецгера и этого... вожака бандитов, охраняющих наркотики в церкви.  Ну и торговца какого-нибудь. Например, Тубби.

Отправлено: 17:39 - 19 Апр., 2006
Alan Killenger
Пользователь

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

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

Цитата:
как пошагово сделать так

Что значит пошагово? В боевом режиме? Если "да", то никак - во время боя криттерами управлять почти невозможно, их действия определяются сугубо их статистикой и пакетом AI. Если "нет", т.е. в обычном режиме, то в скрипте "выбранного критера" пишем
Код:
 
procedure critter_p_proc begin
 if tile_distance(tile_num(obj_tile(dude_obj)), /* номер вашего тайла */) < /* расстояние до вашего тайла */ then begin
   animate_move_obj_to_tile(self_obj, /* куда идти */, /*  скорость */);
 end
end



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

Отправлено: 17:42 - 19 Апр., 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

Круто, скрипт пашет. Но у меня появилась опять проблемка. Я в мапере создал карту, при входе чузена на которую в диалоговом появляется :"Вы стоите перед великим мостом и т. д. ..." . Че за фигня. У меня к карте привязан конкретный скрипт. который должен выдавать свою подпись к карте, что он собственно и делает, но после него следует фактически сразу вот это вот:"Вы стоите перед великим мостом и т. д. ..." . Функция script_overrides не помогает.

-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 15:15 - 22 Апр., 2006
Volk
Пользователь

Регистрация: Июнь 2005

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

Что не так? Когда if (party_member_obj(obj_pid(your_slave)) != 0)  не выполняется все нормально, а когда выполняется игра входут в ступор, т.е. менюшка диалога остаеттся без текска и навсегда
Код:
  if (party_member_obj(obj_pid(your_slave)) != 0) then begin 
   if (((global_var(719) bwand 1) != 0) == 1) then begin
     set_local_var(8, (2 * random(100, 150) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15)))));
     if (get_critter_stat(your_slave, 34) == 0) then begin
       gsay_reply(121, message_str(121, 271) + local_var(8) + message_str(121, 270));
     end
     else begin
       gsay_reply(121, message_str(121, 272) + local_var(8) + message_str(121, 270));
     end
   end
   else begin
     set_local_var(8, (2 * random(50, 100) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15)))));
     if (get_critter_stat(your_slave, 34) == 0) then begin
       gsay_reply(121, message_str(121, 273) + local_var(8) + message_str(121, 270));
     end
     else begin
       gsay_reply(121, message_str(121, 274) + local_var(8) + message_str(121, 270));
     end
   end
 end
 else begin
 ...
прододжение диалога


Отправлено: 22:34 - 23 Апр., 2006
Aman
Пользователь

Откуда: Киев
Регистрация: Апр. 2005

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

Скорее всего переменная "your_slave" не успела объявиться как экспортируемая, так как я это делал в скрипте Дюда, а не в скрипте карты. Это проявляется в маппере, если загрузить карту с подобным скриптом и сразу ничего не делая начать диалог. Но если открыть дверь, или юзнуть умение, то всё ок. В игре этого не видно. Если всё-таки виснет в игре, значит где-то есть импорт, но нет экспорта.

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

Отправлено: 0:14 - 24 Апр., 2006
Volk
Пользователь

Регистрация: Июнь 2005

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

Спс, похоже нашел косяк, экспорт был из скрипта чуза, и в скрипте раба был импорт, значение переменно присваивалось в скрипте раба, тогда вобше не понятно зачем в скрипте чюза экспорт и  как эта вся хрень работала с другим NPC если там где присваивается значение импорт ;] Ша потестю...


(Добавление от 1:12 - 24 Апр., 2006.)


Мдя... Терь вобше скрипт раба похоже не пашет... буду думать ;]


(Добавление от 1:54 - 24 Апр., 2006.)


Все, вкурил ) Тупанул я походу ) Почитал про Import\export в FAQ, у меня в скрипте карты нет экспорта... Ша потестю ;] Тока так я и не понял зачем экспорт в скрипте чуза...


(Добавление от 2:15 - 24 Апр., 2006.)


Экспорт в карте на которой непись не помог...

Отправлено: 1:07 - 24 Апр., 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

Я сделал следующее: убил старую карту нарисовал похожую(назвал тем же именем), прикрепил к ней тот же самый скрипт и все работает, в смысле сообщение про великий мост уже не появлятся. Возмно ли это по тому, что по умолчанию с каким-то предметом вылазеет етот текст, т. е. текст привязан к каому-то объекту, к примеру при наведении курсора на одного, из критеров(без скрипта) вылазеет сообщение:"Мастер-купец".

-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 7:38 - 24 Апр., 2006
Aman
Пользователь

Откуда: Киев
Регистрация: Апр. 2005

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

to Volk

>> Тока так я и не понял зачем экспорт в скрипте чуза

Чтобы не делать экспорт во всех картах фола. Так как скрипт чуза присутствует всегда, в него и запихнут экспорт.

>> Экспорт в карте на которой непись не помог

Экспорт один, импортов несколько. Если экспорт в карте, убери его из Дюда. Где глючит - в маппере или в игре ?


to Alexer

>> к примеру при наведении курсора на одного, из критеров(без скрипта) вылазеет сообщение:"Мастер-купец"

Если криттер незаскриптован, то надписи вылазят из данных его прототипа (pro файл). Надпись про мост должна быть, если конечно тот скрипт присоединил (ArBridge.ssl).

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

Отправлено: 13:50 - 24 Апр., 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

У меня еще такой вопрос: в описаниях функций упоминается указание на объект (who, what и т. д.) к примеру (цитата из документа Функции компилятора скриптов Fallout 2 от BIS
(четвёртая редакция)):

int destroy_object(ObjectPtr obj) - уничтожает объект
Аргументы:
obj - указатель на объект
Возвращаемое значение:
число реально уничтоженных экземпляров (?)

boolean obj_is_locked(ObjectPtr what) - проверяет, заперт ли данный объект
Аргументы:
what - указатель на объект
Возвращаемое значение:
TRUE - если объект заперт
FALSE - если объект не заперт или объект вообще нельзя запереть...
А на кого вообще можно указать. Я почему-то документацию по этой теме не нашел.


-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 12:36 - 25 Апр., 2006
Alan Killenger
Пользователь

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

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

Указать можно на любой объект, на который можно подвесить скрипт. Кажется. Как минимум, это все объекты с прошниками из категории Items и Critters. Если это действительно так, то остальное можешь проверить сам в маппере .

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

Отправлено: 13:42 - 25 Апр., 2006 | ИСПРАВЛЕНО: Alan Killenger - 14:43 - 25 Апр., 2006
Volk
Пользователь

Регистрация: Июнь 2005

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

2Aman
У меня в голове глючит как окачалось ;] Заместо set_local_var(8, (2 * random(50, 100) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15)))));  надо set_local_var(8, floor(2 * random(50, 100) * ((160.00000 + has_skill(dude_obj, 15)) / (160.00000 + has_skill(self_obj, 15)))));

Отправлено: 4:24 - 26 Апр., 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

Как определить файл msg для скрипта, где в скрипте упоминается его имя. Я в диалоге сделал ссылки на строчки в файле msg(название такое-же как у скрипта(x.int и x.msg) ) , а текст почему-то испльзуется из ACTEMVIL.msg.

-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 8:58 - 26 Апр., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

"Это мы не проходили, это нам не задавали" ...

FAQ
FScript-HOWTO

Отправлено: 10:49 - 26 Апр., 2006
Alan Killenger
Пользователь

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

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

У каждого скрипта есть номер (scipts.lst). Каждому скрипту может однозначно соответствовать 1 *.msg файл. Стало быть, каждому *.msg файлу должен соответствовать номер соответствующего ему скрипта. Когда мы берем текст из *.msg файла мы указываем два параметра: номер файла и номер строки.

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

Отправлено: 14:01 - 26 Апр., 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

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

-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 9:15 - 1 Мая, 2006
Sokil
Пользователь

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

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

Элементарно. С помощью глобальной переменной (GVAR, а можно и MVAR, дело вкуса). Скрипт компа устанавливавт переменную в определенное значение( set_global_var(GVAR_DOOR,1); ), а скрипт двери при попытке взаимодействия с ней проверяет эту переменную : if (global_var(GVAR_DOOR)==1) then...

Отправлено: 10:37 - 1 Мая, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Из скрипта чюза прибавляю единичку к скилу под номером задаваемым переменной skil1:

critter_mod_skill(dude_obj,skil1,1);

команда работает нормально если скил не тагнут,
а если тагнут единичка не добовляется.

Кто нибудь знает в чем дело?
С тагнутыми скилами нужно работать иначе?

Отправлено: 14:57 - 3 Мая, 2006
Avenger666
Пользователь

Регистрация: Май 2006

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

Помогите - непонятная проблема. F2 вылетает с "программа выполнила недопустимую ..." из-за scripts.lst . Непонимаю в чем дело, все скрипты добавлял по одному шаблону, 100 раз проверял scripts.lst на ошибки. В чем проблема может быть?

Отправлено: 20:05 - 3 Мая, 2006 | ИСПРАВЛЕНО: Avenger666 - 20:11 - 3 Мая, 2006
Tehnokrat
Модератор

Откуда: Новосибирск
Регистрация: Окт. 2003

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

Не все текстовые редакторы одинаково полезны
Некоторые из них имеют особенность портить lst-файл, хотя не исключено, что проблема в другом.

-----
Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.

Отправлено: 20:15 - 3 Мая, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Avenger

У меня как то была ситуация - правил
scripts.lst в одной папке, а прога брала данные из другого неправленного scripts.lstа который лежал в другой папке.

У тебя правильно пути выставлены?
(на папку с исправленным файлом?)

Отправлено: 22:26 - 3 Мая, 2006 | ИСПРАВЛЕНО: Keha - 22:27 - 3 Мая, 2006
Avenger666
Пользователь

Регистрация: Май 2006

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


пока смутно понимаю о чем ты. я пути вообще нигде не выставляю . Редактирую все в фаре в папке F2\data\scripts\scripts.lst , предварительно удалив оригинал из patch000.dat

scripts.lst пишу с нуля (старые скрипты не использую или исправляю SCRIPT_NAME и компилирую опять если какие-то становятся нужными) все было ок до вчерашнего дня.

Отправлено: 9:04 - 4 Мая, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
critter_mod_skill(dude_obj,skil1,1);
команда работает нормально если скил не тагнут,
а если тагнут единичка не добовляется.

Однако, примечания читаем:
Цитата:
если скилл отмечен как tagged, параметр amount уменьшается до чётного

Отправлено: 9:14 - 4 Мая, 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Цитата:
Quote: from Avenger666 on 9:04 - 4 Мая, 2006

пока смутно понимаю о чем ты. я пути вообще нигде не выставляю . Редактирую все в фаре в папке F2\data\scripts\scripts.lst , предварительно удалив оригинал из patch000.dat


Лично я все содержимое patch000.dat вытряхиваю наружу, а сам это датник деляю. А то у меня игра начинала одно брать из этого датника, другое из паки с моднутыми файлами третье вообще не поймешь откуда.

пути до модифицированных (patches) файлов проставляются в fallout2.cfg. Вот например часть строк моего cfg_шника:

critter_dat=c:\games\Fallout2\critter.dat
critter_patches=c:\games\Fallout2\mod
cycle_speed_factor=1
executable=game
free_space=20480
hashing=1
interrupt_walk=1
language=english
master_dat=c:\games\Fallout2\master.dat
master_patches=c:\games\Fallout2\mod

Цитата:
scripts.lst пишу с нуля (старые скрипты не использую или исправляю SCRIPT_NAME и компилирую опять если какие-то становятся нужными) все было ок до вчерашнего дня.



Попробуй заново оригинальный scripts.lst очистить и аккуратно вписать свои скрипты. В других редакторах, как тут тебе уже предлагали. Или так много уже наскриптил что это проблематично заново набить?

Цитата:
Quote: from Wasteland Ghost

Однако, примечания читаем:
Спасибо большое, как обычно поглазел.

Отправлено: 21:03 - 4 Мая, 2006 | ИСПРАВЛЕНО: Keha - 21:08 - 4 Мая, 2006
Alexer
Пользователь

Откуда: Россия Владивосток
Регистрация: Апр. 2006

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

У меня такой, незатейливый вопрос: как анимировать укус волка. Возможно это можно сделать посредствам функциии anim(ObjectPtr who, int anim, int direction), но я ненашел подходящего int anim. подскажите, если это вообще можно анимировать...

-----
"Вы сильно промахнулись и случайно попали"

Отправлено: 11:48 - 6 Мая, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Это делается при помощи reg_anim. Для примера посмотри как сделана встреча с Френком в пустыне. Ещё на сайте в разделе документации есть пример скриптовой анимации от Communist'а. Он, правда, под ipp, но принцип тот же.

Отправлено: 13:26 - 6 Мая, 2006
Ray
Модератор

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

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

Кто нибудь [косится на Wasteland Ghost] может привести рабочий пример, как при помощи интерфейсного режима создать кнопку (с обработкой событий и графикой). Несколько часов бьюсь - не получается.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 22:02 - 23 Мая, 2006
Pavel
Модератор

Откуда: Одесса Украина
Регистрация: Май 2004

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

Вот пример лифта, он выкидывает на одну карту, правда без графики.


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

#define NAME                 1402//   1360

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


procedure start;
procedure critter_p_proc;
procedure spatial_p_proc;
procedure talk_p_proc;

variable nam;

procedure button_on;
procedure button_off;
procedure button_press1;
procedure button_press2;
procedure button_press3;
procedure button_release;
procedure empty_proc;
procedure region_press1;
procedure region_press2;
procedure region_press3;

procedure start
begin
end

procedure critter_p_proc
begin
end

procedure spatial_p_proc begin

call talk_p_proc;
begin

end
procedure talk_p_proc
begin
   script_overrides;

   CreateWin ("test_wnd1",200,60, 231,285);
   SelectWin ("test_wnd1");
   Display ("pcx/liftmenu.pcx");
   AddButton ("test_btn", 8, 37, 99, 59);
   AddButtonGFX ("test_btn", "pcx/butlups1.pcx", "pcx/butlups1.pcx", "pcx/butlups1.pcx");
   AddButtonProc ("test_btn", button_on, button_off, button_press1, button_release);

   addregion "test_reg1" {10,0, 231,285};
   addregionproc("test_reg1", no_proc, no_proc, region_press1, empty_proc);

   ShowWin;


   AddButton ("test_btn1", 8, 97, 99, 59);
   AddButtonGFX ("test_btn1", "pcx/butlups2.pcx", "pcx/butlups2.pcx", "pcx/butlups2.pcx");
   AddButtonProc ("test_btn1", button_on, button_off, button_press2, button_release);

   addregion "test_reg1" {10,0, 231,285};
   addregionproc("test_reg1", no_proc, no_proc, region_press2, empty_proc);

   ShowWin;


   AddButton ("test_btn2", 8, 157, 99, 59);
   AddButtonGFX ("test_btn2", "pcx/butlups3.pcx", "pcx/butlups3.pcx", "pcx/butlups3.pcx");
   AddButtonProc ("test_btn2", button_on, button_off, button_press3, button_release);

   addregion "test_reg1" {10,0, 231,285};
   addregionproc("test_reg1", no_proc, no_proc, region_press3, empty_proc);

   ShowWin;
end

procedure button_press1
begin
DeleteWin("test_wnd1");
load_map(MAPSTR_N_tpmb02, 22134);    //MAPSTR_N_tpmb02
move_to(dude_obj, 25112, 0);

end

procedure button_press2
begin

//FadeOut(1);
DeleteWin("test_wnd1");
//FadeIn(1);
//gfade_out(999);
//load_map(MAP_New_Military_Base, 22134);
load_map(MAP_New_MB_AR, 22312);
move_to(dude_obj, 25112, 0);
// gfade_in(999);

end

procedure button_press3
begin
DeleteWin("test_wnd1");
//load_map(MAP_New_MB_AR, 22312);
load_map(MAP_New_MB_AR, 22312);
move_to(dude_obj, 21912, 1);

end

procedure button_release
begin
   DeleteWin("test_wnd1");
end

procedure button_on
begin end

procedure button_off
begin end

procedure region_press1
begin
   reg_anim_clear(dude_obj);
   DeleteWin("test_wnd1");
end

procedure region_press2
begin
   reg_anim_clear(dude_obj);
   DeleteWin("test_wnd1");
end

procedure region_press3
begin
   reg_anim_clear(dude_obj);
   DeleteWin("test_wnd1");
end

procedure empty_proc
begin end


-----
В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...

Отправлено: 22:27 - 23 Мая, 2006 | ИСПРАВЛЕНО: Pavel - 22:30 - 23 Мая, 2006
Spy
Реалист

Откуда: Все там будем...
Регистрация: Май 2005

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

Без графики, т.е. не рисует окно с кнопками? А руками его отрисовать нельзя (как в самоделкине)? Насколько я помню, лифты - это проблема, и решить её - хорошее дело.

-----
Хочешь, чтобы что-то было сделано хорошо - сделай сам.

Отправлено: 23:11 - 23 Мая, 2006
Tehnokrat
Модератор

Откуда: Новосибирск
Регистрация: Окт. 2003

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

to Ray
Вот здесь лежит простенький пример, иллюстрирующий самый правильный способ создания интерфейсного окна с одной кнопкой.  Моя разработка. Окно красил валиком, кнопки выпиливал лобзиком

to Spy
Цитата:

Насколько я помню, лифты - это проблема, и решить её - хорошее дело.


Лифты давно уже не проблема.

-----
Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.

Отправлено: 18:49 - 24 Мая, 2006
Avenger666
Пользователь

Регистрация: Май 2006

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

как реализовать respawn critter'a при каждом заходе на карту ?

Отправлено: 19:32 - 25 Мая, 2006
Alan Killenger
Пользователь

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

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

То есть если криттера убивают, то при следующем заходе он был снова живой? В map_enter_p_proc поставить create_obj_pid и создавать криттера при каждом заходе на карту, а в map_exit_p_proc убивать его перед каждым выходом с карты (если он не был убит раньше).

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

Отправлено: 4:35 - 26 Мая, 2006
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Я второй раз пишу об этой проблеме (насколько я помню). Похоже, кроме меня с ней никто не сталкивался. Итак, захожу в диалог, при наведении мыши на вариант ответа, он выделяется желтым. Это нормально, так и должно быть. Но переводя мышь на другой вариант ответа, я замечаю, что этот вариант не стал обратно зеленым, а остался желтым. и так со всеми вариантами ответов. Есть идеи? Сие происходит в AL.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 22:15 - 2 Июня, 2006
Avenger666
Пользователь

Регистрация: Май 2006

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

как сделать чтобы красть у critter'a было сложнее или что за это отвечает (м.б. percepection например?), может как-то можно реализовать кражу через roll_vs_skill ?

Отправлено: 13:19 - 4 Июня, 2006
Alan Killenger
Пользователь

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

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

Цитата:

procedure use_skill_on_p_proc begin
 if (action_being_used == SKILL_STEAL) then begin
   if /* ваше условие на удачное воровство */ then begin
     /* все, дальше движок сам проводит кражу или пишем свой обработчик кражи с использованием интерфейсных функций */
   end else begin
     script_overrides;
     /* заход в режим кражи невозможен */
   end
 end
end


P.S. А можно ввсети тэг code хотя бы просто как делающий шрифт моно... каким-то?

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

Отправлено: 17:02 - 4 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

ЭЭЭ Тут такое предложеньице есть...

Прочитал весь топик аж упарился, и посетила такая мысля, может создать раздел в котором бы лежали готовые, отлаженные скрипты с комментариями для общего пользования... Ну эт чтоб лисапед не изобретать...

Заодно и народ будет смотреть и какие нить скрипты доводить до ума сообща, хотя нет, для доводки этот раздел есть, а в том только конечные варианты писать...

Например вот смотрю лифты многим нужны, былоб неплохо такой скрипт получить с описанием и всеми ресурсами. А то уродовать те что в фолле есть не хочется...



-----
За сим прощаюсь, Олег.

Отправлено: 21:13 - 6 Июня, 2006
Pavel
Модератор

Откуда: Одесса Украина
Регистрация: Май 2004

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

2 Олег1969

1) Оригинальные лифты прошиты двиге, так что изуродовать можно двиг .
2) Рабочий скрипт лифта я привел в пришлом посте этой темы, там только анимации стрелки нет, нет времени сделать.
3) А зачем тебе рабочие скрипты с комментариями? Самому лень разбираться? Там ведь нет ничего сложного .
4) Исходники и так есть и к Фаллауту, и к патчу, и к "Новому взгляду"... Тебе мало?

ЗЫ: Действительно, зачем изобретать велосипед?

-----
В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...

Отправлено: 1:41 - 7 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Цитата:
Quote: from Pavel on 1:41 - 7 Июня, 2006
2 Олег1969

1) Оригинальные лифты прошиты двиге, так что изуродовать можно двиг .
2) Рабочий скрипт лифта я привел в пришлом посте этой темы, там только анимации стрелки нет, нет времени сделать.
3) А зачем тебе рабочие скрипты с комментариями? Самому лень разбираться? Там ведь нет ничего сложного .
4) Исходники и так есть и к Фаллауту, и к патчу, и к "Новому взгляду"... Тебе мало?

ЗЫ: Действительно, зачем изобретать велосипед?


Тут, смотрю, есть некоторое недопонимание...

1. Доку читал, знаю...

2.По поводу лифта... Скрипт видел, сижу разбираюсь интересно...

3. А затем, что тратится лишнее время которое можно былоб потратить подругому...

4. Угу, есть, копаю... Но опять, же, время время! Есть вещи которые уже написаны и доведены до ума! Чем сидеть и самому лепить, вычленять ошибки и т.д и т.п....

Причем имеется ввиду не просто исходник вообще, а какаято конкретная ситуация...

ЗЫ: Будем изобретать велосипед...

-----
За сим прощаюсь, Олег.

Отправлено: 8:40 - 7 Июня, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
3. А затем, что тратится лишнее время которое можно былоб потратить подругому...

А времени тех людей, что тебе комменты к исходникам писать будут, тебе не жалко? Моддинг Фола - он не для ленивых. Кстати, по поводу готовых скриптов. Чем тебя FAQ по скриптам не устраивает?

Отправлено: 12:38 - 7 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Цитата:
Quote: from Wasteland Ghost on 12:38 - 7 Июня, 2006
[quote]3. А затем, что тратится лишнее время которое можно былоб потратить подругому...

А времени тех людей, что тебе комменты к исходникам писать будут, тебе не жалко? Моддинг Фола - он не для ленивых. Кстати, по поводу готовых скриптов. Чем тебя FAQ по скриптам не устраивает?[/quote]

Мдя... Ни кого не заставляю писать комменты к уже готовым скриптам...  Просто когда меня учили писать программы то твердили "пишите комментарии к своим исходникам, а то сами потом в них будете плавать", поэтому я и привык, что если есть текст, то и должны писаться комментарии к нему...  Ну в принципе нет ну и не надо...

А по поводу факи так там обычные стандартные процедурки описаны... А вот хотелось бы видеть, что нибудь особенное, как вот в частности работа с лифтами без движка или например тут видел скриптик по движению по маршруту, отчень интересное решение! Вот что хотелось бы увидеть!



-----
За сим прощаюсь, Олег.

Отправлено: 14:00 - 7 Июня, 2006
Pavel
Модератор

Откуда: Одесса Украина
Регистрация: Май 2004

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

Олег

Действительно, когда меня учили програмировать, то же говорили, что нужно писать комментарии. Но прошло время и смысл в их написании фактически отпал.

Цитата:
А вот хотелось бы видеть, что нибудь особенное, как вот в частности работа с лифтами без движка или например тут видел скриптик по движению по маршруту, отчень интересное решение! Вот что хотелось бы увидеть!

Отчень хорошо, судя из твоего поста - ты их увидел, в чем проблема? Либо я с годами потупел... что вряд ли, либо я не понимаю чего ты вообще хочешь... но ты вроде все видишь, либо ты не правильно излагаешь свои мысли... тебе судить
Исходя из твоих многочисленных постов, ты хочешь всего и сразу... У меня напросился вопрос: а зачем тебе столько?

Цитата:
А по поводу факи так там обычные стандартные процедурки описаны...

На то он и FAQ, что бы в нем стандарное объяснять.  FAQ - это ведь по Русски: часто задаваемые вопросы. Так что таким скриптам, как лифт - в нем не место. И вообще, давай определимся. Вижу ты во многом хочешь разобраться, но в итоге начинаешь заоффтопливать форум, а это противоречит Правилам . Давай так, если у тебя есть конкретный вопрос по скриптам - задавай, а если не конкретный вопрос - пиши на мыло. Потом сам создашь топик по результатам общения, если будет желание, в чем я сомневаюсь .

-----
В жизни нельзя быть уверенным на 100%, ведь никогда не знаешь когда...

Отправлено: 0:05 - 8 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Возник вопрос

в скрипте, в котором я ковыряюсь, есть строка

Scenery_Creation_Ptr:=tile_contains_pid_obj(CAR_POS_IN_MAP,0,PID_DRIVABLE_CAR);

компилятор преобразует ее вот в это

Scenery_Creation_Ptr:=tile_contains_pid_obj( 24915 ,0, (33555441) );

и потом грязно ругается, что неправильно расставлены скобки....

В чем проблема то? Зачем он туда лишние скобки пихает?

Причем он значение PID_DRIVABLE_CAR везде заключает в скобки при подстановке...

ай чет глюкнуло...


-----
За сим прощаюсь, Олег.

Отправлено: 14:17 - 9 Июня, 2006 | ИСПРАВЛЕНО: Oleg1969 - 14:25 - 9 Июня, 2006
Alan Killenger
Пользователь

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

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

Цитата:
В чем проблема то? Зачем он туда лишние скобки пихает?

Затем, что в itempid.h или в scenpid.h есть такая строка
Код:
#define PID_DRIVABLE_CAR (33555441)


Однако этот факт не должен вызывать ошибку, ищите баг в другом месте.

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

Отправлено: 14:56 - 9 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Цитата:
Quote: from Alan Killenger on 14:56 - 9 Июня, 2006
[quote]В чем проблема то? Зачем он туда лишние скобки пихает?

Затем, что в itempid.h или в scenpid.h есть такая строка
Код:
#define PID_DRIVABLE_CAR (33555441)


Однако этот факт не должен вызывать ошибку, ищите баг в другом месте.[/quote]

ну вообщето переменной присваивается значение стоящее в скобках... Ну ладно это особенности компилятора...
Кстати компилятор и строку с ошибкой указывает именно вот эту...

Будем копать дальше...


-----
За сим прощаюсь, Олег.

Отправлено: 15:11 - 9 Июня, 2006
Alan Killenger
Пользователь

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

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

Цитата:
Кстати компилятор и строку с ошибкой указывает именно вот эту...

Поправка, компилятор сообщает о том, что он обнаружил ошибку находясь на этой строке, а не о том, что ошибка заключена в этой строке. Насчет скобок - никаких проблем, будь передаваемый параметр хоть трижды в скобках. Это раз, второе, что именно компилятор пишет в сообщении об ошибке читали? Откомпилировать отдельно только эту строку кода пытались?

to Avenger
Такая мысля, если интересно.
Код:
 
procedure use_skill_on_p_proc begin
 if (action_being_used == SKILL_STEAL) then begin
   /* Открываем диалог, но не с самим персонажем. */
   /* То есть все воровство реализуем как диалог. */
   /* Таким образом можно будет воткнуть любые    */
   /* условия кражи предметов, какие захочется.   */
   /* И сделать все это очень просто, но          */
   /* прийдется отказаться от привычного меню,    */
   /* которое всплывает при воровстве.            */
 end
end




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

Отправлено: 17:47 - 9 Июня, 2006 | ИСПРАВЛЕНО: Alan Killenger - 18:53 - 9 Июня, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
ну вообщето переменной присваивается значение стоящее в скобках... Ну ладно это особенности компилятора...

Вообще-то, батенька, это не переменная, это макроимя. Читай ФАК или любую доку по препроцессорам. Означает сей факт, что если ты напишешь
#define MY_DEF    HORRIGAN_KOZEL
То везде вместо MY_DEF препроцессор (компилятор тут отдыхает и умывает руки, не его это вотчина) подставит HORRIGAN_KOZEL. Препроцессор не выполняет вычислений, поэтому скобки в макросах - это хороший тон.

Отправлено: 12:39 - 10 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Цитата:
Quote: from Wasteland Ghost on 12:39 - 10 Июня, 2006
[quote]ну вообщето переменной присваивается значение стоящее в скобках... Ну ладно это особенности компилятора...

Вообще-то, батенька, это не переменная, это макроимя. Читай ФАК или любую доку по препроцессорам. Означает сей факт, что если ты напишешь
#define MY_DEF    HORRIGAN_KOZEL
То везде вместо MY_DEF препроцессор (компилятор тут отдыхает и умывает руки, не его это вотчина) подставит HORRIGAN_KOZEL. Препроцессор не выполняет вычислений, поэтому скобки в макросах - это хороший тон.[/quote]

МММММ Мадам (или модемуазель?), под словом "компилятор" я имел ввиду общее понятие, с препроцессором, без него, мне без разници ... И если я могу чему-то присвоить какое-то значение то это для меня тоже переменная и неважно чем задается ей это значение... Давайте не будем цепляться к словам...  Вот так вот, поэтому я и говорю, что это особенности компилятора и я их на данный момент изучаю...

Спасибо всем кто откликнулся на мой вопрос, на данный момент он решон с помощью автора скрипта, в чем ему большое СПАСИБО!

ЗЫ: Кстати у меня глупая особенность сначала изучить доступные доки и факи...


-----
За сим прощаюсь, Олег.

Отправлено: 12:26 - 11 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Посмотрите в чем дело: Не хочет работать скрипт сирены
компилятор крмпилит без проблем, логика не нарушена, а не работает... Или работает но не предсказуемо, когда захочет а не сразу после установленного бита....

/*  &#209;&#234;&#240;&#232;&#239;&#242; &#241;&#232;&#240;&#229;&#237;&#251; */
#include  "D:\Fallout2\mod\scripts\headers\define.h"
#include  "D:\Fallout2\mod\scripts\HEADERS\command.h"

#define NAME        SCRIPT_TOKLAXON     //1307

procedure start;
procedure map_update_p_proc;

procedure start begin
end

procedure map_update_p_proc
begin
//variable  item;
 if (gvar_bit(GVAR_RESERVED_VAR59,bit_1)==1) then begin
   if obj_pid(self_obj) == PID_NS_LIGHT then create_object(PID_NS_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj));
   else create_object(PID_EW_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj));
 end
end

Вот такие пироги...



-----
За сим прощаюсь, Олег.

Отправлено: 16:21 - 16 Июня, 2006
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

На сколько я могу видеть, не все кодовые блоки begin ... end корректно закрыты. Попробуй так и сравни поведение (если правильно понял, куда относится else):

procedure map_update_p_proc
begin
//variable  item;
if (gvar_bit(GVAR_RESERVED_VAR59,bit_1)==1) then begin
  if obj_pid(self_obj) == PID_NS_LIGHT then begin create_object(PID_NS_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj));
end
  else begin create_object(PID_EW_FLASHING_LIGHT,tile_num(self_obj),elevation(self_obj));
 end
end
end


-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 16:35 - 16 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

МММ Все закрыто правильно... Сколько бегинов столько и эндов... А еще мона почитать доку и увидеть, что бегин в условиях применяется только для обьединения в блоки...

А причину я нашол. В маппере не работает, а вот в игре как часы заработало все...! В обчем маппер для тестов неподходит, кстати в доке это тоже написано... Грабли...

Всем спасибо.


-----
За сим прощаюсь, Олег.

Отправлено: 14:31 - 17 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Такой вопрос возник...
Как долго могут выполняться скрипты (с какой скоростью) и что на это влияет? А то уже запарился, на простейших вещах то сразу срабатывает, то с тааааким запаздыванием, что ОЙ!!!
И второй вопрос, пользуюсь у себя стандартными макросами по установке, проверке и снятию бит... На сколько сии операции медленны и имеет ли смысл перейти на обычные переменные для ускорения процесса? Битами у меня флаги на карте выставляются...

-----
За сим прощаюсь, Олег.

Отправлено: 1:54 - 19 Июня, 2006
Alan Killenger
Пользователь

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

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

Цитата:
Как долго могут выполняться скрипты (с какой скоростью) и что на это влияет? А то уже запарился, на простейших вещах то сразу срабатывает, то с тааааким запаздыванием, что ОЙ!!!

Не знаю, у меня только однажды было серьезное запаздывание. Во время диалога мой скрипт читал каждую реплику, высеивая из нее нужную подстроку. Т.е. было сравнение строк нехилое количество раз. Хотя чисто интуитивно я всегда делаю привязки по времени к каким-нибудь обработчикам.
Цитата:
И второй вопрос, пользуюсь у себя стандартными макросами по установке, проверке и снятию бит... На сколько сии операции медленны и имеет ли смысл перейти на обычные переменные для ускорения процесса? Битами у меня флаги на карте выставляются...

ИМХО bwor и bwand реализованиы как раз or и and, установка бита - установка числа, проверка наличия бита - bwand и сравнение двух чисел. Плохо только если делаешь shr, shl. А так -  забей, пиши как удобно, на фоне общей неэффективности это все незаметно.

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

Отправлено: 16:00 - 19 Июня, 2006 | ИСПРАВЛЕНО: Alan Killenger - 17:01 - 19 Июня, 2006
Sokil
Пользователь

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

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

Ребята, подскажите, что я делаю не так? Какие-то проблемы с бартером. По плану персонаж предлагает Чузу купить плоскогубцы. Если тот соглашается, идет вызов режима бартера. Далее, если герой выменивает плоские, персонаж должен сказать что-то типа "Вот и молодец", если не вменивает - "Почему ты передумал?"
В реале же получается так, что фраза персонажа вообще не появляется. Когда Чуз покупает плоскогубцы, в режиме бартера появляется фраза "Хорошая сделка, бла-бла-бла." По выходе из бартера она не стирается никоим образом. И реплика персонажа просто не появляется (вообще-то в истории диалога она присутствует, но вот на дисплее не высвечивается).

Пытался делать по-всякому, результат нулевой. Вот кусок кода:

Цитата:

procedure inf_trade begin
variable item;
  item:=create_object(PID_MULTI_TOOL,1,1);
  add_obj_to_inven(self_obj, item);
  gdialog_barter;                                                  
  call trade_bufer;
end

procedure trade_bufer begin
  Reply(" ");                                                      

  if (obj_is_carrying_obj_pid(dude_obj,PID_MULTI_TOOL)) then call Node030;
  else call Node031;

end

procedure Node030 begin  
  Reply(mstr(780));                                                      
  NOption(783,Node999,1);                                        
end

procedure Node031 begin
  Reply(mstr(781));                                                      
  NOption(782,Node999,1);                                        
end



Что я делаю неправильно, и как сделать правильно ;) ? Чтобы закончил торговать - получил адекватную фразу?

Отправлено: 23:04 - 23 Июня, 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

ЭЭЭ Я не спец, пока только начинающий, но судя по всему у тебя выдается стандартная фраза при бартере попробуй на входе в процедуру поставить script_overrides; может поможет... Это я пока понял из описания процесса... Счас попытаюсь посмотреть сам скрипт...

-----
За сим прощаюсь, Олег.

Отправлено: 8:28 - 24 Июня, 2006
Sokil
Пользователь

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

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

Проблема решена. Пусть, не слишком изящно, но решена. Просто в процедуре, следующей после выхода из бартера, добавил опцию [Далее]. После этого диалог отображается нормально.
Кстати, в вышеприведенном примере, в процедуре trade_bufer не работал условный переход (где проверялось наличие плоскогубцев в инвентаре Чуза).  Когда я перенес его в другую процедуру, все заработало. Такое впечатление , что после выхода из бартера половина скриптовых команд не отрабатывается.

Отправлено: 13:07 - 24 Июня, 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

И снова здрасте.)
Такой вопрос.
Стоят три НПС и напротив них еще двое.
Чузен подбегает к троим и ведет диалог с одним из них, один из вариантов троица нападает на Чузена. (Они прописаны в одной команде)
Вопрос:
Как сделать так, чтоб два напротив напали на троих. (Они как бы враги и пользуются ситуевиной)

Отправлено: 7:36 - 15 Авг., 2006
Sokil
Пользователь

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

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

Akkella
Можно так:
В момент, когда враги нападают на чуза устанавливается глобальная переменная - для того, чтобы союзники чуза знали, что началась драка (проверкf гвары в critter_p_proc), Ч чтобы друзья чуза нападали именно нав раговнужно сделать указательна врагов и экспоритровать его. Как это сделать, написано где-то в факах.

Что-то типа этого:
Скрипт врага:
export variable enemy_ptr;

procedure start begin
  ememy_ptr:=self_obj;
end

Скрипт друга:
import variable enemy_ptr;
procedure critter_p_proc begin
  if (globdl_var(GVAR_.....)==) then attack(enemy_ptr)
end

Можешь еще поглядеть, как реализован бой банды Лары и Тайлера.

А проще всего записать друзей в группу дуда (маппером).

Отправлено: 8:54 - 15 Авг., 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

В команду записывать их бы не хотелось... Есть причины.
Глобальными переменными почти не пользуюсь. Вернее она одна на город, не хотелось бы выделять под него бит.
Правда если не будет вариантов, то маппером воспользуюсь...

Отправлено: 9:48 - 15 Авг., 2006
Sokil
Пользователь

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

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

Вместо ГВАР можно МВАРы использовать. Да и ни к чему на ГВАРах экономить, их можно добавлять сколько угодно.

Отправлено: 11:11 - 15 Авг., 2006
Hante
Пользователь

Регистрация: Авг. 2006

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

Добрый день.
Прочитал "FScript-HOWTO", все понятно. Скомпилировал скрипт, отправил его в Data\Scripts, прописал где надо.
В редакторе пытаюсь повесить его на криттера и не обнаруживаю свой скрипт в списке.
Так вот вопрос: а че, собсно, за хрень твориться в тридесятом государстве?
Читал где-то, что это из-за path0000.dat, распаковал его, удалил - нет результата.

Отправлено: 14:58 - 18 Авг., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

FAQ
Плюс данная тема. Если правильно подготовил Фол к модификации, вписал скрипт в скриптс.лст, то "ищи, должон быть".

Отправлено: 17:16 - 18 Авг., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Народ, а есть у кого-нибудь  наработки и тех мысли касательно  *управление боевым отрядом во время боя и вне боя", а то долго меня здесь не было мож придумали чего ? Или все по прежнему:
мол анимация в бою не работает и нечего терять время  на осмысление этой идеи?

Отправлено: 0:47 - 8 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Возникла небольшая проблема с LVAR-ами в скрипте...
Есть скрипт для карты, в нем обьявлены LVAR-ы, в SCRIPTS.LST они прописаны, но когда пытаешся с ними работать то там только -1, как будто они не обьявлены...

В чем может быть затык?

-----
За сим прощаюсь, Олег.

Отправлено: 23:27 - 11 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Карту, часом, не из сохранёнки грузишь?

Отправлено: 13:25 - 12 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Нет. Сначала бегу к доку и открываю локацию на карте мира, а уж потом бегу к локации...

Правда то место где открываю локацию гружу из сохраненки, но ведь они не связаны? Или я ошибаюсь?

Кстати заменил на MVAR то там все работает... В чем же затык?

-----
За сим прощаюсь, Олег.

Отправлено: 17:36 - 12 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 17:39 - 12 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Вроде, не должны. Но всё-таки попробуй новую игру начать.

Отправлено: 17:38 - 12 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Что-бы далеко не бегать, быстренько на выходе из арройо создал перса открывающего мою локацию. бегу в локацию, таже самая петрушка... LVAR нормально не работают...
Привожу ниже скрипт карты, может что не то делаю посмотрите...

#include "D:\Fallout2\mod\scripts\headers\define.h"
#include "D:\Fallout2\mod\scripts\headers\updatmap.h"
#include "D:\Fallout2\mod\scripts\headers\command.h"
#include "D:\Fallout2\mod\scripts\headers\tomorrow.h"

#define NAME                SCRIPT_TOQUESTU //1316
#define CAR_POS_IN_MAP    20077      //
#define CAR_ELEV_IN_MAP   0          //

#define MVAR_Begin_Attack_Mike  (0)  //
#define MVAR_Mike_Put           (1)  //
#define MVAR_Mike_ID            (2)  //

#define LVAR_Mike_Put           (0)

procedure start;

procedure map_enter_p_proc;
procedure map_update_p_proc;
procedure map_exit_p_proc;

procedure Set_Level_Map;

export  variable  object_Mike         //


procedure start
begin

end

procedure map_enter_p_proc
begin
 Lighting;
 call Set_Level_Map;
 Check_Create_Car(CAR_POS_IN_MAP,CAR_ELEV_IN_MAP)
end

procedure map_update_p_proc
begin
 display_msg("LVAR_Mike_Put:="+local_var(LVAR_Mike_Put));
//  display_msg("MVAR_BA_Mike:="+map_var(MVAR_Begin_Attack_Mike));
 Lighting;
end

procedure map_exit_p_proc
begin

end

procedure Set_Level_Map
begin
variable  Tomaps;
 if  ((GAME_TIME_IN_DAYS-(global_var(GVAR_TOMORROW_DAYS)))<=3) and (local_var(LVAR_Mike_Put)<1) then begin
   inc_local_var(LVAR_Mike_Put);
   object_Mike:=create_object_sid(PID_MIKE,18491,0,-1);
   set_map_var(MVAR_Mike_ID,object_Mike);
   anim(object_Mike,ANIMATE_ROTATION,2);
   create_object_sid(PID_BED_4,18085,0,-1);
   create_object_sid(PID_WOOD_FIRE,18486,0,-1);
   Tomaps:=create_object(PID_TOMORROW_MAP,0,0);
   add_mult_objs_to_inven(object_Mike,Tomaps,1);
 end
 override_map_start_hex(19284,0,5);
end

В скриптс.лст все прописано... Скрипт проще некуда...

ЗЫ: На MVAR внимания не обращайте... Это так, замена


(Добавление от 21:28 - 12 Сент., 2006.)


После непродолжительных экспериментов пришол к выводу, что данная проблема касается только скрипта карты. Во всех остальных скриптах обьектов находящихся на карте все отлично работает... Кто нить еще пользовался LVARами в скриптах карт? И как оно? Или это характерно только для моей карты?

-----
За сим прощаюсь, Олег.

Отправлено: 20:42 - 12 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Просмотрел все бисовские скрипты карт. Ни в одном нет работы с LVARами, только с MVARами или GVARами... Это о чем нить говорит? Может LVARы нельзя использовать в скриптах карт?

-----
За сим прощаюсь, Олег.

Отправлено: 23:42 - 12 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

А у тебя оно вообще компилится?
Код:
export  variable  object_Mike         // 


Цитата:
В скриптс.лст все прописано...

А ты тут запость для контроля, так сказать.
Щас проверить не могу, но сильно сомневаюсь в наличии подобных ограничений.

Возьми скрипт карты artemple. Пропиши ему пару-тройку ЛВАР в скриптс.лст. Добавь туда запись/чтение/вывод. Убедись, что нет никаких лишних файлов типа патча000 или завалящего artemple.sav в папке DATA\MAPS или где-там-у-тебя-мод (бывает, если Фол падает). Убедись, что в cfg все пути правильные. Начни новую игру.

Отправлено: 11:25 - 13 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

ХМ... Вообще то да, компилиться... А что там такого? Вроде экспортирую переменную для общего пользования... Что не так? Все работает, просто для сохранения нужно было переделать на LVARы и тут затык...

Постю конец ЛСТ...

ccKevin.int     ; Kevin in Navarro                              # local_vars=8
csAlarm.int     ; Navarro base on alert lights                  # local_vars=1
ciQunWch.int    ; Quincy Locker Watch Script                    # local_vars=1
ciRulWch.int    ; Raul Locker Watch Script                      # local_vars=1
ciCmdWch.int    ; Commanded Locker Watch Script                 # local_vars=1
SSStat.int      ; NCR Statue                                    # local_vars=0
ctFob.int       ; Fob EXP Spatial Script                        # local_vars=1
ctPlans.int     ; Vertibird EXP Spatial Script                  # local_vars=1
ctK9Part.int    ; K9 Part EXP Spatial Script                    # local_vars=1
csArea2.int     ; Script to signal if dude enters an area       # local_vars=0
csOpen2.int     ; Script to signal if dude uses door w/o permis # local_vars=1
ctSound.int     ; Soundproof Room Spatial Script                # local_vars=1
csOpen3.int     ; Script to signal if dude uses door w/o permis # local_vars=1
ECTlkMon.int    ; Talking Moonshiners                           # local_vars=8
ziWeakLk.int    ; Generic Weak Lock Watch Script                # local_vars=1
ziMedmLk.int    ; Generic Medium Lock Watch Script              # local_vars=1
dcCarnKd.int    ; Carny Kid - The Den                           # local_vars=1
ciDocWch.int    ; Raul Locker Watch Script                      # local_vars=1
ziHardLk.int    ; Generic Hard Lock Watch Script                # local_vars=1
CIMine.int      ; Mines in Navarro                              # local_vars=6
niBisHLk.int    ; New Reno Bishop Hard Locker                   # local_vars=1
niBisHDr.int    ; New Reno Bishop Hard Locked Door              # local_vars=6
ntRicRom.int    ; New Reno Richard Wright Room Spacial          # local_vars=1
entony.int      ; Captain Anthony Fassard BrokenHills           # local_vars=4
cesaer.int      ; Vertibird menu for player                     # local_vars=4
ziVrTrnk.int    ; Pilotable Vertibird for player                # local_vars=4
maria.int       ; Officer Maria from Navarro                    # local_vars=4
pilot.int       ; Air strip guard from Navarro                  # local_vars=4
WTPlTrp15.int   ; Plasma Floor Trap Level 2 of Seirra  (Center) # local_vars=0
WTPlTrp16.int   ; Plasma Floor Trap Level 2 of Seirra  (Center) # local_vars=0
WTPlTrp17.int   ; Plasma Floor Trap Level 2 of Seirra  (Center) # local_vars=0
WTPlTrp18.int   ; Plasma Floor Trap Level 2 of Seirra  (Center) # local_vars=0
viWell.int      ; Vault City Courtyard Well                     # local_vars=0
SIPtbox2.int    ; box where Merk hides your car trunk sutff     # local_vars=9
giWell.int      ; Gecko's Well                                  # local_vars=0
toquestu.int    ; скрипт карты toquestu.map                     # local_vars=2
tomike.int      ; Майк, дает квест на поиск  # local_vars=3
tomaps.int      ; скрипт карты с местом поселения               # local_vars=3
tomonste.int    ; скрипт монстров на карте toquestu.map         # local_vars=3

Кстати в ФГеке я так понял есть проверка на соответствие, он на него не ругается. А с артемпле приду домой попробую...


-----
За сим прощаюсь, Олег.

Отправлено: 17:23 - 13 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 17:37 - 13 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
А что там такого? Вроде экспортирую переменную для общего пользования... Что не так?

Точки с запятой нет.

Отправлено: 18:47 - 13 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Странно, а у меня и так работает...

Ну в обчем проверил я на артемпле...  Та-же самая петрушка...  LVAR-ы в скрипте карт не работают! Проверьте пожалуста у себя, что-бы быть уверенным на 100%...

-----
За сим прощаюсь, Олег.

Отправлено: 19:06 - 13 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Ну как ? Кто нить проверил еще? Это я по поводу LVAR...

Кстати у меня еще такой вопрос возник по поводу диалогового режима...
В этом режиме возможно проверять что есть у криттера в мешке?
а то у меня вот такая конструкция не хочет работать...
Да старты диалогового режима сделаны это уже переход...

procedure DialogStart
begin
 if (obj_is_carrying_obj_pid(self_obj,PID_TOMORROW_MAP)==0) then call Node004; //если заданный обьект в мешке отсутствует то переход на Node004
 if local_var(LVAR_Mike_Talk)==0  then Reply(2);
 else Reply(random(28,30));
 if  local_var(LVAR_Mike_Talk)==0  then  call  Node001;        //
 else  if  local_var(LVAR_Mike_Talk)==1  then  call  Node002;  //
 else  if  local_var(LVAR_Mike_Talk)==2  then  call  Node003;  //
end

Вот первый if с переходом на ноду004 не срабатывает, хотя обьекта у криттера нет...

Кстати а гдеб почитать об ограничениях диалогового режима...

-----
За сим прощаюсь, Олег.

Отправлено: 22:44 - 14 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Конструкция кошмарная сама по себе . Вообще в процедуре должен быть или вызов другой процедуры, или Reply + Options.

Отправлено: 9:12 - 15 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Цитата:
Quote: from Wasteland Ghost on 9:12 - 15 Сент., 2006
Конструкция кошмарная сама по себе . Вообще в процедуре должен быть или вызов другой процедуры, или Reply + Options.


Ага, согласен, кошмарная... Просто прилепил на скору руку, проверить одну мыслю... А оно не работат...
Переделал, в нормальный вид привел, теперь все работат...  Пришол к выводу. Могу сказать что нуно Reply + все остальное, а в перемешку не работат...

Вот что у меня получилось окончательно... :

procedure DialogStart
begin
 if local_var(LVAR_Mike_Talk)==0  then Reply(2);
 else if local_var(LVAR_Mike_Talk)==3 then Reply(random(200,204));
 else Reply(random(28,30));
 if  local_var(LVAR_Mike_Talk)==0  then  call  Node001;        //
 else  if  local_var(LVAR_Mike_Talk)==1  then  call  Node002;  //
 else  if  local_var(LVAR_Mike_Talk)==2  then  call  Node003;  //
 else  if  local_var(LVAR_Mike_Talk)==3  then  call  Node004;  //
end

Я так думаю, эта конструкция лучче выглядит... Можно конечно еще улучшить но лениво...




-----
За сим прощаюсь, Олег.

Отправлено: 10:43 - 15 Сент., 2006
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Почему пациент мрет при применении стимпаков? Кусок скрипта пациента.

procedure use_obj_on_p_proc
begin
variable UsedItem_0;
variable UsedItem_1;

display_msg("One" + " LVAR_Diagnosed_Roge =" + local_var(LVAR_Diagnosed_Roge) + " LVAR_Wounded_Roge =" + local_var(LVAR_Wounded_Roge) + " global_var(789)=" + global_var(789));
if( local_var(LVAR_Diagnosed_Roge) == 2) and   (has_skill( dude_obj, SKILL_DOCTOR)  >= 60) and (global_var(789) == 16) then  begin

if( local_var(LVAR_Wounded_Roge) == 0 ) then begin
  UsedItem_0 := obj_being_used_with;
           if ( obj_pid(UsedItem_0) == PID_STIMPAK) then begin
           set_local_var(LVAR_Wounded_Roge, 1);
           float_msg(dude_obj,message_str(1595,249),4);
           end
        else begin
        if ( obj_pid(UsedItem_0) != PID_STIMPAK)  then  begin
        float_msg(dude_obj,message_str(1595,250),4);
        set_global_var(788,-1);
        kill_critter(self_obj, 48);
        end
  end
  end
 
         if( local_var(LVAR_Wounded_Roge) ==1 )  then begin
         UsedItem_1 := obj_being_used_with;
         script_overrides;
     if( obj_pid(UsedItem_1) == PID_MEDICAL_SUPPLIES)  then begin
     set_local_var(LVAR_Wounded_Roge, 2);
     float_msg(dude_obj,message_str(1595,249),4);
     end
     else begin
     if( obj_pid(UsedItem_1) != PID_MEDICAL_SUPPLIES ) then  begin
     float_msg(dude_obj,message_str(1595,250),4);
     set_global_var(788,-1);
     kill_critter(self_obj, 48);
     end
              end
              end


end
display_msg("Two" + " LVAR_Diagnosed_Roge =" + local_var(LVAR_Diagnosed_Roge) + " LVAR_Wounded_Roge =" + local_var(LVAR_Wounded_Roge) + " global_var(789)=" + global_var(789));
end

Отправлено: 23:20 - 17 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Опять диалоговый режим...

Есть такой кусок...

procedure Node240
begin
 Reply(240);
 gsay_option(NAME,241,Remuv,-1);
 gsay_option(NAME,242,Node5271,-1);
 gsay_option(NAME,25,DialogEnd,-1);
end

procedure Remuv
begin
 variable  var0;
 var0:=create_object(PID_SUPER_STIMPAK,0,0);
 add_mult_objs_to_inven(dude_obj,var0,1);
 var0:=obj_carrying_pid_obj(dude_obj,PID_TOMORROW_MAP);
 add_mult_objs_to_inven(self_obj,var0,1);
 rm_obj_from_inven(dude_obj,var0);
 call Node250;
end

procedure Node250
begin
 Reply(250);
 gsay_option(NAME,251,Node260,-1);
 gsay_option(NAME,22,DialogEnd,-1);
end

Все отлично работает... НО! При любой попытке выхода из локации на мировую карту происходит вылет в систему...
Ремиш процедуру Remuv, и корректируешь переход на Node250 все работает.
В чем может быть глюк в процедуре Remuv?  Там же нет ничего сложного?...

-----
За сим прощаюсь, Олег.

Отправлено: 1:49 - 18 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Код:
procedure Remuv 
begin
variable  var0;
var0:=create_object(PID_SUPER_STIMPAK,0,0);
add_mult_objs_to_inven(dude_obj,var0,1);
var0:=obj_carrying_pid_obj(dude_obj,PID_TOMORROW_MAP);
add_mult_objs_to_inven(self_obj,var0,1);
rm_obj_from_inven(dude_obj,var0);
call Node250;
end


Ну, во-первых, объект сначала убирают из инвентаря, а затем помещают его в инвентарь другого объекта:
Код:
restock_obj := obj_carrying_pid_obj(source, the_pid); 
restock_trash := rm_mult_objs_from_inven(source, restock_obj, restock_amt);
add_mult_objs_to_inven(target, restock_obj, restock_amt);


Вообще, посмотри COMMAND.H, секцию "General commands restocking inventory". Потому что так просто удалять объект из инвентаря нельзя -- если он в руке или "одет", анимация сглючит. Не смертельно, но некрасиво.

ЗЫ Кстати, там кое-где в макросах ошибочки есть: вместо who_obj используется self_obj. Так что использовать их надо осторожно . И ошибки исправить .

Отправлено: 10:47 - 18 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Цитата:

Ну, во-первых, объект сначала убирают из инвентаря, а затем помещают его в инвентарь другого объекта:

Вообще, посмотри COMMAND.H, секцию "General commands restocking inventory". Потому что так просто удалять объект из инвентаря нельзя -- если он в руке или "одет", анимация сглючит. Не смертельно, но некрасиво.

ЗЫ Кстати, там кое-где в макросах ошибочки есть: вместо who_obj используется self_obj. Так что использовать их надо осторожно . И ошибки исправить .


Ну вообще-то делал как вы с пробками показывали... А за подсказку спасибо, бум посмотреть...
Кстати я выкрутился тем, что сначало удалял, а потом создавал снова... Несколько такой, заход не через то место...


-----
За сим прощаюсь, Олег.

Отправлено: 13:38 - 18 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

С пробками? С крышками/бабками/тугриками? Так там можно, там логика другая.

Отправлено: 10:31 - 20 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

ЭЭЭЭ Не уловил разници... Что пробки, что стимпаки сие есть инвентарь и лежит в мешке... В чем разность логики? Просветите пожалуста Уточняю, рассматривается мешок, а не руки и тело, там да другая логика, сначало лучче снять, а потом удалять...


-----
За сим прощаюсь, Олег.

Отправлено: 14:22 - 20 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Для работы с крышками есть функция item_caps_adjust. И тут уже не важно, дал ты сначала или отнял. Вообще движок деньги как-то отдельно обрабатывает. Как -- уже вопрос к двиглоковырятелям.

С объектами просто надо помнить логику.
Удаление:
1. Получил указатель.
2. Убрал из рук.
3. Убрал из инвентаря.
4. Удалил.
Перемещение:
1. Получил указатель.
2. Убрал из рук.
3. Убрал из инвентаря.
4. Положил в другой инвентарь.

Отправлено: 16:05 - 20 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

А что есть за такая процедура combat_is_starting_p_proc и combat_is_over_p_proc?
combat_p_proc - выполняется во время боя, а эти когда и что делают?  В описаниях ничего не нашол про них... Просветите пожалуста, вдруг нужная штука...

ЗЫ: Судя по названиям они вызываются при начале и конце боя?

-----
За сим прощаюсь, Олег.

Отправлено: 0:22 - 22 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Угу. Проверяется просто: запихиваешь в эти процедуры display_msg("combat is starting") и display_msg("combat is over") соответственно. Ну и смотришь ;).

Отправлено: 8:48 - 22 Сент., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Мне нужно в сюжете использование сотового телефона.
Вот кусок скрипта:
Код:
procedure use_p_proc begin 
  call talk_p_proc;
end

procedure talk_p_proc begin
    script_overrides;
    start_gdialog(5,dude_obj,-1,-1,-1);
    GSay_Start;
    call opt;
    GSay_End;
    End_Dialogue;
end

procedure opt begin
       gsay_reply(-1,"(ў®§®¦­лҐ ¤Ґ©бвўЁп)";

       gsay_option(-1, "Ћв«®¦Ёвм ®ЎЁ«Єг", enj, 0);
       giq_option(6, -1,"‡ў®­Ёвм ­  Їа®ЇгйҐ­л© §ў®­®Є", prop, 0);
       giq_option(6, -1, "Џ®§ў®­Ёвм ў Ё«ЁжЁо", enj, -1);    
       giq_option(5, -1, "‚л§ў вм бЄ®аго Ї®б®йм", enj, -1);
end


Если телефон использовать из руки при закрытом инвентаре то все хорошо.
Открывается окно диалога и все как надо.

А если телефон использовать из открытого инвентаря, то к сожалению окно диалога рисуется частично под окном инвентаря частично поверх. Получается некрасиво.

Полазил по BIS_help в поисках чего-нибудь подходящего чтоб из скрипта перед вызовом диалога закрыть окно инвентаря, или как то иначе решить проблу не чего подходящего не нашел, возможно не по глазам.

Мож кто что подскажет?

Отправлено: 14:40 - 24 Сент., 2006 | ИСПРАВЛЕНО: Keha - 14:42 - 24 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Пока не знаю чем помочь, но такая-же проблема была в моде EPA со скриптом для буклета-путеводителя по ЕРА, вышло обновление, посмотри может там это уже решено?...

-----
За сим прощаюсь, Олег.

Отправлено: 21:04 - 24 Сент., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Код:
call talk_p_proc;


Плохо доку смотрел, плохо . Не надо делать явный вызов talk_p_proc, для этого есть dialogue_system_enter.

ЗЫ EPA, EPA... обижаете отечественного разработчика . Про ступку в первой версии НВ забыли?

Отправлено: 8:18 - 25 Сент., 2006
Keha
Пользователь

Регистрация: Янв. 2006

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

Большое спасибо, с dialogue_system_enter все завработало так как нужно.

Отправлено: 16:20 - 25 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Хм... Не предполагал, что dialogue_system_enter можно с предметами использовать... Думал, что только с криттерами...
Спасибо за наводку...

-----
За сим прощаюсь, Олег.

Отправлено: 21:01 - 25 Сент., 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Чего-то запутался...
С target_obj и source_obj
Я перекладываю в инвентарь НПС пулемет
Процедура pickup_p_proc
Кто я и кто пулемет?

Далее:
Процедура destroy_p_proc
НПС погибает после того, как чузен выпустил в него содержимое огнемета.
Чузен это target_obj или source_obj
Оружие от которого погиб НПС это target_obj или source_obj

Единственное, что нашел:
http://www.teamx.ru/cgi-bin/ikonboard/topic.cgi?forum=14&topic=41&start=30

Отправлено: 22:05 - 25 Сент., 2006 | ИСПРАВЛЕНО: Akkella - 22:16 - 25 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

по первому пункту, а причем тут пулемет? 8) Он просто обьект, источник чузен или кто там его передает, а приемник непесь...
Ай стоп! Тут же pickup_p_proc А ну тадыть для непися чузен будет source_obj вызвавший процедуру pickup_p_proc.

По второму вопросу. Ну тут вроде как просто, если destroy_p_proc вызвали действия чузена, то destroy_p_proc в скрипте непися вернет указатель на source_obj, то бишь чузена.
А пулемет, это просто указатель чем было произведено действие на непися...

ЗЫ: не совсем понял в чем проблема, то?

-----
За сим прощаюсь, Олег.

Отправлено: 1:22 - 26 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 2:19 - 26 Сент., 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Проблема в том, что и в первом и во втором случае нужно получить указатель на пулемет или огнемет.
Во втором случае, через тернии удалось получить только тип повреждения...

Отправлено: 6:10 - 26 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Угу пнятна, ну тут логика такая: Смотрим кто нанес повреждение, ну а потом смотрим что именно у него в активной руке. Как правило у него там и есть пулемет... Интересно, а зачем тебе указатель на пулемет для мертвого обьекта? Если решать от чего умирать то вполне достаточно знать тип повреждения... Я так думаю...

ЗЫ: И все равно я не понял сути проблемы Имея указатель на криттера, практически всегда можно узнать, что у него в карманах...
Внимательней почитай доку по функциям BISскриптов, там почти все есть... Дока есть тут на сайте.

ЗЗЫ: Вот например кусочек из нее:

"obj_carrying_pid_obj(ObjectPtr who, int pid)" -проверяет есть ли предмет с таким пидом в инвентаре или нет, если есть то возвращает указатель на него...


-----
За сим прощаюсь, Олег.

Отправлено: 8:46 - 26 Сент., 2006 | ИСПРАВЛЕНО: Oleg1969 - 9:03 - 26 Сент., 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Тка...
Все сначала.
Попробуем такую ситуацию:
Чуз вставляет динамит НПС.
Взрыв.
Вариант1 НПС не погиб
Вариант2 НПС погиб
Нужно при случае когда взрыв или огонь и смерти НПС уничтожался весь инвентарь.
Процедуры уничтожения инвентаря не требуется.
Теперь понятно?

Отправлено: 17:18 - 26 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Эта ну тут совсем не причем чуз... Будет работа с damage_p_proc, source_obj будет динамит... проверку делашь и переход на уничтожение инвентаря...

Кстати destroy_p_proc вызывается у меня тогда когда выходишь из combat mode... Это мои наблюдения, может я делаю что нетак? А да эта процедура обрабатывается самим движком.

ЗЫ: Это логические выкладки, на практике не проверялось, так как небыло надобности...

-----
За сим прощаюсь, Олег.

Отправлено: 20:29 - 26 Сент., 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Дак самое главное! Как сделать проверку, что НПС ласты склеил?
А то получается, что он еще живой, но уже без инвентаря

Отправлено: 21:49 - 26 Сент., 2006 | ИСПРАВЛЕНО: Akkella - 21:49 - 26 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

РРРРР ... Так те нуно узнать что он кирдык?! Раньше мона было сказать?  if (critter_state(object_непись)==CRITTER_IS_DEAD) then так далее пнятна?... object_непись - это есть указатель на непися... ставиш в криттер_п_проц и проверяешь живой он или как. можно еще в дамадж_п_проц  можно в дестрой_п_проц

Блин! Доку читал? Вот это http://www.teamx.ru/rus/bd/bis_help.shtml

-----
За сим прощаюсь, Олег.

Отправлено: 22:12 - 26 Сент., 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Вроде оно...
Если ставлю в дамадже. Делаю проверку на тип повреждений, если взрыв или огонь, то проверка на кирдык, делит инвентарь.
Черт. Все легко оказывается. Завтра проверю, что выйдет.

Доку похоже скоро наизусть знать буду...

Отправлено: 22:25 - 26 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

Неа, лучче наверно сначала на кирдык, а потом на все остальное... Структура процедуры будет понятней и проще... А можно ваще все в один иф заталкать типа
если тип дамажа огонь или взрыв и неписю кирдык то делаем то-то и то-то иначе другое... Примерно так...

ЗЫ: А доку просто знать наизусть эт фигня... Вот научится всем этим пользоваться - трудно... Потеть нуно, вот тож сижу и потею...


-----
За сим прощаюсь, Олег.

Отправлено: 0:09 - 27 Сент., 2006
Wertel
Пользователь

Регистрация: Сент. 2006

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

Взял скрипт Мирии из AL и декомпелировал,немного редоктировал и он обратно не хочет компелироваться.Побробовал без редоктирования,тоже не хочет.И ещё там в двух местах прописано отображение брони,где ошибка?

Отправлено: 15:19 - 28 Сент., 2006
Oleg1969
Пользователь

Откуда: Саратов
Регистрация: Май 2006

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

А что компилятор пишет? Уж дюже ты неинформативно написал...

-----
За сим прощаюсь, Олег.

Отправлено: 16:50 - 28 Сент., 2006
Wertel
Пользователь

Регистрация: Сент. 2006

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

Вот что пишет-Stack Overflow!

Отправлено: 17:14 - 28 Сент., 2006
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Будешь и дальше так же лаконично описывать - тебе никто не поможет. Начинать надо с производителя и версии компилятора, а так же декомпилятора. И фрагмента кода до изменения и после изменения. И того, собираются ли другие скрипты или тоже -  нет.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 17:29 - 28 Сент., 2006
Wertel
Пользователь

Регистрация: Сент. 2006

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

Декомпилятор-int2ssl_1.52,компилятор BISовский официальный.Все остальпые срипты нормально работают,Мирия даже без изменений не компелируется!

Отправлено: 17:40 - 28 Сент., 2006
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

1. Возьми в файловом разделе int2ssl v1.54. В 1.52 была пара неприятных багов.
2. Там же возьми нормальный компилятор от Anchorit'a. В BIS'овском тоже есть пара неприятных багов.
3. Сообщи результат.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 18:41 - 28 Сент., 2006 | ИСПРАВЛЕНО: Alchemist - 19:01 - 28 Сент., 2006
Perceptron
Модератор

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

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

В утилях валяется версия 1.54. Попробуй ее.

Отправлено: 18:48 - 28 Сент., 2006
Wertel
Пользователь

Регистрация: Сент. 2006

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

Всё получилось,большое спасибо.Остался вопрос по поводу отображения брони-дважды прописано.

Отправлено: 18:54 - 28 Сент., 2006
Panzer
Пользователь

Откуда: Санкт-Петербург
Регистрация: Март 2005

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

Уважаемые жители форума. Я совсем недавно решил разобраться в моддинге фолла, скачал много программ, кое-какие документации и начал самообучение, так сказать. Начал читать руководство о скриптах вот это, однако дочитав до места где говориться о каком-то файле define.h, вошел в ступор. Что это за файл? Где его взять? Написано: в редакторе, в папке хедс, однако там вообще папок нет, вот и прошу помощи в нахождении данного файла.


З.Ы. Извините что не прочитал все 66 страниц, возможно там был ответ, просто мое время пребывания в интернете очень ограничено, и я просто быстрее получу ответ если все таки спрошу....

-----
Столбом огня и серы мир взлетел на воздух
В чудо верить никогда не поздно...

Отправлено: 5:28 - 18 Окт., 2006
Alan Killenger
Пользователь

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

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

*.h файлы - это файлы заголовки (они же хэадеры). В этих файлах ведется объявление констант и макросов (макроопределений). Изначально редактор карт от BIS поставлялся в архиве вместе с исходниками скриптов и компилятором. TeamX разделила архив на отдельные части: исходники скриптов и сам редактор карт. Если вы скачаете архив с исходниками, то увидите в нем каталог header (или что-то в этом роде), в котором и будут лежать эти заголовки. О том, зачем нужны эти заголовки и как их использовать, написано в доке по препроцессору, которая прилагается к "Fallout Scripts: How To?".

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

Отправлено: 8:35 - 18 Окт., 2006
Panzer
Пользователь

Откуда: Санкт-Петербург
Регистрация: Март 2005

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

Все нашел, да и еще все скрипты игры там есть)))  Спасибо за помощь)

-----
Столбом огня и серы мир взлетел на воздух
В чудо верить никогда не поздно...

Отправлено: 18:47 - 19 Окт., 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

2Panzer Не надо необоснованно использовать жирный шрифт.

Не забудь скачать отсюда "довесок" от Haenlomal'а. Ибо у БИС там не последней версии скрипты.

Отправлено: 8:53 - 20 Окт., 2006
Ray
Модератор

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

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

У меня такой вопрос:

В обработчике криттеров combat_p_proc, fixed_param == 1 это:
Цитата:

COMBAT_SUBTYPE_WEAPON_USED (1) - было использовано оружие.

Так вот, кто знает действительно ли это так и параметр возвращается. В скриптах фолла подобного нет. Я сколько не изгалялся так рабочего результата и не добился.

Код:
 
procedure combat_p_proc
begin
if (fixed_param == 1) then
begin
display_msg("Weapon used" ) ;
end
end



Во время боя (после использования оружия ничего не выводится). Неужто я настолько забыл скриптинг Надо исправляться

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 23:08 - 8 Ноября, 2006
Alan Killenger
Пользователь

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

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

На  всякий случай, что я некогда получил в результате собственных экспериментов.
Цитата:
combat_p_proc

fixed_param == 1
???

fixed_param == 2
Успешное попадание собственника скрипта по своей цели, и только это.
target_obj == тот, в кого попали (именно попали, а не хотели попасть), не знаю как насчет очереди.

fixed_param == 3
???

fixed_param == 4
Начало хода собственника скрипта. В том случае, если собственник ход пропустил, обработчик вызван не будет.
target_obj == self_obj.

fixed_param == 5
Если наступает, то это самое начало боя, до того, как fixed_param == 4. Это значит то, что персонаж еще не определен с тем, как он вступает в бой, на чъей он стороне. Более понятно скриптовикам: событие наступает тогда, когда персонаж оказывается в битве, причем  его TEAM_NUM в битве не учавствует, и его в битву никто не втравливал.
target_obj == self_obj.

source_obj == при любом fixed_param это тот, кто был target_obj в прошлый раз (во время прошлого вызова combat_p_proc в этом же скрипте при любом fixed_param).


Код:
procedure combat_p_proc  
begin
if (fixed_param == 1) then
begin
display_msg("Weapon used" ) ;  
end  
end


Или я ничего не понял, или здесь не хватает target_obj или source_obj?

P.S.
Цитата:
COMBAT_SUBTYPE_WEAPON_USED (1) - было использовано оружие.

А это достоверно? Вспомнить хотя бы obj_can_hear_obj и obj_can_see_obj.

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

Отправлено: 1:53 - 9 Ноября, 2006 | ИСПРАВЛЕНО: Alan Killenger - 2:57 - 9 Ноября, 2006
Ray
Модератор

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

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

Цитата:
Или я ничего не понял, или здесь не хватает target_obj или source_obj?


А они разве там нужны? Этот код написан в Obj_dude. Покрайней мере fixed_param == 2 и fixed_param == 4 работают и без target_obj или source_obj.

Цитата:
А это достоверно? Вспомнить хотя бы obj_can_hear_obj и obj_can_see_obj.


А вот это я как раз и спрашивал. (см. пред. пост) В доке от WG написанно именно это. Но с другой стороны, сколько я не пытался так у меня по fixed_param == 1 ничего не сработало. Что самое интересное: в доке идущей с маппером и описывающей "Script Action Descriptions" нет упоминания о COMBAT_SUBTYPE_WEAPON_USED.


Цитата:
Combat:
Combat is occurring, and one of the combat sub-actions has occurred. These actions allow the script to react to combat (even though combat attack/etc. choices are actually handled in the engine). They are:
• HIT_SUCCEEDED -- The scripts’ object successfully hit it’s target. This can be used to do extra damage (radiation, for example), or to count the attacks that succeed.
• SEQUENCING – Combat sequencing is being checked (to see if critters want to enter/exit combat).
• TURN – A combat turn is just about to start. You can override the default turn behavior here to prevent a critter from reacting to combat (or to cause them to do something special).
• NONCOM_TURN – (UNUSED).




P.S. Тогда у меня более общий вопрос:
Можно ли узнать, что игрок стрелял из оружия? Причём не только при попадании в цель но и при промахе?

-----
Не бывает невозможных задач – бывает мало времени.

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

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

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

Цитата:
в доке идущей с маппером и описывающей "Script Action Descriptions" нет упоминания о COMBAT_SUBTYPE_WEAPON_USED

Часть того, что описано в доке, взята напрямую из заголовков БИС. Проверялось далеко не всё, так что дополнения и исправления приветствуются .
Цитата:
Можно ли узнать, что игрок стрелял из оружия? Причём не только при попадании в цель но и при промахе?

"Изнашиваемое оружие", да? У Рейвена в своё время так и не получилось это узнать, т.к. сам момент выстрела уловить, вроде как, нельзя, а дамаж_п_проц вызывается только при нанесении повреждения, т.е. если удар был поглощён бронёй, то процедура эта не вызовется. Тем более не вызовется она при промахе.

ЗЫ Кстати, проверять параметры надо не только в скрипте Дуда, но и в скрипте "жертвы".

Отправлено: 11:55 - 10 Ноября, 2006
Ray
Модератор

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

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

Цитата:
"Изнашиваемое оружие", да?


Нет, но близко Мои цели более прозаичны. Мне в принципе хватит и отслеживания при попадании, но хотелось бы знать всё

Цитата:
ЗЫ Кстати, проверять параметры надо не только в скрипте Дуда, но и в скрипте "жертвы".



Нет, не надо. Достаточно в скрипте дуда написать

Код:
  
if (fixed_param == 2) then begin
//код
end



-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 14:49 - 10 Ноября, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
Нет, не надо.

Нет, надо .
Я говорю об экспериментальном выяснении смысла параметров. Потому как не ясно, например, COMBAT_SUBTYPE_WEAPON_USED - было ли использовано оружие объектом или на объекте. Если бы у меня было время , я бы прописала все эти варианты в скриптах и Дуда, и жертвы. И устроила бы битву века .

Отправлено: 11:20 - 14 Ноября, 2006
Austin
Пользователь

Откуда: Москва
Регистрация: Сент. 2006

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

Я тут пишу мод брони для Маркуса, и возникла проблема. Состоит она вот в чем. Я хочу, чтобы после изготовления брони не просто менялся внешний вид Маркуса (это у меня получилось), но и повышались его характеристики (класс брони, сопротивляемость и пр.). Сначала я пробовал сделать все это через скрипты, с помощью set_critter_stat(ObjectPtr who, int stat, int amount). Для проверки я написал в той процедуре, в которой на Маркуса одевалась броня:
set_critter_stat(Marcus_Ptr, STAT_max_move_points, 3) - дал ему три очка действия. Скомпилировал, запустил, посмотрел на экранчик управления у Маркуса - очков действия так и осталось 9. Пробовал с другими параметрами - то же самое. Почему-то эта функция не работает на Маркусе.
Еще я пробовал просто создать новый итем брони и прописать в нем все характеристики. Создал. Одеваю сам - превращаюсь в мутанта в броне. Даю Маркусу - не хочет одевать.

Вопрос в следующем:
1) Можно ли сделать так, чтобы Маркус согласился одеть броню, которая у него в инвентаре? Причем не любую, а именно ту, которую я создал?.
2) Если первое никак невозможно, то почему на Маркусе не работает функция set_critter_stat и как можно поднять ему характеристики через скрипты?

Отправлено: 18:48 - 16 Ноября, 2006 | ИСПРАВЛЕНО: Austin - 18:50 - 16 Ноября, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Документация по созданию партийца для начинающих моддеров.

AP -- производная характеристика. Менять производные характеристики непосредственно нельзя. По крайней мере у меня это не получалось. Если так хочется поднять AP, можно попробовать повесить на Мркуса перк "Action Boy". Кажется, перки вешаются не только на Дуда.

Отправлено: 9:39 - 17 Ноября, 2006
Austin
Пользователь

Откуда: Москва
Регистрация: Сент. 2006

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

Цитата:
Quote: from Wasteland Ghost on 9:39 - 17 Ноября, 2006


AP -- производная характеристика. Менять производные характеристики непосредственно нельзя. По крайней мере у меня это не получалось. Если так хочется поднять AP, можно попробовать повесить на Мркуса перк "Action Boy". Кажется, перки вешаются не только на Дуда.
Попробовал добавить перки - заработало! Выход найден. Спасибо!

Отправлено: 11:36 - 17 Ноября, 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Вот это нашел в скрипте дуда:

has_trait(1, dude_obj, 0)

Описание команды в доке:
int has_trait(int trait_type, ObjectPtr who, int trait) - вернуть значение указанного свойства
Аргументы:
trait_type - тип трейта:
TRAIT_PERK   (0)
TRAIT_OBJECT (1)
TRAIT_TRAIT  (2)
who - указатель на криттера
trait - если trait_type = TRAIT_PERK - номер перка (см. DEFINE.H раздел Perk Trait Types)
если trait_type = TRAIT_TRAIT - номер трейта (см. DEFINE.H раздел Trait Types)
если trait_type = TRAIT_OBJECT - номер особого свойства:

Возвращаемое значение:
если trait_type = TRAIT_PERK ли trait_type = TRAIT_TRAIT - проверяет наличие перка/трейта
если trait_type = TRAIT_OBJECT:
OBJECT_AI_PACKET  (5)   - возвращает номер AI
OBJECT_TEAM_NUM   (6)   - возвращает номер команды
OBJECT_CUR_ROT    (10)  - возвращает направление взгляда (0...5)
OBJECT_VISIBILITY (666) - возвращает видимость (TRUE, FALSE)
OBJECT_CUR_WEIGHT (669) - возвращает текущий вес

Вопрос:
Что за особое свойство 0 в TRAIT_OBJECT

Отправлено: 20:08 - 20 Ноября, 2006 | ИСПРАВЛЕНО: Akkella - 20:10 - 20 Ноября, 2006
Alan Killenger
Пользователь

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

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

Цитата:
если trait_type = TRAIT_OBJECT:
OBJECT_AI_PACKET  (5)   - возвращает номер AI
OBJECT_TEAM_NUM   (6)   - возвращает номер команды
OBJECT_CUR_ROT    (10)  - возвращает направление взгляда (0...5)
OBJECT_VISIBILITY (666) - возвращает видимость (TRUE, FALSE)
OBJECT_CUR_WEIGHT (669) - возвращает текущий вес

Ну вот оно и особое свойство. Следует понимать, ято это свойство не системы SPECIAL, а просто технический переключатель, позволяющий получить доступ к некоторым техническим параметрам реализации NPC в игре. Каким именно - выше описано. Или я не въехал? Какое "особое свойство 0"?

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

Отправлено: 20:53 - 20 Ноября, 2006 | ИСПРАВЛЕНО: Alan Killenger - 21:54 - 20 Ноября, 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Alan Killenger
В скрипте дуда есть следующая функция (в расчете желудка)

has_trait(1, dude_obj, 0)

Это означает, что она возвращает значение особого свойства дуда под номером 0.
Так вот:
Что это за свойство?

Отправлено: 21:18 - 20 Ноября, 2006
Alan Killenger
Пользователь

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

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

В случае trait_type == TRAIT_PERK тот аргумент попросту неиспользуется. Пиши там все, что захочется. Общепринято писать в таких случаях 0, но разницы никакой.

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

Отправлено: 0:22 - 21 Ноября, 2006
Akkella
Пользователь

Регистрация: Авг. 2006

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

Alan Killenger
Тут случай TRAIT_OBJECT.
И аргумент используется в расчетах.

Отправлено: 7:26 - 21 Ноября, 2006
Alan Killenger
Пользователь

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

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

А, въехал наконец. То есть вы декомпилировали скрипт дуда и нашли недокументрованное значение параметра? Чудненько. В таком случае, если ответ имеется, его определенно прийдется подождать. Тут давным-давно где-то база была по ковыряниям... уж не знаю, есть ли она сейчас... вроде fallout offcode... черт, не помню. Там скриптовики ковырятели записывали свои заметки, там надо либо посмотреть, может что по теме найдете, либо записать ваши наблюдения... на память потомкам.

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

Отправлено: 11:36 - 21 Ноября, 2006
Wasteland Ghost
Маленькое Злое Привидение

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

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

Не работает желудок. Там в коде целая куча ошибок. Например, там везде сравниваются указатель и PID . Забей на этот код .

Отправлено: 13:08 - 21 Ноября, 2006
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Я хотел задать характеристики персонажа то есть self через скрипт например все параметры в PID персонажа ставить в ноль а потом скриптом их задавать пример

Эти характеристики не задаются, это вообще осуществимо может нужно как то по-другому или это движок, а если движок, то может байтик какой-нибудь поменять

  set_critter_stat(self_obj, STAT_current_hp, 200);

  set_critter_stat(self_obj, STAT_st, 10);
  set_critter_stat(self_obj, STAT_pe, 10);
  set_critter_stat(self_obj, STAT_en, 10);
  set_critter_stat(self_obj, STAT_ch, 10);
  set_critter_stat(self_obj, STAT_iq, 10);
  set_critter_stat(self_obj, STAT_ag, 10);
  set_critter_stat(self_obj, STAT_lu, 10);
Эти характеристики задать можно
  critter_mod_skill(self_obj, SKILL_SMALL_GUNS, 100);
  critter_mod_skill(self_obj, SKILL_BIG_GUNS, 100);
  critter_mod_skill(self_obj, SKILL_ENERGY_WEAPONS, 100);
  critter_mod_skill(self_obj, SKILL_UNARMED_COMBAT, 100);
  critter_mod_skill(self_obj, SKILL_MELEE, 100);
  critter_mod_skill(self_obj, SKILL_THROWING, 100);
  critter_mod_skill(self_obj, SKILL_FIRST_AID, 100);
  critter_mod_skill(self_obj, SKILL_DOCTOR, 100);
  critter_mod_skill(self_obj, SKILL_SNEAK, 100);
  critter_mod_skill(self_obj, SKILL_LOCKPICK, 100);
  critter_mod_skill(self_obj, SKILL_STEAL, 100);
  critter_mod_skill(self_obj, SKILL_TRAPS, 100);
  critter_mod_skill(self_obj, SKILL_SCIENCE, 100);
  critter_mod_skill(self_obj, SKILL_REPAIR, 100);
  critter_mod_skill(self_obj, SKILL_CONVERSANT, 100);
  critter_mod_skill(self_obj, SKILL_BARTER, 100);
  critter_mod_skill(self_obj, SKILL_GAMBLING, 100);
  critter_mod_skill(self_obj, SKILL_OUTDOORSMAN, 100);

Отправлено: 20:13 - 4 Июля, 2007
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Базовые характеристики явно задать нельзя. Но для каждой из них можно установить аддитивный модификатор, который может принимать и отрицательные значения. Попытку выхода результирующего значения за пределы 1...10 ограничит движок.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 21:16 - 4 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

Вы можете показать пример как установить аддитивный модификатор?

Отправлено: 21:26 - 4 Июля, 2007
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Код:
variable adj; 

adj := -1;
set_critter_stat(self_obj, STAT_pe, adj);



Уменьшить значение Perception на единицу.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 14:20 - 5 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

variable adj;  
adj := -1;
set_critter_stat(self_obj, STAT_pe, adj);

Сделал все так же но stat не увеличивается и не уменьшается



(Добавление от 15:33 - 5 Июля, 2007.)


Кто нибудь знает как одет броню персонажа через скрипт
Не заменить вид персонажа а именно одеть
Вот как я делал но что то не получается

wield_obj((critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, tile_num(self_obj), elevation(self_obj)));

wield_obj((critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, 0, 0));

И даже так

add_obj_to_inven(self_obj, (critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, 0, 0)))

add_obj_to_inven(self_obj, (critter_inven_obj(self_obj, INVEN_TYPE_WORN)==create_object(PID_METAL_ARMOR, tile_num(self_obj), elevation(self_obj))));

Отправлено: 15:14 - 5 Июля, 2007
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Цитата:
Я декомпелирую скрипты fallout1

Надо было вот с этого начинать. В F1 базовыми характеристиками действительно заведует движок и только движок. В F2 же этот код вполне работает.

-- Update --

Код:
variable armour; 

armour := create_object(PID_METAL_ARMOR, 0, 0);
add_obj_to_inven(self_obj, armour);
wield_obj(obj_carrying_pid_obj(self_obj, PID_METAL_ARMOR));



Со скриптами -- детский сад. Твои примеры сводятся к wield_obj(false) и add_obj_to_inven(self_obj, false). Если не понимаешь синтаксиса языка, посмотри для начала, как это сделано в исходниках. Благо, доступ к ним имеется, да и декомпилятор в помощь.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 16:57 - 5 Июля, 2007 | ИСПРАВЛЕНО: Alchemist - 18:46 - 5 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

> Надо было вот с этого начинать. В F1 базовыми характеристиками действительно заведует движок и  только движок. В F2 же этот код вполне работает.

variable adj;  
adj := -1;
set_critter_stat(self_obj, STAT_pe, adj);

Я это делаю в fallout2 но ничего не изменяет
в map_enter_p_proc

variable adj;  
adj := -1;
set_critter_stat(self_obj, STAT_st, adj);  Сила персонажа

critter_p_proc

в proto файле персонажа сила = 8
Чтобы проверить изменяет ли он или нет
 if (get_critter_stat(self_obj, STAT_st )==8) then float_msg(self_obj,"сила равна 8", 3);
else float_msg(self_obj,"сила неравна 8", 3);

Он выдает это float_msg(self_obj,"сила равна 8", 3);

> детский сад.
Эх, давненько это было

> Если не понимаешь синтаксиса языка, посмотри для начала, как это сделано в исходниках

Ну что ж посмотрю

Отправлено: 19:41 - 5 Июля, 2007
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Цитата:
Я это делаю в fallout2 но ничего не изменяет
в map_enter_p_proc

Для криттера этот обработчик может и не вызываться. Выбери другой. Это раз.
Данная операция вообще имеет смысл только  для dude_obj. Это два.
Контролировать значения параметров надёжнее всего через окошко персонажа. Это три.
Плохой, но рабочий пример обращения с базовой характеристикой персонажа можно посмотреть в скрипте Pariah Dog. Только обрати внимание, что их там два: один для локации, другой -- для собаки. Это четыре.


-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 20:19 - 5 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Выяснил что self_obj через скрипты нельзя повышать или понижать характеристики а dude_obj можно


(Добавление от 22:14 - 5 Июля, 2007.)


Ну и последний вопрос как сделать так чтобы единицы здоровья больше 100 не повышались.
Пробывал так
 while (get_critter_stat(dude_obj, STAT_max_hp) > 100) do begin
  set_critter_stat(dude_obj, STAT_max_hp, - (1));
  end

не получилось но зато Windiws XP висанул а писали что никогда не виснет
если хотите это проверить перепишите в скрипт dude_obj в проседуру  critter_p_proc

еще пробывал так

  if  (get_critter_stat(dude_obj, STAT_current_hp) > 100) then begin
  set_critter_stat(dude_obj, STAT_current_hp ,100);
  end
и так

  if  (get_critter_stat(dude_obj, STAT_max_hp) > 100) then begin
  set_critter_stat(dude_obj, STAT_max_hp,100);
  end

Так вот это реализуемо?
Может байтик поменять в fallout2.exe


Отправлено: 21:11 - 5 Июля, 2007
Ray
Модератор

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

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

Цитата:
ObjectPtr self_obj - возвращает указатель на объект, в скрипте которого выполняется
ObjectPtr dude_obj - возвращает указатель на игрока


Чиатй доку и внимательно смотри пост Alchemist'а.


Цитата:
не получилось но зато Windiws XP висанул а писали что никогда не виснет
если хотите это проверить перепишите в скрипт dude_obj в проседуру  critter_p_proc


У меня мощности компьютера вполне хватает, чтобы закрыть "подвисший" процесс. Это раз.
Обработчик critter_p_proc выполняется всегда, причём несколько раз в секунду (хм... 10 раз? по тикам что-ли...) Отсюда такие результаты. Это два (заразно, блин )

Цитата:
Может байтик поменять в fallout2.exe

Блин. Что все так бросаются этой фразой. Хоть бы раз посмотрели на fallout2.exe в дизассемблереном виде и попытались там что-то найти. А также попробывали повозиться с отладчиками или REC Studio...


-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 23:37 - 5 Июля, 2007 | ИСПРАВЛЕНО: Ray - 22:39 - 5 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Ray

> Чиатй доку и внимательно смотри пост Alchemist'а.
Доку читал и пост перечитал то есть нельзя получается

> Блин. Что все так бросаются этой фразой. Хоть бы раз посмотрели на fallout2.exe в дизассемблереном

Смотрел ниче не понял очень много цифр  
 
> виде и попытались там что-то найти. А также попробывали повозиться с отладчиками или REC Studio...

Не я в этом полный ноль так я и задал этот вопрос знающим на него ответ
Так можно или нет?


Отправлено: 0:04 - 6 Июля, 2007
Spy
Реалист

Откуда: Все там будем...
Регистрация: Май 2005

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

Цитата:
Так можно или нет?


Конечно можно! Только байтиком тут, боюсь, необойдётся. Чтобы исправить что-то в движке как следует (т.е. так, чтобы потом не было глюков), нужно обладать недюжим интеллектом, памятью, кучей времени и страстным желанием. Практика показывает, что сочетается всё это в одном человеке чрезвычайно редко. Так что я предложу тебе забыть идею про "байтик в движке".

-----
Хочешь, чтобы что-то было сделано хорошо - сделай сам.

Отправлено: 2:02 - 6 Июля, 2007 | ИСПРАВЛЕНО: Spy - 2:05 - 6 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Spy

> Так что я предложу тебе забыть идею про "байтик в движке".

Прям как в анекдоте

- Хорошее пальто было
- Да (печально)
- Ну и хрен сним

to All
Еще пара вопросов вы уж меня не rtfm вопросы у меня не банальные то есть не такие
как скомпилировать скрипт или что такое макрос

Мне в процедуре combat_p_proc зделать проверку
если на self было использовано оружие то есть ударили или выстрелили пример

если на self было использовано оружие отравленное копье то повысить отравление self

  if (weapon_dmg_type(DMG_normal_dam == obj_pid(PID_SPEAR))) then critter_dmg(dude_obj, 50, DMG_normal_dam);

Но тут нужно через какойто параметр fixed_param

И еще Мне нужно чтобы чуз с одной карты скриптово появился скриптово на другой

Пример в наваро но на 2 elevation load_map(Имя_карты,параметр)
load_map("Navarro",0); но он загрузит первый ELEVATION dude окажется на бензакалонке а мне нужен 2 или 3

И вот вопросик который я давно хочу задать можно ли сделать проверку у партийуев да у любого персонажа маркус в   процедуре combat_p_proc если в руках пулемет и он стреляет в цель а рядом есть сопартийцы 1 вариант убрать оружие и взять другое
2 вариант атаковать другого
3 вариант вывести float и изменить значение GVAR выдает сообщение разайдись GVAR меняется а в скриптах партийцев Если гвара такая то или атаковать других или атайти от цели на 5 tile
А то если у него в руках пулемет э таж смерть для всей команды

Жмем на dude выбираем бинокль создается окошко как в Mrfixit
Там команды если в партии есть маркус то есть команды для маркуса
если в партии то тото....
И еще есть команды для всех
Пример именно в бою
Разойдись
или
отступаем и все партийцы
убегают с карты

Или приказ ленни
подлечи вика и ленни бежит и лечит

Так вот это возможно реализовать я буду пробывать но просто ответье
пример
Это нельзя реализоватьююю а за это отвечает движок или вот это можно и сделать

Кто нибудь может скинуть оригинальные текста fallout1 папку game
Ну очень надо


Отправлено: 10:35 - 6 Июля, 2007 | ИСПРАВЛЕНО: Jordan 63 - 10:38 - 6 Июля, 2007
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Возможно все, дерзай. У меня, когда я писал партийцев, кроме всего прочего, была идея реализации г.и. для командования. Но не хватило времени. Так что доки в руки и вперед.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 14:55 - 6 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Еще 40 вопросов от Jordan 63 )

Хотел реализовать если у персонажа клинта в руке пулемет и дистанция то есть если dude стоит рядом с врагом примерно <= 3 tile тогда клинт убирает оружие и идет в рукопашку. Без дистанции все отлично работает а вот с дистанцией проблемы fallout2 вылетает я знаю это мой косяк а вот примеры что не так

procedure combat_p_proc begin
    if (critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)!=0) then begin

   if (obj_carrying_pid_obj(self_obj, PID_MINIGUN))

   а вот примеры
 
   and (tile_distance(tile_num(dude_obj), tile_num(obj_pid(PID_DOG)))<=3) then

   and (tile_distance_objs((obj_pid(PID_DOG)), dude_obj) <=3) then


     //inven_unwield(self_obj);
     rm_obj_from_inven(self_obj, obj_carrying_pid_obj(self_obj, PID_MINIGUN));
    end
end

А вот скрипт http://jordan631.narod.ru/party.rar
копируйте в папку data  и начинайте новую игру

Отправлено: 18:15 - 6 Июля, 2007 | ИСПРАВЛЕНО: Jordan 63 - 18:31 - 6 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Как организовать проверку if dude находтится на карте мира в такой то координате но меньше чем в такой то then
Пример который не сомпилится ругается что ошибка then
 if ((worldmap_xpos == 11) and (worldmap_ypos == 9)) > and < ((worldmap_xpos == 493) and (worldmap_ypos == 349)) then

Отправлено: 13:40 - 8 Июля, 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Я бы на месте компилера ещё не так ругалась . Что это за конструкция такая?
Цитата:
> and <


Большая просьба грамотно, чётко и полно формулировать вопросы. Если не можешь сформулировать свой вопрос, это означает, что ты сам пока не понимаешь, что тебе нужно.

Отправлено: 20:16 - 9 Июля, 2007
Akkella
Пользователь

Регистрация: Авг. 2006

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

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

Вернее должна менятся,но почему-то процедура map_update_p_proc в скрипте предмета не работает.
Сам предмет находится в активной руке дуда.
Есть ли данные или опыт по этому вопросу?

На всякий случай код:
procedure start;
procedure map_update_p_proc;

procedure start
begin

end
procedure map_update_p_proc
begin
display_msg(message_str(1, 100));
if global_var(775)>0 and global_var(776)==self_obj then
begin
set_local_var(0, local_var(0)+1);
set_global_var(755, 0);
set_global_var(776, 0);
display_msg(message_str(1, 859));

if local_var(0)==1 and random(local_var(0), 10)==local_var(0) then
begin
set_local_var(0, 0);
display_msg(message_str(1, 850));
destroy_object(self_obj);
end
end
end

Отправлено: 20:55 - 9 Июля, 2007 | ИСПРАВЛЕНО: Akkella - 22:49 - 9 Июля, 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Akkella

global_var(776)==self_obj

Это нормально ? Может тут процесс прерывается?

Глобальные вары, там всегда работают. Просто вары тоже  
variable eklmn  
тоже.

Jordan 63

Цитата:
И еще есть команды для всех
Пример именно в бою
Разойдись
или
отступаем и все партийцы
убегают с карты


anim(self_obj, ANIM_jump_begin, LVar2);
jump_begin не использована в оригинале и сюда можно встроить свою анимацию, а затем ее скриптово проигрывать.
"Рисуещь" анимацию под джамп(прыжок) в ручную, в смысле перииначиваещь обычную ходьбы/бега (не помню почему она так просто не подходит)(у меня где-то на Анклавера есть) и создаещь иллюзию перемешения, т.е. телепортирующь
критера вручную-скриптово, а затем проигрываещь анимацию скриптово, хм, наоборот проигрываещь свою анимацию и затем телепортируещь, подобрав клетку.
Но это коряво будет выглядеть в большей или меньшей степени так как синхронизировать их до идеала тоже самое, что подпрыгнуть и схватить пролетающюю мимо пулю - я не смог.
Нормально внедряется только команда "Стоять и Недышать"

Это предел: (если я код не попутал)

procedure combat_p_proc
begin  
     /* if  (fixed_param == 3) then begin
      float_msg(self_obj, "Sir!!! fixed_param = 3", 6);
      reg_anim_clear(self_obj); end
      If  (fixed_param == 5) then begin
      float_msg(self_obj, "Sir!!! fixed_param = 5", 6);
      end   */
     
// ждать приказ.
     if global_var(GVAR_WARCRAFT) == 1 then
     begin
     script_overrides;
     critter_injure( self_obj,DAM_KNOCKED_DOWN);
     anim(self_obj,ANIMATE_ROTATION,rotation_to_tile(tile_num(self_obj),tile_num(dude_obj)));
     anim(self_obj, ANIM_stand, rotation_to_tile(tile_num(self_obj),tile_num(dude_obj)));
     critter_injure( self_obj,DAM_KNOCKED_DOWN);
//good //float_msg(self_obj, "Ok, I'm stand, Sir, Ok", 6);
     end
//действовать самостоятельно.
       if global_var(GVAR_WARCRAFT) == 2 then
       begin
       critter_injure( self_obj,DAM_KNOCKED_OUT);
       //anim(self_obj, ANIM_stand, rotation_to_tile(tile_num(self_obj),tile_num(dude_obj)));
       critter_injure( self_obj,DAM_KNOCKED_OUT);
       float_msg(self_obj, "UYUYOYUrrrr, Sir", 6);
       end
   
// исполнять приказ: Ко мне.
         if global_var(GVAR_WARCRAFT) == 3 then begin
         script_overrides;
         critter_injure( self_obj,DAM_KNOCKED_DOWN);
      LVar2 := rotation_to_tile(tile_num(self_obj),tile_num(dude_obj));
      //float_msg(self_obj, "Sir!!! obj_get_rot(self_obj)=" + LVar2, 6);
If  (fixed_param == 4) then begin
anim(self_obj, ANIMATE_ROTATION, rotation_to_tile(tile_num(self_obj),tile_num(dude_obj)));
move_to(self_obj, tile_num_in_direction(tile_num(self_obj),LVar2,5), elevation(dude_obj));
anim(self_obj, ANIM_jump_begin, LVar2);
set_global_var(GVAR_WARCRAFT,1);

     while (time_control_of_anim_combat <=1000) do  begin
     time_control_of_anim_combat:= (time_control_of_anim_combat +1);
     if time_control_of_anim_combat == 900 then anim(self_obj,ANIM_swing_anim, LVar2);
     end

end
         critter_injure( self_obj,DAM_KNOCKED_DOWN);
         end
end

Зато для раздачи команд можно использовать интерфейсные команды.

ps
Обработчик critter_p_proc срабатывает не менее ста раз в реальную секунду. ЕМНИП.

Отправлено: 0:26 - 10 Июля, 2007
Akkella
Пользователь

Регистрация: Авг. 2006

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

Цитата:
global_var(776)==self_obj

Это нормально ? Может тут процесс прерывается?

Глобальные вары, там всегда работают. Просто вары тоже  
variable eklmn  
тоже.

Все нормально. В эту гвару указатель записывается....
Но мар апдейт не работает в принципе, посольку даже тестовое сообщение не выводит, которое должно выводиться при любых условиях.
Может еще есть идеи?

Отправлено: 18:05 - 10 Июля, 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Если мне не изменяет мой склероз, map_update во время боя не работает. А вообще, для предметов, находящихся в инвентаре, не вызываются очень даже многие обработчики. Инвентарь практически полностью обрабатывает движок. Кстати, многое зависит от подтипа предмета. Для misc-предметов, например, обработчик use вызывается, а для drug -- нет.

Отправлено: 9:15 - 12 Июля, 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Wasteland Ghost


> Большая просьба грамотно, чётко и полно формулировать вопросы. Если не можешь сформулировать свой вопрос, это означает, что ты сам пока не понимаешь, что тебе нужно.

Когда dude перемещается по карте мира то происходят случайные встречи грузится такая то карта и такие то персонажи а я хотел это так сказать отследить и переделать случайные встречи через скрипт только неспрашивайте зачем через недельку увидите. Так вот сообственно вопрос делаем скрипт и привязываем к картам случайных встреч пример
в процедуре map_enter_p_proc пишем
if (cur_map_index == MAP_RND_DESERT_1)  and dude находиться в токой то координате на карте мира then

Зато для раздачи команд можно использовать интерфейсные команды.

Я так и делаю а вот насчет проигрываещь анимацию скриптово, а если сделать так

lvar_bit(1,bit_1)
set_lvar_bit_on(1,bit_1)
set_gvar_bit_off(1, bit_1)

приказ ко мне
set_lvar_bit_on(1,bit_1)

if lvar_bit(1,bit_1) then begin
animate_move_to_tile(tile_num(dude_obj))
set_gvar_bit_off(1, bit_1)

end

Хотел реализовать если у персонажа клинта в руке пулемет и дистанция то есть если dude стоит рядом с врагом примерно <= 3 tile тогда клинт убирает оружие и идет в рукопашку.

Ктонибудь знет как это сделать?

И последний вопрос ктонибудь пришлите английские текста fallout1 точнее папку game ну очень надо
У меня готовы все скрипты fallout1 то есть приведены к более менее исходному коду
но осталось сделать CRITRPID.H а для этого нужно pro_crit.msg
и maps.н



Отправлено: 15:24 - 12 Июля, 2007
Akkella
Пользователь

Регистрация: Авг. 2006

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

Прошу прощение за дезу.
map_update работает во время боя и у криттеров и у предметов.
Как обычно, дело в элементарной ошибке, не тот скрипт подключил.

Все нормально, указатель и флаг передается в скрипт редмета, где, если указатели совпадают происходит расчет износа по флагу (кол-во выстрелов/ударов)
Если износ критический предмет исчезает.

Проблема износа теперь полностью решена, но остались еще две.

1 Оружие или броня разлетаются во время обновления (примерно два-три раза в минуту), а не во время удара/попадания
2 Серьезней.ю Теперь оружие и броню в кучи не складируешь, они занимают отдельный слот.

Боюсь эти задачи нерешеные и если с первым можно мириться (Ну, ударил, а нож разлетелся через несколько секунд), то вторая портит геймплей.
Впрочем, эта задача нерешаемая. И ее можно стерпеть, тем более этот способ позволяет использовать максимум 8 гвар...

Отправлено: 18:03 - 12 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

есть такая функция:
tile_contains_pid_obj (tile, elev, pid)

"Возвращает указатель на первый объект с идентификатором прототипа (pid) находящийся на заданном тайле и этаже."

вопрос:
1. существует ли возможность получить указатель не на первый, а на второй и далее объекты?
2. если не существует - тогда существует ли хотя бы возможность узнать - а есть ли в этом тайле еще другие объекты того же pid'а?

условие: верхний объект, естественно, нельзя передвигать, уничтожать и прочее, т.е. делать второй - первым (вследствие отсутствия бывшего первого) и обрабатывать его уже как первый.

Отправлено: 7:27 - 14 Июля, 2007
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Цитата:
Quote: from Akkella on 18:03 - 12 Июля, 2007
2 Серьезней.ю Теперь оружие и броню в кучи не складируешь, они занимают отдельный слот.




Вот об этом я тебе и говорил, когда говорил почитай темы. Эта проблема уже обсуждалась.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 23:03 - 14 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

"будь проклят тот день, когда я сел за баранку этого пылесоса!" (C)

проблема. прочитав где-то мимолетом про "stored_node", захотел ее поюзать. запоминалку оной ноды вешаю на timed_event. почему? потому что мне нравится, когда моргание экрана на черный и обратно не сопровождается дополнительным морганием диалогового окна. сам же разговор всегда завершаю обнулением этой переменной, на всякий случай, чтобы грязи не было (перед эндом critter_talk_proc'ы).
все хорошо, все прекрасно работает, если бы не одно "но": если я выхожу из разговора по "нулю" - то таймер_евент, вызванный в последней ноде, до которой дошел разговор, - не запускается.
startcritical-endcritical пробовал, поднять строчку add_timer_event в самый верх процедуры - тоже пробовал, ничего не получается!

прописывать эту сторед_ноде в самой процедуре вместо вызова таймер_евента - не хочу: все остальные моменты работают хорошо, а думать где у меня может мусор остаться в разговоре и в следующий раз он начнется не сначала - тоже не хочу. если, конечно, есть какие-то шансы это не хочу сохранить.

что за пакость такая с нулем?

Отправлено: 16:33 - 21 Июля, 2007
Ray
Модератор

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

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

Выход из диалога после нажатия кнопки 0 - это злой баг. Долго рассписывать не буду, но там видимо проблемы из-за того, что ранее запланированная фича для фолла была обрезана. При нажатии на ноль функция вылетает с ошибкой и из-за этого диалог закрывается. Для своего будущего (надеюсь) мода я эту пакость исправил. В двиге достаточно поменять один байт. На память не помню - посмотрю в записях, напишу.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 19:42 - 21 Июля, 2007
Akkella
Пользователь

Регистрация: Авг. 2006

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

Цитата:
Выход из диалога после нажатия кнопки 0 - это злой баг. Долго рассписывать не буду, но там видимо проблемы из-за того, что ранее запланированная фича для фолла была обрезана. При нажатии на ноль функция вылетает с ошибкой и из-за этого диалог закрывается. Для своего будущего (надеюсь) мода я эту пакость исправил. В двиге достаточно поменять один байт. На память не помню - посмотрю в записях, напишу.

Напиши плз.
Вообще в Исследования побольше информации о движке, наверняка много нарыл.
Делиться надо)

Отправлено: 21:05 - 21 Июля, 2007
Ray
Модератор

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

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

Выключение кнопки 0 в диалогах:

Offset: 0x36C48
Старое значение: 0x30
Новое значение: 0x31

P.S О результатах доложить

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 21:40 - 21 Июля, 2007
Akkella
Пользователь

Регистрация: Авг. 2006

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

Цитата:
Выключение кнопки 0 в диалогах:

Offset: 0x36C48
Старое значение: 0x30
Новое значение: 0x31

P.S О результатах доложить

Поставил себе. Проверил три диалога.
0 не работает

Отправлено: 22:31 - 21 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

что ж, пришлось переделать по другому. отключать ноль переправляя экзешник - не буду: я этот ноль сам регулярно использую, когда надо побыстрее послать надоедливого криттера не вдаваясь в подробности, на что он там обидится и т.п.
====================

возник гораздо более серьезный вопрос:

found -- это дохлый криттер, валяющийся в клетке, если у него непустое инвентори, найденный методом:
found:=metarule3((106),tile_num(xxxxx),elevation(dude_obj),0);

next -- это попытка получить указатель на следующего криттера валяющегося тут же.
next:=metarule3((106),tile_num(found),elevation(dude_obj),found);

после драки у меня некоторые криттеры раскиданы поодиночке, а в одном дверном проеме я специально положил целую пачку народу, чтобы проверить работу скрипта. очень долго не мог понять, какого фига происходит не то что я хочу. решил проверить:
display_msg("f: " + found + " n: " + next);
оказалось, что при любом раскладе f == n. ВСЕГДА! бред какой-то! там же черным по белому (белым по синему) прописано "Next_Critter"!!! Что происходит???

что делать - не понимаю. есть вариант уничтожать каждого отработанного криттера, но это очень некрасиво выглядит: идет партиец а вокруг него трупы пачками прямо на глазах исчезают, не уничтожать верхний трупешник - тогда нет возможности обратиться к следующему. Я был согласен уничтожать только одного - верхнего, если под ним кто-то еще валяется - это бы выглядело нормально - какая разница сколько именно трупов образуют кляксу на одном месте, одним больше - одним меньше, - никто и не заметит, но для этого надо, чтобы found и next - отличались! А у меня - равны!

Помогайте!!

Отправлено: 22:33 - 21 Июля, 2007 | ИСПРАВЛЕНО: JSilver - 22:40 - 21 Июля, 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Господа исследователи! Убедительная просьба не сваливать всё в одну кучу. Ray, пожалуйста, продублируй инфу о кнопке 0 в
теме по смещениям. JSilver, если ты серьёзно собрался заняться исследованием метарулей, создай отдельную тему в
соответствующем разделе.

Отправлено: 10:50 - 22 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

Цитата:
Quote: from Wasteland Ghost on 10:50 - 22 Июля, 2007
Господа исследователи! Убедительная просьба не сваливать всё в одну кучу. JSilver, если ты серьёзно собрался заняться исследованием метарулей, создай отдельную тему в
соответствующем разделе.

все бы ничего, но тому были две помехи:
1. новичок, не написавший и десяти сообщений, а уже возомнивший себя "исследователем" мне, мягко говоря, был бы очень странен.
2. особенно, если этот новичок запостит в "исследования" сообщение не типа "я нашел такую фичу, она круто работает, сообщаю остальным на радость", а, наоборот, "я хотел сделать то и то и у меня ничего не получилось".

но, раз так надо - я продублирую свой пост там. поскольку темы про метарули не нашел - начну новую.

Отправлено: 15:29 - 22 Июля, 2007
Akkella
Пользователь

Регистрация: Авг. 2006

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

Цитата:
Вот об этом я тебе и говорил, когда говорил почитай темы. Эта проблема уже обсуждалась.

Я весь форум читал...
Тут возникла проблема посерьезней...
Нужно удалять все оружие в игре и запихивать новое.
То, что уже есть на картах, без привязанного скрипта.
А то, что добавляешь, со скриптом...

Немного в тупике...

Отправлено: 17:55 - 22 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

Цитата:
Тут возникла проблема посерьезней...
Нужно удалять все оружие в игре и запихивать новое.
То, что уже есть на картах, без привязанного скрипта.
А то, что добавляешь, со скриптом...

Немного в тупике...


а нельзя вместо этого перекомпилить скрипт чузена, вставив туда проверку: "если чузен взял что-то в руки, и если это что-то = оружие, то если у этого чего-то скрипт не привязан, то этому чему-то скрипт привязать". в соответствии с его пидом, типом и другими твоими идеями. а то, что у него в стеке до сих пор валялось поскладированное штабелями - так штабелями и останется, не начиная занимать собственную единичную позицию. еще более правильно, хотя может и более сложно - это уж тебе решать - привязывать этот скрипт не в тот момент, когда чуз это в руки взял - может он просто два ствола сравнить хотел, у кого дамаж/дальность покруче, а в момент первого выстрела из этого ствола.

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

Отправлено: 19:31 - 22 Июля, 2007
Rosetau
Пользователь

Регистрация: Июль 2007

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

привет подскажите пожалуйста

скачал компиль скриптов. написал в блокноте код с фака - компилю - "ssl not found"
фаел есессно лежит в той же директории что и компиль

что делаю не так?

Отправлено: 19:49 - 27 Июля, 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Подкажите, как воспользоваться  tile_in_tile_rect({int tile1}, {int tile2}, {int tile3}, {int tile4}, {int tile}) правильно. Не происходит ожидаемого события, с  этим прямоугольником может там гексы задаются в определенном порядке?  

Код:
#define tile_1 (13694) // 13694
#define tile_2 (13690) // 13690
#define tile_3 (15490) // 15490
#define tile_4 (15494) // 15494

if fixed_param == event_timer_12 then begin
             rm_fixed_timer_event(self_obj, event_timer_12);      
           if (global_var(GVAR_DOOR_DWELLER_VAULT) <= 2) then begin      
      if (tile_in_tile_rect(tile_1, tile_2, tile_3, tile_4, tile_num(dude_obj)) == True) then begin  
      set_global_var(GVAR_DOOR_DWELLER_VAULT, 5);
      // Закрыть и Запереть дверь.                                              
      obj_close( self_obj );                                                                        
      obj_lock( self_obj );                                                                          
      // Анимация закрытия двери.                                                                    
      reg_anim_func(1, 1);                                                                          
      reg_anim_animate_reverse(self_obj, 0, 9);                                                      
      reg_anim_func(3, 0);                                                                                                                          
      end           else begin                                                                                    
                    add_timer_event(self_obj, game_ticks(5), event_timer_12);
                    end  
          end  
              end

Цитата:
что делать - не понимаю. есть вариант уничтожать каждого отработанного криттера, но это очень некрасиво выглядит: идет партиец а вокруг него трупы пачками прямо на глазах исчезают, не уничтожать верхний трупешник - тогда нет возможности обратиться к следующему. Я был согласен уничтожать только одного - верхнего, если под ним кто-то еще валяется - это бы выглядело нормально - какая разница сколько именно трупов образуют кляксу на одном месте, одним больше - одним меньше, - никто и не заметит, но для этого надо, чтобы found и next - отличались! А у меня - равны!


А просто перемешать труп на гекс два в сторону не судьба?

Отправлено: 0:31 - 28 Июля, 2007 | ИСПРАВЛЕНО: Dar - 0:35 - 28 Июля, 2007
Sokil
Пользователь

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

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

Цитата:
Подкажите, как воспользоваться  tile_in_tile_rect({int tile1}, {int tile2}, {int tile3}, {int tile4}, {int tile}) правильно. Не происходит ожидаемого события, с  этим прямоугольником может там гексы задаются в определенном порядке?  

Правильный порядок обхода важен. А так же нужно следить, чтобы зона была строго прямоугольной.
Вот мой работающий вариант:
#define dude_near_hatch_1                 (tile_in_tile_rect(9717, 9712, 10717, 10712, dude_tile))
Очередность обхода сам вычислишь.

Отправлено: 10:55 - 28 Июля, 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Спасибо, Sokil помогло
1,2 указываются "горизонтали" слева направо.
3,4 указываются  "горизонтали" слева направо.
Мой четвертый по периметру достаточно было поменять с третьим.

Отправлено: 13:24 - 28 Июля, 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Еще вопрос, наверно глупый, но таки спрошу,  можно ли "отсрочить" скриптово запуск финальной картиноки  смерти игрока, просто пишу critter_dmg(dude_obj, dmg, DMG_laser); но свой труп разрезаный на части не успеваю разглядеть. Хоть бы секунд пять выйграть?

Отправлено: 0:46 - 3 Авг., 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Если в скрипте критера написать

procedure map_enter_p_proc
begin
kill_critter(self_obj, ANIM_fall_back_sf);
end

То этот скрипт, не будет привязан к трупу так или нет?
Мне нужен оскриптованный труп, как его получить?  

Отправлено: 17:58 - 7 Авг., 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Попробуй ручками изменить вид анимации на картинку трупа.

PS Вообще-то после смерти скрипт всё ещё привязан к трупу, только не все обработчики вызываются.

Отправлено: 17:52 - 8 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Ну и последний вопрос как сделать так чтобы единицы здоровья больше 100 не повышались.

Я задавал этот вопрос в этой теме но никто не ответил как это сделать кому интересно нашел ответ

В скрипте dude

procedure critter_p_proc begin

  while (get_critter_stat(dude_obj,STAT_current_hp) > 100) do begin
   critter_heal(dude_obj, -1);
   end

end

Отправлено: 22:28 - 8 Авг., 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Wasteland Ghost

Спасибо , но увы это не то.
Я просто хотел "похороны" сделать, типа смотришь в бинокль несколько раз - скрипт считает и все. Но и возможно обыскать при этом. А оказалось и description_p_proc и push_p_proc и talk_p_proc не работают, ну последняя логично.  А с иллюзией трупа, его карманы не рассмотришь, иначе чем через скилл.
Ладно, обойдусь без "похорон" , - не принципиально.

Цитата:
Ну и последний вопрос как сделать так чтобы единицы здоровья больше 100 не повышались.


А при этом в характеристиках показывает 101/100, 102/100, 120/100 и когда будещь лечиться до полного в Пипбое, то потом будет считать назад и у тебя на глазах будут убывать жизни, что будет отображаться на панели  интерфейса.

ЗЫ: мне тоже хотелось выставить фиксированное чиcло НP по каждой расе.

Отправлено: 0:04 - 10 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

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

Эх а вот об этом я неподумал после полного выздоровления ждать пока жизнь упадет до 100
а если сделать экранчик вызывается когда используешь бинокль на dude и там сделать  вариант ответа отдохнуть до выздоровления когда нажимаешь повышается жизнь и увеличивается время
пример

если жизнь равна 1 то увеличеть ее на 99 и увеличить время на 5 дней и так до ста проверок


Отправлено: 11:12 - 10 Авг., 2007 | ИСПРАВЛЕНО: Jordan 63 - 11:20 - 10 Авг., 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

Jordan
Сделать можно, но действия двига ты этим не отменишь, начиная с того, что в пипбой заходить  не запретищь. А так можно весь пипбой по его  функциональности в оскриптованный итем загнать при желании. Хм, кроме автокарт - не велика потеря. Ну или допустим можно отключить чисто пипбой в двиге. А не пипбой на пару со сменой анимации. Но это врятли, хотя не знаю.
Еще в интерфейсном меню, (то которое в низу экрана в процессе игры у нас)  еще есть смена цвета жизней.

Но тогда в характеристиках все равно будет 140/100 150/100.
Если бы можно было исправить в двиге сразу на 100 максимум или в скриптах срабатывали изменения вторичных статов, но они вроде все не работают, работают только измения первичных статов типа: Сила Ловкость, Выносливость......

Хм,
If get_critter_stat(dude_obj, STAT_max_hp) >= 31 then
Begin
set_critter_stat(dude_obj, STAT_max_hp, 30);
end

Если STAT_max_hp считается вторичным то это не сработает, а скорее всего оно так и есть, ведь он зависит от силы и выносливости.
Если сработает, то покажет в характеристиках.

Отправлено: 15:48 - 10 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Dar

А так можно весь пипбой по его  функциональности в оскриптованный итем загнать при желании.

буду пробывать через say режим

Но тогда в характеристиках все равно будет 140/100 150/100.

Ну и ладно это же чисто визуально мне это впечатление не испортит

Если бы можно было исправить в двиге сразу на 100 максимум

Я думаю можно но я не двиглоковырятель

If get_critter_stat(dude_obj, STAT_max_hp) >= 31 then
Begin
set_critter_stat(dude_obj, STAT_max_hp, 30);
end

Я сначала тоже так пытался но не работает

Отправлено: 17:30 - 10 Авг., 2007
Dweller
Пользователь

Откуда: Е-бург
Регистрация: Июль 2007

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

Кто нибудь может мне, тупому человеку, обьяснить как работают случайные проверки на характеристики (броски кубика, как сказано в доке)? Единственное, что приходит в голову, что это random, возвращающий 4 значения, и как-то связаный с характеристиками. Отсюда и вопрос: как?

-----
Не нужна мне эта подпись

Отправлено: 21:51 - 10 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Хотел сделать если персонажа  ударяешь копьем то он отравлялся и терял жизни но не работает подскажите где ошибка

procedure combat_p_proc begin

if (fixed_param == COMBAT_SUBTYPE_HIT_SUCCEEDED) then begin



if (obj_pid(critter_inven_obj(source_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SPEAR)
or (obj_pid(critter_inven_obj(source_obj,INVEN_TYPE_LEFT_HAND)) == PID_SPEAR) then set_global_var(456, 1);


end

if (fixed_param == COMBAT_SUBTYPE_TURN) and (global_var(456) == 1) then critter_heal(self_obj, -5);


display_msg("Текущее здоровье " + (get_critter_stat(self_obj, STAT_current_hp)));

end

И еще один вопрос если pro файлы из fallout2 заменить на fallout1 то их нельзя редактировать а также сохранять игру потому что они отличаются есть ли такая программа которой можно открыть pro файлы fallout1 и сохранить что бы они работали в fallout2

Отправлено: 21:39 - 12 Авг., 2007 | ИСПРАВЛЕНО: Jordan 63 - 22:27 - 12 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Есть такие макросы
worldmap_xpos возвращает координату x текущего местоположения на карте мира
worldmap_ypos возвращает координату x текущего местоположения на карте мира

Как узнать координаты я склеил мировую карту и открыл в паинте там можно узнать
координаты. Мне нужно узнать на какой клетке находиться dude
то есть узнать координаты клетки но как их правильно записать нужно узнать координаты каждого угла клетки
такая конструкция нормальная

if ((worldmap_xpos >= 150) and (worldmap_ypos <= 50)
or  (worldmap_xpos >= 200) and (worldmap_ypos <= 50)
or  (worldmap_xpos >= 200) and (worldmap_ypos <= 100)
or  (worldmap_xpos >= 150) and (worldmap_ypos <= 100)) then call Node001;

и так

if (worldmap_xpos >= 150)
and (worldmap_ypos <= 50)
and (worldmap_xpos >= 200)
and (worldmap_ypos <= 50)
and (worldmap_xpos >= 200)
and (worldmap_ypos <= 100)
and (worldmap_xpos >= 150)
and (worldmap_ypos <= 100) then call Node001;

и даже так

if ((worldmap_xpos >= 150)
and (worldmap_xpos <= 200)
and (worldmap_ypos >= 50)
and (worldmap_ypos <= 50)
or ((worldmap_xpos >= 200)
and (worldmap_xpos <= 150)
and (worldmap_ypos >= 100)
and (worldmap_ypos <= 100))) then call Node001;



Если dude находиться на мировой карте в таких координатах то выполнить node001

Он выполняет node001 и в клетке и вне клетке а мне нужно чтобы он выполнял node001
Только в этой клетке кто знает помогите как правильно раствить >= , <=  and и or.

Отправлено: 20:25 - 14 Авг., 2007
Freeman
Пользователь

Регистрация: Февр. 2007

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

Я для Фаллаута скриптов никогда не писал, но могу предположить, что нужный код выглядит вот так:
if (worldmap_xpos >= 150)
and (worldmap_xpos <= 200)
and (worldmap_ypos >= 50)
and (worldmap_ypos <= 100) then call Node001;

Отправлено: 3:44 - 15 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Freeman

Работает!

Спасибо!



Отправлено: 9:35 - 15 Авг., 2007
Dweller
Пользователь

Откуда: Е-бург
Регистрация: Июль 2007

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

Вопрос об интерактивности критеров: как наилучшим образом отправлять критеров спать? Можно прописать каждому критеру sleep_point и сделать проверку, если время ночь, то иди в кровать и спи. Но это геморно, к тому же, если много критеров с одним скриптом, то они улягутся все в одну кровать Хе-хе так что можно сделать такую проверку: если ночь, то критер становится невидимым. Однако странно получается, днем город полон жизни, а ночью вымирает. Этому есть решение - сделать противоположный скрипт-если ночь, то критер появляется. И привязать его к критеру, валяющемуся на кровати. То есть днем виден один критер, а ночью совсем другой. И все проверки поместить в процедуру map_enter, a также в процедуру  critter_p_proc с дополнительной проверкой, если критер не виден на экране, то исчезай/появлялся. Правда это выглядит не очень - вот криттер около тебя, сдвинул чуть чуть экран в сторону, вернулся - а его уже нет.


(Добавление от 15:20 - 18 Авг., 2007.)


Вот еще: можно сделать так: если время ночь, то криттеры все сваливают за пределы карты, то есть получается, что они специально ждут чуза, пока он не посетит их город, а потом сваливают спать. Да и к тому же экспериментируя с animation_walk я понял, что если криттер стоит далеко от нужной точки, то двиг подумает, что добраться до туда нельзя. Следовательно есть риск, что криттер останется стоять всю ночь на своей дневной позиции. Трудоголик, е-мое... Ну так вот, какие еще способы есть уложить критера спать? И какими пользуетесь вы, товарищи модеры? Хочется выбрать наилучший.  

-----
Не нужна мне эта подпись

Отправлено: 15:05 - 18 Авг., 2007
Dweller
Пользователь

Откуда: Е-бург
Регистрация: Июль 2007

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

Блин! Идея со спящими критерами накрылась. Критеры не хотят укладываться на кровати. Залезают под них :-[ Прийдется всех укладывать на драные матрасы и на подстилки. А так хотелось, что бы они спали по-человечески!

-----
Не нужна мне эта подпись

Отправлено: 17:17 - 18 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Dweller

Блин! Идея со спящими критерами накрылась. Критеры не хотят укладываться на кровати. Залезают под них :-[ Прийдется всех укладывать на драные матрасы и на подстилки. А так хотелось, что бы они спали по-человечески!

Посмотри скрипт мис бишоп когда ее разводишь то она корректно лежит на кровати

Отправлено: 0:59 - 19 Авг., 2007
Dweller
Пользователь

Откуда: Е-бург
Регистрация: Июль 2007

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

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

-----
Не нужна мне эта подпись

Отправлено: 12:42 - 19 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Можно ли скриптово увеличивать и понижать цену в процентах пример

Если навык торговли меньше 100 тогда цена кожанной брони будет стоить на 10 процентов больше от стоимости этой вещи заданной в прототипе

if (has_skill(dude_obj, SKILL_BARTER) < 100) then item_caps_adjust(dude_obj, -proto_data(PID_LEATHER_ARMOR, it_cost));

В какой то теме читал что можно  export и import процедур если кто то знает поделитесь как это сделать

Отправлено: 22:37 - 19 Авг., 2007 | ИСПРАВЛЕНО: Jordan 63 - 23:30 - 19 Авг., 2007
Dweller
Пользователь

Откуда: Е-бург
Регистрация: Июль 2007

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

Вроде если вызывать бартер из скрипта, то есть возможность установить какой-то модификатор, вроде бы он может быть положительным или отрицательным, и выражается в процентах. Правда так изменяется цена всех предметов, а не одного.

-----
Не нужна мне эта подпись

Отправлено: 11:26 - 20 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Dweller

Цитата:
Вроде если вызывать бартер из скрипта, то есть возможность установить какой-то модификатор,


Это я знаю но я хочу сделать торговлю полностью через скрипты + say режим

Друг, когда же ты научишься правильно цитировать?
WG

Отправлено: 13:53 - 20 Авг., 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

раз уж речь зашла о ценах - вспомнился скрипт Ренеско и его "скидки", которые выводят все предметы в ноль баксов. Что я такое в этом скрипте проглядел? Карма, реакция, прочие модификаторы... где заковыка? Сделал другого криттера, прописал ему аналогичные вещи как и у Ренеско - не получается, в приказном порядке записал реакцию на дюда больше сотни, бартер модификатор ставил как у Ренеско в этой ноде и даже более высокий - все равно не получается! Очень маленькими цены сделать удается, а вот совсем нулевыми, как при "скидках" - ни в какую! Чем так уникален Ренеско, подскажите кто-нибудь?

Отправлено: 2:29 - 21 Авг., 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

2Jordan 63 Раз ты делаешь торговлю полностью через диалог, то и деньги ты с игрока снимаешь через диалог. И ничто тебе не мешает в этот момент изменять вычитаемую сумму как тебе угодно.

Отправлено: 9:55 - 21 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Wasteland Ghost
Цитата:

И ничто тебе не мешает в этот момент изменять вычитаемую сумму как тебе угодно.


Я просто хотел упростить реализацию. Конечно можно для каждого предмета определить цену а потом увеличивать или понижать ее но это муторно хотя реализуемо. А с процентами будет проще.

Отправлено: 10:46 - 21 Авг., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

To All
Кто нибудь знает какие global var в fallout2 движковые которые прошиты в движке типа GVAR_RUNNING_BURNING_GUY

И дополнительный вопрос как вычитать в процентах
item_caps_adjust(dude_obj, -5% от 350)
Если это возможно то как правильно записать

Отправлено: 13:58 - 10 Сент., 2007
Ray
Модератор

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

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

Цитата:
Кто нибудь знает какие global var в fallout2 движковые которые прошиты в движке


Точно и с уверенностью могу сказать:

За машину отвечают:
439
455
456
453
(эти видел лично)

Также ещё эти (лично не проверял, но в двиге видел):
491
18
7
494
47

И ещё все гвары репутации, а также ещё несколько, номера которых не указаны явно.

Цитата:
И дополнительный вопрос как вычитать в процентах
item_caps_adjust(dude_obj, -5% от 350)


item_caps_adjust(dude_obj, (350-(350/100*5)))



-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 17:40 - 10 Сент., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Ray

Цитата:
item_caps_adjust(dude_obj, (350-(350/100*5)))



Испытал на клинте в процедуру

procedure map_enter_p_proc begin

  item_caps_adjust(dude_obj, 350);
  item_caps_adjust(dude_obj, (350-(350/100*5)));


end

Получилось 685 монет

Пробывал так

  item_caps_adjust(dude_obj, 100);
  item_caps_adjust(dude_obj, (100-(100/100*5)));

То есть должно получиться 95 а получается 195 на 100 монет больше
Это моя ошибка или твоя

Если не сложно можешь составить весь список движковых гвар или посоветуй программу которой можно покавырять двиг на наличие global var


Отправлено: 20:01 - 10 Сент., 2007
Ray
Модератор

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

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

Цитата:
procedure map_enter_p_proc begin

 item_caps_adjust(dude_obj, 100);
 item_caps_adjust(dude_obj, (100-(100/100*5)));

end

То есть должно получиться 95 а получается 195 на 100 монет больше
Это моя ошибка или твоя



[Ray удивлённо смотрит в монитор]

Ты вообще понимаешь что делают те или иные функции? Ты добавил 100 монет, а потом добавил ещё 95. Как результат стало 195.

Цитата:

item_caps_adjust(dude_obj, 100);                          // + 100 монет
item_caps_adjust(dude_obj, (100-(100/100*5)));  // +  95 монет (100-5%)



Читать надо что пишешь... И вообще, не знать формулу процентов?


           Y
X =      --        * Z %
         100 %

Цитата:
Если не сложно можешь составить весь список движковых гвар или посоветуй программу которой можно покавырять двиг на наличие global var


1)Список составлять не буду - для этого надо перелопатить и перебрать весь двиг...
2)ДизАсм + REC

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 21:29 - 10 Сент., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Ray

Ошибся признаю


Цитата:
2)ДизАсм + REC


Где можно скачать REC? Искал в nigme так и ненашел.

Отправлено: 8:57 - 11 Сент., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Пробывал сделать чтобы клинт не стрелял из пулемета если растояние между dude и целью меньше 5 тайлов

procedure map_enter_p_proc begin
    party_add(self_obj);
end


procedure combat_p_proc begin

if (tile_distance_objs(dude_obj, target_obj) < 5) then begin
  inven_unwield(self_obj);
  rm_obj_from_inven(self_obj, obj_carrying_pid_obj(self_obj, PID_MINIGUN));
  end
end


Но клинт стреляет в цель хотя dude находиться рядом c целью а если сделать так

if (tile_distance_objs(dude_obj, target_obj) > 5) then begin
  inven_unwield(self_obj);
  rm_obj_from_inven(self_obj, obj_carrying_pid_obj(self_obj, PID_MINIGUN));
  end
end

Клинт убирает оружие хотя расстояние между ними меньше 5 тйлов
Где я допустил ошибку?


И еще обьясните что такое масивы зачем они нужны и приведите пример? И что такое парсер зачем он нужен и тоже приведите пример.

Отправлено: 21:33 - 22 Сент., 2007 | ИСПРАВЛЕНО: Jordan 63 - 14:44 - 23 Сент., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Кто нибудь может выложить наработки по устранению привязки номеров скриптов.
В .h файле или выложить пример скрипта.

Отправлено: 21:24 - 30 Окт., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Как сделать чтобы если при компиляции в скрипте ошибка то создавался файл а в нем было написано ИМЯ_СКРИПТА.ssl и на какой строчке ошибка

Вот мой батник

@echo off
@copy *.ssl *.c

@for %%f in (*.c) do cpp32 %%f >> cpp32.log

@for %%f in (*.i) do sslc %%f

@del *.c
@del *.i
rem @del cpp32.log

Отправлено: 20:33 - 19 Дек., 2007
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

@for %%f in (*.i) do sslc %%f  >> sslc.log

Отправлено: 11:22 - 20 Дек., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Anchorite

Я все сделал как ты написал вот батник

@echo off
@copy *.ssl *.c

@for %%f in (*.c) do cpp32 %%f >> compile.log

@for %%f in (*.i) do sslc %%f  >> sslc.log

@del *.c
@del *.i
rem @del compile.log


Он создает sslc.log и в нем такая запись

*** THERE WERE ERRORS (1 of them)

А я хотел чтобы он указывал имя скрипта(в котором ошибка) и на какой строчке ошибка как в коммандной строке

ARADESH.i(9557): Error! expecting ';'.







Отправлено: 12:25 - 20 Дек., 2007
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

Так попробуй

@for %%f in (*.i) do sslc %%f  >> sslc.log 2>&1

Отправлено: 10:30 - 21 Дек., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Anchorite

Спасибо все работает!

Отправлено: 11:41 - 21 Дек., 2007
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Если через скрипт карты скриптово создавать плитку пола т.е create_object_sid то он нормально не лежит т.е она создается между полом и крышей по середине.

Вот скриншот

http://jordan631.narod.ru/scr00000.JPG

Част скрипта artemple.ssl

procedure map_enter_p_proc begin

  if (map_first_run) then begin

      call Initial_Inven;
  end

  Lighting;

  override_map_start_hex(17488, 0, 5);
  set_global_var(GVAR_LOAD_MAP_INDEX,0);
 
  create_object_sid(67108866, 19097, elevation(dude_obj), -1);


end

Вот здесь исходники скриптов из мода Ф1 на движке Ф2

http://jordan631.narod.ru/Source.rar

Чтобы скомпилировать запустите ssl\Compile.bat

Откомпилированные скрипты появятся в папке scripts

У некоторых людей появляется ошибка "синтаксическая ошибка" при компиляции скриптов(у меня такая ошибка не возникает) вот вопрос почему такая ошибка возникает?

Отправлено: 10:53 - 4 Янв., 2008 | ИСПРАВЛЕНО: Jordan 63 - 11:27 - 4 Янв., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Если кому интересно здесь лежит скрипт клинта только теперь диалог у него сделан через say режим.

http://jordan631.narod.ru/say.rar

В папке Scripts лежит исходник и файл с макросами.

Установка распакуйте архив в каталог игры и начните разговор с клинтом.
Может это кому пригодиться.

Отправлено: 20:14 - 4 Янв., 2008
Tehnokrat
Модератор

Откуда: Новосибирск
Регистрация: Окт. 2003

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

Я тут столкнулся с неким багом. Похоже, в скриптах прикреплённых к карте, LVARs не работают. Слыхал кто-нибудь про такое?

-----
Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.

Отправлено: 23:57 - 9 Янв., 2008
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

Цитата:

Если через скрипт карты скриптово создавать плитку пола т.е create_object_sid то он нормально не лежит т.е она создается между полом и крышей по середине.



Она нормально лежит. Просто эта плитка является объектом, который находится БЛИЖЕ к тебе, чем остальные объекты и поэтому рисуется ПОЗЖЕ. Поэтому и возникает такой забавный эффект.

Отправлено: 9:33 - 10 Янв., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
Я тут столкнулся с неким багом. Похоже, в скриптах прикреплённых к карте, LVARs не работают. Слыхал кто-нибудь про такое?

Видела такое сама.

Отправлено: 13:36 - 10 Янв., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

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

Лежит здесь.
http://jordan631.narod.ru/data.rar

Установка распакуйте архив в папку игры

Пока в скрипте прописано 7 предметов но можно сколько угодно чтобы добавить или изменить предмет смотрите acklint.msg там все закоментировано в папке scripts лежат исходники скрипта.

Так же в файле acklint.msg необязательно писать по английски можно и по русски но нужно изменить
вот это PID_LEATHER_ARMOR
на это кожаная броня в двух местах так и с отстальными предметами

А теперь вопрос как сделать так чтобы скрипт считывал не так

# Название предмета
{100}{}{PID_LEATHER_ARMOR}
# Минимальное количество предметов
{101}{}{1}
# Максимальное количество предметов
{102}{}{2}
# Вероятность появления предмета в процентах
{103}{}{100}

Т.е с каждой строки

А вот так с одной строки

{100}{}{PID_LEATHER_ARMOR|1|2|100}

или  так

{100}{}{PID_LEATHER_ARMOR,1,2,100}


Отправлено: 14:12 - 14 Янв., 2008 | ИСПРАВЛЕНО: Jordan 63 - 18:50 - 15 Янв., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Обновил скрипт качать здесь

http://jordan631.narod.ru/data1.rar

Установка прежняя.

Отправлено: 21:57 - 15 Янв., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Как в процедуру atoi

procedure atoim(variable ostr, variable bstr) begin
   variable begin
       i;
       str;
       val;
   end
   str:=bstr;
   while (ostr!=str and ostr<=str+":" and ostr>=str+"0" do begin
       while not((ostr>str+i and ostr<str+(i+1)) or ostr==str+i) and i<9 do i+=1;
       str+=i; val:=val*10+i; i:=0;
   end
   return val;
end

#define atoi(x) atoim(x,""

Вставить проверку

(atoi(message_str(SCRIPT_GLOBAL_VARS, 100)));

если строчка 100 в скрипте с номером 567 пустая тогда
читать строчку 100 в скрипте с номером 345 если и это пустая тогда
читать строчку 100 в скрипте с номером 961

Отправлено: 12:09 - 4 Фев., 2008 | ИСПРАВЛЕНО: Jordan 63 - 12:11 - 4 Фев., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Это надо делать не в atoi, а с помощью atoi.

Отправлено: 17:15 - 4 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Wasteland Ghost

Цитата:
Это надо делать не в atoi, а с помощью atoi.


Как это можно сделать? Если не трудно покажи пример.

Отправлено: 2:48 - 5 Фев., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Я не знаю, что конкретно ты имел ввиду, говоря "пустая", поэтому...

if not(message_str(567, 100) == "Error" or message_str(567, 100) == "") then begin // если строка есть и она не пустая
   val := atoi(message_str(567, 100));
end
else if not(message_str(345, 100) == "Error" or message_str(345, 100) == "") then begin
   val := atoi(message_str(345, 100));
end
else if not(message_str(961, 100) == "Error" or message_str(961, 100) == "") then begin
   val := atoi(message_str(961, 100));
end

Примитивно, но должно работать. :)

Ray, больше так не делай.

Отправлено: 11:04 - 5 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Wasteland Ghost

А как в саму atoi вставить эту же проверку.

Пример я пишу

set_global_var(atoi(message_str(961, 100), 1);

И что бы atoi в самой процедуре сама смотрела все мсг на этой строке но не именно на 100 а любую какая будет

Я просто хотел  сделать так будет один мсг где прописаны гвары (самый главны) а также будут несколько пустых мсг где можно вписывать номера гвар т.е что бы не записывать их в главный файл а в другой и atoi должна посмотреть все мсг и если эти мсг на таких то строках пустые значит читать главный файл.

Отправлено: 11:22 - 5 Фев., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Нельзя такие сугубо конкретные вещи загонять в базовую процедуру! Это как минимум некрасиво, а как максимум чревато несовместимостью, узостью и глюкавостью. Лучше напиши свой макрос. Например

#define get_gvar_from_msg(x)
if not(message_str(567, x) == "Error" or message_str(567, x) == "") then begin \
   val := atoi(message_str(567, x)); \
end \
else if not(message_str(345, x) == "Error" or message_str(345, x) == "") then begin \
   val := atoi(message_str(345, x)); \
end \
else if not(message_str(961, x) == "Error" or message_str(961, x) == "") then begin \
   val := atoi(message_str(961, x)); \
end

Отправлено: 0:18 - 6 Фев., 2008
Ray
Модератор

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

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

Wasteland Ghost

За смайлики прошу прощения, а тэг code - издевательство над пользователями


-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 20:14 - 6 Фев., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Убрала тэг. Нет, определённо, люблю я свою Мозиллу-тормозиллу. Скольких оперно-иешных глюков не вижу...

Отправлено: 21:21 - 6 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Я тут сделал счетчик дней и он выводит
осталось 180 дней и каждый день уменьшается но вот проблема слово то дней не изменяется а хотелось бы
что бы например  остался 161 день или осталось 23 дня т.е нормально взависимости от дней выводил надпись. Как это можно сделать?

Переделал воровство так что теперь воровство происходит через диалог и мы можем задавать при каком скиле предмет будет виден любые условия. Пока черновая версия просто начните разговор с клинтом.
Можно доделать скрипт при каком условии сколько опыта получит что угодно пишите свои идеи.
В папке scripts есть исходники.

Установка распакуйте архив каталог игры

http://jordan631.narod.ru/Steal.rar

P.S. Следущая наработочка будет по изменению бартера оставайтесь на волне у меня еще несколько наработок в стадии доделки.

Файл в архиве 1.h с помощью программы f-Geck лучше не открывать смотрите в простом блокноте

Отправлено: 16:30 - 8 Фев., 2008 | ИСПРАВЛЕНО: Jordan 63 - 21:06 - 8 Фев., 2008
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Цитата:
нормально взависимости от дней выводил надпись. Как это можно сделать?

Например так. В скрипте:
Код:
 
variable word; // SVAR для верного слова
variable remn;       // SVAR для остатка

remn := global_var(GVAR_DayCounter) % 10;
if (remn > 4) then begin
   word : = 3;
end else begin
   if (remn > 1) then begin
        word := 2;
   end else begin
       if (remn == 1 and global_var(GVAR_DayCounter) != 11) then begin
           word := 1;
       end else begin
           word := 3;
       end
   end
end

display_msg(mstr(400+word) + global_var(GVAR_DayCounter) + mstr(410+word));



А в MSG:
Код:
 
{401}{}{Остался }
{402}{}{Осталось }
{403}{}{Осталось }

{411}{}{ день.}
{412}{}{ дня.}
{413}{}{ дней.}



-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 14:24 - 9 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

А можешь выложить полный скрипт! Или на мыло кинь! А то я его и так и эдак а он не компилится а найти ошибку никак не могу.

Отправлено: 16:43 - 12 Фев., 2008
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

"Всего" скрипта не существует. Я просто привёл алгоритмический пример. Проблема твоя, вероятнее всего, в том, что для нормальной работы макроса mstr нужно прописать define для данного скрипта в scripts.h и, соответственно, define в голове самого скрипта. Вот пример, который точно соберётся на "голом" sslc без препроцессора. Только одна процедура, которую ты уже сам должен вызвать их какой-либо функции скрипта.
Код:
// Вместо 666 пропишешь номер своей GVAR 
// Вместо 111 пропишешь номер своего MSG

procedure DispRemain
begin
   variable word; // SVAR для верного слова
   variable remn;       // SVAR для остатка


   remn := global_var(666) % 10;
   if (remn > 4) then begin
       word := 3;
   end else begin
       if (remn > 1) then begin
            word := 2;
       end else begin
           if (remn == 1 and global_var(666) != 11) then begin
               word := 1;
           end else begin
               word := 3;
           end
       end
   end

   display_msg(message_str(111, 400+word) + global_var(666) + message_str(111, 410+word));
end


P.S. А ещё в предыдущем примере в одном присвоении я опечатался, вставив лишний пробел между ':' и '='.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 19:08 - 13 Фев., 2008 | ИСПРАВЛЕНО: Alchemist - 19:11 - 13 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

Цитата:

P.S. А ещё в предыдущем примере в одном присвоении я опечатался, вставив лишний пробел между ':' и '='.


Вот из за этого он и некомпилился

Теперь все компилится надпись выводит но не совсем, когда первый раз смотришь бинокль он выводит eror а когда пропускаешь день все нормально.

Вот часть скрипта

procedure description_p_proc begin
 script_overrides;
 call Node001;
end

procedure Node001 begin
  variable word; // SVAR для верного слова
  variable remn;       // SVAR для остатка
  variable GVAR_DayCounter;
  GVAR_DayCounter := GVAR_DAYS_TO_VAULT13_DISCOVERY;

remn := global_var(GVAR_DayCounter) % 10;
if (remn > 4) then begin
   word := 3;
end else begin
   if (remn > 1) then begin
        word := 2;
   end else begin
       if (remn == 1 and global_var(GVAR_DayCounter) != 11) then begin
           word := 1;
       end else begin
           word := 3;
       end
   end
end

display_msg(mstr(400+word) + (global_var(GVAR_DAYS_TO_VAULT13_DISCOVERY) - GAME_TIME_IN_DAYS) + mstr(410+word));
end

Част мсг

{401}{}{Остался }
{402}{}{Осталось }
{403}{}{Осталось }

{411}{}{ день.}
{412}{}{ дня.}
{413}{}{ дней.}

vault13.gam

GVAR_DAYS_TO_VAULT13_DISCOVERY          :=180;  //      (1009)

А вот скриншоты

http://jordan631.narod.ru/scr00001.JPG
http://jordan631.narod.ru/scr00000.JPG

Отправлено: 15:58 - 15 Фев., 2008
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Во-первых, раз ты выводишь не просто содержимое переменной, а (global_var(GVAR_DAYS_TO_VAULT13_DISCOVERY) - GAME_TIME_IN_DAYS), то вместо того, чтобы присваивать локальной переменной номер GVAR, лучше бы совал туда сразу результат вычета. И дальше работал уже с ним. А то алгоритм у тебя поломанный получается.
На счёт Error сказать что-то сложно. Похоже, что по какой-то причине, сразу после инициализации игры mstr(410+word) удаётся извлечь строку из MSG, а mstr(400+word) -- нет. Очевидный глюк, но что может быть источником, умозрительно не подскажу. Можешь попробовать сначала сделать конкатенацию строки в три прихода в локальную переменную, а уже её содержимое выводить. А ещё проверь, нет ли у тебя часом в соответствующей MSG дубликатов строк с номерами на 400.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 15:43 - 16 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

Я сделаю так если гвара равна 180 то вывести строку осталось, а остальное пусть алгоритм делает.

Так получается можно не только выводить дней но и монет. А есть ли универсальный алгоритм как атои прописываешь строку и число а он уже сам все делает.

А возможно ли через мсг вызвать процедуру?

Отправлено: 16:59 - 16 Фев., 2008
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

Цитата:
Я сделаю так если гвара равна 180 то вывести строку осталось, а остальное пусть алгоритм делает.

Как временное решение пойдёт, но, если собираешься в будущем мод релизить в публичный доступ, лучше разобраться в причинах. Слишком уж экзотично смотрится, чтобы быть скриптонезависимым багом.

Цитата:
А есть ли универсальный алгоритм как атои прописываешь строку и число а он уже сам все делает.

В смысле, чтобы автоматически склонение определялось? Да ну, брось, у тебя не так много строк будет, чтобы делать эвристику подобного уровня. Тем более, на SSL. Приведённый выше алгоритм достаточно универсален. Передаёшь ему число, а на выходе получаешь индекс в массиве строк. А уж какой номер строки брать за базу -- выбираешь в зависимости от объекта.

Цитата:
А возможно ли через мсг вызвать процедуру?

Косвенный вызов по имени процедуры стандартом языка поддержан. А будешь ты грузить эту строку из MSG или вводить прямо в скрипт -- твоё дело. Хотя, конечно, хранить в MSG вещи, от которых зависит стабильность  системы, не стоило бы. Но технически это вполне возможно.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 18:56 - 16 Фев., 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Alchemist

Цитата:
Как временное решение пойдёт, но, если собираешься в будущем мод релизить в публичный доступ, лучше разобраться в причинах. Слишком уж экзотично смотрится, чтобы быть скриптонезависимым багом.


Буду разбираться в чем дело.

Цитата:
Косвенный вызов по имени процедуры стандартом языка поддержан. А будешь ты грузить эту строку из MSG или вводить прямо в скрипт -- твоё дело. Хотя, конечно, хранить в MSG вещи, от которых зависит стабильность  системы, не стоило бы. Но технически это вполне возможно.


Покажи пример как это сделать.

Отправлено: 19:14 - 16 Фев., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
Похоже, что по какой-то причине, сразу после инициализации игры mstr(410+word) удаётся извлечь строку из MSG, а mstr(400+word)  -- нет. Очевидный глюк, но что может быть источником, умозрительно не подскажу.

Был у меня такой глюк на больших мсг. Точнее, на мсг с большими номерами строк. Странный глюк. Отписывалась где-то на форуме, кажется, в исследованиях. Можно поискать. Решение так и не найдено. Ну и кроме того может быть элементарная бага где-то при инициализации word.
Цитата:
Покажи пример как это сделать.

variable stored_node;
...
stored_node := node001;
...
call stored_node;

Отправлено: 23:36 - 17 Фев., 2008
Ray
Модератор

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

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

Может всё-таки:

call stored_node;

?

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 19:56 - 20 Фев., 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

2Ray Спасибо, исправила.

Отправлено: 20:27 - 21 Фев., 2008
Alchemist
Модератор

Откуда: Арзамас-17
Регистрация: Дек. 2004

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

2Wasteland Ghost:
Цитата:
Был у меня такой глюк на больших мсг.

Я помню. Но в данном случае никто не мешает проверить, тот ли глюк или же -- нет, банально загрузив строки числительных из отдельной маленькой MSG.

-----
/// What'ya be sain'? Vault 100+? We need nothing o'that!

Отправлено: 5:46 - 23 Фев., 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Как мне откомпилировать сразу все скрипты?

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 3:29 - 16 Марта, 2008
Alan Killenger
Пользователь

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

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

Пакетным файлом.

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

Отправлено: 8:42 - 16 Марта, 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

А поподробней?

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 18:17 - 16 Марта, 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Посмотри батники (*.bat) в исходниках скриптов Ф2 от БИС.

Отправлено: 19:45 - 16 Марта, 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Да смотрел вроде... Там один только call :-) на компайлер там вообще нигде ссылки нет... Что мне нужно в батнике написать, чтобы все скрипты один за другим через препроцессор с компайлером пропустить?

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 13:28 - 17 Марта, 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

А ты все батники посмотри. Включая те, что в папках городов и тот, что в папке компилера.
Цитата:
Что мне нужно в батнике написать, чтобы все скрипты один за другим через препроцессор с компайлером пропустить?

Ровно то самое, что написано в батниках БИС.

Отправлено: 10:16 - 18 Марта, 2008
Alan Killenger
Пользователь

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

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

Пример. Открытие в текстовом редакторе всех текстовых файлов в каталоге.
Цитата:
set my_dir=c:\temp
set my_editor=c:\program files\blablabla.exe
for %%i in ("%my_dir%\*.txt") do (
 call "%my_editor%" %%i
)

За деталями обращайся в встроенный виндовый хэлп.

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

Отправлено: 17:46 - 18 Марта, 2008 | ИСПРАВЛЕНО: Alan Killenger - 18:56 - 18 Марта, 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Компилирую все скрипты (версия 1.02д). В папке со скриптами ТОЛЬКО оригинальные скрипты, и ТОЛЬКО оригинальные Хедеры. Но тем не менее несколько скриптов отказываются компилироваться, ссылаясь на разные ошибки типа андефайнед симбол. В чем проблема? Разве оригинал не должен компилироваться нормально?
Скрипты:
DENBUS1.SSL
Error! Undefined symbol CAR_DENBUS1_HEX
DENBUS2.SSL
Error! Undefined symbol CAR_DENBUS2_HEX
GENERIC.SSL
Error! Undefined symbol LVAR_Herebefore
GENFFLD.SSL
Error! Mismatched parenthesis.
NEWR1.SSL
Error! Undefined symbol CAR_NEW_RENO1_HEX
NEWR2.SSL
Error! Undefined symbol CAR_NEW_RENO2_HEX
NEWR3.SSL
Error! Undefined symbol CAR_NEW_RENO3_HEX
NEWR4.SSL
Error! Undefined symbol CAR_NEW_RENO4_HEX
PEASANT.SSL
Error! Undefined symbol TEAM_
RAIDERS1.SSL
Error! Undefined symbol CAR_RAIDERS_CAMP_ELEV_SECRET
SPRTRP0.SSL
Error! Mismatched parenthesis.
TALK.SSL
Error! Undefined symbol TEAM_
WAYPNT.SSL
Error! Undefined symbol self_tile

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 14:44 - 29 Марта, 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Это ставил? БИСы исходники по сусекам соскребали, там всё что угодно может быть.

Отправлено: 16:33 - 29 Марта, 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Цитата:
Quote: from binyan on 14:44 - 29 Марта, 2008
Компилирую все скрипты (версия 1.02д).

Ставил. Значит и там недочеты есть.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 18:59 - 29 Марта, 2008
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

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

Повидимому проблема в том, что в оригинальных сырцах (файл F2_scripts.rar) заголовки лежат в папочке headerS, а в патченных (файл F2_scripts_102d) - в папочке header.
Попробуй перенести содержимое папки header в headers, а header удали за ненадобностью.

Отправлено: 20:07 - 29 Марта, 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Хех, ну яж не новичок в моддинге. Пробовал. И все заголовки в Хедерс, и все заголовки в Хедер, и обе папки пробовал оставлять - результат один. Вышеуказанные скрипты не компилятся из-за вышеуказанных ошибок.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 22:07 - 29 Марта, 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Цитата:

DENBUS1.SSL
Error! Undefined symbol CAR_DENBUS1_HEX
DENBUS2.SSL
Error! Undefined symbol CAR_DENBUS2_HEX
GENERIC.SSL
Error! Undefined symbol LVAR_Herebefore
GENFFLD.SSL
Error! Mismatched parenthesis.
NEWR1.SSL
Error! Undefined symbol CAR_NEW_RENO1_HEX
NEWR2.SSL
Error! Undefined symbol CAR_NEW_RENO2_HEX
NEWR3.SSL
Error! Undefined symbol CAR_NEW_RENO3_HEX
NEWR4.SSL
Error! Undefined symbol CAR_NEW_RENO4_HEX
PEASANT.SSL
Error! Undefined symbol TEAM_
RAIDERS1.SSL
Error! Undefined symbol CAR_RAIDERS_CAMP_ELEV_SECRET
SPRTRP0.SSL
Error! Mismatched parenthesis.
TALK.SSL
Error! Undefined symbol TEAM_
WAYPNT.SSL
Error! Undefined symbol self_tile



Это все в исходниках есть в файле UPDATMAP.H

#define CAR_NEW_RENO1_HEX                   (25321)
#define CAR_NEW_RENO2_HEX                   (9509)
#define CAR_NEW_RENO3_HEX                   (30894)
#define CAR_NEW_RENO4_HEX                   (16068)

Error! Undefined symbol LVAR_Herebefore - это в самом скрипте

Выложи этот твой архив посмотрю, конечно если это не секрет.

Отправлено: 23:18 - 29 Марта, 2008
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

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

Почему же секрет... Вот он мой архив:
http://www.teamx.ru/files/srcs/F2_scripts.rar + http://www.teamx.ru/files/srcs/F2_scripts_102d.rar


-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 0:59 - 30 Марта, 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

У меня эти же скрипты и я так же ставил обновление 1.02 и все компилится.

Это я на скрипты бис поставил скрипты 1.02 и добавил компилятор и препрцессор для удобства, просто копируй скрипты в папку scripts и жми compile.

http://jordan631.narod.ru/f2ssl.7z

Потом сделаю батник что бы компилить, сразу все скрипты.

Отправлено: 12:16 - 30 Марта, 2008
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
Потом сделаю батник что бы компилить, сразу все скрипты.

А чем buildall.bat не угодил?

Отправлено: 12:22 - 30 Марта, 2008
Jordan 63
Пользователь

Откуда: Россия, Самара
Регистрация: Июль 2007

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

Wasteland Ghost


Цитата:
А чем buildall.bat не угодил?


Да я в нем не разобрался. Мне проще самому сделать.


(Добавление от 13:42 - 30 Марта, 2008.)


Обновил архив в нем были ошибки не все файлы компилировались можно скопировать скрипты в папку Compile и нажать Compile.bat, скомпилить все скрипты надо запустить Compile_All.bat. Если будут ошибки пиши.


(Добавление от 13:43 - 30 Марта, 2008.)


Качать по старой ссылке!

Отправлено: 12:28 - 30 Марта, 2008
 

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


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