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

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

Не стесняюсь спросить....

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.341
Благодарности
3.187
Баллы
525
В Готике 1 не знаю, может подтвердить или опровергнуть ElderGamer
Разрабы в оригинале пытались использовать подобную хрень. Но она также работает, только до загрузки сохранения.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.292
Благодарности
6.277
Баллы
1.595
N1kX, а зачем у тебя такое странное условие?
if((Npc_KnowsInfo(other, DIA_Kardif_GDZIE_JEST_TROKAR)) && (gdzie_jest_trokar == TRUE))
Сделай так:
if(gdzie_jest_trokar == TRUE)
Просто как сказали предыдущие ораторы:
permanent = TRUE;
Тут есть глюк.
Ну а ту тебя и без Npc_KnowsInfo это сработает
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
Ради интереса провёл тест на диалоге с Диего:
Daedalus:
instance Info_Diego_Brief(C_Info)
{
    npc = PC_Thief;
    nr = 10;
    condition = Info_Diego_Brief_Condition;
    information = Info_Diego_Brief_Info;
    permanent = 1; // устанавливаем повторяемость для теста
    description = "У меня есть письмо Верховному Магу Круга Огня.";
};


func int Info_Diego_Brief_Condition()
{
    if (Kapitel < 2)
    {
        return TRUE;
    };
};


func void test_info()
{
    var int result;
    var int permanent_old;
    
    // запоминаем старое значение "повторяемости"
    permanent_old = Info_Diego_Brief.permanent;
    
    // обнуляем для обхода защиты движка (в этом вся суть!)
    // такая процедура нужна для всех "постоянных диалогов"
    Info_Diego_Brief.permanent = 0;
    
    // был ли прослушан диалог "Info_Diego_Brief" до конца (1 - да, 0 - нет)
    result = Npc_KnowsInfo(hero, Info_Diego_Brief);
    
    // восстанавливаем старое значение
    Info_Diego_Brief.permanent = permanent_old;
    
    // выводим результат функции "Npc_KnowsInfo()" на экран
    Print(IntToString(result));
};


func void Info_Diego_Brief_Info()
{
    AI_Output (hero, self, "Info_Diego_Brief_15_00");    //У меня есть письмо Верховному Магу Круга Огня.
    AI_Output (self, hero, "Info_Diego_Brief_11_01");    //Правда...?
    AI_Output (hero, self, "Info_Diego_Brief_15_02");    //Его отдал мне какой-то маг, перед тем как стражники сбросили меня со скалы.
    AI_Output (self, hero, "Info_Diego_Brief_11_03");    //Тебе повезло, что больше я не могу показываться на глаза магам. Любой другой с радостью перерезал бы тебе глотку за это письмо.
    AI_Output (self, hero, "Info_Diego_Brief_11_04");    //Маги хорошо платят своим гонцам, а большинство людей здесь не имеет за душой и гроша.
    AI_Output (self, hero, "Info_Diego_Brief_11_05");    //На твоем месте я бы держал рот на замке до тех пор, пока не встретил бы кого-нибудь из магов. Правда, тебе на это не стоит надеяться.
    AI_Output (hero, self, "Info_Diego_Brief_15_06");    //Почему?
    AI_Output (self, hero, "Info_Diego_Brief_11_07");    //Маги живут в Старом Лагере, но только людям Гомеза дозволено входить в их замок.
    
    // new
    test_info();
};

На первом вызове функция напечатает "0", потому что AI очередь длится дольше вызова функции test_info(). А уже на втором и последующих и далее на save/load, функция выводит "1", как положено.
Но как видно, обработчик выглядит объёмно, проще действительно воспользоваться переменной, либо приготовить что-то на кухне Юниона.
 

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
Меня давно интересует вот что: я часто исследовал скрипты разных модов, да и оригинальной игры тоже, декомпилировав их через сурсер, а потом они отказывались компилироваться обратно - находилось множество ошибок, предупреждений и прочих аномалий. Собственно, вопроса два: 1) почему там так много ошибок? Хотя, как я понимаю скрипты игры изначально корявые и требуют правок в многих местах. 2) Тогда каким образом все это вообще компилировали мододелы, если сурсер отказывается?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.049
Благодарности
1.840
Баллы
290
Pag,
- Декомпилятор в сурсере, вероятно, хреновый.
- Можно отредактировать ДАТник так, что даже хороший декомпилятор не справится.
- Ошибки в декомпилированных скриптах оригинальной игры давно исправлены.
- Мододелам нет нужды пользоваться декомпилятором, так как у них есть исходные коды своих модов.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.292
Благодарности
6.277
Баллы
1.595
Декомпилятор в сурсере, вероятно, хреновый
Декомпелятор в сурсере, вероятно, НЕ хреновый. Он показывает ошибки, которые логически не правильно построены.

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

Мододелам нет нужды пользоваться декомпилятором, так как у них есть исходные коды своих модов.
Да? :eek:
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.341
Благодарности
3.187
Баллы
525
- Декомпилятор в сурсере, вероятно, хреновый.
Косяки там есть, да. Но дело не только в этом. Часть информации, содержащейся в исходниках, просто не идёт в компилированные скрипты. Следовательно, они не могут быть полноценно декомпилированы в принципе.

а потом они отказывались компилироваться обратно - находилось множество ошибок, предупреждений
Если говорить об оригинальных скриптах Г1, то они компилировались разрабами ДО появления Соурсера. Там есть такие моменты, которые движковый компилятор не считает ошибками, а компилятор Соурсера считает. Иногда Соурсер перестраховывается и называет ошибкой то, что ошибкой не является, но может ей быть, имея все признаки ошибки. И это правильно, на мой взгляд.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.292
Благодарности
6.277
Баллы
1.595

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.049
Благодарности
1.840
Баллы
290
Декомпелятор в сурсере, вероятно, НЕ хреновый. Он показывает ошибки, которые логически не правильно построены.
Да, похоже на то. Я то подумал, что он как DecDat валится на пустом месте.
А зачем? Однажды начав разработку, декомпилер скриптов уже становится ненужным.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.898
Благодарности
5.347
Баллы
910
Ну, если мод на голых скриптах, мод с Union/AST/Ikarus+Lego уже хрен декомпилируешь.
Именно поэтому некоторые авторы просто добавляют расширитель в мод, даже его не инициализируя их, чтобы защитить от GS, скрипты все равно можно получить, но восстанавливать их тот ещё геморрой.

Ну и я за компиляцию игрой/спакером.
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.290
Благодарности
4.605
Баллы
625
А зачем? Однажды начав разработку, декомпилер скриптов уже становится ненужным.
Тебе пример привести?) У нас особо одаренных, которые чисто из удобства декомпилят, либо теряют исходники, выше крыши. Звучит абсурдно, но они считают это нормой. Гильдия 'опытный пользователей ПК' среди мододелов.
 

DocNight

Участник форума
Регистрация
6 Июн 2020
Сообщения
32
Благодарности
1
Баллы
60
Не стесняюсь спросить... Возможно ли как нибудь скриптами, или же на уровне движка отключить паузу во время открытии окон статистики, например?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.290
Благодарности
4.605
Баллы
625
DocNight, для окна статистики и журнала пауза вызывается из методов oCStatusScreen::Show и oCLogScreen::Show соответственно.
Достаточно занопать функциональные области памяти, отвечающие за непосредственные вызовы процедуры oCGame::Pause. В том и другом случаях это по 5 байт в 0x0047EE57 и 0x0047F4D7.
Код:
push 0
call oCGame::Pause


Реализовать пропуски тактов можно коротким .patch файлом под системой Union. Патч файл достаточно поместить в папку System игры, либо в VDF том к необходимому моду.
Код для G2A (Ночь ворона) будет выглядеть следующим образом.
Union:
#engine [G2A]
    #patch
        // Disable Status pause
        HEX @0x0047EE57 = '90 90 90 90 90'
      
        // Disable Log pause
        HEX @0x0047F4D7 = '90 90 90 90 90'
    #/patch
#/engine
 

Вложения

  • zNoMenuPauses.7z
    262 байт · Просмотры: 3
Последнее редактирование:

DocNight

Участник форума
Регистрация
6 Июн 2020
Сообщения
32
Благодарности
1
Баллы
60
Ну-с, благодарю за помощь, но тут уже возникла еще одна потребность. Не стесняюсь спросить... С включением камеры от первого лица все работает почти идентично?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.898
Благодарности
5.347
Баллы
910
Кто-нибудь может распознать, что за текст в 1 строке?
По моему там слов нет от слова совсем.
1606558423492.png
Это текст игрового предмета ItWr_MinenAnteil_Mis
По идее первая строка должна быть Erzminenanteil (Акция рудника), но слов что-то много для этого

Красоты вам в ленту
1606558873570.png
 
Последнее редактирование:

Pag

Участник форума
Регистрация
7 Ноя 2013
Сообщения
98
Благодарности
62
Баллы
170
N1kX, первое слово похоже то ли на ohr, то ли на ihr, последнее на hier
 
Сверху Снизу