Code:
Version 3.9.9 (01/2024)
------------------------
[+] Added the following functions to Era Erm Framework:
!?FU(Hash32);
; Calculates int32 digest (hash sum) of arbitrary sequence of bytes.
!#VA(data:x); Pointer to data first byte or string
!#VA(dataLen:x); Length of data in bytes
!#VA(result:x); Result hash
!?FU(MakeRngSeed);
; Generates deterministic int32 seed for pseudo random number generator, consuming up to 15 arbitrary int32 parameters.
; Example: FU(MakeRngSeed):P(x)/(y)/(z)/(heroId)/?(seed:y); get prng seed, which will be the same for given coordinates and hero
!#VA(firstArg:x);
!?FU(SplitMix32);
; Generates new random value using SplitMix32 algorithm and modifies input seed value.
; Possible syntaxes:
; FU:P?(seed:y) ?(result:y); Generate random int32 value (negative or positive)
; FU:P?(seed:y)/(min)/(max) ?(result:y); Generate random int32 value in [min..max] range
!#VA(seed:x); OUT. Previous generator seed. Pass by reference (using ?), because this value will change after generation
!#VA(min:x); Minimum value.
!#VA(max:x); Maximum value.
!#VA(result:x); OUT. Result number
[+] Added the following exported function to era.dll:
// Calculates data hash sum of arbitrary length
function Hash32 (Data: pchar; DataSize: integer): integer; stdcall;
// Generates new random value using SplitMix32 algorithm and provided Seed value. Seed is passed by reference and modified on return.
function SplitMix32 (var Seed: integer; MinValue, MaxValue: integer): integer; stdcall;
[*] Era now uses SplitMix32 algorithm for seeding Xoroshiro128 PRNG.
Version 3.9.8 (01/2024)
------------------------
[*] Improved network PvP battles stability. The game will always send original (unmodified) battle stack action info to remote side, thus no desynchronization will occur when any script or plugin alters battle action parameters.
Version 3.9.7 (12/2023)
------------------------
[+] Added support for arrays and primitive types in language json files, because they are often used as config files. Numbers are converted to strings, booleans are converted to "0" and "1", null values are ignored (the same, as key-value pair didn't exist at all). Arrays are treated as objects with monotonically increasing string keys ("0", "1", "2").
Example json:
{
"creatures": [
{
"id": 2000
},
{
"id": 150,
"name": "SuperRobot",
"isGod": true,
"power": 77.345,
"copyFrom": null
}
]
}
Example script:
!?FU(OnAfterErmInstructions);
!!IF:M^%T(creatures.0.id) %T(creatures.1.id) %T(creatures.1.name) %T(creatures.1.isGod) %T(creatures.1.power) %T(creatures.1.copyFrom)^;
[-] Fixed bug: png resources where cached forever, causing visual glitches in mods like Random Wallpaper.
[-] Fixed bug: battle obstacles placement differed from SoD.
Version 3.9.6 (12/2023)
------------------------
[+] Added support for multiple language files in a single mod. Json files from Lang\[Language] directory have priority over files in Lang directory root. Current language is stored in heroes3.ini in "Era" section under "Language" key and defaults to "en".
It's recommended to keep any mod main language data in root "Lang" directory and alternative localizations in appropriate subdirectories (en, pl, ru, fr).
[+] Added new exported function to era.dll:
// Changes current language code in memory without altering ini files or reloading already loaded data
SetLanguage (NewLanguage: pchar): TDwordBool; stdcall;
// Reloads all json files from "Lang" directory and current language subdirectory.
ReloadLanguageData; stdcall;
[-] Fixed "SN:H" command and "OnAdvMapTileHint" event behavior. No hint is applied and no event is generated if tile is not visible by current player.
Code:
Версия 3.9.9 (01/2024)
------------------------
[+] Добавлены следующие функции в Era Erm Framework:
!?FU(Hash32);
; Вычисляет дайджест int32 (хэш-сумму) произвольной последовательности байтов.
!#VA(данные:x); Указатель на первый байт данных или строку
!#VA(dataLen:x); Длина данных в байтах
!#VA(результат:x); Хэш результата
!?ФУ (макаронное семя);
; Генерирует детерминированное начальное значение int32 для генератора псевдослучайных чисел, используя до 15 произвольных параметров int32.
; Пример: FU(MakeRngSeed):P(x)/(y)/(z)/(heroId)/?(seed:y); получаем начальное значение prng, которое будет одинаковым для заданных координат и героя
!#VA(firstArg:x);
!?FU(SplitMix32);
; Генерирует новое случайное значение с использованием алгоритма SplitMix32 и изменяет начальное значение ввода.
; Возможные синтаксисы:
; FU:P?(начальное значение:y) ?(результат:y); Сгенерировать случайное значение int32 (отрицательное или положительное)
; FU:P?(начальное значение:y)/(min)/(max) ?(результат:y); Сгенерировать случайное значение int32 в диапазоне [min..max]
!#VA(начальное значение:x); OUT. Предыдущее начальное значение генератора. Передавать по ссылке (используя ?), потому что это значение изменится после генерации
!#VA(min:x); Минимальное значение.
!#VA(max:x); Максимальное значение.
!#VA(результат:x); ВЫХОД. Номер результата
[+] Добавлена следующая экспортируемая функция в era.dll:
// Вычисляет хэш-сумму данных произвольной длины
функция Hash32 (Data: pchar; DataSize: integer): integer; stdcall;
// Генерирует новое случайное значение, используя алгоритм SplitMix32 и предоставленное начальное значение. Начальное значение передается по ссылке и модифицируется при возврате.
функция SplitMix32 (var Seed: integer; MinValue, MaxValue: integer): integer; stdcall;
[*] Era теперь использует алгоритм SplitMix32 для заполнения Xoroshiro128 PRNG.
Версия 3.9.8 (01/2024)
------------------------
[*] Улучшена стабильность сетевых PvP-сражений. Игра всегда будет отправлять исходную (неизмененную) информацию о действиях в боевом стеке удаленной стороне, таким образом, рассинхронизация не произойдет, когда какой-либо скрипт или плагин изменит параметры боевых действий.
Версия 3.9.7 (12/2023)
------------------------
[+] Добавлена поддержка массивов и примитивных типов в языковых файлах json, поскольку они часто используются в качестве конфигурационных файлов. Числа преобразуются в строки, логические значения преобразуются в "0" и "1", нулевые значения игнорируются (то же самое, поскольку пары ключ-значение вообще не существовало). Массивы обрабатываются как объекты с монотонно увеличивающимися строковыми ключами ("0", "1", "2").
Пример json:
{
"creatures": [
{
"id": 2000
},
{
"id": 150,
"name": "SuperRobot",
"isGod": true,
"power": 77.345,
"copyFrom": null
}
]
}
Пример сценария:
!?FU(в дальнейших инструкциях);
!!ЕСЛИ:M^%T(creatures.0.id ) %T(creatures.1.id ) %T(creatures.1.name ) %T(существа.1.исГод) %T(существа.1.сила) %T(существа.1.Копия)^;
[-] Исправлена ошибка: ресурсы в формате png кэшировались навсегда, вызывая визуальные сбои в модах, таких как случайные обои.
[-] Исправлена ошибка: размещение боевых препятствий отличалось от SoD.
Версия 3.9.6 (12/2023)
------------------------
[+] Добавлена поддержка нескольких языковых файлов в одном модуле. Файлы Json из каталога Lang\[Язык] имеют приоритет над файлами в корневом каталоге Lang. Текущий язык хранится в heroes3.ini в разделе "Era" под ключом "Language" и по умолчанию имеет значение "en".
Рекомендуется сохранять все данные об основном языке мода в корневом каталоге "Lang", а альтернативные локализации - в соответствующих подкаталогах (en, pl, ru, fr).
[+] Добавлена новая экспортируемая функция в era.dll:
// Изменяет текущий языковой код в памяти без изменения ini-файлов или перезагрузки уже загруженных данных
setLanguage (NewLanguage: pchar): TDwordBool; stdcall;
// Перезагружает все файлы json из каталога "Lang" и подкаталога текущего языка.
ReloadLanguageData; stdcall;
[-] Исправлено поведение команды "SN:H" и события "OnAdvMapTileHint". Подсказка не применяется и событие не генерируется, если тайл не виден текущему игроку.
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|