• Уважаемый посетитель!!!
    Если Вы уже являетесь зарегистрированным участником проекта "миХей.ру - дискусcионный клуб",
    пожалуйста, восстановите свой пароль самостоятельно, либо свяжитесь с администратором через Телеграм.

Изготовление симс объектов на конкретном примере (с использованием IffPencil)

  • Автор темы Автор темы Gilder
  • Дата начала Дата начала
Если в Manage Inventory все последних четыре байта взять равными нулю, то будет браться GUID стекового объекта. В игре я это не проверял.

"{flags = 0, 0, 0, 0}" -- это то, что не удалось расшифровать, но (возможно) как-то влияет на действие примитива. Если есть время и желание, с этим можно экспериментировать.

2) Все величины лучше всего считать неопределенными. Но, возможно, какие-то из них инициализируются нулем. Еще одно поле для экспериментов. ;)

3) Атрибуты -- некоторые величины в которых можно хранить состояние объекта. В общем все, что не вкладывается в стандартный набор. Для примера можно окрыть какой-нибудь ExpansionPack, начиная с третьего, найти в нем файл с расширением stx, и открыть его IFF Pencil'ом. Если в нем есть строковый ресурс с номером 256, то в нем хранятся имена атрибутов.
 
Stack&Atribute

1)Спасибо Shy.
Появились некоторые вопросы:
Если в Manage Inventory все последних четыре байта взять равными нулю, то будет браться GUID стекового объекта.
2)Стековый объект, это что?
Атрибуты -- некоторые величины в которых можно хранить состояние объекта. В общем все, что не вкладывается в стандартный набор.
3)Атрибуты – Это некоторый тип данных, или они самонастраиваются в зависимости от того, что в них складируют. Я видел фрагмент строчки Assign To Obj’s Atribute 3 (или что то в этом роде), значит ли это, что каждый объект обладает набором различных нумерованных атрибутов, отражающих его различные свойства? В этом случае вероятно (существует или) может быть составлена таблица |Атрибут - Свойство| для различных предметов? Не мог бы кто-нибудь вывесить (или кинуть ссылку) хотя бы несколько примеров использования атрибутов и их значений? Номера атрибутов свои для каждлго объекта, или это что-то вроде глобальных нумерованных констант. К сожалению я сейчас не могу добраться до Expansion Pack –ов, посему возможно задаю совершенно дурацкий вопрос.
4)Хотелось бы разобраться в терминологии, уже который раз вижу слово «примитив». Примитив – это что?
Спасибо.
 
2) Стековые объекты используются, когда один объект (как правило, сим) что-то делает с другим объектом. В этом случае my обычно относится к симу, а stack object - к объекту, который "мучают", на что можно полюбоваться, например, в бхавах от стульев/кресел и т.д.
А еще стековые объекты используются, когда надо многоклеточный объект обработать - в стек запихивают ID текущей клетки, работают, потом переходят (Set To Next (part of a multi-tile object)) к следующей клетке...
"Запихивание" делает команда Stack Object's ID Assign To <чего-нибудь>.

3) Атрибуты - это, по-моему, всегда числа, если говорить о типе... Это некоторая характеристика, которую ты хочешь присвоить объекту. Для каждого объекта атрибуты свои. Единственное общее правило, которое мне пока попадалось на глаза - в Attrubute 0 многоклеточные предметы обычно пишут номер клетки (начиная с 0), но есть ли в этом необходимость - никогда не интересовалась :-/
При переходе из функции в функцию атрибуты не меняются, сохраняются/загружаются вместе с игрой - в общем, очень полезная в хозяйстве вещь ;)

4) Ну, если я не ошибаюсь... Открой в IffPencil-е любой объект, открой любой бхав, выдели строчку, и нажми на троеточие рядом с номером функции (надеюсь, ты это раньше делал?)
Откроется окошко со списком функций в комбобоксе... Вот примитивы - это те функции, у которых нет приставки "(glob: )", "(semi: )" или "(priv: )" - они обычно в самом начале списка.
 
Последнее редактирование модератором:
Банкомат

Ну вот. Закончил (или почти закончил) делать «банкомат».
Странный предмет получился: Внешность – от Jukebox-а, только, перекрашенного в синий цвет, имя IIF-а - от шкафа (Bookcase#######). А по сути этот объект всего лишь разменивает деньги сима на монеты, и обратно. Единственная недоделка – это постоянный курс обмена, а хотелось бы, чтобы он менялся ежедневно. Допустим, колебания курса можно сделать генератором случайных чисел (Вроде бы есть такой???) Но надо, чтобы он срабатывал раз в сутки, а как это сделать я не знаю? Кроме того внешний вид (Jukebox – это как-то несерьезно), возможно кто-нибудь возьмется его слегка переделать, а то неряшливо и неинтересно. Я что-то устал, работая над «содержанием», так что на «форму» уже сил нет.
Кроме того, курс - еще недоделан. Не хотелось бы пока вывешивать в «Ваши работы», ведь скачают недоделку и пользоваться начнут раньше времени, а если уж делать, то делать хорошо. Почти все «внутренности» я подчистил, однако возможно что-то ненужное осталось (тоже было бы неплохо, если бы кто-нибудь просмотрел опытным глазом). В общем, если у кого-то возникнет желание помочь, напишите, пожалуйста.
Заранее благодарен.
 
Gilder, чтобы менялся раз в сутки - поставь в main что-то такого содержания:
(glob: ) Idle hours (параметры: 24 0 0 0, лень пересчитывать в HEX)
My Attribute N:=random ...... ну и так далее

Шогал добавил [date]1076100225[/date]:
Jasana, необходимость для того чтобы долго не расковыривать в свойствах объекта его индекс - а так раз - и он уже в нулевом аттрибуте ;)
 
Я тут пофантазировала, как такой обменный агрегат выглядеть может. Вот что получилось. Может пригодится?

excangebox.jpg
 
Банкомат

1)Спасибо Шогал.
2) Спасибо fendy. Здорово! Не могла бы ты скинуть мне эту «шкурку»(gilder@front.ru)? Если хочешь, я могу поделиться IIF-ом «банкомата» (пока со стационарным курсом, надеюсь доделать его до среды.), чтобы может анимацию слегка подправить, или еще чего переделать? Да и вообще, возможно у него глюки возникают в ситуациях, которые я не предусмотрел.
Все-таки себе, как тестеру я не очень доверяю, может кто-нибудь согласится помочь в отлове глюков (ну не верю я, что их больше нету, а пожаловаться не на что).
3)Есть примитивы. Большинство из них – реакция на пункт меню или вызов из другого примитива. Но есть еще примитивы инициализации, и некий main. Если я правильно понял, примитивы инициализации вызываются, когда сим так или иначе взаимодействует с предметом (в самом начале этого взаимодействия далее управление перадается вызываемым примитивам). Не мог бы кто-нибудь разъяснить ситуацию с main-ом и примитивами инициализации (например, есть ли какие-то стандартные имена, по которым игра определит, что перед ней примитив инициализации, а не вызываемый примитив).
Спасибо.
 
Gilder
Хм, main и init - это не примитивы.

...Каждая функция (или ресурс типа BHAV) это набор инструкций. Каждая инструкция это вызов или примитива или другой функции. Как я уже говорил, инструкция кодируется 12-ю байтами. Два байта задают номер примитива или функции. Еще два байта — номера переходов для Истины или Лжи. Восемь байтов — параметры. Теперь подробнее. Если в первых двух байтах стоит номер от 0 до 255, то это примитив. Если номер от 4096 до 8191, то функция приватная, (priv: ), искать ее нужно в том же файле. Если номер от 256 до 4095 — это глобальная функция. IFF Pencil 2 пишет перед ее именем (glob: ). Глобальные функции размещены в файле global.iff из global.far. Если номер от 8192 и старше, то функция полуглобальная, (semi: ), искать ее нужно в файле, который задан в ресурсе GLOB. Например, для файла Sofas.iff таким файлом будет SofaGlobals.iff...

...Начнем с main, он самый простой, и его номер (4096) общий для всех. В скрипте main задается поведение самого шкафа, чем он “занимается”, когда с ним не взаимодействуют симы...

...Перейдем теперь к init-ам. Эта функция вызывается в двух случаях: когда предмет появляется в игре при покупке (еще до того, как он будет поставлен на участок, сразу же после выбора его мышкой в каталоге) и после ошибок во время функционирования самого предмета (в случае шкафа эти ошибки могут быть только в функциях init, main и load и в функциях, которые они вызывают; при ошибках в других функциях должен выполняться reset для симов, но он, почему-то не выполняется, но это уже тонкости). Поэтому очень важно, чтобы init ошибок не содержал, иначе можно легко повесить игру...

("Некоторая документация по Iff Pencil 2 и скриптам" by Shy)
 
Последнее редактирование:
Спасибо

Спасибо Дюкаша кое что начинает проясняться.
Видимо я неправильно задал вопрос. Сейчас переварю свежеполученную информацию и попробую еще раз.
 
Неприятная непонятка.

1) Имеется следующая ситуация: в «банкомате»изменен main объекта и добавлен BHAV для вывода случайного числа.
В (этом горемычном) банкомате я изменил main следующим образом:

|0| (glob:) idle (20 4e 00 00 00 00 00 00) |1|6|
|1| (glob:) idle hours (02 00 00 00 00 00 00 00) |2|6|
|2| Temporary Storage 4:=random from 0 to < 10 |3|6|
|3| Local Variable 0 Assign To: Temporary Storage 4 |4|6|
|4| Dialog (message: id#5, icon: automatic) {Title: id#3} |5|6|
|5| (glob:) idle (20 4e 00 00 00 00 00 00) |0|6|
|6| Dialog (message: id#0, icon: automatic) |True|True|

В оригинале main выглядел вот так:
|0| (glob:) idle (20 4e 00 00 00 00 00 00) |0|Error|
В 4 - ой строке сообщение содержащее Local Variable 0
В 5-ой сообщение об ошибке.
Раз в сутки исправно появляется Сообщение с очередной циферкой (как и полагается, разной), сообщения об ошибке не возникает.
BHAV для вывода случайного числа, следующий:

|0| Go To Relative Position (In front of, Facing) {byte = 00, flags = 0, 0} |1|6|
|1| (glob:) Standard entry |2|6|
|2|Local Variable 0 Assign To: Temporary Storage 4 |3|6|
|3|Animate Sim (id 4 from object) {return event in Parameters 0} {flags = 0, 0}|4|6|
|4|Stack Object's flags Clear Flag in use |5|6|
|5|Dialog (message: id#5, icon: automatic) {Title: id#3} |True|6|
|6| Dialog (message: id#0, icon: automatic) |True|True|

Здесь тоже не выводится сообщение об ошибке(строчка |6|), и тоже выводится сообщение с цифрой(строчка|5|), только здесь эта цифра всегда 0 .
Создается впечатление, что Temporary Storage из main не передается во второй BHAV.
Что тут может быть не правильно???
2)В посте Шогала используется My Atribute N вместо Temporary Storage, но я не понимаю разницы, если в данном случае она существенна, объясните пожалуйста.
3)Набор Temporary Storage – свой для каждого объекта? (Допустим в игре сим использует 2 объекта: душ и холодильник, каждый из которых в процессе функционирования записывает какие-то значения в Temporary Storage 4). Насколько я понимаю в таком случае есть как минимум 2 Temporary Storage 4 (один для душа, другой для холодильника). И холлодильник ен может не запихныть ничего в Temporary Storage 4 душа??? Или я не прав?
 
Gilder
1) Temporary Storage не передаются от одного скрипта к другому. То есть, скрипт "Main" выполняет у тебя объект, а скрипт "Exchange money" (или как он у тебя называется) выполняет сим. Значения Temporary Storage в этих двух скриптах никак не взаимосвязаны.
2) В этом и есть большая разница. Temporary Storage относится к одному процессу запуска скрипта. А My Attribute относится к объекту, и для всех процессов аттрибуты общие. Один нюанс: если в main ты используешь My Attribute, то во заимодействии ты должен использовать Stack Object Attribute, так как main выполняется "от первого лица" (My), а взаимодействие - "от третьего" (Stack Object).
3) Набор Temporary Storage свой не только для каждого объекта, но и для каждого процесса. Объясню-ка я лучше не по симовски, а по понятному: допустим ты открываешь Word - там у тебя документ. Этот документ, скажем, и есть Temporary Storage. Ты открываешь второе окно ворда, и в нем открываешь тот же документ. Но документ ты можешь спокойно отредактировать в первом окне, также можешь отредактировать по-другому во втором окне. Как видишь, копии документа в обоих окнах будут разные, несмотря на то что это Temporary Storage с одним и тем же номером. Так же для скриптов симс, только вместо документов там просто числа.
А аттрибуты по-другому - они общие для объекта. Жизненный пример - возьмем обыкновенную бумагу, и напишем на ней слово. Кто бы не посмотрел на эту бумагу - все время будет написано именно это слово, пока мы его не зачеркнем и на месте не напишем новое.

Шогал добавил [date]1076233325[/date]:
Небольшое примечание к первому пункту:
Temporary Storage может передаваться от одного скрипта к другому, но только если этот второй скрипт запускается из первого как (priv: ). Причем он не остается Temporary Storage, а переименовуется в Parameter (с тем же номером). А как только функция заканчивается и мы возвращаемся в главный модуль - Temporary Storage снова становится таким, каким был при вызове функции.
 
Новая порция вопросов

То есть правильно ли я понял, что :
1)Local Variable, сушествует только внутри скрипта в котором она записана?
2)Temporary Storage N можно перислать в (priv)-функцию, где она превратится в Parameter N?
3)Atribute, сохраняется при выходе из скрипта, до тех пор, пока его не перезапишут?
Если в этих утверждениях есть ошибки или неточности, пожалуйста напишите (впрочем если нет, тоже).
4)Спасибо Шогал. Единственное, что:
поставь в main что-то такого содержания:
(glob: ) Idle hours (параметры: 24 0 0 0)
My Attribute N:=random ...... ну и так далее
если сделать так, то My Atribute N будет обновлятся каждые 24 часа с момента (первого обращения сима???) (или покупки??? ) предмета, а хотелось бы, чтобы он всегда обновлялся например в полночь. Как такое можно сделать?
Спасибо.
 
Курс

Обмен валюты.
Я создал BHAV, для пересчета денег в соответствии с курсом.
Он вызывается из функции обмена с параметром (число монет для обмена).
Как сделать, чтобы он возвращал в функцию обмена уже пересчитанную величину?
(т.е. как заставить вызванную функцию возвращать результат?)
Напишите, пожалуйста, какой-нибудь пример (так оно доступней).
 
Еще раз о Temporary Storage

1)Взывая (priv: )-функцию, можно ли часть параметров указать в явном виде, а часть переслать через Temporary Storage (у меня сложилось впечатление, что нет, т.е. можно либо указать все параметры в явном виде, либо использовать Temporary Storage для пересылки параметров, и если (priv: )-функция имеет вид (priv: )Function Name (00 00 00 00 00 00 00 00), то игра игнорирует параметры пересылаемые в (priv: )-функцию через Temporary Storage, однако значения перисланые из (priv : )-функции по ее окончании прочитать из Temporary Storage- можно ). Верно ли это? Если нет, то не могли бы вы показать соответствующий пример?
2)Кроме того, Вынужден подвергнуть сомнению следующие слова Шогала:
Temporary Storage может передаваться от одного скрипта к другому, но только если этот второй скрипт запускается из первого как (priv: ). Причем он не остается Temporary Storage, а переименовуется в Parameter (с тем же номером).
Temporary Storage не передаются от одного скрипта к другому.
Как мне кажется это не так. Temprary Storage передаются между скриптами. Temporary Storage одного и того же объекта передается не только в (priv: )-функцию, а если передается в нее, то не обязательно превратится в Parameter. Если при вызове (priv: )-функции она задана без параметров (точнее все ее параметры проставлены «–1»), (т.е. в виде (priv: )Function Name) , то в качестве параметра N, записывается Temporary Storage N. Эти выводу сделаны на основе моих наблюдений, и не в коем случае не ддолжны рассматриваться, как хорошо проверенный факт. Если это интересно могу опубликовать три коротеньких функции на которых ставился опыт.
Приношу свои извинения, если данные рассуждения неправильны. В этом случае напишите пожалуйста в чем состоит моя ошибка или неточность. Если же гипотеза окажется верной, пожалуйста, подтвердите ее.
 
Temporary Storage одного и того же объекта передается не только в (priv: )-функцию
Вроде бы оно в любую функцию передается, почему же обязательно в priv? Насчет примитивов только не уверена...
И вызов функции действительно должен быть без параметров, вернее, с параметрами -1. Именно значения -1 дают коду знать, что параметры переданы не в этих 8 байтах, а в определенных перед функцией Temp Storage-ах.
 
Re: Еще раз о Temporary Storage

Кажется, я слегка не так сказал,
Temporary Storage не передаются от одного скрипта к другому.
- это я имел ввиду если OWNER'ы этих процессов разные (не знаю как это по симски объяснить, но на примере из обычной жизни - если сравнивать с Windows XP, там есть такая команда "Запуститиь от имени..."). То есть, main запускается от имени объекта, а interaction - от имени сима - вот между этими двумя процессами никогда не будут передаваться никакие переменные (кроме аттрибутов). Если два различных сима запустили одно и то же взаимодействие в двух различных экземплярах - то между ними тоже никогда не передадутся переменные (Temporary Storage тоже туда относится). А в скрипте который запустил сим (или объект) - Temporary Storage будет ходить по всем функциям, запускаемым ЭТИМ процессом, и уничтожится после того как сим завершит процесс. А тип функции не имеет значение - что приват, что глобал что полуглобал.

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

1)Спасибо Шогал .
2) Как должен выглядеть BHAV (обновляющий курс обмена) генерирующий случайное число от 0 до 10 раз в сутки (в 9 часов утра), при этом хочется сделать так, чтобы сим не мог воспользоваться банкоматом, сразу же после покупки, а вынужден был бы дождаться, 9 утра (но только один раз, в день покупки, а затем никаких ограничений по использованию банкомата быть не должно). Если кто-нибудь знает как такое сделать, напишите пожалуйста (лучше в виде скрипта). Я честно пытался сделать это самостоятельно, но ничего приличного не вышло.
3) Расскажите пожалуйста, что такое (glob: ) idle, что она делает, какие величины возвращает, какие параметры ей можно задать?
4)Расскажите пожалуйста, что такое (glob: ) hours idle, что она делает, какие величины возвращает, какие параметры ей можно задать?
Заранее благодарен.
 
Gilder,
Чтобы запретить симу пользоваться неготовым банкоматом нужно сделать в Check Tree (в TTAb) ссылку на следующий BHAV:

Stack Object Attribute (аттрибут с текущим курсом) Equals? 0 | False | True |

2)
0. (glob: ) Idle Minutes (01 00 ...(дальше все нули)) [1|Error]
1. Global (...) Minute Equals? 0 [2|0]
2. (glob: ) Idle Hours (01 00 ...) [3|Error]
3. Global (...) Hour Equals? 9 [4|2]
4. My Attribute X := Random Number (... диапазон ...) [5|Error]
5. My Attribute X += (выравнивание, чтобы курс был не от нуля как обычно при random number а от определенного числа) [2|Error]

Там где у меня написано Global (...) - в качестве (...) имеется ввиду from simulation. X обозначает номер того аттрибута где находится курс.

3) (glob: ) idle приостанавливает выполнение скрипта на определенное время (по часам Симс). Первый параметр - это время ожидания, остальные роли не играют. К сожалению я не помню чему равна одна единица времени, но это можно вычислить.

4) (glob: ) Idle Hours (или в некоторых версиях behavior.iff -hours idle) приостанавливает выполнение скрипта на заданное количество симских часов. Действует точно также как просто idle, но задается в другой единице измерения (в часах). (например, (glob: ) idle hours (24|0|0|0) (в десятичной) будет ждать одни сутки, затем продолжит выполнение скрипта). Похожая функция - idle minutes (она задается в минутах).

Функции idle ничего не возвращают.
 
Спасибо

Спасибо Шогал. Сейчас попробую.
Чтобы запретить симу пользоваться неготовым банкоматом нужно .... Stack Object Attribute (аттрибут с текущим курсом) Equals? 0 | False | True |
.
А что все Атрибуты объекта до его первого использования по умолчанию равны 0 ???
 
Глюк в розыске

1)Шогал снова спасибо, все получилось.
2)Я столкнулся с глюком, который никак не могу отловить. Он состоит в том, что сим не всегда может поменять монеты обратно на деньги. То есть это действие начинается, но прерывается на полпути. Возможно кто-нибудь может мне помочь. Я вывесил IIF объекта, Вот здесь (это самораспаковывающийся (.exe) RAR архив) (публиковать код в форуме довольно неудобно, поскольку BHAV- ов много и все они связаны, тем более, что хоть сколько нибудь локализовать глюк мне не удалось).
3)Я где-то тут видел (то ли пост, то ли тему) о том как можно уменьшить размер объекта, киньте, пожалуйста, ссылку (а то они у меня довольно тяжелые получаются).
Заранее блогадарен.
 
Назад
Сверху