Показать сообщение отдельно
Старый 25.09.2007, 03:43   #1797
HikeR

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: М: Скриптинг в Готике

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

Если сам ничиго не хочешь придумать, ставь retuern FALSE.
я не хочу ничего придумывать. есть желание довести скрипты до состояния безошибочной компиляции текущим инструментарием :)
так как ответа на вопрос, "что возвращает func int имя_функции() {}; я не нашел, то решил просто проверить.
в Menu.DAT есть ф-ия показа титров (ну или авторов)
[pre]func int showcredits()
{PlayVideo("credits.bik");
return 1; };[/pre]
я ее немного видоизменил:
Cпойлер(щелкните, чтобы прочесть):
[pre]func int test()
{
* * *if (1 == 0) {return 10;}; //заведомо ложно
};

func int showcredits()
{
* * *if (test () == -1) {PlayVideo("logo1.bik");};
* * *if (test () == 0) {PlayVideo("logo2.bik");};
* * *if (test () == 1) {PlayVideo("extro.bik");}; * * *
* * *if (test () == 2) {PlayVideo("intro.bik");}; * * *
* * *return 1;
};[/pre]

компилятор на это дело поругался, но откомпилировать дал. предполагая, что в случае отсутствия явного указания значения возврата игровой движок вставляет что-то вроде return TRUE или return FALSE, то есть возвращает либо 0 либо 1, я рассчитывал по запущенному ролику определить, какая проверка сработала.
запустил, и еще больше запутался. проигрались ролики logo2.bik и extro.bik, то есть сработали ДВЕ проверки.
получается, что нечто, возвращаемое ф-ий test() не равно -1 и 2, но одновременно равно и нулю и еденице. ну и как это понимать?

Добавление от 09/25/07, в 03:51:07
вроде немного въехал. если предварительно заюзать переменную, то страбатывает только условие проверки на ноль, то есть в нижеприведенном скрипте покажется только ролик intro.bik:
Cпойлер(щелкните, чтобы прочесть):
[pre]var int i;
i = test();
if ( i == -1) {PlayVideo("logo1.bik");};
if ( i == 1) {PlayVideo("logo2.bik");};
if ( i == 2) {PlayVideo("extro.bik");}; * * *
if ( i == 0) {PlayVideo("intro.bik");}; * * *
return 1;[/pre]

а если сделать так:
Cпойлер(щелкните, чтобы прочесть):
[pre] * * *if ( test() == 0) {PlayVideo("logo1.bik");};
* * *if ( test() == 1) {PlayVideo("logo2.bik");};
* * *if ( test() == 1) {PlayVideo("extro.bik");};
* * *if ( test() == 0) {PlayVideo("intro.bik");};[/pre]

то есть при каждой проверке вызывать ф-ию, то проиграются первые три ролика, а четвертый - нет.

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

Добавление от 09/25/07, в 04:03:50
дополнение:
если вызовы происходят в пределах одной ф-ии, то ситуация описана выше. а если из разных ф-ий - то все повторяется, сначала ноль, потом еденица.
вобщем, остановился на том, что везде вставляю return 0, к чему это приведет - видимо узнаю не сразу ;)
Ответить с цитированием