• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 560
Последнее редактирование модератором:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Достаточно знать таблицы истинности для И, ИЛИ, НЕ.
Имхо, достаточно иметь возможность расшаренных айваров вместо всей это сцаной ереси.. иначе вся эта кухня будет не лучше чем пользование Уг троллейбусом..
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
546
Баллы
245
Имхо, достаточно иметь возможность расшаренных айваров вместо всей это сцаной ереси.. иначе вся эта кухня будет не лучше чем пользование Уг троллейбусом..
Обычное использование флаговых битов. Много букав, так как объяснение человек попросил. А так простейшее использование.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
Немножко двоичной арифметики, и все готово.
Спасибо! Отличное разъяснение! Немного допилить, и получится готовый урок для соответствующего раздела. :)

Думаю, я понял. Но чтобы убедиться, вот пример из скриптов:
Код:
const int BS_FLAG_INTERRUPTABLE = 1 << 15;
const int BS_FLAG_FREEHANDS = 1 << 16;
...
const int BS_MAX = 31;

func int C_BodyStateContains(var C_Npc slf,var int bodystate)
{
   if((Npc_GetBodyState(slf) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS)) == (bodystate & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS)))
   {
     return TRUE;
   }
   else
   {
   };
   return FALSE;
};

Здесь сравниваются значения двух старших и пяти младших битов. Значения остальных битов игнорируются. Так?

Именно по этому это и есть сцаная ересь которую никто в здравом уме пользовать не будет..
Ну, разрабы же используют. Почему бы и скриптерам-моддерам это не записать в свой инструментарий. Особенно, если учесть, что многие аиварины используются в однобитовом режиме (TRUE/FALSE). ;)


ГЫ, люди, которых принято считать нормальными, сейчас отдыхают после встречи Нового Года. Походу, я не совсем ненормальный. Но взглянул на список посетителей и понял, что я не один такой. :rolleyes:
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Ну, разрабы же используют. Почему бы и скриптерам-моддерам это не записать в свой инструментарий. Особенно, если учесть, что многие аиварины используются в однобитовом режиме (TRUE/FALSE). ;)
Да я не против, просто народ даже в простых скриптах разобраться не могет, а когда математика начинается, это фсе туши свет, уже сейчас предвижу: "спасите", "памагите", "враги скрипты накрыли матаном"... :D

ГЫ, люди, которых принято считать нормальными, сейчас отдыхают после встречи Нового Года. Походу, я не совсем ненормальный. Но взглянул на список посетителей и понял, что я не один такой. :rolleyes:
Все "нормальные люди" сейчас "дрыхнуть", строго мордой лица вниз, в оливье.. *lol*
Остались ток особенные или шибко стойкие.. *yes!**dance2*
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
546
Баллы
245
Здесь сравниваются значения двух старших и пяти младших битов. Значения остальных битов игнорируются. Так?
Здесь сначала идут вычисления логические побитовые
(Npc_GetBodyState(slf) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS))
и
(bodystate & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS)

Рассмотрим первый вариант
const int BS_MAX = 31; //11111
const int BS_FLAG_INTERRUPTABLE = 32768; //1000000000000000 (1<<15)
const int BS_FLAG_FREEHANDS = 65536; //10000000000000000 (1<<16)
Итак, после этого вычисления
BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS
получим это
11000000000011111
Затем по операции & сравниваем флаги с Npc_GetBodyState(slf). После этого ни один флаг не испорчен. Проверяются только флаги установленный в маске в 1.
Смысл проверки в этом выражении
(Npc_GetBodyState(slf) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS))
такой: если в состоянии нпс включен (установлен в 1) хотя бы один из битов 0,1,2,3,4,15,16, то результат будет TRUE. Далее по аналогии.

Ты сказал, о двух старших битах, но в инте 32 бита от 0 до 31, а 15-ый и 16-ый биты находятся в середине.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
Да я не против, просто народ даже в простых скриптах разобраться не могет, а когда математика начинается, это фсе туши свет, уже сейчас предвижу: "спасите", "памагите", "враги скрипты накрыли матаном"... :D
думать сложно?)
1432883191_124104117 — копия.jpg
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
546
Баллы
245
Буду благодарен за разъяснения.
Забыл еще одно. Бывает нужно инвертировать бит. Чтобы не делать конструкции if-else можно воспользоваться замечательной операцией "исключающее ИЛИ". Но такой нет в дедале. Ее легко выразить базовыми функциями.
Сделаем функцию для удобства
func int xor(var int a, var int b)
{
return (~a & b) | (a & ~b);
};
Вызываем ее
xor(state, killerFlag);
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
думать сложно?)
Конечно, зачем все это уг для конечного юзера, если есть нормальный айвар ?! :p
Ведь не зря говоря что на словах он лев толстой, а на деле ... простой.. Когда до дела доходит. И это касается всех..:D
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
на святое покушаешься *at-ta-ta*
ващет побитовые поля нормальная практика не только в скриптах, но и в программировании в целом, когда выделенная ячейка памяти выжимает из себя весь свой потенциал. те же флаги в г2 работают по аналогичному принципу. одна переменная int 4 байта может спокойно хранить в себе целый набор значений и это намного лучше, чем какой-нибудь булиан массив интов или еще что-то подобное.
Безымянный.png
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
546
Баллы
245
Конечно, зачем все это уг для конечного юзера, если есть нормальный айвар ?! :p
Вопрос был в другом. Вот в этом:
к сожалению, пока не въехал, как правильно работать с битовыми операциями из скриптов, как изменить значение определённого бита в переменной, и как прочитать его. Буду благодарен за разъяснения.
А где и как использовать это вопрос другой
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
Это тебе понятно, Элдеру и прочим немногим.. но новичкам этого не объяснить.. *pointing*
ну так мы то тут при чем? :) если они не в состоянии освоить пару элементарных правил по работе с битами, то и нефиг лезть тогда в них. вот и все :p
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
ну так мы то тут при чем? :) если они не в состоянии освоить пару элементарных правил по работе с битами, то и нефиг лезть тогда в них. вот и все :p
Дык не причем.. Но вот наверное именно по этому модинг на ТЕС всегда выигрывает у моддинга на Готу, ибо его в ней, всегда вот такой хренью и не только, разворачивают к юзеру ЖОПОЙ, а не лицом..
Не в пример того-же КСета. Ибо там делают для людей... *pointing*
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
А где и как использовать это вопрос другой
Да, как-то, бывало, ловил себя на мысли, что нужно ввести набор однотипных переменных, и начинает душить жаба, поскольку вместо каждой переменной достаточно было бы 1 бита. А теперь, открыл для себя способ, как можно в небольшое количество переменных засунуть кучу информации.

но новичкам этого не объяснить... Им большой кнопка "Айвар" подавай...
Когда-то, я робко начинал делать правки в инстанциях диалогов. И тогда, встречая aivar[ХХХХХХХХХХХХХХХ], говорил себе: "А это что за хрень? Нее, это пока сложно для меня." Так что, если моддер дорос до использования аиваров, то он уже не новичок. А если не новичок, то и дальнейшие шаги вполне может осилить. При желании. :)
 

BOPOH32

Участник форума
Регистрация
7 Июл 2014
Сообщения
246
Благодарности
56
Баллы
200
подскажите как с этим бороться? постоянно выскакивает эта ошибка при компилляции! хотя я только меню алхимии и ковки для себя делаю
 

Вложения

  • Безымянный3.png
    Безымянный3.png
    188,4 KB · Просмотры: 285

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
давай по порядку. ты проект этот где взял?
 

BOPOH32

Участник форума
Регистрация
7 Июл 2014
Сообщения
246
Благодарности
56
Баллы
200
исходники Трагеза от В2 0065
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
ExternalsFunc.d тразага взял? в настройках компиляцию AST выставил?
 

BOPOH32

Участник форума
Регистрация
7 Июл 2014
Сообщения
246
Благодарности
56
Баллы
200
естественно
 
Сверху Снизу