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

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

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

MaGoth

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

Вложения

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

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Строка в функции может попасть на ту же самую область памяти, что и при предыдущем вызове. И в ней может оказаться старая информация.
Это наверное рассказ про стек..

Вообще-то, всегда надо полагать, что в новой переменной содержится случайная информация, и из элементарных гигиенических соображений, новые переменные надо инициализировать.
Переменная инициализируется вверху функции.
Некоторые языки программирования инициализируют переменные и в соответствии с типом сами задают им начальные значения типа:
int = 0,
string = "",
boolean = false
и т.д.
Но скрипты готики не предназначены для программирования, они служат лишь начинкой проекта или самой главной движемой частью проекта, с уже заранее заготовленными функциями.
Тем более разработчики делали его не под кого-то, а чисто под своих людей, отсюда и отсутствие циклов, статичность некоторых важным мест и т.д. недостатки(для модостроителей).

И ещё.. Я хотел узнать причину такой неудачной организации работы скриптовых функций, а не то, как решить проблему. Я как бы уже написал, что достаточно сбросить значение после объявления переменной, чтобы всё работало нормально. Было предположение: толи это Соурсер не правильно работает, толи сам движёк не доделан как надо.

А номер два - использование конкатенации там, где достаточно обычного присвоения.
Да нет же! Я написал в качестве примера. Вы чё как инспекторы контроля кода - придираетесь ко всяким мелочам?*???* Где надо, я сам поправлю... Я мог ещё несколькими способами написать вывод информации о переменной, например, просто прописать в начале функции вывод значения переменной text через тот же самый принт, а ниже присвоить значение и вызвать 2 раза и т.д.*flowers*

выгружаться должна по определению. это закон программирования, так как переменная объявлена локально внутри функции.
Это более-менее нормальный ответ, который о чём-то говорит.
Скажу даже больше, то, что на этом методе основана работа с функциями и стеком.
Покопавшись в сети удалось найти кое-какую информацию...

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

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

Далее..
При каждом вызове функции для размещения локальных переменных, программа выделяет пространство в стеке. При завершении функции пространство стека, содержащее значения этих переменных, освобождается. Какое бы количество локальных переменных ни объявлялось в функции, программа сохраняет в стеке значение каждой из них.

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

ВЫВОД - программа не выгружает из стека значения локальных переменных, которые использовались в функции. Как-то так.

George_M, у тебя не хватает корневых классов и некоторых переменных, а мб и констант, на которых основана работа всех тех функций. Ищи всё это там, где и нашёл код...
Они мб скоро научатся писать вредоносный код через скрипты готики?:)
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Это наверное рассказ про стек..

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


Переменная инициализируется вверху функции.
Некоторые языки программирования инициализируют переменные и в соответствии с типом сами задают им начальные значения типа:
int = 0,
string = "",
boolean = false
и т.д.
Но скрипты готики не предназначены для программирования, они служат лишь начинкой проекта или самой главной движемой частью проекта, с уже заранее заготовленными функциями.
Тем более разработчики делали его не под кого-то, а чисто под своих людей, отсюда и отсутствие циклов, статичность некоторых важным мест и т.д. недостатки(для модостроителей).

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

И ещё.. Я хотел узнать причину такой неудачной организации работы скриптовых функций, а не то, как решить проблему. Я как бы уже написал, что достаточно сбросить значение после объявления переменной, чтобы всё работало нормально. Было предположение: толи это Соурсер не правильно работает, толи сам движёк не доделан как надо.

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

Да нет же! Я написал в качестве примера. Вы чё как инспекторы контроля кода - придираетесь ко всяким мелочам?*???* Где надо, я сам поправлю... Я мог ещё несколькими способами написать вывод информации о переменной, например, просто прописать в начале функции вывод значения переменной text через тот же самый принт, а ниже присвоить значение и вызвать 2 раза и т.д.*flowers*

Ну, выбрали Вы самый неудачный и противоестественный способ из существующих. А насчет "инспекторов кода" отвечаю: "нет, я не инспектор кода". Поэтому далее читать просто не буду.

Дабы "код не инспектировать".
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Вы хотите обсудить общефилософский вопрос? Вопрос о начальной инициализации сродни вопросу о первичности материи и духа. И единого мнения нет.
Опять куда-то не туда...
Я ожидал каких-то предположений, опыта, наблюдений, а в ответ....

Ну, выбрали Вы самый неудачный и противоестественный способ из существующих. А насчет "инспекторов кода" отвечаю: "нет, я не инспектор кода". Поэтому далее читать просто не буду.
Давайте не будем спорить кто круче напишет код и кто умнее всех тут...
Вопрос был по переменной, а не по передаче параметров в неё и красоте написания кода.

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

Volwis

Участник форума
Регистрация
21 Дек 2010
Сообщения
50
Благодарности
0
Баллы
155
У меня проблемка с переносом визуализации лица с Готики 1 в Готкику 2 НВ.
http://mod.worldofgothic.ru/scripting/face-from-g2-to-g2
С самого начала нужно:
1) Зайти в скрипт Кор Галома посмотреть на строчку визуалиции, для этого заходим в _work\data\Scripts\_decompiled\Story\NPC и открываем файл GUR_1201_CorKalom.d
Но у меня нет папки _decompiled, как её найти?
 

clumb

Участник форума
Регистрация
21 Июн 2010
Сообщения
302
Благодарности
13
Баллы
180
Volwis,
У тебя МДК установлен?
 

Volwis

Участник форума
Регистрация
21 Дек 2010
Сообщения
50
Благодарности
0
Баллы
155
да. установлен
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
George_M, у тебя не хватает корневых классов и некоторых переменных, а мб и констант, на которых основана работа всех тех функций. Ищи всё это там, где и нашёл код...
Они мб скоро научатся писать вредоносный код через скрипты готики?:)
У меня хватает всего, по причине наличия полного пакета - если бы чего-то не хватало, я бы его нашел, прежде чем вопрос задавать. Я привел полностью кусок кода (нет только величин пары констант).
Смыс вопроса сводится к следующему: на что оказывают влияние и какое значение возвращают пустые функции, ничего не возвращающие?!
Например - пустой класс и пустая функция, но используются активно. Замеч? И как это можно обойти? Понятно что все строится на специфике работы со стеками - это из названия функций понятно, но вот на каких?
Код:
class MEMINT_HelperClass {};

func MEMINT_HelperClass MEMINT_StackPopInstSub () {};
 

Вариматас

Забанен
Регистрация
11 Апр 2011
Сообщения
175
Благодарности
1
Баллы
165
У меня хватает всего, по причине наличия полного пакета - если бы чего-то не хватало, я бы его нашел, прежде чем вопрос задавать. Я привел полностью кусок кода (нет только величин пары констант).
Смыс вопроса сводится к следующему: на что оказывают влияние и какое значение возвращают пустые функции, ничего не возвращающие?!
Например - пустой класс и пустая функция, но используются активно. Замеч? И как это можно обойти? Понятно что все строится на специфике работы со стеками - это из названия функций понятно, но вот на каких?
Код:
class MEMINT_HelperClass {};
 
func MEMINT_HelperClass MEMINT_StackPopInstSub () {};
Зачем парится, и взрывать себе мозг инжектингом двига из скрипта??
Если динамическое изменение цен я сам делал, причем без вских "Извращенских функций" достаточно было просто изменить const float TRADE_VALUE_MULTIPLIER
на переменную var float TRADE_VALUE_MULTIPLIER
и все! Хотя по идеи такая реализация работать не должна.. но все же работает, даже если менять const string TRADE_CURRENCY_INSTANCE на переменную все нормлаьно работает, так зачем парить мозг с икарусом????

ЗЫ Спейсером ты не соберешь икарус, только игрой=) по крайней мере так написанно в его описании=)
Да и зачем тебе этот икарус? Есть ведь г2екст, на нем есть две отличные функции EraseSecuredMem и PatchSecuredMem через них можно реализовать гораздо больше чем через икарус=)

Bump: И по функции func MEMINT_HelperClass MEMINT_StackPopInstSub () {}; то по идеи ее можно смело менять на int а не на MEMINT_HelperClass, хотя фик их знает...
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Опять куда-то не туда...
Я ожидал каких-то предположений, опыта, наблюдений, а в ответ....

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


Давайте не будем спорить кто круче напишет код и кто умнее всех тут...
Вопрос был по переменной, а не по передаче параметров в неё и красоте написания кода.

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

Вы приводите фрагмент кода. Поэтому Вам следовало быть готовым к здоровой конструктивной критике. Реализация у Вас была кривая, на что я и указал. Ошибка проистекает и из-за нее. Про инициализацию я написал. И стек тут совершенно не при чем. Выделяется память. В ней находится случайная информация. Поэтому ее надо инициализировать. Это называется аккуратное программирование, культура производства, хороший стиль и т. п.

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

Если Вы хотите пофантазировать о том, как следовало бы следать транслятор, так и пишите. Но это обсуждение будет ни чем иным, как переливанием из пустого в порожнее. Хотя. может быть, кому-нибудь именно это будет интересно.
 

Volwis

Участник форума
Регистрация
21 Дек 2010
Сообщения
50
Благодарности
0
Баллы
155
clumb
А есть декомпилированые скрипты на Готику 1?
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Вариматас, да двигу наплевать константу ты ему пихнешь, переменную или даже функцию - проверял я это. Но, позволю тебе напомнить, я заморачиваюсь под ПЕРВУЮ Готику, а у нее функция торговли целиком вшита в двиг.
И заменять на int MEMINT_HelperClass не лучший выход - исходя из ее использования, int и instance специально разделены. И даже если рискнуть заменить для проверки, то вопрос все равно остается открытым: что возвращает пустая функция?
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.049
Благодарности
1.168
Баллы
340
Следовал точно инструкции http://mod.worldofgothic.ru/scripting/face-from-g2-to-g2
но нечего не происходит. Подскажите почему?

Конечно подскажем...только вызовем из отпуска штатных телепатов, чтобы они вместо Вас описали в деталях, что и как Вы делали.
В будущем, если хотите получить ответ на вопрос, постарайтесь максимально детально описывать производимые действия и возникшую проблему, иначе ответа будете ждать очень долго...
А так я могу лишь предположить, что Вы не компилировали измененный скрипт и игра просто подгружает стандартные скрипты из Gothic.dat и OU.bin.
 

Volwis

Участник форума
Регистрация
21 Дек 2010
Сообщения
50
Благодарности
0
Баллы
155
hell9999,
Я думаю вы правы, и прошу подскажите как компилировать файлы и куда?
P.S. Простите пожалуйста за дурацкие вопросы, просто я новичок в этом.
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.049
Благодарности
1.168
Баллы
340
hell9999,
Я думаю вы правы, и прошу подскажите как компилировать файлы и куда?
P.S. Простите пожалуйста за дурацкие вопросы, просто я новичок в этом.

Думаю, что неплохо бы проштудировать всю секцию сайта модостроения по теме скриптов, дабы такие вопросы не возникали.
Касаемо компиляции скриптов - вот Вам тема, читайте.
http://mod.worldofgothic.ru/programs/gothic-sourcer
 

Volwis

Участник форума
Регистрация
21 Дек 2010
Сообщения
50
Благодарности
0
Баллы
155
У меня проблемы с текстурами лиц персонажей. Я загружаю эту текстуру:

d3e5934d3fd0.jpg


а в результате накладывается эта:

5c05deb2ac56.jpg


в чем может быть проблема?
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Проверь:

1. правильно ли именуешь текстуру
2. идет ли нумерация текстур подряд
3. положил ли текстуру в сборку.

Двиг не видит текстуру и подставляет текстуру зомби.
 

FagyT

Участник форума
Регистрация
2 Июл 2011
Сообщения
21
Благодарности
0
Баллы
150
Скажите пож где находятся все скрипты в папке с игрой персонажей там типа PC_HERO , PAL_... и тд.
Как мне изменить вид ГГ на Альберхта одного из паладинов что стоит в ратуше в хоринесе где находится Лорд Хаген
 
Сверху Снизу