IKARUS: скрипт-пакет

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
IKARUS - Это скрипт-пакет, который был разработан немецким модостроителем Sektenspinner'ом.​
Этот пакет позволяет расширить нам, другим модостроителям, возможности.
Что же такое делает он, чтобы получить новые способы улучшения качества и повышения интереса к модам?

Не секрет, что возможности стандартного набора модостроителя ограничены переданными Пираньями материалами.
Но любой скриптёр, втягиваясь и осваивая язык Даедалус, спустя некоторое время утыкается в стены, которые он пытается обойти разными извращёнными способами.
У него в определённый момент возникает вопрос к себе, но адресованный реально Пираньям. "Ну почему они не сделали функцию просто получения времени" или "почему нет функции деэкипировки отдельного типа оружия?" Что, реально сложно это было?
Нет, это было абсолютно несложно, но мы имеем то, что имеем. Может ввиду того факта, что для написания игры им хватило именно этого набора функций, что они и отдали на растерзание игрокам-модостроителям.
Ладно, это лирика. Теперь перейдём к физике.

Что же нам позволяет расширить потенциал? Здесь ответ как в известной программе: "Показать всё, что скрыто!"
Пример.
Что у нас представляет объект класса C_NPC (человек, монстр)?
Это объект, которому мы можем задать порядка тридцати полей (урон, защита, вид, флаг, имя и ещё некоторые.)
Что же представляет объект класса oCNpc (тот класс, что реально используется игрой) - это класс, имеющий более 250 полей только относящихся к нему + ещё около 40, относящихся к общему классу zCVob. И это частный пример, но уже чувствуете разницу? Пускай, 99% из 100 может нам и не нужна, ну а вдруг???

Далее, продолжаем.
Пакет позволяет читать из памяти (+ изменять в памяти) процесса игры практически любую информацию. Тут главное знать, что, где и как?

Теперь немного мат.части.
Представим себе кусок памяти наглядно:
[ячейка памяти],[ячейка памяти],[ячейка памяти],[ячейка памяти],[ячейка памяти],[ячейка памяти],[ячейка памяти] и т.д.

Каждая ячейка в понятном для нас виде имеет размер 1Байт, которая хранит в себе информацию в 16-ричной системе. Также она имеет свой собственный адрес.
В языке Даедалус есть переменные и константы трех видов (int - целое цисло, float - число с плавающей точной, string - строка).
Переменные типа int и float - занимают в памяти 4 ячейки (4 Байта).
Переменные !пользовательского! типа string (которого реально нет в языке Си++) занимают в удобном для нашем понимании виде 20 ячеек (20 Байт).
Адресом переменной в памяти по сути является адрес первой ячейки.
Получается, зная адрес ячейки памяти, тип хранимой в ней информации, мы можем в любой момент времени прочитать или изменить её.

Теперь на примере конкретного объекта, глянем, что он из себя представляет в памяти:
Код:
class zCObject	
{
  var int    _vtbl;
  var int    refCtr;
  var int    hashIndex;
  var int    hashNext;
  var string objectName;
};
Объект этого класса расположен в памяти и имеет начальный адрес. Первое поле этого класса содержит в себе информацию, и имеет свой адрес, но по сути является и адресом всего объекта.
Далее, есть следующее поле, оно смещено относительно первого поля на 4 Байта. Именно столько занимает первая ячейка типа int.
И т.д.
Получаем, что если в памяти подряд находятся два элемента класса zCObject, то они предствляют следующее
[1-ый объект имеет адрес 1234(наобум) размером 4Байта+4Байта+4Байта+4Байта+20Байт(36Байт)],[второй объект уже будет иметь адрес 1234+36 и занимать столько же]
То есть по адресу 1234 +16 мы можем прочитать поле objectName первого объекта.
По адресу 1234+36+8 мы можем прочитать поле hashIndex второго объекта.

Теперь подытожим на конкретном примере:

Имеем НПС. Он в памяти имеет адрес 1000.
Глядя в описание расширенного типа oCNpc, хочу прочитать поле idx.
Он смещён относительно начала на 288 Байт.
У нас есть два способа прочитать.
Первый - получить ссылку на НПС как на объект класса oCNpc и банально прочитать:
var int x; x = oCNpc.idx;
Второй - прочитать значение ячейки памяти, с помощью функции пакета Ikarus MEM_ReadInt(var int address)
Это одна из функций, которая читает из памяти число типа int по адресу address
var int x; x = MEM_ReadInt(1000+288);

На этом вступление окончено.

ВТОРАЯ ЧАСТЬ.

Какие вообще сосредоточены возможности в пакете ИКАРУС

  • -Чтение и изменение памяти
  • -Вызов практически любой скрытой в движке игры функции

Какой практический смысл на примере (из описания автора и от меня):
  • - включение/выключение режима MARVIN
  • - постановка игры на паузу в любой момент
  • - включить-выключить дождь/снег в любой момент
  • - узнать, какая клавиша сейчас нажата игроком.
  • - найти любой ВОБ в игре и поменять ему параметры (передвинуть, удалить, сменить внешний вид и т.д)
  • - наполнить сундук барахлом или открыть запертую где-то дверь.
  • - организовать циклы.
И т.д. и т.п., главное углубиться во всё это.

ТРЕТЬЯ ЧАСТЬ.

Рассмотрим некоторые базовые функции пакета Икарус.

1. MEM_ReadInt(var int address);
2. MEM_ReadString(var int address);


Как нетрудно догадаться из названия и внешнего вида функции, первая - читает из памяти число типа int, вторая - строку, - по адресу address;

3. MEM_WriteInt(var int x, var int address)
4. MEM_WriteString(var string y, var int address)


Опять же всё очень просто: обе записывают в память по адресу address своё значение (x - число типа int, y - строковое значение).

5. func int MEM_InstToPtr (var instance inst)
6. func instance MEM_PtrToInst (var int ptr)


Здесь чуть сложнее. Первая возвращает указатель на инстанцию (число, являющееся адресом объекта в памяти ). Вторая - делает обратное, по указателю получает ссылку на инстанцию.

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

ЧЕТВЁРТАЯ ЧАСТЬ.

Интеграция пакета Икарус в скрипты (взято из документации автора):
Распаковываем архив со скриптами к себе в проект. Приведу на своём примере:
Вот моя корневая структура проекта:
..\_Intern\
..\AI\
..\Ikarus1_2
..\Items
..\Story
..\gothic.src

Как видите от оригинала отличается наличием папки Ikarus1_2
В неё просто распакованы все файлы. И в gothic.src добавлено следующее:
_Intern\Constants.d
_Intern\Classes.d
AI\AI_Intern\AI_Constants.d
//Пакет Икарус
Ikarus1_2\Ikarus_Const_G2.d
Ikarus1_2\Misc.d
Ikarus1_2\oCAiHuman.d
Ikarus1_2\oCGame.d
Ikarus1_2\oCInfoManager.d
Ikarus1_2\oCItem.d
Ikarus1_2\oCMob.d
Ikarus1_2\oCNpc.d
Ikarus1_2\oCZoneMusic.d
Ikarus1_2\zCCamera.d
Ikarus1_2\zCConsole.d
Ikarus1_2\zCMenu.d
Ikarus1_2\zCMesh.d
Ikarus1_2\zCOption.d
Ikarus1_2\zCParser.d
Ikarus1_2\zCSkyController.d
Ikarus1_2\zCTexture.d
Ikarus1_2\zCTrigger.d
Ikarus1_2\zCWaynet.d
Ikarus1_2\zCWorld.d
Ikarus1_2\zCZoneZFog.d
Ikarus1_2\Ikarus.d
Ikarus1_2\float.d
//конец пакета
AI\AI_Intern\BodyStates.d
Компиляция скриптов происходит игрой. Проверять на ошибки можно и с помощью GothicSourcer'а. Он проход сделает до конца, но остановится.


ССЫЛКИ:
Тема по скрипт-пакету на WOG.de: http://forum.worldofplayers.de/forum/threads/969446-Skriptpaket-Ikarus-3
Пакет Ikarus (версия 1.2), компиляция только игрой: http://exodus.worldofgothic.com/team/Sektenspinner/Ikarus_Skriptpaket.zip
Пакет Ikarus (версия 1.1.4), компиляция игрой и GS: http://exodus.worldofgothic.com/team/Sektenspinner/Ikarus_Skriptpaket_1.1.4.zip
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
УРОК 1.

Его мы посвятим такой вещи как "Список", или массив записей иначе.
К такому термину в готике относятся:
  • - список всех вобов игры
  • - список всех НПС игры
  • - список всех итемов игры
  • - инвентарь героя, сундука
  • - список квестов в журнале
  • - и т.д. Можете додумать, что ещё можно отнести к этому.

Любой из этих списков представляет собой объект класса zCListSort.
Что у нас представляет собой этот класс:

Код:
class zCListSort {
    var int compareFunc;        //int (*Compare)(T *ele1,T *ele2);
    var int data;               //T*
    var int next;               //zCListSort<T>*
};

Пока не понятно, да? Что с этим делать.
Рассмотрим на примере сундука. Это объект класса oCMobContainer.
У этого класса есть поле containList_next - это адрес как раз списка предметов внутри сундука. То есть число, хранимое в oCMobContainer.containList_next является указателем на сортированный список предметов.

Итак мы получили адрес объекта класса zCListSort с перечнем предметов.
Как у нас выглядит этот список в памяти. Внимательно! Предположим, что у нас в сундуке: золотая монета, стрела, меч, лук. Это уже отсортированный список игрой.

Давайте сделаем первые шаги к получению информации:

Код:
[B][COLOR="DeepSkyBlue"]func void Inventar()[/COLOR][/B]
[COLOR="DeepSkyBlue"][B]{[/B][/COLOR]
//объявляем переменную класса [B]oCMobContainer[/B], 
//к которой мы приравняем наш сундук.
	
	[B]var oCMobContainer SUNDUK;[/B]
 
//Допусти мы знаем адрес это объекта в памяти и он равен [B]123456[/B];
//Чтобы начать работать с сундуком, мы должны управлять его элементами.
	
	[B]SUNDUK = MEM_PtrToInst(123456);[/B]
	
//Всё, переменная [B]SUNDUK[/B] у нас приравнена к этому сундуку.
//Давайте теперь управлять инвентарём сундука.
	
	[B]var zCListSort Inventar;
	Inventar = MEM_PtrToInst(SUNDUK.containList_next);[/B]
	
//Теперь мы уже можем работать с объектом Inventar как со списком предметов.
//Мы знаем, что в инвентаре находятся предметы класса [B]oCItem[/B].
//В поле data хранится указатель на первую итемку (золотую монету).
	
	[B]var oCItem first_item;
	first_item = MEM_PtrToInst(Inventar.data);
	Print(first_item.name);[/B] //Здесь на экран выведется "Золотая монета"
	
//Так а где же всё остальное?
//Смотрим на поле [B]next[/B].
//Оно указывает на ... след.список предметов. Запутанно вроде, ан нет. 
//Вторым списком у нас является уже следующее: стрела, меч, лук.
//То есть:
	
	[B]var zCListSort Inventar_2;
	Inventar_2 = MEM_PtrToInst(Inventar.next);
	var oCItem second_item;
	second_item = MEM_PtrToInst(Inventar_2.data);
	Print(second_item.name);[/B] //Здесь на экран выведется "Стрела"
	
//Третий предмет получим:
	
	[B]var zCListSort Inventar_3;[/B]	//Здесь уже остаётся меч и лук.
	[B]Inventar_3 = MEM_PtrToInst(Inventar_2.next);
	var oCItem third_item;
	third_item = MEM_PtrToInst(Inventar_3.data);
	Print(third_item.name);[/B] //Здесь на экран выведется "Меч"
	
//Четвёртый предмет получим:
	
	[B]var zCListSort Inventar_4;[/B]	//Здесь уже остаётся лук.
	[B]Inventar_4 = MEM_PtrToInst(Inventar_3.next);[/B]
	[B]var oCItem fourth_item;
	fourth_item = MEM_PtrToInst(Inventar_4.data);
	Print(fourth_item.name);[/B] //Здесь на экран выведется "Лук"
	
//На этом инвентарь заканчивается. 
//И обозначает это то, что поле Inventar_4.next = 0; 
//Значит больше нет продолжения списка.
[COLOR="DeepSkyBlue"][B]};[/B][/COLOR]

В этом уроке я дал вам хоть какое-то представление о том, что представляет собой любой список в игре.

А вот наглядный пример:
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
ВЫШЕ - Первый урок.

Урок 2. Циклы и сканирование списков с помощью цикла.
Циклы.

Рассмотрим один пример c сайта WOG.de от немецкого форумита mud-freak
Функция являет собой поиск вайпойнта в мире.
Написана она ещё была тогда, когда не вышла версия 1.2 пакета ИКАРУС.
Я её немного видоизменил под версию 1.2 , но оставив функциональную часть цикла старой - построенного на метках.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// SearchWaypointByName (VAR string wp)
// -------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Код:
[B][COLOR="RoyalBlue"]FUNC int SearchWaypointByName(VAR string wp)
{[/COLOR][/B]
//Здесь вызывается объявление глобальных инстанций. 
//В нашем случае важна одна - [B][I]MEM_Waynet[/I][/B].   
    [B]MEM_InitGlobalInst(); [/B]
    
//Объявляем переменные соответствующих типов.
    [B]VAR zCWaypoint curWp;
    VAR zCListSort curItem;
    VAR zCListSort lastItem;[/B]

//приравниваем к списку curItem - список всех вайпонтов игры.        
	[B]curItem = MEM_PtrToInst(MEM_Waynet.wplist_next);[/B]	
   
//А здесь мы инициализируем работу с метками
    [B]MEM_InitLabels();
    VAR int label;[/B]
//Вот тут мы ставим метку. И теперь в любом месте 
//далее по программе мы можем переместиться в эту точку кода.
    [B]label = MEM_StackPos.position;[/B]	
 
//А здесь собственно и идёт поиск

//Читаем поле [B][I]data[/I][/B] списка. Если ничего нет, значит вайнета нет. 
//Мне кажется этот кусок лишним.
        [B]IF (!curItem.data)  
        {
            RETURN 0; 
        };[/B]

//Приравниваем к вайпойнту [B][I]curWp[/I][/B] вайпойнт, 
//адрес которого хранится в поле data.
        [B]curWp = MEM_PtrToInst(curItem.data);[/B]	
		
//Теперь сравниваем название вайпойнта и то имя, 
//которое мы задали для поиска.
//Если совпадает, то значит мы нашли его
       [B] IF (Hlp_StrCmp(curWp.name, wp))    
        {[/B]
//Возвращаем адрес этого вайпонта (указатель на него) 
                [B]RETURN MEM_InstToPtr(curWp);    
        };[/B]

//Если пришли к концу листа, значит всё... Не нашли.        
       [B] IF (!curItem.next)	
        {
            RETURN 0;  
        };[/B]
                
//После прохода списка в случае необнаружения вайпойнта, 
//нам надо дальше искать.
//Запоминаем текущий просканированный лист как [B][I]lastItem[/I][/B].
        [B]lastItem = MEM_PtrToInst(MEM_InstToPtr(curWp));[/B]

//А к [B][I]curItem[/I][/B] приравниваем следующий список, 
//в котором находится следующий вайпойнт.
        [B]curItem = MEM_PtrToInst(lastItem.next);[/B]
        
//А здесь мы перескакиваем на объявленную выше метку. 
//Тем самым получается цикл.
    [B]MEM_StackPos.position = label;  [/B] 
    
//А это тоже лишнее.
    [B]MEM_Warn("SearchWaypointByName: Schleifenfehler");
    RETURN 0;[/B]
        
[COLOR="RoyalBlue"][B]};[/B][/COLOR]

В следующем уроке я перепишу этот пример на свой вариант, основанный на применении комбинации while-end.
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
УРОК 3. Циклы.
Использование комбинации While-End.

Здесь я вам представлю тот же самый скрипт, что был в предыдущем уроке, но уже основанный не на использовании меток, а с помощью комбинации while-end.

Давайте сразу я представлю свой вариант. В нём я отрезал лишнее, что было по сути своей ненужным излишеством.
Код:
FUNC int SearchWaypointByName(VAR string wp)
{
   MEM_InitGlobalInst();
   
   VAR zCWaypoint curWp;
   VAR zCListSort curItem;
   
   curItem = _^(MEM_Waynet.wplist_next);
   while(curItem);		
		curWp = _^(curItem.data);
		IF (Hlp_StrCmp(curWp.name, wp))
		{
			Print("ВАЙПОЙНТ НАЙДЕН!");
			RETURN MEM_InstToPtr(curWp);
		};
		IF (!curItem.next)
		{
			Print("ВАЙПОЙНТ НЕ НАЙДЕН!");
			RETURN 0;
		};
		curItem = _^(curItem.next);
	end;	
};
Обратите внимание. Я использовал такое сочетание символов как _^. Это функция, которая равна функции MEM_PtrToInst. Абсолютно одно и тоже, но сокращает писанину и повышает удобочитаемость.

Итак, что у нас происходит в скрипте. Комбинация while-end представляет собой некое подобие "скобок" для цикла. Кто занимался программированием, например на Паскале, уже видел такое. Там оно выглядит так:
while (x=1) do
begin
...[код цикла]
end;


То есть, пока x=1, всё внутри begin-end будет выполняться бесконечно. Когда x станет равным 1, цикл закончится, и начнётся выполнение кода, расположенного ниже end;.
Аналогично и здесь.
Пока выражение внутри скобок while (у нас это curItem != 0) является не 0, всё внутри while-end будет выполняться постоянно.

В моём варианте происходит следующее:
Берём первый вапойнт, приравниваем его в переменной curWp, читаем его имя, сравниваем с нужным. Если это не так, то мы переходим на следующий вайпонт в списке. И до тех пор, пока мы не найдём нужный вайпойнт, или мы не дойдём до конца вайнета, цикл поиска будет выполняться. Прервать цикл (закончить) нам позволяет команда return XXX.
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
УРОК 4.
Попробуем понять работу с вызовом функций движка. А также передачей параметров в стек.

В Готике существует 4 типа вызова движком функций.
  • func void CALL__stdcall (var int adr )
  • func void CALL__thiscall (var int this, var int adr )
  • func void CALL__cdecl (var int adr )
  • func void CALL__fastcall (var int ecx, var int edx, var int adr)
А также мастерами своего дела был получен список функций Готы путём ...(молчим).
Вот ссылка на то, что вам нужно: http://yadi.sk/d/R4mM_54u6C78K

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

-берём одну функцию из списка, наиболее понравившуюся и понятную по смыслу.
void __thiscall oCNpc::CompleteHeal(void) 0x00736720
Я думаю, ясно, что она должна сделать. Кто разумеет английский язык, поймёт, что она должна полностью вылечить НПСа.

Давайте разберём по порядку то, что нам необходимо:
1) тип вызова - __thiscall . Это значит, что для того, чтобы вызвать функцию мы должны использовать команду CALL__thiscall. При этом обязательным параметром будет являться указатель на объект класса oCNpc (на кого вызывается функция).
2) CompleteHeal(void) - внутри скобок не указаны передаваемые параметры (void - означает отсутствие), значит, кроме указателя на oCNpc, больше ничего не понадобится.
3) 0x00736720 - это адрес функции в памяти процесса. Представлен в 16-ричном виде (HEX-формат). Чтобы вызвать функцию по адресу, нам надо перевести это число в десятичный формат.
Я, например, использую онлайн-конвертер (http://www.binaryhexconverter.com/hex-to-decimal-converter);
вы также можете использовать инженерный калькулятор Windows. Нам нужно число, идущее после 0x
00736720 (hex) = 7563040 (dec);
А теперь пишем функцию:
Код:
func void Npc_CompeteHeal(var C_NPC slf)
{
	const int oCNpc__CompleteHeal = 7563040;
	CALL__thiscall(MEM_InstToPtr(slf), oCNpc__CompleteHeal);
};

Теперь приведу пример посложнее. Выберем функцию, где нужно помимо просто указателя на НПС передать ещё какие-то параметры. Судя из названия, НПС должен перевестись в бессознательное состояние.
void __thiscall oCNpc::DropUnconscious(float, oCNpc*) 0x00735EB0
Итак:
1) Функция thiscall. Передавать обязательно надо указатель объект класса oCNpc.
2) Помимо этого нам надо передать число типа float и ещё один объект класса oCNpc. Если включить мозг, то можно предположить, что второй объект oCNpc - это походу обидчик (тот, кто переводит первого НПС в нокдаун). А вот что за число типа float, я так опытным путём и не выяснил. Видимо, Пираньи хотели заложить в него время, которое НПС будет в бессознанке, но в итоге это было реализовано в обычных скриптах в ZS_Unconscious. Но это не означает, что нам его не надо передавать. Пусть 0, пусть 101.478, неважно.
3) Переводим адрес: 00735EB0 = 7560880 ;

А вот теперь запоминаем. Параметры, которые мы будем помещать в стек, должны передаваться СПРАВА - НАЛЕВО, как это написано в скобках. То есть это выглядит так:

Код:
func void Npc_DropUnconscious(var C_NPC vict, var int xxx, var C_NPC killer)
{
	[B]const int oCNpc__DropUnconscious = 7560880;[/B]
//Сначала мы передаем указатель на обидчика
	[B]CALL_PtrParam(MEM_InstToPtr(killer));[/B]
//А уж затем число типа float  
	[B]CALL_FloatParam(mkf(xxx));[/B]
//Вызываем функцию перевода НПС vict в нокдаун.   	
	[B]CALL__thiscall(MEM_InstToPtr(vict),oCNpc__DropUnconscious);[/B]
};

Заодно мы ознакомились с новой функцией - mkf(xxx). Она переводит число типа int в формат Float, но в том виде, в котором оно реально выглядит в памяти, а именно HEX-формат. То есть число 125.14 в HEX-формате выглядит как 0x42fa47ae = 1123698606 в десятичном формате.
Передача парметров в стек производится функциями:

  • func void CALL_IntParam (var int param) /* int32 */
  • func void CALL_FloatParam (var int param) /* single / zREAL */
  • func void CALL_PtrParam (var int param) /* void* */
  • func void CALL_zStringPtrParam (var string param) /* zString* */
  • func void CALL_cStringPtrParam (var string param) /* char ** */
  • func void CALL_StructParam (var int ptr, var int words) /* struct */

В нашем случае, чтобы передать указатель на второго НПС, мы использовали CALL_PtrParam, а чтобы передать число типа float - CALL_FloatParam.

Думаю, чтобы понять этот урок, нужно самому побаловаться и потыкаться.
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Итак. Поделюсь очень интересным механизмом, реализованным мной на скрипт-пакете Ikarus.
Этот скрипт позволяет включить все возможные диалоги с НПС во время диалога.
Для чего нужно? Для тестирования. Если у вас вдруг не выполняется какое-то условие, а марвином его решить трудно или невозможно, просто подключите данный механизм к себе в проект.
P.S. Если кому интересна утилита для перевода кода Daedalus в форматированный вид для форума, то вот: Farbeimer

А теперь объясню вкратце как это работает:

Во-первых, сканируются все топики у НПС, с которым начинается диалог. При нажатии определенной(ых) клавиш(и) происходит подмена всех условий топиков на пустышку, которая всегда даёт TRUE. И сразу же в диалоге все строчки(топики) появляются, причём с комментарием. При покидании диалога все условия возвращаются назад.

/*******************************************************\
---------------РАБОТА С ДИАЛОГАМИ (oCINFO)---------------
\*******************************************************/


Код:
[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] Info_GetInfo[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#AAAA00],[/COLOR] [COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] herInstance[COLOR=#AAAA00],[/COLOR] [COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] nr_info[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//oCInfo *
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=Gray][I]//oCInfo * __thiscall oCInfoManager::GetInfo(class oCNpc * oCNpc * int)	0x00702D60
[/I][/COLOR]	[COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfoManager__GetInfo [COLOR=Maroon]=[/COLOR] 7351648[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] oCNpc npc[COLOR=#AAAA00];[/COLOR]	Npc [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]Hlp_GetNpc[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] oCNpc her[COLOR=#AAAA00];[/COLOR]	Her [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]Hlp_GetNpc[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]herInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL_IntParam[COLOR=#0080C0][B]([/B][/COLOR]nr_info[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL_PtrParam[COLOR=#0080C0][B]([/B][/COLOR]MEM_InstToPtr[COLOR=#0080C0][B]([/B][/COLOR]Npc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL_PtrParam[COLOR=#0080C0][B]([/B][/COLOR]MEM_InstToPtr[COLOR=#0080C0][B]([/B][/COLOR]Her[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL__thiscall[COLOR=#0080C0][B]([/B][/COLOR]MEM_Game[COLOR=#AAAA00].[/COLOR]infoman[COLOR=#AAAA00],[/COLOR]oCInfoManager__GetInfo[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]return[/COLOR] CALL_RetValAsPtr[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] Info_GetInfoCount[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#AAAA00],[/COLOR] [COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] herInstance[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//oCInfo *
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=Gray][I]//int __thiscall oCInfoManager::GetInfoCount(oCNpc * oCNpc *)  	0x00702940
[/I][/COLOR]	[COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfoManager__GetInfoCount [COLOR=Maroon]=[/COLOR] 7350592[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] oCNpc npc[COLOR=#AAAA00];[/COLOR]	Npc [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]Hlp_GetNpc[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] oCNpc her[COLOR=#AAAA00];[/COLOR]	Her [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]Hlp_GetNpc[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]herInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL_PtrParam[COLOR=#0080C0][B]([/B][/COLOR]MEM_InstToPtr[COLOR=#0080C0][B]([/B][/COLOR]Npc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL_PtrParam[COLOR=#0080C0][B]([/B][/COLOR]MEM_InstToPtr[COLOR=#0080C0][B]([/B][/COLOR]Her[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	CALL__thiscall[COLOR=#0080C0][B]([/B][/COLOR]MEM_Game[COLOR=#AAAA00].[/COLOR]infoman[COLOR=#AAAA00],[/COLOR]oCInfoManager__GetInfoCount[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]return[/COLOR] CALL_RetValAsInt[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]

[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo_GetConditionFunc[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo_ptr[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//symbolindex
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=Gray][I]//int __thiscall oCInfo::GetConditionFunc(void)   	0x007038F0
[/I][/COLOR]	[COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo__GetConditionFunc [COLOR=Maroon]=[/COLOR] 7354608[COLOR=#AAAA00];[/COLOR]	
	CALL__thiscall[COLOR=#0080C0][B]([/B][/COLOR]oCInfo_ptr[COLOR=#AAAA00],[/COLOR]oCInfo__GetConditionFunc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]return[/COLOR] CALL_RetValAsInt[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]string[/COLOR] oCInfo_GetConditionFuncName[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo_ptr[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//symbolname;
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] symbolIndex[COLOR=#AAAA00];[/COLOR]
	symbolIndex [COLOR=Maroon]=[/COLOR] oCInfo_GetConditionFunc[COLOR=#0080C0][B]([/B][/COLOR]oCInfo_ptr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	
	[COLOR=#0683FF]var[/COLOR] zCPar_Symbol symb[COLOR=#AAAA00];[/COLOR]
	symb [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]MEM_GetSymbolByIndex[COLOR=#0080C0][B]([/B][/COLOR]symbolIndex[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]return[/COLOR] symb[COLOR=#AAAA00].[/COLOR]name[COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo_InfoConditions[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo_ptr[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//	TRUE|FALSE
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=Gray][I]//int __thiscall oCInfo::InfoConditions(void) 	0x00703950
[/I][/COLOR]	[COLOR=Gray][I]//Необходимая проверка. Без неё, в условиях для диалога other != hero, self != self
[/I][/COLOR]	
	[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR][COLOR=Purple]other[/COLOR][COLOR=#AAAA00].[/COLOR]id [COLOR=Green]==[/COLOR] 0[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=#0080C0][B]{[/B][/COLOR]	[COLOR=Purple]other[/COLOR] [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]Hlp_GetNpc[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR][COLOR=Purple]hero[/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]	[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=Purple]self[/COLOR] [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]MEM_InformationMan[COLOR=#AAAA00].[/COLOR]npc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] oCInfo__InfoConditions [COLOR=Maroon]=[/COLOR] 7354704[COLOR=#AAAA00];[/COLOR]	
	CALL__thiscall[COLOR=#0080C0][B]([/B][/COLOR]oCInfo_ptr[COLOR=#AAAA00],[/COLOR]oCInfo__InfoConditions[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]return[/COLOR] CALL_RetValAsInt[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]



Код:
[COLOR=Gray][I]//-----------------------------------------------------------
[/I][/COLOR][COLOR=Gray][I]//СКАНИРОВАНИЕ ВСЕХ ДИАЛОГОВ НА ПРИНАДЛЕЖНОСТЬ К НПС, 
[/I][/COLOR][COLOR=Gray][I]//-------которые сейчас актуальны
[/I][/COLOR][COLOR=Gray][I]//-----------------------------------------------------------
[/I][/COLOR][COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] B_GetCurrentInfosByNPC[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR]
[COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] count[COLOR=#AAAA00];[/COLOR]	count [COLOR=Maroon]=[/COLOR] Info_GetInfoCount[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#AAAA00],[/COLOR][COLOR=Purple]hero[/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] i[COLOR=#AAAA00];[/COLOR] i [COLOR=Maroon]=[/COLOR] 0[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr[COLOR=#AAAA00];[/COLOR] arr   [COLOR=Maroon]=[/COLOR] MEM_ArrayCreate[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] InfoPtr[COLOR=#AAAA00];[/COLOR]
	
	while[COLOR=#0080C0][B]([/B][/COLOR]count[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		InfoPtr [COLOR=Maroon]=[/COLOR] Info_GetInfo[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#AAAA00],[/COLOR][COLOR=Purple]hero[/COLOR][COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		MEM_ArrayInsert[COLOR=#0080C0][B]([/B][/COLOR]arr[COLOR=#AAAA00],[/COLOR]InfoPtr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		i [COLOR=Maroon]+[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
		count [COLOR=Maroon]-[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
	end[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]return[/COLOR] arr[COLOR=#AAAA00];[/COLOR]	[COLOR=Gray][I]//Array of oCInfo*
[/I][/COLOR][COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]//СКАНИРОВАНИЕ ВСЕХ ДИАЛОГОВ НА ПРИНАДЛЕЖНОСТЬ К НПС, 
[/I][/COLOR][COLOR=Gray][I]//---полностью весь список с прочитанными
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] B_GetAllInfosByNpc[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR]
[COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=Gray][I]//MEM_InfoMan = _^(MEM_Game.infoman);
[/I][/COLOR]	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] Infos_Ptr[COLOR=#AAAA00];[/COLOR]	Infos_Ptr [COLOR=Maroon]=[/COLOR] MEM_InfoMan[COLOR=#AAAA00].[/COLOR]infoList_next[COLOR=#AAAA00];[/COLOR]	
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr[COLOR=#AAAA00];[/COLOR]   				arr   [COLOR=Maroon]=[/COLOR] MEM_ArrayCreate[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	
	[COLOR=#0683FF]var[/COLOR] oCInfo INFO_INSTANCE[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] zCListSort ListOfInfos[COLOR=#AAAA00];[/COLOR]
	
	While[COLOR=#0080C0][B]([/B][/COLOR]Infos_Ptr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		ListOfInfos [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]Infos_Ptr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		INFO_INSTANCE [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]ListOfInfos[COLOR=#AAAA00].[/COLOR]data[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]INFO_INSTANCE[COLOR=#AAAA00].[/COLOR]npc [COLOR=Green]==[/COLOR] npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR]
		[COLOR=#0080C0][B]{[/B][/COLOR]
			MEM_ArrayInsert[COLOR=#0080C0][B]([/B][/COLOR]arr[COLOR=#AAAA00],[/COLOR]MEM_InstToPtr[COLOR=#0080C0][B]([/B][/COLOR]INFO_INSTANCE[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]ListOfInfos[COLOR=#AAAA00].[/COLOR]next[COLOR=#FF4AA5][B])[/B][/COLOR]
		[COLOR=#0080C0][B]{[/B][/COLOR]
			Infos_Ptr [COLOR=Maroon]=[/COLOR] ListOfInfos[COLOR=#AAAA00].[/COLOR]next[COLOR=#AAAA00];[/COLOR]
			ListOfInfos [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]Infos_Ptr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#FF4AA5][B]}[/B][/COLOR]
		[COLOR=#0683FF]else[/COLOR]		[COLOR=#0080C0][B]{[/B][/COLOR]Infos_Ptr [COLOR=Maroon]=[/COLOR] 0[COLOR=#AAAA00];[/COLOR][COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	end[COLOR=#AAAA00];[/COLOR]
	
	[COLOR=#0683FF]return[/COLOR] arr[COLOR=#AAAA00];[/COLOR]	[COLOR=Gray][I]//Array of oCInfo*
[/I][/COLOR][COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]///Сканирует диалоги и возвращает массив со значениями,
[/I][/COLOR][COLOR=Gray][I]// выполняется ли условие диалога. [TRUE,FALSE,FALSE,TRUE,..]
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] B_GetAllInfosCondByNpc[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//по идее не нужно.
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_adr[COLOR=#AAAA00];[/COLOR]	arr_adr [COLOR=Maroon]=[/COLOR] B_GetAllInfosByNPC[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] zCArray arr[COLOR=#AAAA00];[/COLOR]	arr [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_length[COLOR=#AAAA00];[/COLOR]	arr_length [COLOR=Maroon]=[/COLOR] arr[COLOR=#AAAA00].[/COLOR]numInArray[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arrCond[COLOR=#AAAA00];[/COLOR]	arrCond [COLOR=Maroon]=[/COLOR] MEM_ArrayCreate[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]	
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] info_Ptr[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] i[COLOR=#AAAA00];[/COLOR] i [COLOR=Maroon]=[/COLOR]0[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] bool[COLOR=#AAAA00];[/COLOR]
	
	while[COLOR=#0080C0][B]([/B][/COLOR]arr_length[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		info_Ptr [COLOR=Maroon]=[/COLOR] MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		bool [COLOR=Maroon]=[/COLOR] oCInfo_InfoConditions[COLOR=#0080C0][B]([/B][/COLOR]info_Ptr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		MEM_ArrayInsert[COLOR=#0080C0][B]([/B][/COLOR]arrCond[COLOR=#AAAA00],[/COLOR]bool[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		arr_length [COLOR=Maroon]-[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
		i [COLOR=Maroon]+[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
	end[COLOR=#AAAA00];[/COLOR]
	
	[COLOR=#0683FF]return[/COLOR] arrCond[COLOR=#AAAA00];[/COLOR]	[COLOR=Gray][I]//array of condition all NPC's dialogs (TRUE|FALSE)
[/I][/COLOR][COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]///Сканирует диалоги и возвращает массив со значениями
[/I][/COLOR][COLOR=Gray][I]// порядковых номеров названий функций dia_xx_cond в символьной таблице
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] B_GetAllInfosCondFuncByNpc[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//return array of symbolIndex
[/I][/COLOR][COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=Gray][I]//Получаем длину массива всех диалогов НПС npcInstance
[/I][/COLOR]	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_adr[COLOR=#AAAA00];[/COLOR]	arr_adr [COLOR=Maroon]=[/COLOR] B_GetAllInfosByNPC[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] zCArray arr[COLOR=#AAAA00];[/COLOR]	arr [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_length[COLOR=#AAAA00];[/COLOR]	arr_length [COLOR=Maroon]=[/COLOR] arr[COLOR=#AAAA00].[/COLOR]numInArray[COLOR=#AAAA00];[/COLOR]
	[COLOR=Gray][I]//Делаем массив (символ_индексов функций условий диалогов) = массиву всех диалогов
[/I][/COLOR]	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arrFuncCond[COLOR=#AAAA00];[/COLOR]	arrFuncCond [COLOR=Maroon]=[/COLOR] MEM_ArrayCreate[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]	
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] info_Ptr[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] oCInfo info[COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] i[COLOR=#AAAA00];[/COLOR] i [COLOR=Maroon]=[/COLOR]0[COLOR=#AAAA00];[/COLOR]
	
	while[COLOR=#0080C0][B]([/B][/COLOR]arr_length[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		info_Ptr [COLOR=Maroon]=[/COLOR] MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		info [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]info_ptr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		MEM_ArrayInsert[COLOR=#0080C0][B]([/B][/COLOR]arrFuncCond[COLOR=#AAAA00],[/COLOR]info[COLOR=#AAAA00].[/COLOR]conditions[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		arr_length [COLOR=Maroon]-[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
		i [COLOR=Maroon]+[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
	end[COLOR=#AAAA00];[/COLOR]
	
	[COLOR=#0683FF]return[/COLOR] arrFuncCond[COLOR=#AAAA00];[/COLOR]	[COLOR=Gray][I]//array of of symbolIndex all 'dia_xxx_cond' functions
[/I][/COLOR][COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]/////Функция, возвращающая всегда TRUE - идет на подмену всех функций 'dia_xxx_cond'
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]string[/COLOR] INFO_allwaysTRUE_COND_NAME [COLOR=Maroon]=[/COLOR] [COLOR=Black][I]"INFO_allwaysTRUE_COND"[/I][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] INFO_allwaysTRUE_COND[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=#0080C0][B]{[/B][/COLOR]	[COLOR=#0683FF]return[/COLOR] [COLOR=#FF8080]TRUE[/COLOR][COLOR=#AAAA00];[/COLOR][COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]int[/COLOR] _get_INFO_TRUE_COND_symbolindex[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=#0080C0][B]{[/B][/COLOR]	[COLOR=#0683FF]return[/COLOR] MEM_GetSymbolIndex[COLOR=#0080C0][B]([/B][/COLOR]INFO_allwaysTRUE_COND_NAME[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]	[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]//Устанавливаем условия всех диалогов в TRUE
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]void[/COLOR] B_SetAllInfosCond_asTRUE[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR]
[COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]!ARR_oCInfosFunc_ADR[COLOR=#FF4AA5][B])[/B][/COLOR]
	[COLOR=#0080C0][B]{[/B][/COLOR]
		ARR_oCInfosFunc_ADR [COLOR=Maroon]=[/COLOR] B_GetAllInfosCondFuncByNpc[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_adr[COLOR=#AAAA00];[/COLOR]	arr_adr [COLOR=Maroon]=[/COLOR] B_GetAllInfosByNpc[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] zCArray arr[COLOR=#AAAA00];[/COLOR]	arr [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_length[COLOR=#AAAA00];[/COLOR]  arr_length [COLOR=Maroon]=[/COLOR] arr[COLOR=#AAAA00].[/COLOR]numInArray[COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] oCInfo oCInfo_inst[COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] i[COLOR=#AAAA00];[/COLOR] i[COLOR=Maroon]=[/COLOR]0[COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]string[/COLOR] info_description[COLOR=#AAAA00];[/COLOR]	info_description[COLOR=Maroon]=[/COLOR][COLOR=Black][I]""[/I][/COLOR][COLOR=#AAAA00];[/COLOR]
		
		while[COLOR=#0080C0][B]([/B][/COLOR]arr_length[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			oCInfo_inst [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			info_description [COLOR=Maroon]=[/COLOR] oCInfo_inst[COLOR=#AAAA00].[/COLOR]description[COLOR=#AAAA00];[/COLOR]
			[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]oCInfo_InfoConditions[COLOR=#0080C0][B]([/B][/COLOR]MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//Если для диалога выполняется условие
[/I][/COLOR]			[COLOR=#0080C0][B]{[/B][/COLOR]
				[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]oCInfo_inst[COLOR=#AAAA00].[/COLOR]told [COLOR=Green]&&[/COLOR] !oCInfo_inst[COLOR=#AAAA00].[/COLOR]permanent[COLOR=#FF4AA5][B])[/B][/COLOR]
				[COLOR=#0080C0][B]{[/B][/COLOR]
					info_description [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]ConcatStrings[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%//уже прослушано и ушло."[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
				[COLOR=#FF4AA5][B]}[/B][/COLOR]
				[COLOR=#0683FF]else[/COLOR] [COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]oCInfo_inst[COLOR=#AAAA00].[/COLOR]told [COLOR=Green]&&[/COLOR] oCInfo_inst[COLOR=#AAAA00].[/COLOR]permanent[COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//НЕВОЗМОЖНЫЙ ВАРИАНТ!
[/I][/COLOR]				[COLOR=#0080C0][B]{[/B][/COLOR]
					info_description [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]ConcatStrings[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%//уже прослушано, но постоянный"[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
				[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			[COLOR=#FF4AA5][B]}[/B][/COLOR]
			[COLOR=#0683FF]else[/COLOR] [COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]!oCInfo_InfoConditions[COLOR=#0080C0][B]([/B][/COLOR]MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]	[COLOR=Gray][I]//Если для диалога НЕ выполняется условие
[/I][/COLOR]			[COLOR=#0080C0][B]{[/B][/COLOR]
				[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]oCInfo_inst[COLOR=#AAAA00].[/COLOR]told [COLOR=Green]&&[/COLOR] !oCInfo_inst[COLOR=#AAAA00].[/COLOR]permanent[COLOR=#FF4AA5][B])[/B][/COLOR]
				[COLOR=#0080C0][B]{[/B][/COLOR]
					info_description [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]ConcatStrings[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%//уже прослушано, не постоянный и не выполняется условие."[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
				[COLOR=#FF4AA5][B]}[/B][/COLOR]
				[COLOR=#0683FF]else[/COLOR] [COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]oCInfo_inst[COLOR=#AAAA00].[/COLOR]told [COLOR=Green]&&[/COLOR] oCInfo_inst[COLOR=#AAAA00].[/COLOR]permanent[COLOR=#FF4AA5][B])[/B][/COLOR]
				[COLOR=#0080C0][B]{[/B][/COLOR]
					info_description [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]ConcatStrings[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%//уже прослушано, постоянный и не выполняется условие"[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
				[COLOR=#FF4AA5][B]}[/B][/COLOR]
				[COLOR=#0683FF]else[/COLOR] [COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]!oCInfo_inst[COLOR=#AAAA00].[/COLOR]told [COLOR=Green]&&[/COLOR] !oCInfo_inst[COLOR=#AAAA00].[/COLOR]permanent[COLOR=#FF4AA5][B])[/B][/COLOR]
				[COLOR=#0080C0][B]{[/B][/COLOR]
					info_description [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]ConcatStrings[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%//не прослушано, не постоянный и не выполняется условие"[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
				[COLOR=#FF4AA5][B]}[/B][/COLOR]
				[COLOR=#0683FF]else[/COLOR] [COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]!oCInfo_inst[COLOR=#AAAA00].[/COLOR]told [COLOR=Green]&&[/COLOR] oCInfo_inst[COLOR=#AAAA00].[/COLOR]permanent[COLOR=#FF4AA5][B])[/B][/COLOR]
				[COLOR=#0080C0][B]{[/B][/COLOR]
					info_description [COLOR=Maroon]=[/COLOR] [COLOR=#FFAE40][B]ConcatStrings[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%//не прослушано, постоянный и не выполняется условие"[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
				[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			oCInfo_inst[COLOR=#AAAA00].[/COLOR]description [COLOR=Maroon]=[/COLOR] info_description[COLOR=#AAAA00];[/COLOR]
			oCInfo_inst[COLOR=#AAAA00].[/COLOR]conditions [COLOR=Maroon]=[/COLOR] _get_INFO_TRUE_COND_symbolindex[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			
			arr_length [COLOR=Maroon]-[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
			i [COLOR=Maroon]+[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
		end[COLOR=#AAAA00];[/COLOR]
		
		DialogManager__UpdateInfos[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#FF4AA5][B]}[/B][/COLOR]
	[COLOR=#0683FF]else[/COLOR]
	[COLOR=#0080C0][B]{[/B][/COLOR]
		MEM_Error[COLOR=#0080C0][B]([/B][/COLOR][COLOR=Black][I]"Массив для восстановления условий диалогов уже существует. Необходимо затереть на него ссылку, прежде."[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]//Возвращаем все условия диалогов на место
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]void[/COLOR] B_RestoreAllInfosCond[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] npcInstance[COLOR=#AAAA00],[/COLOR][COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arrCondFunc[COLOR=#FF4AA5][B])[/B][/COLOR]
[COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]ARR_oCInfosFunc_ADR[COLOR=#FF4AA5][B])[/B][/COLOR]
	[COLOR=#0080C0][B]{[/B][/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_adr[COLOR=#AAAA00];[/COLOR] [COLOR=#0683FF]var[/COLOR] zCArray arr[COLOR=#AAAA00];[/COLOR]
		arr_adr [COLOR=Maroon]=[/COLOR] B_GetAllInfosByNpc[COLOR=#0080C0][B]([/B][/COLOR]npcInstance[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		arr [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] arr_length[COLOR=#AAAA00];[/COLOR]  arr_length [COLOR=Maroon]=[/COLOR] arr[COLOR=#AAAA00].[/COLOR]numInArray[COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] oCInfo oCInfo_inst[COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] i[COLOR=#AAAA00];[/COLOR] i[COLOR=Maroon]=[/COLOR]0[COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]string[/COLOR] info_description[COLOR=#AAAA00];[/COLOR]	info_description[COLOR=Maroon]=[/COLOR][COLOR=Black][I]""[/I][/COLOR][COLOR=#AAAA00];[/COLOR]
		
		while[COLOR=#0080C0][B]([/B][/COLOR]arr_length[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			oCInfo_inst [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arr_adr[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			info_description [COLOR=Maroon]=[/COLOR] oCInfo_inst[COLOR=#AAAA00].[/COLOR]description[COLOR=#AAAA00];[/COLOR]
			info_description [COLOR=Maroon]=[/COLOR] STR_Split[COLOR=#0080C0][B]([/B][/COLOR]info_description[COLOR=#AAAA00],[/COLOR][COLOR=Black][I]"%"[/I][/COLOR][COLOR=#AAAA00],[/COLOR]0[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			oCInfo_inst[COLOR=#AAAA00].[/COLOR]description [COLOR=Maroon]=[/COLOR] info_description[COLOR=#AAAA00];[/COLOR]
			oCInfo_inst[COLOR=#AAAA00].[/COLOR]conditions [COLOR=Maroon]=[/COLOR] MEM_ArrayRead[COLOR=#0080C0][B]([/B][/COLOR]arrCondFunc[COLOR=#AAAA00],[/COLOR]i[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
			arr_length [COLOR=Maroon]-[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
			i [COLOR=Maroon]+[/COLOR][COLOR=Maroon]=[/COLOR] 1[COLOR=#AAAA00];[/COLOR]
		end[COLOR=#AAAA00];[/COLOR]
		MEM_ArrayFree[COLOR=#0080C0][B]([/B][/COLOR]ARR_oCInfosFunc_ADR[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		ARR_oCInfosFunc_ADR [COLOR=Maroon]=[/COLOR] 0[COLOR=#AAAA00];[/COLOR]
		DialogManager__UpdateInfos[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#FF4AA5][B]}[/B][/COLOR]
	[COLOR=#0683FF]else[/COLOR]
	[COLOR=#0080C0][B]{[/B][/COLOR]
		MEM_Warn[COLOR=#0080C0][B]([/B][/COLOR][COLOR=Black][I]"Отсутствует массив для восстановления условий диалогов. Вероятно он был затёрт."[/I][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=Gray][I]//
[/I][/COLOR][COLOR=Gray][I]//--Функция вызывается в цикле (у нас в ds_time)
[/I][/COLOR][COLOR=Gray][I]//При нажатии клавиш Info_DeblockKey_1 и Info_DeblockKey_2 все диалоги покажутся
[/I][/COLOR][COLOR=Gray][I]//При нажатии клавиши Info_BlockKey_1 всё восстановится по умолчанию.
[/I][/COLOR][COLOR=Gray][I]//!!!!Эти действия производить в рамках одного НПС и в течение одной сессии игры.!!!!
[/I][/COLOR][COLOR=Gray][I]//
[/I][/COLOR][COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] Info_DeblockKey_1 [COLOR=Maroon]=[/COLOR] KEY_LEFTARROW[COLOR=#AAAA00];[/COLOR]		[COLOR=Gray][I]// -->> DarkSaga2.ini
[/I][/COLOR][COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] Info_DeblockKey_2 [COLOR=Maroon]=[/COLOR] KEY_RIGHTARROW[COLOR=#AAAA00];[/COLOR]	[COLOR=Gray][I]// -->> DarkSaga2.ini
[/I][/COLOR][COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]int[/COLOR] Info_BlockKey_1 [COLOR=Maroon]=[/COLOR] KEY_TAB[COLOR=#AAAA00];[/COLOR]							[COLOR=Gray][I]// -->> DarkSaga2.ini
[/I][/COLOR][COLOR=#0683FF]const[/COLOR] [COLOR=#0683FF]string[/COLOR] Info_DeblockKey_Comb [COLOR=Maroon]=[/COLOR] [COLOR=Black][I]"AND"[/I][/COLOR][COLOR=#AAAA00];[/COLOR]

[COLOR=#0683FF]func[/COLOR] [COLOR=#0683FF]void[/COLOR] B_DSG_DeblockAllInfos[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]
[COLOR=#0080C0][B]{[/B][/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] LeftArrow[COLOR=#AAAA00];[/COLOR]		LeftArrow [COLOR=Maroon]=[/COLOR] MEM_KeyState[COLOR=#0080C0][B]([/B][/COLOR]Info_DeblockKey_1[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] RightArrow[COLOR=#AAAA00];[/COLOR]	RightArrow [COLOR=Maroon]=[/COLOR] MEM_KeyState[COLOR=#0080C0][B]([/B][/COLOR]Info_DeblockKey_2[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#0683FF]var[/COLOR] [COLOR=#0683FF]int[/COLOR] TabKey[COLOR=#AAAA00];[/COLOR]				TabKey [COLOR=Maroon]=[/COLOR] MEM_KeyState[COLOR=#0080C0][B]([/B][/COLOR]Info_BlockKey_1[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=Gray][I]//В(ы)ключаем деблокировочный ключ, который активирует все диалоги у НПС.
[/I][/COLOR]	[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR][COLOR=Purple]hero[/COLOR][COLOR=#AAAA00].[/COLOR][COLOR=Purple]aivar[/COLOR][COLOR=#0080C0][B][[/B][/COLOR][COLOR=#FF8080]AIV_INVINCIBLE[/COLOR][COLOR=#FF4AA5][B]][/B][/COLOR] [COLOR=Green]==[/COLOR] [COLOR=#FF8080]TRUE[/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]
	[COLOR=#0080C0][B]{[/B][/COLOR]
		[COLOR=#0683FF]var[/COLOR] oCNpc npc[COLOR=#AAAA00];[/COLOR] npc [COLOR=Maroon]=[/COLOR] _^[COLOR=#0080C0][B]([/B][/COLOR]MEM_InformationMan[COLOR=#AAAA00].[/COLOR]npc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]LeftArrow [COLOR=Green]==[/COLOR] KEY_PRESSED[COLOR=#FF4AA5][B])[/B][/COLOR] [COLOR=Green]&&[/COLOR] [COLOR=#0080C0][B]([/B][/COLOR]RightArrow [COLOR=Green]==[/COLOR] KEY_PRESSED[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR]
		[COLOR=#0080C0][B]{[/B][/COLOR]
			B_SetAllInfosCond_asTRUE[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FFAE40][B]Hlp_GetInstanceID[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]npc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#0683FF]if[/COLOR][COLOR=#0080C0][B]([/B][/COLOR]TabKey [COLOR=Green]==[/COLOR] KEY_PRESSED[COLOR=#FF4AA5][B])[/B][/COLOR]
		[COLOR=#0080C0][B]{[/B][/COLOR]
			B_RestoreAllInfosCond[COLOR=#0080C0][B]([/B][/COLOR][COLOR=#FFAE40][B]Hlp_GetInstanceID[/B][/COLOR][COLOR=#0080C0][B]([/B][/COLOR]npc[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00],[/COLOR]ARR_oCInfosFunc_ADR[COLOR=#FF4AA5][B])[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
		[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
	[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
[COLOR=#FF4AA5][B]}[/B][/COLOR][COLOR=#AAAA00];[/COLOR]
 

Дикус

Готоман
Регистрация
12 Дек 2015
Сообщения
11
Репутация
0
Делал телекинез. Где накосячил?

Файлы spell_telekinesis и Spell_ProcessMana_Release

https://yadi.sk/d/G-ijEs6DwF39R

Вот какой косяк:

https://yadi.sk/i/e6Nln76fwF29Z

Если добавляю в Spell_ProcessMana

PHP:
if(activespell == SPL_TELEKINESIS)
	{
		return spell_logic_telekinesis(manainvested);
	};

то игра вообще вылетает при попытке использовать заклинание.
 

НастасьСанна

Профессор скриптологии
Регистрация
10 Дек 2012
Сообщения
360
Репутация
442
Адрес
Самара
Делал телекинез. Где накосячил?
У тебя есть инстанция oCItem_Telekinesis, в которой должен быть записан предмет, который надо двигать. А ты его туда нигде не записываешь.
Вот это не сработает:
Код:
		var int temp;
		temp = oCItem_Telekinesis;
		MEM_AssignInst(temp, Npc.focus_vob);
Надо либо:
Код:
		MEM_AssignInst(oCItem_Telekinesis, Npc.focus_vob);
Либо:
Код:
		oCItem_Telekinesis = MEM_PrtToInst(Npc.focus_vob);
 

Дикус

Готоман
Регистрация
12 Дек 2015
Сообщения
11
Репутация
0
А Spell_ProcessMana не трогать, как я понимаю?

Что-то совсем запутался.

1. Сначала заменил

PHP:
                var int temp;
		temp = oCItem_Telekinesis;
		MEM_AssignInst(temp, Npc.focus_vob);

на

PHP:
MEM_AssignInst(oCItem_Telekinesis, Npc.focus_vob);

Получил тот же результат.

2. Заменил на

PHP:
oCItem_Telekinesis = MEM_PrtToInst(Npc.focus_vob);

Получил ошибку: Неопределенная функция MEM_PRTTOINST
 
Последнее редактирование модератором:

Дикус

Готоман
Регистрация
12 Дек 2015
Сообщения
11
Репутация
0
Может из-за компиляции GS 3.15?
 

Дикус

Готоман
Регистрация
12 Дек 2015
Сообщения
11
Репутация
0
Хм... А можно как-то декомпилировать то, что создано с использованием Икаруса и Лего? GS бессилен.
 

kazus23

Гражданин
Регистрация
30 Янв 2011
Сообщения
38
Репутация
11
Адрес
Санкт-Петербург
Хм... А можно как-то декомпилировать то, что создано с использованием Икаруса и Лего? GS бессилен.
Нет, нельзя, понадобятся исходники от авторов мода. Можно только путём сложных подстановок скопилировать подобный проект. И то на версии 3.15.
 
Сверху Снизу