                            Evil Islands Addon library
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
                           Что нового в последней версии
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    [!] - Важное замечание!
    [*] - Изменение.
    [-] - Исправлена ошибка.
    [+] - Нововведение.

    ---------------------------------------------------------------------------
     Версия: 0.11.0.0                                       [26.10.2020 03:00]
    ---------------------------------------------------------------------------
    [+] Улучшены некоторые скриптовые команды:
        1.  Улучшена функция GetUnitExp(unit: object) : float
            Добавлен опциональный аргумент для указания типа опыта:
            GetUnitExp(unit: object, exp_type: string) : float
            Доступные типы опыта:
            - "max" - максимальный полученный юнитом опыт.
                От него рассчитывается максимальное количество здоровья и маны.
                Используется по-умолчанию (когда тип не указан).
            - "spent" - опыт, потраченный юнитом на навыки/перки
            - "penalty" - размер штрафа за смерть (отрицательное число).
                Пока он не станет равным 0, здоровье и мана у игрока не будут расти.
            - "real" - опыт, отображаемый в магазине. Вычисляется как max + penalty
        2.  Новый опциональный аргумент для функции FloatToStr
            В дополнение к существующей функции доступен новый вариант:
            FloatToStr(num: float, digits: float) : string, где digits - число знаков после точки.
        3.  Улучшены команды Say и ConsoleStringb>
            Теперь они могут принимать сколько угодно строк, которые будут объединены в одну строку
            перед выводом в консоль/на экран.
    [+] Добавлены новые скриптовые функции:
        1.  GiveUnitExp(unit: object, exp: float)
            Выдать exp опыта юниту unit.
        2.  GetDexterity(unit: object): float
            Возвращает ловкость юнита unit.
        3.  GetIntelligence(unit: object): float
            Возвращает разум юнита unit.
        4.  GetStrength(unit: object): float
            Возвращает силу юнита unit.
        5.  GetActions(unit: object): float
            Возвращает действия юнита unit с учётом эффектов заклинаний (бафов).
        6.  GetActionsBase(unit: object): float
            Возвращает действия юнита unit без учёта эффектов заклинаний (бафов).
        7.  GetSkill(unit: object, skill: string): float
            Возвращает навык skill юнита unit.
            Доступные навыки: "science", "melee", "archery", "elemental", "sense", "astral".
        8.  GetEncumbrance(unit: object): float
            Возвращает текущую нагрузку юнита unit.
        9.  GetMaxEncumbrance(unit: object): float
            Возвращает максимальную нагрузку юнита unit.
        10. GetPerk(unit: object, perk: string): float
            Возвращает уровень прокачки перка perk у юнита unit.
            Доступные перки: "sword", "axe", "dagger", "hammer", "bow", "crossbow", "fire",
              "lightning", "acid", "illusion", "divination", "enchantments", "healing",
              "domination", "infra", "health", "mana", "vitality", "spirit", "quickness",
              "lift", "quickness", "backstab", "strength", "dexterity", "intelligence".
        11. GetPrototype(unit: object): string
            Возвращает строку с именем прототипа юнита unit.
        12. GetRace(unit: object): string
            Возвращает строку с именем расы юнита unit.
        13. RandObj(grp: group): object
            Возвращает случайный объект из группы grp.
        14. GameOver()
            Завершить одиночную игру с сообщением о гибели главного героя.
        15. GameOver(title: string, message: string): object
            Завершить одиночную игру с указанными строками для заголовка окна и сообщения.
            Эти строки используются для поиска соответствующего файла с текстом в архиве texts.res.
            Например, текст для заголовка окна ищется в texts.res с именем файла "string _заголовок_".
    [+] Добавлены новые консольные команды:
        1.  Команда nogui 1, которая позволяет отключить элементы интерфейса в игровой зоне.
            А также nogui 2 - которая в добавок к интерфейсу отключает так же курсор и nogui 0,
            которая включает интерфейс и курсор обратно.
        2.  Читерская команда drawall 1, которая включает отображение всех юнитов на карте.
            Полезна для разработчиков модов.
    [+] Различные улучшения для возможности запуска ЗвА в качестве мода:
        1.  Добавлена поддержка загрузочных экранов из ЗвА.
        2.  Добавлена возможность загрузки библиотеки binkw32.dll из папки мода.
        3.  Добавлены скриптовые команды GameOver и GameOverMSG (см. выше).

    [-] Исправлено несколько ошибок связанных с поддержкой широкоформатных дисплеев.
        Теперь поддержка широкоформатных дисплеев включена по-умолчанию.
    [-] Исправлена ошибка скриптовой команды GiveUnitExp, из-за которой не отображалось
        количество полученного опыта.
    [-] Исправлены различные ошибки оригинального движка, связанные с накоплением эффектов
        от заклинаний (бафов).
    [-] Исправлена ошибка проверки навыка ловкости рук, необходимого для открытия замков,
        из-за которой навык ловкости рук требовался даже для замков с нулевым требованием к навыку.

    ---------------------------------------------------------------------------
     Версия: 0.10.3.0                                       [07.09.2020 02:40]
    ---------------------------------------------------------------------------
    [+] Добавлены новые скриптовые функции:
        1.  Random(min: float, max: float): float
            Возвращает случайное число в диапазоне от min до max. Новая функция является альтернативой
            оригинальной функции Random(max), которая будет продолжать работать, как и раньше.
        2.  RandStr(a: string, b: string, ...): string
            Возвращает случайным образом одну из переданных строк a, b, ...
        3.  SendCurrentParty(nPlayer: float)
            Отправить пользователю игрока с номером nPlayer его текущую партию. Другими словами,
            в сетевой игре, принудительно сохраняет на диск персонажа указанного игрока.
        4.  Loot(nPlayer: float, unit: object)
            Собрать труп мёртвого юнита unit в обоз игрока с номером nPlayer.
        5.  PlayerExists(nPlayer: float): float
            Возвращает 1, если игрок с номером nPlayer существует и 0 в противном случае.
        6.  Max(a: float, b: float, ...): float
            Возвращает максимальное число из аргументов a, b, ...
        7.  Min(a: float, b: float, ...): float
            Возвращает минимальное число из аргументов a, b, ...
        8.  Abs(num: float): float
            Возвращает абсолютное по модулю значение числа num.
        9.  Round(num: float): float
            Округляет число num до ближайшего целого числа. Например, 3.7 -> 4, 3.2 -> 3.
        10. Ceil(num: float)
            Округляет число num до ближайшего большего целого числа. Например, 3.7 -> 4.
        11. Floor(num: float)
            Округляет число num до ближайшего меньшего целого числа. Например, 3.7 -> 3.
        12. StrHas(str: string, substr: string): float
            Возвращает 1, если строка str содержит в себе подстроку substr и 0 в противном случае.
        13. StrMid(str: string, pos: float, len: float"): string
            Возвращает подстроку str с позиции pos и длиной len. Если позиция pos отрицательная, то
            считается позицией с конца строки. Если длина len равна 0, то функция возвращает подстроку
            с позиции pos и до конца строки str.
        14. StrLower(str: string): string
            Возвращает строку, состоящую из символов строки str в нижнем регистре.
        15. StrUpper(str: string): string
            Возвращает строку, состоящую из символов строки str в верхнем регистре.
    [+] Улучшена консоль игры:
        1.  Добавлена поддержка хоткеев: ctrl+A, ctrl+C, ctrl+V, ctrl+X
        2.  Немного улучшена история команд, чтобы избежать её замусоривания одними и теми же командами

    [*] Удалена скриптовая функций Eval в связи с тем, что от неё крайне
        мало пользы, но есть несколько потенциальных проблем. Возможно, в будущем появится её более полезный аналог

    [-] Исправлена баг, из-за которой удаляются настройки клавиатуры при проверке скриптов
    [-] Исправлена баг проверки минимальной версии аддона
        Для того, чтобы избежать этой ошибки, настоятельно рекомендуется указывать полную версию
        аддона (4 числа: AddonVersion=0.10.3.0)
    [-] Исправлен баг, из-за которого происходил вылет игры при использовании новых скриптовых
        функций GSGetPlayerVar/GSSetPlayerVar, если указан номер несуществующего
        игрока (аргумент nPlayer)
    [-] Немного доработан фикс бага скриптового движка игры, связанного с обработкой переменных,
        начало имён которых совпадает с именем какой-либо функции: например, round#1: object

    ---------------------------------------------------------------------------
     Версия: 0.10.0.0                                       [02.08.2020 21:30]
    ---------------------------------------------------------------------------
    [+] Добавлены настройки для ai.reg:
        [Addon]
        AttackAnimSpeed=1                 - Включить динамическую скорость анимации атаки и каста.
        NewRunes=1                        - Включить поддержку новых типов рун.
        UsePrototypeActionsForMobAttack=1 - Использовать параметр действий из прототипа юнита для атаки моба.
        UsePrototypeActionsForMobCast=1   - Использовать параметр действий из прототипа юнита для каста моба.
        FastTeleport=1                    - Уменьшить минимальную длительность каста с 30 до 1 игровых секунд.
        DisableCrippledHL=1               - Отключить ломание конечностей.
        UnlockExperimentalSpell=1         - Разблокировать экспериментальные заклинания.
    [+] Добавлены новые скриптовые функции:
        1.  Eval(script: string, count: float)
            Выполнить строку script, в качестве скрипта. В script используются одинарная кавычка
            вместо двойной для записи строк. Пример script: "ConsoleString('Hello!')".
        2.  GSSetPlayerVar(nPlayer: float, name: string, value: float)
            Установить значение переменной для конкретного игрока nPlayer. Имеет смысл только для
            сетевой игры, т.к. в одиночной игре она эквивалентна команде GSSetVar.
            В сетевой игре переменные, создаваемые командой GSSetVar общие для всех игроков.
        3.  GSGetPlayerVar(nPlayer: float, name: string) : float
            Возвращает значение переменной, установленной командой GSSetPlayerVar.
        4.  GiveExp(nPlayer: float, exp: float)
            Выдать опыт игроку с номером nPlayer. Если игрока с таким номером нет (например, -1),
            то опыт выдаётся всем игрокам в пропорциях аналогичным стандартной выдаче опыта
            при убийстве монстра.
        5.  StartCameraSave(path: string)
            Начать запись движений камеры в файл path.
        6.  StopCameraSave()
            Завершить запись движения камеры.
        7.  Say(message: string)
            Написать сообщение message в чат.
        8.  And(a: float, b: float, ...) : float
            Логическое "И". Возвращает 1, если все аргументы равны 1. Иначе возвращает 0.
        9.  Or(a: float, b: float, ...) : float
            Логическое "ИЛИ". Возвращает 1, если хотя бы один аргумент равен 1. Иначе возвращает 0.
    [+] Из EI Plugin перенесено исправление номеров игроков, которое позволяет многим скриптам указывать
        отличное от 0 значение. Т.е. nPlayer в параметрах функций - реальный номер игрока.
        Чтобы получить номер игрока, используйте GetPlayerOfUnit. Важно учитывать, что этот номер
        может меняться в течении игры (например, при заходе/выходе игроков на карту).
    [+] Так же из EI Plugin перенесены новые скриптовые функции:
        1.  GetPlayerOfUnit(unit: object) : float
            Возвращает номер плеера для юнита, если имеется. Для всех бесплеерных юнитов возвращает 0
        2.  GetUnitExp(unit: object) : float
            Возвращает общий опыт юнита, полученный за всё время игры
        3.  GetArmor(unit: object, part: float, id: float) : float
            Возвращает броню юнита.
            part - часть тела: 0 (голова), 1 (торс), 2 (л.рука), 3 (п.рука), 4 (л.нога), 5 (п.нога), -1 (общая броня)
            id - тип брони: 0 (impaling), 1 (slashing), 2 (crushing), 3 (termical), 4 (chemical), 5 (electrical), 6 (general)
        4.  GetObjectStringID(object) : string
            Возвращает ID объекта в виде строки
        5.  FloatToStr(float) : string
            Перевести число в строку
        6.  StrToFloat(string) : float
            Перевести строку в число
        7.  StrCat(string, string, ...) : string
            Объеденить две и более строк в одну
        8.  StrLen(string) : float
            Длина строки
        9.  Sin(float) : float
            Синус
        10. Cos(float) : float
            Косинус
        11. Pow(base : float, pow : float) : float
            Возвести число в степень (основание ^ степень)
        12. DistancePointPoint(x1: float, y1: float, x2: float, y2: float) : float
            Возвращает расстояние между точками
        13. NearestUnit(x: float, y: float, r: float, flags: float) : object
            Ближайший к точке (x,y) юнит. Поиск ведется в радиусе r
            Если flags = 1, то учитываются одушевленные объекты (люди, монстры и т.д.)
            Если flags = 2, то учитываются неодушевленные объекты (дома, деревья и т.д.)
            Если flags = 3, то учитывается все объекты
        14. UnitsNearPoint(x: float, y: float, r: float, flags: float) : group
            Получить список юнитов возле точки. Правила аргументов как для NearestUnit.
    [+] Изменено несколько существующих скриптовых функций:
        1.  Add(a: float, b: float, ...) : float
            В отличие от оригинальной функции Add, поддерживает более двух аргументов.
        2.  Mul(a: float, b: float, ...) : float
            В отличие от оригинальной функции Mul, поддерживает более двух аргументов.
    [+] Добавлена возможность сохранять переменные (GS vars) в файле персонажа сетевой игры (.mp-файл).
        Для работы с такими переменными нужно использовать функции GSSetPlayerVar/GSGetPlayerVar.
        Сохраняются только те переменные, имя которых начинается с "gvar.".
    [+] Добавлено несколько новых консольных команд:
        1.  execs - запуск указанного скрипта из указанного текстового файла.
            Разница с командой @AddMob("...") в простоте (не нужно создавать .mob-файл ради скрипта) и
            в возможности запускать скрипт несколько раз (.mob-файл можно добавить только один раз)
        2.  listgvar - выводит список глобальных переменных (GlobalVars)
    [+] Добавлена поддержка аргументов командной строки и команда для проверки скриптов на наличие ошибок.
        Для удобства работы с командной строкой аддона добавлен скрипт addon.bat.
        Если с его помощью открыть .mob-файл, то скрипт в файле будет проверен на ошибки.

    [-] Исправлены несколько багов скриптового движка игры:
        1.  Баг циклов For и ForIf, в которых было невозможно использовать аргументы скрипта
        2.  Баг обработки переменных, начало имён которых совпадает с именем какой-либо функции: например, caster: object
        3.  Баг функции ResetTarget, из-за которого игра завершалась с ошибкой
        4.  Баг, из-за которого не работали скрипты в главном меню игры
    [-] Исправлен баг игры, из-за которого было возможно открывать сундуки при недостаточных характеристиках персонажа
    [-] Исправлен баг аддона с загрузкой .mob-файлов мода из папок с нестандартными атрибутами

    ---------------------------------------------------------------------------
     Версия: 0.9.0.0                                        [07.06.2019 21:00]
    ---------------------------------------------------------------------------
    [+] Добавлена экспериментальная поддержка широго экрана
        Параметр WideScreen, 1 - включен, 0 - выключен. По-умолчанию равен 0
    [+] Добавлена настройка дальности отрисовки объектов
        Параметр ObjectsDrawRadius, от 1 до бесконечности. По-умолчанию равен 100
    [+] Добавлена настройка дальности отрисовки ландшафта
        Параметр LandscapeDrawRadius, от 1 до бесконечности. По-умолчанию равен 100

    [!] Перечисленные параметры находятся в ключе реестра:
        HKCU\Software\Gipat.Ru\EI_Starter\Settings

    ---------------------------------------------------------------------------
     Версия: 0.8.0.0                                        [23.03.2019 21:12]
    ---------------------------------------------------------------------------
    [+] Экспериментальная функция автоматического бэкапа персонажа в случае вылета игры
        Если игра завершилась с ошибкой, addon попытается сохранить персонажа в папку mp\backup
        N.mp - основной сейв, lootall-N.mp - вместе с персонажем сохраняется весь лут на карте
    [+] В случае падения игры сохраняется дамп памяти процесса, который поможет найти баг
    [+] Добавлено логирование (addon.log) + логирование срабатывания патчей
    [+] Добавлена настройка для config.reg:
        [MOD]
        AddonVersion=A.B.C.D    - Задать минимальную версию addon.dll, необходимую для запуска мода.
                                  Например, 0.8.0.0. Или короче: 0.8.

    [*] Множество внутренних изменений (рефакторинг)

    [-] Исправлен баг, из-за которого в игре мог пропадать звук

    ---------------------------------------------------------------------------
     Версия: 0.7.0.16                                       [21.01.2019 1:41]
    ---------------------------------------------------------------------------
    [+] Добавлены настройки для ai.reg:
        [Addon]
        ShowAllQuests=1    - Показывать все квесты, а не один радомный на зону.

    [-] Различные мелкие фиксы.

    ---------------------------------------------------------------------------
     Версия: 0.7.0.15                                       [31.12.2018 13:30]
    ---------------------------------------------------------------------------
    [+] Добавлены настройки для ai.reg:
        [Addon]
        DistanceModifier=1 - Отключить моддификатор расстояния при вычислении аттаки.
        WeightBonus=1      - Отключить бонус веса при вычислении аттаки.

    [-] Исправлен серьезный баг, приводивший к вылетам игры в произвольные моменты времени.

    ---------------------------------------------------------------------------
     Версия: 0.7.0.14                                       [01.01.2015 14:39]
    ---------------------------------------------------------------------------
    [+] Добавлена поодержка binkw32.dll из ЗвА (нужно скопировать этот файл в папку стартера).
    [+] Добавлена возможность переопределить файлы config/lights*.ini.
    [+] Добавлены настройки для ai.reg:
        [AddonExp]
        Limit=N               - Установить ограничение максимального размера опыта.

        [Addon]
        MagicRandom=0...1     - Значение рандомизации магического урона (от 0 до 1 - доля от эффекта).
        AllowMagicNegative=1  - Разрешить отрицательный урон магии.
        DeagrPlayerOnLoose=1  - Игрок перестаёт гнаться за противниками вне зоны видимости.
        DisableRunaway=1      - Запретить уворачиваться от удара.
        ArchersDefence=1      - Включить защиту лучникам.

    [-] Убрано ограничение на число .mob файлов в папке maps.
    [-] Исправлена ошибка, из-за которой addon.dll всегда писал логи и замедлял игру.

    ---------------------------------------------------------------------------
     Версия: 0.7.0.13                                       [27.11.2007 01:15]
    ---------------------------------------------------------------------------
    [-] Исправлен порядок просмотра перехвата figures.res. В первую очередь просматривается figures.res из папки мода.

    ---------------------------------------------------------------------------
     Версия: 0.7.0.12                                       [21.12.2005 09:35]
    ---------------------------------------------------------------------------
    [-] В некоторых ситуациях файл speech.res не перехватывался.

    ---------------------------------------------------------------------------
     Версия: 0.7.0.11                                       [07.12.2005 02:38]
    ---------------------------------------------------------------------------
    [-] Следующие файлы подключались не полностью: Figures.res, Textures.res,
                                                   Redress.res и Menus.Res

    ---------------------------------------------------------------------------
     Версия: 0.7.0.10                                       [27.11.2005 00:08]
    ---------------------------------------------------------------------------
    [-] При использовании GameDebugFile в файле настроек мода - игра
        не запускалась. Ошибка появилась с версии 0.7.0.6

    ---------------------------------------------------------------------------
     Версия: 0.7.0.9                                        [11.11.2005 00:27]
    ---------------------------------------------------------------------------
    [-] Игра не производила поиск файлов "pers *" в ресурсах мода.
        Из-за этой ошибки у новых персонажей отсутствовали имена.

    ---------------------------------------------------------------------------
     Версия: 0.7.0.8                                        [31.10.2005 06:54]
    ---------------------------------------------------------------------------
    [+] Реализована совместимость с Английской и Немецкой версией game.exe

    ---------------------------------------------------------------------------
     Версия: 0.7.0.7                                        [31.10.2005 03:30]
    ---------------------------------------------------------------------------
    [+] Подключен файл streamsn.reg
        [CONFIG]
        streamsn.reg=config\streamsn.reg
    [+] Проигрываются .mp3 файлы из папки Stream мода.
    [+] Проигрываются .cam файлы из папки Camera мода.
    [+] Подключен файл Movie.Ini
        [CONFIG]
        Movie.Ini=config\Movie.Ini
    [+] Подключен файл Tutorial.ini
        [CONFIG]
        tutorial.ini=config\tutorial.ini
    [+] Принудительное включение подсказок.
        [MOD]
        ForceShowTutorial=1

    ---------------------------------------------------------------------------
     Версия: 0.7.0.6                                        [28.10.2005 09:07]
    ---------------------------------------------------------------------------
    [-] Серьезная ошибка, приводившая к тому, что часть ресурсов просто не
        перехватывалась!
    [+] Возможность отключить оригинальные ресурсы игры.
        Первый символ имени должен быть знак: -
        [RES]
        speech.res=-Ignore
        sfx.res=-
    [+] Проигрываются .BIK файлы из папки Movies мода.
    [+] Подключен файл music.reg
        [CONFIG]
        music.reg=config\music.reg

    ---------------------------------------------------------------------------
    Версия: 0.6.0.5 [09.12.2003 17:01]
    ---------------------------------------------------------------------------
    [+] Добавлена возможность отключить автоматический запуск анимации в зоне
        "Развалины".
        Для отключения, в файле настроек мода config.ini, нужно указать:
        [MOD]
        PreventZone1Animation=1

    ---------------------------------------------------------------------------
    Версия: 0.6.0.4 [24.07.2003 20:15]
    ---------------------------------------------------------------------------
    [+] Добавлена обработка папки Camera.

    ---------------------------------------------------------------------------
    Версия: 0.6.0.3 [16.05.2003 14:20]
    ---------------------------------------------------------------------------
    [-] Для работы библиотеки требовалась PSAPI.DLL, которая отсутствует в
        Windows 95, 98, 98SE, ME.

    ---------------------------------------------------------------------------
    Версия: 0.6.0.2 [04.05.2003 23:56]
    ---------------------------------------------------------------------------
    [-] Устранена ошибка с глобальными переменными. Не функциональная.
    [+] Чат теперь сохраняется в HTML, Ники подкрашиваются цветами как в игре.
    [+] Добавлена поддержка Английского и Русского game.exe для следующих
        функции:
        Установка лимитов для Perks
        Альтернативный расчет Exp
        Отключение доступа к пунктам меню "Сетевая игра", "Новая игра",
         "Старая игра".
        Хранить сейвы в папке мода
        Привязка имен файлов зон ZoneXX к аллодам (для сетевой игры).
        Вывод отладочных сообщений об ошибках игры в файл
        Сохранение чата на сервере сетевой игры
        Подключение ресурсов мода.

    ---------------------------------------------------------------------------
    Версия: 0.6.0.1 [02.05.2003 21:47]
    ---------------------------------------------------------------------------
    [+] Добавлена поддержка перехвата функций в Game.exe для
        Английской и Немецкой версии.
        На данный момент реализованы следующие функции:
        работа с папкой Maps и подключение файла Config.reg.

    ---------------------------------------------------------------------------
    Версия: 0.5.0.6 [26.04.2003 18:45]
    ---------------------------------------------------------------------------
    [+] В файле настроек мода config.ini, добавлены новые ключи:

        [MOD]
        Multi=0  - Запрещает доступ к пункту меню "Сетевая ига".
        Multi=1  - Разрешает доступ к пункту меню "Сетевая ига". (По умолчанию)

        [MOD]
        Single=0 - Запрещает доступ к пунктам меню: "Новая игра", "Старая игра".
        Single=1 - Разрешает доступ к пунктам меню: "Новая игра", "Старая игра". (По умолчанию)

        [MOD]
        GameSaves=0 - Запрещает изменять путь к сейвам игры "Saves" и "Mp".
        GameSaves=1 - Разрешает изменять путь к сейвам игры. (По умолчанию)
        (Для мода   - "Игра Без модов").

    ..[lost in space]..

    ---------------------------------------------------------------------------
    Версия 0.4.0.0 [20.02.2003 21:35]
    ---------------------------------------------------------------------------
    Основное
    ~~~~~~~~
    [+] У пользователей WinXP, Win2K имеется проблема с переключением
        на русский язык во время игры.
        В этой версии библиотеки, Мы реализовали один из придуманных нами
        способов решения этой проблемы.
        Суть способа заключается в следующем: при запуске игры мы удаляем
        процесс ctfmon.exe, из-за которого, собственно говоря, и возникает эта
        проблема. После завершения игры мы вновь запускаем этот процесс.

    (c) 2003-2019 Gipat.ru Dev team.