IPB

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику Berserker. Спасибо сказали: 991
Дата поста: В теме: За сообщение: Спасибо сказали:
30 Jul 2020, 02:20 ERA III


Вышло обновления для HoMM 3 ERA
Текущая версия: 3.0.3

Что нового ?

Добавлена долгожданная возможность безлимитной установки названий/описаний артефактов через ЕРМ без привязки к фиксированному набору строковых переменных.
ERS-файлы (файлы вог-опций) избавлены от ограничений геройского движка на имя в 12 символов, что позволило восстановить работу мода Era Scripts.
Добавлено новое событие на получение хода отрядом в бою до фазы регенерации. На необходимость такого события указал автор мода Z Усиленные Боевые Машины IV.
Множественные мелкие исправления.

Скачать: https://mods.hmm35.ru/Era%203.X.exe

Код
Version 3.0.3 (07/2020)
------------------------
[+] Added command SN:H^art^/art ID/0 (name) or 1 (description)/$text
    allowing to get/set any artifact name/description without z-variables dependency.

[+] ERS-files parser was rewritten. No more H3 bugs, caused by 12-character path length restriction.
    Any ers file name like "some loooooong script.ers" is supported.

[+] Added OnBeforeBattleStackTurn event. It occurs right before OnBattleRegenerationPhase event.
    Parameters: Stack ID (0..41). Change the first parameter to give turn to another stack.
    
    Note, that similar OnBattleStackObtainsTurn event occurs when stack becomes active and is not related to regeneration phase at all.
    Normally OnBattleStackObtainsTurn occurs after OnBattleRegenerationPhase but may also be triggered manually by calling
    464F10 (THISCALL, ecx = CombatManager, Side 0..1, StackInd 0..21).

[-] HE:P without 4-th parameter now works as in WoG 3.58f for compatibility reasons. If hero belongs to current player,
    teleport sound is played and screen redrawn. Otherwise teleportation is silent without visual update.

[-] Fixed bug: each reloading reduced ERT strings length by one. Credits: ArnoVanClaire.
[-] Included missing ztower1.def in hmm35wog.pac. Credits: ArnoVanClaire.
[-] Fixed invalid Sorceress fight value in zcrtraits.txt. Credits: Archer30.
[-] ztport01.def monolith will not be used on random maps anymore (removed from zaobjts.txt).
[*] IF:N fix was improved. Credits: igrik.
[*] Era exported functions with boolean results now return int32 0 or 1 (0 or -1 previously).
Bes, hippocamus, Mefista, Zabuza-san, KypaToP_HM
24 Jun 2020, 01:55 ERA III


Вышло обновления для HoMM 3 ERA
Текущая версия: 3.0.2 (альфа 2)

Что нового ?

Добавлено новое событие OnAdvMapObjectHint, позволяющее динамически управлять подсказкой при наведении на любую клетку карты, что активно используется, например, в моде на новые хранилища существ от PerryR.
Вернулась поддержка старого синтаксиса некоторых ЕРМ команд. Баг с улучшением существ до копейщика и ошибки в моде расширенных жилищ существ пропадут.
Исправлен баг в библиотеке тестов на ЕРМ и обновлена библиотека, отвечающая за виртуальную файловую систему.

Скачать: https://mods.hmm35.ru/Era%203.X.exe

Код
[+] Added new ERM event 'OnAdvMapObjectHint', allowing to get/set hint for any tile, mouse is currently over.
    Parameters: x, y, z, object type, object subtype.
    Example:

    !?FU(OnAdvMapTileHint); display tile coordinates and original hint
    !#VA(x:x) (y:x) (z:x) (objType:x) (objSubtype:x);
    !!MM:M?(existingHint:z);
    !!MM:M^%(x) %(y) %(z) %(objType) %(objSubtype): %(existingHint)^;

[+] Added support for %Vf..t syntax in interpolated strings, that was present in WoG 3.58.
[+] Restored short !!HE:X6 syntax support and fixed ERM HE:X7 bug: short syntax worked as X7/a/d/0/0/0/0 instead of X7/0/a/d/0/0/0.
[+] Updated VFS.dll to version 1.0.5.
[-] Fixed bug in "era - testlib.erm": !?FU(et_ExpectError) didn't restore error suppression option.
Bes, gamehuntera, hippocamus, magoth, Mefista, Odin, KypaToP_HM, Grossmaster
03 Jun 2020, 03:39 ERA III
ERA 3



Вышла новая мажорная версия HoMM 3 ERA
Текущая версия: 3.0.0 (альфа 0)

Что нового ?

Опциональный режим ERM 2.0: именованные константы, локальные переменные и функции на стадии прекомпиляции. На ЕРМ становится возможным писать понятный код с малым числом комментариев.
Переписан движок ЕРМ: множество исправлений наследия прошлого, универсальный синтаксис, удобная работа со строками, исправление багов, расширение и добавление команд и многое другое.
Добавлена стандартная библиотека ЭРЫ на ERM: 1 расширенное событие и тысячи предопределённых констант.
ЭРА становится полноценным ядром для мододелов всех мастей: больше нет навязанных модов, анимации, большинства графических изменений, нового интерфейса, заменённых кампаний и музыки и т.д. Установив ЭРУ вы получаете рабочий скелет со всеми инструментами для создания уникальной сборки под ваши вкусы и желания. Базовый комплект новых монстров/объектов из WoG 3.58 остаётся в качестве ресурсов и включаемых/выключаемых игровых механик.

Скачать: https://yadi.sk/d/Bhg4CGTf3PXi3k/Releases/Era%203.exe

Код
Version 3.0.0 (06/2020)
------------------------
[+] Introduced advanced ERM precompilation mode, called ERM 2.0 and activated via "ZVSE2" first line signature.
  Main features:
    - Named local variables to write human readable code instead of cryptic one.
      Example: !!HE-1:C0/0/?(monType:y)/?(monNum:y) instead of !!HE-1:C0/0/?y23/?y24;
    
    - Global named constants instead of magic numbers to write self-explaining code:
      Example: !?FU(onKeyPressed)&x1=(KEY_1) instead of !?FU(onKeyPressed)&x1=49; what is 49???
    
    - Strict distinguishing naming for functions, local variables and constants. No way to mix up.
      Example: thisIsVariable, THIS_IS_CONSTANT, ThisIsFunction and era_ThisIsFunctionAgain.

  ==== Named global constants ====
  Constant is named value, that is defined once and never changes. Like 13 (Archangel monster type).
  Constant can be used anywere, where numbers can be used. Era currently supports only integer numeric
  constants, written in all capitals: (MON_ARCHANGEL), (OBJ_MINE), (PLAYER_RED).
  Allowed characters are: [A-Z0-9_].
  To define a constant use the following instruction !#DC(CONSTANT_NAME) = 777; where 777 is arbitrary number.
  Examples:
  !#DC(PLAYER_BLUE)     = 1;
  !#DC(SKILL_FIRST_AID) = 27;

  To use a constant simply write its name in parentheses:
  !!OW:R(CURRENT_PLAYER)/(RES_GOLD)/d1000; give 1000 gold to current player

  will be compiled to

  !!OW:R-1/6/d1000; give 1000 gold to current player

  --- Naming ---
  Scripts writers must use unique prefix before constant names to prevent names collisions. Any constants without prefix
  may be added to ERA in the future and break your script.
  Example:
; for mod Battle Heroes let's use prefix "BH_"
  !#DC(BH_ART_RING_OF_POWER) = 160;
  
  !#DC(BH_CLASS_WARRIOR) = 1;
  !#DC(BH_CLASS_MAGE)    = 2;
  !#DC(BH_CLASS_RANGER)  = 3;

  --- Globality ---
  Constants are global. It means, that one script can use constants of another script. To ensure, that your constants
  are always loaded before other scripts, place them in the script with high priority (ex. "1000 - phoenix consts.erm").
  
  --- Standard constants ---
  ERA provides file "1000 - era consts.erm" with many predefined constants, covering most values, mentioned in ERM help.
  Look through it before defining your own constant for secondary skill, monster or player color.


  ==== Named local variables ====
  Each ERM trigger (!?XX before next !?XX) can now declare and use own named local variables, allocated from
  x1..x16, y1..y100, z-1..z-10, e1..e100 sets.
  Named variables are replaced with regular variables during scripts compilation and do not influence the performance at all.
  Example: (day) may be compiled to y5;

  --- Naming ---
  Names of variables must be in so called "camelCase" and contain only [a-zA-Z0-9] characters. They must be wrapped
  in parantheses the same way, as function names are wrapped.
  Example of valid variables: (hero), (monNum), (isAutocombatMode), (specialObject7).

  --- Declaration ---
  Variables must be declared on the first usage: i.e their type (x, y, z, e, v) and array length (for arrays) must be specified.
  If you write '[some number]' after variable name, variable will become an array (sequence of variables) with specified length.
  If you write ':e' after variable name or array length, it will mean, that variable type is "e" (floating point numbers).

  Examples:
  !!HE-1:N?(hero:y); give some y-variable name "hero" and write current hero ID to it
  !#VA(arts[4]:y);   allocate 4 y-variables with sequential indexes and name the array "arts"

  !#VA instruction is pseudo-command, that is dropped from final compiled code and that can be used to hold variables declarations.
  Example:
  !?FU(acm_Sum);
; The function calculates sum of two numbers
  !#VA(first:x) (second:x) (result:x); [bind "first" to x1, "second" to x2, "result" to x3]
  !!VR(result):S(first) +(second);     [calculate result]

  --- Usage ---
  It's allowed to specify the same type and array length for variables in every variable usage place, but it's not necessary.
  After you declared variable, there is no more any need to write its type/length.
  Example:
  !!HE-1:N?(hero:y);
  !!HE(hero):K1; kill hero with ID in (hero) variable.

  will be compiled to something like that:
  !!HE-1:N?y5;
  !!HEy5:K1;

  --- Arrays ---
  If you need not a single variable, but sequence of variables, for instance to hold [x, y, l] coordinates of objects,
  then you need an array. Specify array length in square brackets right after variable name during declaration.
  !#VA(coords[3]:y); allocate 3 y-variables named 'coords'

  Items or elements of arrays are zero-indexed and can be accessed by direct index.
  For 3-items array possible indexes are 0, 1, 2.
  Example:
  !!CM:P?(coords[0])/?(coords[1])/?(coords[2]);

  will be compiled to something like that:
  !!CM:P?y50/?y51/?y52;

  If you don't specify array index, the first array element will be used. It means that
  (test) and (test[0]) have the same sense. Regular variables are considered arrays of length 1.

  --- Negative array indexes ---
  Negative array index means n-th item from the end. -1 will point to the last item, -2 to the one before the last one and so on.
  Example:
; allocate array of 10 y-variables and assign the last one value 2000
  !#VA(array[10]:y);
  !!VR(array[-1]):S2000;

  will be compiled to something like that:
; allocate y1..y10
  !!VRy10:S2000;

  --- Releasing local variables ---
  If you don't need large variable array anymore, but want to declare another big array, then free the previous one.
  Syntax: !#VA(-variableName); will forget about specified variableName, allowing to reuse indexes, allocated for that variable.

  Example:
  !#VA(myArts[100]:y); allocate y1..y100 to hold artifact IDs
  ...;                 use them
  !#VA(-myArts);       release 'myArts' name and y1..y100 indexes.
  !#VA(coords[3]:y);   allocate y1..y3 as 'coords' variable

  --- Getting variable address (real index) ---
  It's often necessary to get real index of variable or even array element. When you want to output "2" instead of
  y2, use address operator '@'.
  
  Example:
; Initialize array with 3 artifacts
  !#VA(arts[3]:y);
  !!VR(arts):C(ART_SKULL_HELMET)/(ART_HELM_OF_CHAOS)/(ART_DEAD_MANS_BOOTS);

; Select one artifact randomly
; same as R0/0/2, generates random number in 0..2 range and assigns it to artPtr variable.
  !!VR(artPtr:y):R0/(@arts)/(@arts[-1]);
  
; Give artifact to hero
  !!HE-1:Ay(artPtr);

  will be compiled to something like that:
  
  !!VRy1:C20/21/56;
  !!VRy4:R0/0/2;
  !!HE-1:Ayy4;

  Address operator "@" compiles to real (final) variable index. For instance, for array "test[10]:y" mapped to y50..y59
  (@test[1]) will compile to "51".

  Example of declaring array of 10 y-variables and initializing all of them with -1.
  !#VA(monTypes[10]:y);

  !!re i/(@monTypes)/(@monTypes[-1]):; repeat from i = first array index to i = last array index
    !!VRyi:S-1; set -1 for current array item
  !!en:;

  In other programming languages variables, holding other variables addresses/indexes are usually called "pointers"
  and abbreviated as "ptr" or "Ptr". We will rewrite the previous example with named variable in place of quick "i" var
  just for learning purposes.

  !!re (monTypePtr:y)/(@monTypes)/(@monTypes[-1]):; repeat from (monTypePtr) = first array index to (monTypePtr) = last array index
    !!VRy(monTypePtr):S-1; set -1 for current array item
  !!en:;

  --- Naming function arguments ---
  Indexes for named local variables are allocated starting from the smallest possible value.
  It means, that we can name even function arguments if we declare them in the same order, as arguments will be passed.
  Example:

  !?FU(BH_GetHeroSecSkill);
  !#VA(hero:x) (skill:x) (result:x); now hero = x1, skill = x2, result = x3
  !!HE(hero):S(skill)/?(result);

  !?FU(...); some event
  !!FU(BH_GetHeroSecSkill)/(HERO_XERON)/(SKILL_FIRST_AID)/?(xeronFirstAidLevel:y); so what's the level of First Aid skill Xeron has? )

  --- Redeclaration ---
  If you need to declare variable in both branches of if-then block, specify type/length in both of them.

  !!if&(day)>90:;
    !!VR(price:y):S(day) *100;
    ...
  !!el:;
    !!VR(price:y):S(day) *(difficultyLevel) +300;
    ...
  !!en:;

  --- Reusing same name in other trigger ---
  Variable names are local to nearest trigger only. New trigger starts with no declared variables.
  Example:

  !?FU(OnHeroScreenMouseClick);
  !!CM:F?(flags:y); flags = y1

  !?FU(OnHeroScreenMouseClick);
  !#VA(flags[23]:e); flags is array, binded to e1..e23

  --- Interpolation ---
  To substitute local variables in string literals use %(varName) syntax. Example:
  !!VR(price:y):S600;
  !!VR(heroName:z):S^Robin Hood^;
  !!IF:Q2/^Would you like to hire %(heroName) for %(price) gold only?^;

  %y(varName) syntax is also supported and compiles to something like %yy5.


  ==== Named functions ====
  Function names must consist of [A-Za-z0-9_] characters only, start with letter and contain at least
  single lower case letter (a-z).
  There are two allowed naming methods:
  1) Start function with capital letter. (CalcHeroArmyPower), (ShowUpgradeDialog).
  ERA reserves right to declare prefixless functions, starting with "On" for events. This method is not
  recommended, due to possible names collisions in different mods. Two mods may declare functions
  will the same names and thus produce hard to debug bugs.

  2) Start function with any case unique prefix with '_' character. Prefix is usually mod abbreviation.
  For instance, for "Dwellings Extended" mod the following functions are used:
  !?FU(dex_SetDwellingSlotByTownType);
  !?FU(dex_DwellingPopulation);
  ...

  --- Generating new events ---
  You can call function, even if it has no handlers. For instance, in Upgrade All Creatures mod you
  want to allow other scripts to be able to notify, what monster can be upgraded to in particular town.
  Just call not existing function like !!FU(auc_OnDetermineMonsterUpgrade):P... in your script with all
  necessary parameters and other scripts will be able to write new event handlers like:

  !?FU(auc_OnDetermineMonsterUpgrade);
  ...

  --- Passing function as handlers or callbacks ---
  You can use function as ordinary constant, compiled to number. You can assign it to variable or pass to
  another function.
  !!VR(spellHandler:y):S(newmagic_DesintegrationSpellHandler);
  !!FU(spellHandler):P;

  will compile to something like that

  !!VRy20:S95003;
  !!FUy20:P;

[+] Added 1000 era - stdlib.erm script, which will contain safe for all extra ERM functionality.
    Currently !?FU(OnEvenyDay) event is enhanced. Its handlers will receive 5 parameters:

    !?FU(OnEveryDay);
    !#VA(day:x1) (weekDay:x) (once:x) (owner:x) (isAi:x);
    !!IF:M^%(day) %(weekDay) %(once) %(owner) %(isAi)^;

[+] Added 1000 era - consts.erm script with lots of constants to be used in ERM 2.0 scripts.
    ERM Editor, based on Sublime Text, supports constants autocompletion.
    Remember, that constants without mod name prefix are reserved for ERA.
    Prefer BH_GOLD_PER_VICTORY to GOLD_PER_VICTORY for Battle Heroes mod, for instance.

[+] Floating point variables (e-variables) are passed to ERM commands as raw 4 bytes value,
    treated by most commands as integer, which may cause many bugs, unless you know, what you are doing.
    The exception is !!VR:S command, allowing transparent conversion integer-float. To copy float value,
    stored in raw format in integer variable to e-variable and vice versa use !!VR:C command. It acts same
    as VR:S, but without data conversion.

[+] New command !!VR$1:S#2/#3. Convert float to integer using specific rounding mode.
    $1 - integer variable.
    #2 - float variable
    #3 - rounding mode:
      < 0 for floor operation (round towards negative infinity),
      0 for normal round (round half away from zero),
      > 0 for ceil operation (round towards positive infinity).

[+] !!VR: +/-/*/:/% convert both arguments to float if any is float before calculation and convert back
    to base var type on return.
    Thus
    !!VR(koef:e):S25 :10; koef = 2.5
    !!VR(gold:y):S2 *koef; gold = 5, not 4

[+] New command !!VR$1:~#2
    Unsets bits #2 in $1 integer variable.
    Example:
    !!VR(flags):~17; unset bits/flags 1 + 16 from (flags) variable.
  
[+] New command !!VR$1:Z#2. Creates trigger local temporary z-variable with given contents and assigns its index to integer variable.
    $1 - integer variable.
    #2 - any string.

    The command can be used to create temporal z-variables to change, for example, artifact description,
    show message and restore description.

[+] ^....^ literal in any ERM command is interpolated and replaced by temporal z-variable index before receiver
    execution. This z-variable is released right after receiver is executed.
    Don't use string literals in WoG 3.58 hint/description setting commands, because such descriptions have short life time.

    From now it's possible to pass strings to functions.

    !?FU(ES_Ask);
; Shows question dialog with caption. Returns boolean (1 on success and 0 on failure).
    !#VA(captionPtr:x) (questionPtr:x) (result:x);
    !!IF:Q1/^{%z(captionPtr)}

    %z(questionPtr)^;
    !!VR(result):S0;
    !!VR(result)&1:S1;

    !?OB(OBJ_TOWN)/(ANY_OBJ);
    !!FU(ES_Ask):P^Sphinx asks you:^/^Do you really want to die, fighting my guards?^/?(answer:y);
    !!HE(CURRENT_HERO)&(answer)=1:K1; let him die )))

[+] Only regular ERT variables are interpolated automatically.
    Regular z-variables and temporal ert variables are not interpolated in receivers.
    It means, that !!VRz2:S^%%y5^; z2 is now really "%y5"

    Previously interpolation would be performed again and again recursively, converting %y5 into y5 value like 0.
    and even later using z2 in any command would run interpolation again.

    !!IF:M1/z2; will display "%y5", not y5 value.

[+] New VR$1:R/T syntax: 0/min/max - generates random value in given range and assignes it to $1 integer variable.
[+] VR:R/T now both support syntaxes with 1/2/3 arguments.
[+] VR:T uses Mersenne Twister qualitive generator, but it's not synchronized in multiplayer.
[+] VR:M1. -1 as length means "till string end".

[+] VR:M2 does not store token index in global variable anymore. Token index, that was ignored earlier, works now as expected.
   Token delimiters are [#1..#31, ' ', ',', '.']. Don't use for huge text, because performance is O(n^2), where n is tokens number.

[+] VR:M3 Base/radix is enforced to be in 2..16 range.

[+] ERM interpolation (expanding variables starting with % in string literals ^...^ and ERT strings) was fully rewritten.
    Upper case registry for old ERM variables is supported, but deprecated.
    %X1 is good, but %x1 is better.

    All new s^...^, i^...^ and named local variables are supported.
    Indirect references is supported.

    %s(named global variable)
    %i(named global variable)
    %xy7
    %zi^named global variable^
    %z(namedLocalVar)
    %(namedLocalVar)

    Quick vars are supported:
    %i %g %k

    Interpolation of %Vf...t meaning is changed to real v-indexing
    %vi means v-var with i-index.
    %f means quick 'f' var.
    %i means quick 'i' var.

    %F5 means flag 5
    %Fx16 means flag with x16 index

    Function IDs and constants can be interpolated in the same way, as named local variables:
    %(CONST_NAME), %(era_FuncName), %(money), %y(moneyPtr)

[+] IF:M# now works with any string
[+] IF:N1/# now works with any string, not z1 only.
[+] IF:N# now works with any string.
[+] BA:B now can work with any string and integer.

[+] Call SN:F^GenerateDebugInfo^ to generate Debug directory contents, the same way as F11 does.

[+] Exported "NameTrigger" function (void NameTrigger(int TriggerId, const char* Name)), allowing plugins to
    give name to any ERM trigger, which can be used in ERM like !?FU(OnYourNewEvent).

[+] Updated "wog native dialogs" plugin by igrik. From now it's possible to select item in message dialogs
    using mouse double click.

[+] s^...^, ^...^, i^...^ can now be freely used in conditions.

[+] New d-modifiers (d~, d%, d|, d&, d<<, d>>) work with all receivers.

[+] Rewritten ert-strings storage implementation. Removed limit on 50000 strings. Increased add/delete operations
    performance (from linear search to binary tree search). Savegames format was changed.

[+] Added VR:C alternative for SN:M arrays. New command !!SN:U#1/#2/$3...up to $21 allows to set/check/get/modify
    many items of dynamical array.
    #1 - SN:M array ID.
    #2 - starting index
    $3... - items at starting index, starting index + 1, starting index + 2, etc.

[+] Added new command !!VR:R0/#min/#max, generating random value in specified range and assigning its to variable.
    Example: !!VRy1:R0/100/300; set y1 to random value in 100..300 range

[*] The following exported functions now return 4-bytes LONGBOOL value, 0 for false, -1 (0xFFFFFFFF) for true.
    "ReadStrFromIni", "WriteStrToIni", "SaveIni", "PatchExists", "PluginExists", "Ask".

[+] Added "1000 - era consts.erm" script to WoG mod with standard Era constants, including players,
    player bits, heroes, resources, objects, monsters, artifacts, spells. The file contents may be corrected
    and widened in the future. All constants were registered in Erm Editor, based on Sublime Text.

[+] Added "1000 - era stdlib.erm" script with universal ERM functions and events. Currently "OnEveryDay"
    event is enhanced with the following x-arguments: day, week day, once(0..1), owner (color), isAi (0..1).

[*] Fixed WoG bug with tactics detection on the very first round. Do not use BU:R in !?BR or !?FU(OnCombatRound) for zero round,
    because a few structures are not initialized at this moment and random crash may occur. First round code was moved after
    combat theme initialization and tactics popup message appearance.

[+] All *.ers files are loaded without name/quantity constraints. Previously only script00.ers..script99.ers were processed.

[+] HE:P command behavior was fixed. Teleport function with sound is called only if any coordinate
    was really changed. Advanced d-modifiers are supported for the first three parameters.

[+] HE:C0 command was rewritten.
    -1 and -2 values for creature type are not treated as "upgrade"/"degrade" anymore. Command supports any d-modifiers now.
    Exp. modifier parameter is now SET-only. Previosly !!HE:C0/0/?y1/?y2/d5000/2 would not increase slot experience.
    In fact, any GET syntax used to make ERM engine ignore stack experience at all. This bug was fixed.
    Creature Type < 0 or Number <= 0 will be normalized to Type -1, Number 0 automatically.
    Note, that in all cases the returned stack experience value is the one before applying any changes.

[+] Rewritten HE:X command to accept any number of parameters and understand any d-modifiers.
    Example: !!HE-1:X0/27 xD.gif1; become master of gold dragons

[+] Introduces many new d-modifiers for all ERM commands, except for GE:E/N, LE:E/N.
    d+# - integer addition
    d-# - integer substraction
    d*# - integer multiplication
    d:# - integer division
    d|# sets bits from # (bitwise OR operation)
    d& leaves only # bits, if any (bitwise AND operation)
    d& unsets bits, specified in #. d&17 unsets bits 1 and 16
    d%# calculates division modulo. 10%4 = 2, for instance.
    d<<# shifts original value bits to the left by # positions (bitwise logical shift left).
    d>># shifts original value bits to the right by # positions (bitwise logical shift right.

[+] Function parameters (FU:P, DO:P), which were passed using GET-syntax, are now initialized with
    original variable value. The behavior is similar to pass-by-reference in other programming languages.
    Example:
    !?FU(Add3):;
; (value:x)
    !!VR(value:x):+3;

    !?CM0;
    !!VR(numHeads:y):S10;
    !!FU(Add3):P?(numHeads:y); 10 is passed to function as the first argument, 13 is result

[+] Enhanced !!RD:I with new named parameters syntax.
    !!RD:I^parameter name^/?$parameter_value;
    ============================== Featured parameters: ==============================
    ^dlgId^        - Unique recruit dialog ID. Used to distinguish between nested dialogs (yep, it's possible). Reusable.
    ^townId^       - ID of town, for which dialog is opened or -1.
    ^dwellingId^   - ID of town dwelling, for which dialog is opened or -1. 0..6 non upgraded, 7..13 for upgraded.
                     Horde buildings (+X population) are treated as dwellings, they influence.
    ^slot^         - Active logical slot index.
    ^cost^         - Cost of single monster in current slot in gold.
    ^resource^     - Special resource for monster in current slot.
    ^resourceCost^ - Cost of single monster in current slot in special resource.
    ^quantity^     - Number of monsters, currently selected for recruitment.
    ^maxQuantity^  - Maximal number of monsters, the player can afford.

    Example:
    !?FU(OnRecruitDlgMouseClick);
    !!RD:I^dlgId^/?(dlgId:y) I^townId^/?(townId:y) I^dwellingId^/?(dwellingId:y) I^slot^/?(slot:y) I^cost^/?(cost:y);
    !!RD:I^resource^/?(resource:y) I^resourceCost^/?(resourceCost:y) I^quantity^/?(quantity:y) I^maxQuantity^/?(maxQuantity:y);
    !!IF:M^(dlgId:y) (townId:y) (dwellingId:y) (slot:y) (cost:y) (resource:y) (resourceCost:y) (quantity:y) (maxQuantity:y)^;

[+] Enhanced !!UN:C command. It supports all d-modifiers now. New syntax with offset from address is available:
    !!UN:C#addr/#offset/#size/$value;
    Era always calls GetRealAddr for #addr, thus !!UN:C supports all extended/relocated game structures.

[+] WoG interface and WoG campaigns were extracted to appropriate standalone mods. ERA is now mostly Vanilla game with
    enhanced ERM engine and other modding capabilities.

[+] Added !!BM:Z?$addr command to get battle stack structure address.
[+] Added !!HE:Z?$addr command to get hero structure address.
[+] Introduced ERM 2.0 support for scripts, beginning with 'ZVSE2'.
[+] Doubled stack size for h3era.exe executable to allow trigger depth level up to 150, but better avoid such depth.

[+] WoG Campaign editor loads resources from hmm35wog.pac and uses virtual file system. No more Campaign Fix required.
[+] Added extended resources redirection support with wav/bik/smk files, including missing resources redirection.

[+] Added new plugins events "OnAfterLoadLods", occured right after lods/pacs are loaded and "OnAfterLoadMedia", occured
    when lod/pacs/snd/vids are loaded.

[*] ERA is recommended to be installed over Heroes 3 Complete only. Removed resources, which are already present in Complete lods.

[-] Restored functionality of Data\Redirections\Missing\*.json files, which are used to setup redirections
    for missing resources only.

[+] ERM quick vars (f..t) are now local to triggers. Use them safely.

[+] Update ERM Editor.
[+] Rewritten core of ERM engine. Greatly improved old macro support ($macronam$). Just for perfection.

[+] Extracted WoG campaigns into standalone mod, which was removed from Era installer package.

[+] "remove exe protection.bin" was applied to h3era.exe and removed as patch.

[+] Many resources and features were extracted from WoG mod into separate mods: Animated Object Flags, Animated Trees,
    No Prebattle Music, Secondary Skills Scrolling, Quick Savings, Fast Battle Animation, Improved Battle Decorations,
    WoG Interface, WoG Campaigns, Yona.

[+] Added new event "OnDetermineMonInfoDlgUpgrade", occured, when game determines wether to show upgrade button
    in monster info dialog. Parameters: MonType, UpgradedType or -1, Town ID or -1, Hero ID or -1.
    -1 for UpgradedType means no upgrade button (because of wrong town type or appropriate building being not built, or monster having no upgrade).
    You can change this value to allow universal Jelu-like behavior or any upgrade system.
    Example:

    ZVSE2
    
    !?FU(OnDetermineMonInfoDlgUpgrade);
    !#VA(monType:x) (upgType:x) (town:x) (hero:x);
    !!VR(upgType):S(MON_GOLD_DRAGON); allow upgrade anything into Gold Dragons

[+] SN/RD/MP receivers now support indexed parameters like vy6 or zi^myIndex^.

[+] SN:D may be used now in battle, being equal to BU:R.

[+] Added support for trigger local dynamical arrays. !!SN:M-1/#/#/-1 will allocate new dynamical array
    with ID, that will be automatically released after current trigger is exited. Thus no
    corresponding !!SN:M# is necessary to release this temporary array. It can be used, for instance,
    for large calculations or to pass string arguments to function.

    Example:
    !?FU(OnAdventureMapRightMouseClick);
    !!SN:M-1/4/1/-1;        [allocate 4 strings array (-1 = auto ID, 4 = 4 items, 1 = of string type, -1 = local to current trigger)]
    !!VR(dlgStrings:y):Sv1; [save array ID]
    
; Setup strings
    !!SN:M(dlgStrings)/0/^Select commander bonus:^;
    !!SN:M(dlgStrings)/1/^1) Attack^;
    !!SN:M(dlgStrings)/2/^2) Speed^;
    !!SN:M(dlgStrings)/3/^3) Health^;
    
    !!FU(PM_ShowDialog):P(dlgStrings); [pass 4 string to dialog showing function]
; here array with (dlgStrings) ID will be automatically freed, same as SN:M(dlgStrings);

    !?FU(PM_ShowDialog);
; (dlgStrings:x) - dynamical array of 4 strings
; (items[3]:z)
    !!SN:M(dlgStrings)/0/?(caption:z);
    !!SN:M(dlgStrings)/1/?(items[0]);
    !!SN:M(dlgStrings)/2/?(items[1]);
    !!SN:M(dlgStrings)/3/?(items[2]);
    !!IF:M^{(caption)}
    (items[0])
    (items[1])
    (items[2])^;

[-] Fixed memory leakage in SN:M dynamical arrays deallocation and a few other places.




Вышло обновления для HoMM 3 ERA
Текущая версия: 3.0.1 (альфа 1)

Что нового ?

Работать с ЕРМ-функциями стало ещё приятнее: корректный подсчёт переданных параметров, значения параметров по умолчанию, автоинициализация параметров нулями.
Улучшенная поддержка отладки и тестирования: новые магические константы и первая версия библиотеки тестов Эры. Для обнаруженных багов написаны авто-тесты на ERM.
SN:M динамические массивы теперь отлично выполняют роль списков. Изменение размеров было оптимизировано. Появился доступ к концевым элементам по отрицательным индексам.
Исправлено несколько багов движка и недочётов предыдущего релиза.

Скачать: https://mods.hmm35.ru/Era%203.X.exe

Код
Version 3.0.1 (06/2020)
------------------------
[+] Added first ERA ERM tests. Tests library in "Tests/1000 era - testlib.erm" and tests, covering found
    bugs and part of new functionality in "Tests/era - tests.erm".

[+] Added new 3 magic constants. All are safe to use inside strings and as parameters:
    (FILE) expands into current script file name.
    (LINE) expands to current line number in script file.
    (CODE) expands to excerpt of escaped current line source code.
    These constants are specially useful for debugging, bug reporting and automated tests. See
    "Tests/era - tests.erm" for examples.

[+] Added new constants: TRUE, FALSE, SN_M_* (for SN:M parameters).

[+] Added new escape sequences for string literals (^...^):
    '%\:' expands into ';' (usually forbidden character for literals, marking receiver end).
    '%\"' expands into '^' (usually forbidden character for literals, marking end of literal).
    '%%'  expands into '%' (used to prevent possible variable interpolation, %%y5 => %y5, not y5 value).

[+] !!FU/DO receivers can now be really called without arguments.
    For all WoG 3.58 ERM receivers except SN/MP calling subcommand without parameters actually passes single
    parameter with 0 value.
    Example:
    !!CM:R; is the same as !!CM:R0;

    This is not suitable for functions, which could rely on arguments counting to implement default parameter values
    and optional parameters.
    From now !!FU:P; passes no parameters and !!FU:P6; passes single parameter.

[!] Old-style ERM macros ($...$) are deprecated, though improved and fully working.
    Note, that macro names are not cleared until game process is restarted, so prefer not to use them at all.

[*] !!SN:U was renamed to !!SN:V (Vector).

[+] !!SN:M was greatly improved. Negative indexes allow to access elements from the end of array.
    -1 - the last element
    -2 - the one before last, etc.
    It became easy to access list tail like !!SN:M(arrayId)/-1/^New value^;

    SN:M arrays resizing was improved so, that from now they can be used as lists without performance penalty.
    Memory is allocated by blocks, growing exponentially, so most of the time no allocation is really performed,
    just remembering new number of items.

    Examples:
; Create new list with 3 items, stored in saved games. Put its ID in i^heroNames^ global variable.
    !!SN:M(SN_M_AUTO_ID)/3/(SN_M_STR)/(SN_M_STORED)/?i^heroNames^;

; Set all items values at once
    !!SN:Vi^heroNames^/^Corwin^/^Deo^/^Bers^;

; Wait, forgot about 'Salamandre', add him too
    !!SN:Mi^heroNames^/d1;              increased list size by 1
    !!SN:Mi^heroNames^/-1/^Salamandre^; and written new item to the end

[+] Updated ERM Editor, based on Sublime Text.
[!] !!FU:C is deprecated and not supported anymore. It may be reused in future.

[*] ErmLegacySupport is set to 0 by default in heroes3.ini. It was introduced for old scripts, relying on
    negative y-vars automatical zeroing.

[+] All function x-parameters, which were not passed, are now initialised with zeroes. This behavior is suitable for
    optional arguments. Just don't pass odd arguments in !!FU:P/!!DO:P/etc, and they will have 0 value.

[+] Added new syntax to !!FU:A command. Set default values for parameters.
    !!FU:A#1/[#2.../#3...];
    #1 - default value for the first parameter (x1)
    #2 - default value for the second parameter...
    The command changes values only if the are not specified during function call.

    Example:
; Find object with given type and subtype
    !?FU(acl_FindObj);
; Declare two optional parameters
    !#VA / (objType:x) (objSubtype:x);
; Provide default -1 value for both parameters
    !!FU:A(NO_OBJ)/(NO_OBJ);
    ...

    Another example with string parameters.
    'Ptr' means 'pointer', index of z-variable.
    
    !?FU(acl_ShowMessage);
    !#VA / (messagePtr);
    
    !!FU:A?(numArgs:y);    get number of passed arguments
    !!VR(message:z):S^OK^; set up default message text
    !!VR(message)&(numArgs)>=(@messagePtr):Sz(messagePtr); override message text with provided value, if it's passed

    !!IF:M^%(message)^;    display message

    The last line works, because @messagePtr for the first argument (x1) will return 1.
    This is handy way to check if particular parameter was passed.

[+] It's proposed to decorate functions declarations in the following variants:

; Bried function description like:
; Hides rectangular area on the map.
  !?FU(es_HideMapSquare);
  !#VA(x1:x) (y1:x) (x2:x) (y2:x) (level:x); fast declare all parameters without description

; Alternative declaration with arguments explained:
  !?FU(es_HideMapSquare);
  !#VA(x1:x); top-left x-coordinate
  !#VA(y1:x); top-left y-coordinate
  !#VA(x2:x); bottom-right x-coordinate
  !#VA(y2:x); bottom-right y-coordinate

  Remember, that everything in !#VA before closing ';' and except of (variableName) is simply deleted
  from compiled code.

  For functions with optional arguments it's proposed to separate optional arguments from required ones by '/'.

; Adds monsters stack to hero army. Default quantity is 1.
  !?FU(es_AddMonster);
  !#VA(hero:x) (monType:x) / (monNum:x);
  !!FU:A0/0/1; specify default argument values
  !!HE(hero):C2/(monType)/(monNum)/1;

  Alternatively argument optionality may be specified in its description.
  !?FU(es_AddMonster);
  !#VA(hero:x);    hero ID
  !#VA(monType:x); monster type
  !#VA(monNum:x);  optional. Default: 1

[-] Added missing 1000 era - const.erm and 1000 era - stdlib.erm files to WoG mod.
[-] Fixed bug: z-variables with invalid negative indexes were considered mutable. Credits: gamemaster.
[-] Unknown macro names $...$ are now reported as errors, same as it was in ERA 2.x.
[-] Fixed bug: ERM must stop evaluating cached receiver parameters after first error.
Bes, gamehuntera, ZahaR, hippocamus, IQUARE, magoth, Ben, feanor, Mefista, Haart of the Abyss, Chainsaw_Charlie, Эроласт, igrik, Zabuza-san, KypaToP_HM, Barin, Lokos, Grossmaster
27 Feb 2020, 03:32 Era II Рус
Вышло обновление HoMM 3 ERA
Текущая версия: 2.9.11

Кратко: небольшое обновление, восстанавливающее работоспособность старых карт и модов, а также включающее несколько новых фишек для разработчиков и игроков.

Добавлен плагин «Журнал Заданий» от igrik. Позволяет удобно просматривать содержание заданий и перемещать экран к требуемой хижине провидца.
Стало проще использовать локализуемые строки на ЕРМ (синтаксис %T() в литералах).
Восстановлена работа оригинального генератора псевдослучайных чисел. Препятствия в бою более не меняются при перезагрузке. Качественный ГСЧ «Вихрь Мерсена» перенесён на ЕРМ команду VR:T.
И другие мелкие исправления (h3 structures and constants.txt, макросы для ЕРМ редактора от Algor, исправление названий событий).

Скачать
Скачать мод WoG Scripts

Код
Version 2.9.11
------------------------
[+] Added Quest Dialog plugin by igrik. It allows to easily view quests contents and move view to seer huts.

[+] Added %T(translatable_key_from_json) interpolation in ^...^ strings. Thus json texts without parameters may be inserted directly.
    Example: !!IF:M^Welcome to {%T(mymod.woody_castle_object)}!^;

[+] Heroes 3 PRNG was restored. VR:R uses it, as in old times. Mersenne Twister PRNG was moved to VR:T command.
    Mersenne Twister generator state is NOT synchronized between remote PCs automatically. Do not use it in
    battles for you mod to be compatible with multiplayer.

[+] Included macros for Erm Editor, enabling automatical indentation and comment insertion via ALT + END. Credits: Algor.
[+] Added "h3 structures and constants.txt" by BTB/RoseCavalier to Help directory.
[*] Reallowed SN:K#1/#2/#3/#4 to work with strings.
[-] Fixed OnUnequipArt and OnEquipArt named events. They were called instead of each other.
Bes, Mefista, igrik, Odin, Ethereal
13 Feb 2020, 04:11 Прекрасный Новый Мир (римейк)
переделка старой карты из Клинка Армагеддона
Хантера, дружище, ты жив? )) С днём рождения!
Пост по карте в ВК: https://vk.com/wall-936488_76832
gamehuntera, XEL
12 Feb 2020, 04:20 Era II Рус
Вышло обновление HoMM 3 ERA
Текущая версия: 2.9.10

Что нового ?

Мод «WoG Scripts» получил несколько исправлений и был благополучно отправлен на пенсию. Теперь он не является частью установщика Эры, но его можно скачать и установить отдельно.
ERM движок научился игнорировать пробельные символы и переводы строк между командами, а также не трактовать точку с запятой как команду.
Улучшен вывод ошибок ЕРМ: чаще правильно показывается точное местоположение проблемного места.
Обновлена утилита MMArchive до свежей версии 1.3.1

Скачать
Скачать мод WoG Scripts
Bes, hippocamus, magoth, Mefista, igrik, Ethereal
06 Feb 2020, 03:02 Era II Рус
Вышло обновление HoMM 3 ERA
Текущая версия: 2.9.9

Что нового ?

Появилась возможность прерывать/продолжать циклы верхних уровней с использованием команд !!br и !!co.
Рудиментарная универсальная команда отключения ресиверов XX:Z была удалена.
Исправлен ЕРМ интерпретатор: теперь любое число пробелов перед командами воспринимается корректно. Меньше багов, чище код.
Досадная ошибка, запарывающая сохранённые игры, исправлена.
Данная версия идеально подходит для нового мода «Расширенные Жилища»

Скачать: https://mods.hmm35.ru/Era%20Latest.exe
Bes, hippocamus, magoth, igrik, Ethereal
06 Feb 2020, 02:54 Мод «Расширенные Жилища»
Инструмент для всех и каждого!


«Расширенные Жилища»

Автор: Berserker
Версия: 1.0.0
Требует: Era 2.9.9+
Скачать: Extended Dwellings

Мод позволяет настроить до 4-х слотов на каждое городское жилище.
Каждый слот может быть как альтернативным существом, так и дополнительным.

Альтернативное существо использует тот же счётчик населения, что и родное. Однако может быть задано произвольное соотношение между оригинальным числом существ и альтернативным.
Например, 1 голем может быть куплен взамен населения в 12 гремлинов. Такие слоты называются альтернативными, так как невозможно купить максимум существ из всех альтернативных слотов. Покупка существ в одном из слотов пропорционально снижает число существ в остальных.

Дополнительные слоты не связаны с основным населением жилищ. Их население может быть установлено вручную через ЕРМ
или может расти автоматически еженедельно, как это происходит с родными обитателями жилищ.

Используйте следующие документированные ЕРМ функции:
Код
"dex_DwellingPopulation" чтобы установить/изменить население в дополнительном слоте.
"dex_SetDwellingSlotByTownType" для настройки слота для всех городов определённого типа.
"dex_GetDwellingSlotByTownType" для получения настройки слота для всех городов определённого типа.
"dex_SetDwellingSlotByTownId" для настройки слота в конкретном городе (имеет приоритет над dex_SetDwellingSlotByTownType).
"dex_GetDwellingSlotByTownId" для получения настройки слота в конкретном городе (имеет приоритет над dex_GetDwellingSlotByTownType).


Для старых модов, зависящих от плагина battery.dll, есть функция "dex_CA_D" с почти идентичным CA:D синтаксисом.
Рекомендуется по возможности всё же использовать новое API для более точной и упрощённой настроки слотов, включая альтернативы и
авторастущее население.

Пример:

Код
!?FU(OnAfterErmInstructions);
!!re i/0/8:;
  !!FU(dex_SetDwellingSlotByTownType):Pi/0/0/2/120/-1007;
!!en:;


Для каждого типа города назначает в неулучшенное жилище 1-го уровня дополнительный слот с авторастущим населением в 7 псих. элементалей в неделю (14 с замком, 21 с Граалем).

Код
!?FU(OnAfterErmInstructions);
!!re i/0/8:;
  !!FU(dex_SetDwellingSlotByTownType):Pi/0/0/2/120/5;
!!en:;


То же самое, но элементали являются АЛЬТЕРНАТИВАМИ родным существам и могут быть наняты в соотношении 1 элементаль вместо 20 родных существ (5% = 1/20).
Iv, hippocamus, magoth, Ethereal
04 Feb 2020, 02:23 Era II Рус
Вышло обновление HoMM 3 ERA
Текущая версия: 2.9.8

Что нового ?

В языке скриптов ЕРМ стало просто писать быстрые циклы (повторяющийся код). Очень просто и наглядно.
Стало возможным писать универсальные функции. Например, одна функция можно как вернуть число монстров в жилище, так и установить/увеличить их число.
Полностью заменён код проверки условий команд. Раньше нельзя было сравнивать вещественные числа с константами, не было проверок безопасности. Сейчас много чего можно и всё есть.
Когда-то форумчанин gamecreator написал прекрасные плагины для работы с Ящиками Пандоры и Хижинами Провидца через ЕРМ. Они были слегка адаптированы и включены в сборку Эры вместе с документацией.
ВоГ 3.58-скрипты переехали в отдельный мод "WoG Scripts", поставляемый в установщике. Теперь данный мод можно выключить и даже удалить. Ядро игры, движок ЕРМ и многие другие моды продолжат работать.
Обновлены утилиты от @grayface (Сергей Роженко): TxtEdit и MMArchive.
Небольшие изменения в ЕРМ редакторе и один исправленный вылет.

Большинство нововведений используется в моде «Расширенные Жилища». Он на подходе

Скачать: https://mods.hmm35.ru/Era%20Latest.exe
Bes, Iv, hippocamus, magoth, lion-killer, Mefista, igrik, Ethereal
31 Jan 2020, 23:42 Era II [ENG]
New concept in modding


Version 2.9.7

Код
[+] Added possibility to query function arguments count for functions, called via FU:P, FU:D, DO:P.
    New command !!FU:A?$ returns number of x-arguments (not including x16 for DO:P), received by function.
    This mechanism allows to write functions with optional parameters (parameters with default values) and
    functions with variadic arguments number.

    Example 1:
    !?FU(KillHero);
   ; Kills specified hero. Demonstration of optional parameters.
   ; [x1] - hero ID. Optional. -1 by default
    !!FU:A?k;       get number of function arguments
    !!VRx1&k=0:S-1; set x1 to -1, if no arguments passed
    !!HEx1:K;       killed hero

    !?CM0;
    !!FU(KillHero):P; kill current hero
    !!FU(KillHero):P155; kill Xeron

    Example 2:
    !?FU(sum);
   ; Calculates sum of all passed arguments.
   ; x1..x[n] - arguments to sum
   ; x[n+1] - result
    !!FU:A?k;  count function arguments
    !!VRxk:S0; set result to 0

    !!VRi:S0;
    !!SN&i>=k:G[end-for]; repeat k times
    [:for]
    !!VRxk:+xi; add next argument value to result
    !!VRi:+1;
    !!SN:G[for];
    [:end-for]

    !?CM0;
    !!FU(sum):P100/200/300/400/?s; get 100 + 200 + 300 + 400 into "s" quickvar
    !!IF:M^%Vs^; displays "1000"

[+] VR:C now supports v, y, x and w-variables.
[+] Improved MR:N and OnBattleRegeneratePhase:x1. Now stack ID is returned more accuratly. Thanks to Heromant.
[+] Small improvements of ERM Editor. Better 'for'-loop snippet, syntax fixes, 'iff' for !!IF, etc.

[*] Map resources, like ERM or Lua scripts were previously located in Maps/[MapName] directories. In order
    to support HD-mod maps grouping into folders, the location was changed to Maps/Resources/[MapName].

[-] Fixed wrong/unstable round, used by WoG for creature autosummoning via creature experience system.
[-] Fixed bug: w-variables in SN/MP/RD were always related to current hero.
[-] VR:R will no more crash on invalid value.


Скачать
Spartak, magoth, Zabuza-san
27 Jan 2020, 21:58 Era II [ENG]
New concept in modding


Version 2.9.5

[+] New version of WoG Native Dialogs plugin released by igrik. Now IF:D dialogs are rendered using
native Heroes 3 engine, compatible with HD mod scaling, unless avi/gif images are used.
The Sphinx dialog is also remade.

[+] Included new powerful ERM Editor, based on Sublime Text.

[+] Added "OnBuildTownBuilding" event, occuring when current PC human or AI builds town building.
Parameters: x1 = Town ID, x2 = Building ID.

[+] Added "OnOpenTownScreen" and "OnCloseTownScreen" events with the only x1 parameter: ID of town,
that was entered initially. Towns may be switched between inside town screen without generating Enter/Leave events.

[+] Added "OnSwitchTownScreen" event (x1 = Town ID), occuring when player switches towns in town screen.

[+] Added "OnPreTownScreen" and "OnPostTownScreen" events (x1 = Town ID), occuring right before/after showing
town screen for particular town. Both events occur, whether town screen is opened/closed or switched.
They can be used to pre-change buildings/names/dwellings and revert changes afterwards, for instance.

[+] Events "OnOpenHeroScreen", "OnCloseHeroScreen" and "OnUpdateHeroScreen" now receive x1 = Hero ID parameter.
In "OnCloseHeroScreen" x1 is the same as in "OnOpenHeroScreen", thus it's the first hero, screen was opened for.
Hero screen dialog allows to switch between heroes, without generating new Open/Close events.

[+] Added "OnPreHeroScreen" and "OnPostHeroScreen" events (x1 = Hero ID), occuring right before/after showing
hero screen for particular hero. Both events occur, whether hero screen is opened/closed or switched.
They can be used to pre-change creatures/names/skills and revert changes afterwards, for instance.

[+] Included Smacker (smk producing tools) in the package. Thanks to wessonsm. False positive detection by AVG/Avira possible.

[*] Labels in ERM triggers may now be duplicated, overwriting previous ones. Example:
!?XX;
[:loop]
...
[:loop] new loop will use the same label "loop", overwriting label position
...

[*] Events "OnEnterTown" and "OnLeaveTown" were renamed to "OnEnterTownHall" and "OnLeaveTownHall".

[*] SN:E result is stored in e1 only for FLOAT_RES convention (+4), otherwise in v1. The behavior is the
same, as it was before Era 2.9.x branch.

[-] Fixed crash when using temp variables f..t with GET syntax.
[-] Fixed invalid parameters of RD:I in town hord dwelling dialog.
[-] Fixed crash, caused by invalid town dialog detection.
[-] Fixed a small bug in structure address, thanks to gamemaster.

Скачать



Version 2.9.6

[+] SN and RD receivers syntax was improved. Now any command can use string concatenation (like d&z2),
integer modification (like d*5), SN:W string variable in the form of [?]s^var name^, SN:W integer
variable in the form of [?]i^var name^.

Examples:
- Concatenate string with existing variable and display result.
!!SN:W^report^/^Today we met a few strangers. They were^;
!!SN:W^report^/d&^ orcs^;
!!IF:M^%S(report)^; Today we met a few strangers. They were orcs

- Get current MP3 theme into named variable
!!MP:C?s^theme^;
!!IF:M^Current theme is %S(theme)^;

- Multiply number of creatures in the first slot of recruit dialog by 10 and display it
!!RD:C0/?t/d*10; type not changed, number multiplied by 10
!!RD:C0/?t/?i^numMons^;
!!IF:M^There are %I(numMons) creatures to hire^;

[+] Added support for SN:W variables interpolation inside ^...^. %S(var_name) for string values, %I(var_name)
for integer values. The total length of interpolated string must not exceed 1 MB.

[+] Replaced Heroes 3 random generator routine with world-wide known Mersenne Twister, generating
qualitative uniformly distributed sequences with huge periods.

[+] Added new ERM command BM:U6/?$, returning stack actual speed, including slow spell effect.
Note, BM:S always returns speed without slow spell effect.

[*] VR:T is deprecated and is equal to VR:R now. To get current time in milliseconds the following code can be used:
!!UN:C6529876/4/?t; t = timeGetTime function address
!!SN:Et/1; v1 = result
Use VR:R0/#new_seed to reseed random number generator.

Скачать
magoth, Zabuza-san
16 Jan 2020, 01:37 Новый ERM редактор
Новый Редактор ЕРМ



На базе прекрасного и крайне функционального редактора Sublime Text был разработан ЕРМ редактор.
(Крайне рекомендуется ознакомиться с сайтом разработчика редактора, где в виде gif-анимацией иллюстрируются многие возможности программного продукта)

Основные особенности:
-) Поддержка множественных курсоров/выделений позволяет редактировать большое число мест документа одновременно.
-) Встроенная система Python-плагинов и менеджер пакетов.
-) Визуальная мини-карта документа, панель с файловым деревом.
-) Возможность организации файлов в проекты, поиска по сотням файлов одновременно.
-) Быстрый нечёткий поиск по идентификаторам, объявлениям, файлам.
Переход к объявлениям функций.
-) Мощная поддержка автодополнения на основе любых слов, встречающихся в открытых файлах.
-) Сессии, автосохранение сессий, разделение рабочего окна на подокна.
-) Поиск и замена по регулярным выражением и многое другое.

Особенности поддержки ЕРМ:
-) Полная подсветка синтаксиса, включая интерполированные переменные (%Y2), имена функций и меток, макросы и др.
-) Быстрый ввод триггеров по "_xx" + ENTER и "on" + ENTER.
-) Быстрый ввод ресиверов по "xx" + ENTER, например "UN" => "!!UN:".
-) Автодополнение названий событий Эры.
-) Всплывающая подсказка для перехода к объявлению функции при наведении на имя функции. Не работает для функций с точками в названии, но работает выделение имени + F12.
-) Поддержка сниппетов "if", "ife" для быстрого ввода условий, "exi", "exif", "exifo" для быстрого ввода условий выхода из триггера.
-) Сниппет "for" для быстрой записи циклов со счётчиком.
-) Быстрый переход по именованным триггерам по CTRL+R.
-) Быстрый переход по открытым файлам и файлам проекта по CTRL+P.
-) Быстрый переход на любую строку по CTRL+G.
-) И другое…

Редактор будет распространяться в составе установщика Эры.
Купить лицензию для отключения напоминаний о регистрации можно на сайте разработчика.

Скачать: https://yadi.sk/d/tp1ClUzFV7YpRA (14 МБ)
Скачать только файлы поддержки ЕРМ для Sublime Text: https://yadi.sk/d/kBVOWIXg3y4vsg (7 КБ)
magoth, SerAlexandr, Zabuza-san, Ethereal, Grossmaster
21 Dec 2019, 00:36 Era II Рус
Вышла Эра 2.9.2



Долгое время шла работа над выпуском новой ветки 2.9.х, которая, наконец, закончена. Ключевые особенности обновления:

Оптимизация скриптового движка ЕРМ позволила ускорить выполнение повторяемого кода в 10 раз! (со 130 тыс. команд/сек до 1.3 млн. команд/сек). Это значит быстрее и плавнее игра, больше тяжёлых модов, больше возможностей для улучшения ИИ.
Множество улучшений в работе ЕРМ, которые положительно скажутся на лёгкости написания и отладки кода.
Поддержка новых событий: отрисовка экрана героя, а также обработка мыши в экранах найма монстров, городской ратуши и диалоге обзора королевства.
Скриптописателям предоставлен интерфейс для работы с диалогом найма отрядов. Стало возможным реализовывать множество идей на его основе: призыв разных существ в бою, перенос армий между героями, удалённая покупка монстров, свои жилища существ и многое другое.
Эволюция кода Эры. Код Эры 1.9 полностью перенесён на Delphi. Angel.dll — теперь просто заглушка.
Подарок для антивирусов: старая утилита DEFka, заменена на благоприятную версию 2.0 на другом движке.

Всё остальное читайте в журнале изменений: Help\Era\era ii changelog.txt.
====================
Особая благодарность фанатам игры, что поддержали проект материально: Andarium() и нескольким другим игрокам(). Просьба писать ники/имена в комментариях к переводам, чтобы вас, дорогие друзья, потом можно было упомянуть в летописях.

Отдельная благодарность daemon_n за шефство над самой популярной русскоязычной сборкой Эры и поддержку, неустанно оказываемую игрокам, а также перевод мода Advanced Classes.

Благодарность MoP за его плагин Battery.dll, с которого началась разработка программного интерфейса диалога найма существ.

Выражаю благодарность igrik за постоянные выпуски и обновления плагинов, советы и помощь.

Скачать актуальную версию
Устанавливать на Полное Собрание или Дыхание Смерти.

Поддержать выпуск новых версий можно через приложение пожертвований из шапки группы или напрямую на банковскую карту:
4496 5501 6577 3844 (Беларусь, БПС-СБЕРБАНК). Сервис: paysend.com



Era v2.9.3

Код
[+] Improved "ErmLegacySupport" option. Negative z-variables are not local for classic FU1..FU29999.
    Negative z-variables are not nulled on FU1..FU29999 enter and other quirks.
    Old WoG scripts bug count decreased.
[!] Warning. Modern ERM scripts should not rely on any initial y+, y-, e+, e-, z- value. Assign them
    before usage. In named functions and non-functional triggers y+, e+, z- variables are local to current trigger.
    Use temprorary global z+ variables or SN:W to return string values from functions.
[+] x1..x16 are also printed during ERM vars dumping.
[*] Question in ERM error dialog is changed from "continue without dumping" to "dump ERM memory".
[*] IFs counter is now reset at each trigger start.
[-] Fixed bug: current hero was not set in a few ERM events.


Скачать
Bes, hippocamus, magoth, Mefista, SerAlexandr, ZAR, igrik, Zabuza-san, Odin, Orzie, Ethereal, Sandris
18 Aug 2019, 01:06 Era II [ENG]
New concept in modding
Version 2.8.8
------------------------
Код
[+] Added command for changing monster names/specialty text as !!UN:G1 zvar-free replacement.
    SN:H^monname^/monster ID/(0 - singular, 1 - plural, 2 - description)/text.
    Note: get syntax works with all SN:H commands, allowing to obtain actual hint/text.

    Example:
    !?FU(OnOpenHeroScreen);
    !!SN:H^monname^/0/0/^Bug^; rename pikeman to Bug
    !!SN:H^monname^/0/1/^Bugs^; pikemen to Bugs
    !!SN:H^monname^/0/2/^Screws the game process^; change pikeman special abilities description
    !!SN:H^monname^/13/2/?z2; get archangel special abilities text
    !!IF:M^Don't hire bugs. Better higher archangel. Pros: %Z2^; display archangel advertisement

[+] Added plugin event 'OnAfterStructRelocations', occured after 'OnAfterWoG'. All game/WoG/Era structure relocations
    must be performed before it with calling corresponding RedirectMemoryBlock (OldAddr: pointer; BlockSize: integer; NewAddr: pointer)
    function. At 'OnAfterStructRelocations' event final addresses of game structures must be obtained via GetRealAddr.
    UN:C command always uses GetRealAddr and is thus safe to use default WoG/SoD addresses.

    Era uses GetRealAddr to get hero specialties, secondary skills, monster names and descriptions from now and
    will support more relocated structures in the future.

[-] Fixed MR:N bug: if dead stacks were present in position of alive stack, dead stack number could be returned.
[-] Fixed Era bug with invalid address of secondary skills descriptions table, leading to wrong SN:H behavior. Credits: gamemaster.
hippocamus, Etoprostoya, Richter
08 Aug 2019, 20:04 Era II Рус
Доступные сервисы:

ERM Scripts Extractor
Позволяет извлекать из h3m карт ЕРМ-скрипты в Эра формате, а скриптовые события в карте автоматически отключать.

ERM Enhancer
Переводит староформатные ЕРМ скрипты в формат Эры (именованные функции и метки, ограниченная автоправка !!MP:S команд). Поддерживает обработку множества скриптов за раз,а также переиспользование именованных функций из других скриптов.

Пример:
Обновлённый скрипт Атлантиды (600 КБ!)
Bes, Etoprostoya, igrik, Ethereal, Sandris
08 Aug 2019, 19:55 Era II [ENG]
New concept in modding
Пользователям сборок рекомендуется обновить game bug fixes.dll на тот, в котором нет исправления номеров раундов в бою.

С этой версии многопоток включён по умолчанию.

Version 2.8.7
------------------------
Код
[+] Added new function and event name 'OnRemoteEvent', generating !?FU(OnRemoteEvent) on remote sides with x1..x16 arguments.
    x1 is event type, values 0..9999 are reserved by Era. ERM users may use !!FU(any func):D instead with the same functionality.

[+] Added new event 'OnEveryDay', same as !?TM[xx], but occuring every day for every player/AI without any settings and before
    all other !?TM triggers.
    Example: !?FU(OnEveryDay)&-1000; every day for any AI

[+] Added new ERM command SN:R^old resource name^/^new resource name^, redirecting lod/pac/mp3 resources to other names.
    The command is a thin wrapper over RedirectFile exported function. Pass empty name as new resource name to remove
    redirection. All applied redirections are local, stored in saved game and reverted on map exit.
    '*.mp3' redirection works on all mp3 files at once.
    
    Example:
    !#SN:R^crgrif.def^/^croc.def^; let Royal Griffins look like Rocs (portraits are not changed)

    Game unloads not used resources, thus many resources can be dynamically redirected during playing.
    If resource is used in Hero Screen, perform redirection before Hero Screen is shown (and resource is cached).

    Custom interface skins may also be implemented, allowing user to switch themes right in the game (saved game
    loading may be necessary for visual update).

[+] MP trigger and receivers were fully remade. Old documentation is not applicable now. New implementation is fully
    thread-safe. From now heroes3.ini setting "UseOnlyOneCpuCore" is 0 by default, allowing running HD mod in CPU-heavy modes.

    Documentation:

    !?MP; Trigger occurs whenever game or ERM/Lua calls ChangeMp3Theme function.
   ; Here function parameters may be changed via !!MP:S, function default reaction enabled/disabled via !!MP:R

    !!MP:C?z[xx]; Get name of current theme without mp3 extension in lower case.
   ; Receiver may be called any time. Example result: 'dirt'.

    !!MP:P[theme name]/[Don't track position = 0/1]/[Loop = 0/1]; Calls ChangedMp3Theme function and generates !?MP event.
   ; Theme name is mp3 file name without extension.
   ; If 'Don't track position' is true (1), track playing is begun from start after resuming from pause.
   ; Otherwise position is remembered and restored on resume.
   ; 'Loop' controls automatical theme replay after end. 'Don't track position' must be set to 0 in order for looping to work.
   ; ---------------------
   ; Please, note, that final parameters are fully ignored if theme with the same name is being played currently.
   ; You may need to pause current theme before starting another one to force playing from start or without loops.
    Example: !!MP:P^cstletown^/0/1; start playing looped Castle theme

    !!MP:P0/[0 - pause, 1 - resume]; Pauses or resumes current theme
    Example:
    !!MP:P0/0; Silence, please, important event will occur now

    !!MP:S[theme name]/[Don't track position = 0/1]/[Loop = 0/1]; Get/change parameters for !?MP trigger.
    Examples:
    !?MP;
    !!MP:S?z2/d/0; Make all themes non-looped

    !?MP;
    !!MP:S^mainmenu^/0/1; Play SoD main menu theme during the whole gameplay process

    !!MP:R[get/set: Enable default reaction = 0/1]; Command allows to disable theme changing at all
   ; Can be used to disallow music changing for some time
    Example:
    !?MP;
    !!MP:R0; Don't switch current theme at all

[+] Added 4 new battle events as solution to !?BR and v997 mess with full backward compatibility:
    Event: 'OnBeforeBattlefieldVisible'.
    Occurs when battlefield and stacks are ready, but not visible. Right before !?BR&v997=-1.
    WoG applies spells to stacks in this phase and inits shoot/melee/attack-n-return settings.

    Event: 'OnAfterTacticsPhase'.
    Occurs right after tactics phase or after 'OnBeforeBattlefieldVisible' event if no tactics phase takes place.
    WoG summons Santa's guardians in this phase (because now stacks are in their final positions).

    Event: 'OnBattlefieldVisible'.
    Occurs when battlefield becomes visible. Game changes theme to combat right after this phase.
    
    Event: 'OnCombatRound'. A drop-in replacement for !?BR aka 'OnBattleRound'. Occurs only for visible real rounds.
    v997 is round number. For tactics phase it starts from -1000000000. For normal phase, counting starts from 0.
    Each round v997 is increased by one, thus it can serve as always increasing unique round ID.
    Note: v997 value in other triggers may be different!

    Example:
    !?FU(OnCombatRound)&v997=0; on first non-tactics visible real round
   ; apply spells, play music, change creature attributes, etc.

[-] Fixed bug: pressing Enter/Esc in ERM error dialog showed error dialog twice.
Richter
24 Jul 2019, 15:42 Феникс-Мод 3.6
Свежие билды
Первый раз вижу, не должны. Патч Heroes 3\Mods\WoG\EraPlugins\AfterWoG\fix towers damage.bin на месте?
Richter
23 Jul 2019, 20:39 А где тема "вопрос-ответ"?
С документацией только проблема. Возможность была ещё с версии 2.2:

Код
Version 2.2  May, 29.
---------------------
...

[+] Added support for packages of map objects. Instead of releasing the whole zeobjts.txt, create new txt with
only new items and place it under unique name in Mods\YourMod\Data\Objects folder.
  Example:
    Mods\YourMod\Data\Objects\new objects pack.txt
Richter
23 Jul 2019, 13:32 А где тема "вопрос-ответ"?
Попробуй создать папку Data\Objects. Внутри файл ritcher.txt. Туда из zeobjts.txt оставь только свои объекты и первой строкой их кол-во:

7
GKH2GR01.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000001 40 0 0 1
GKH2GR02.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000001 40 0 0 1
GKH2GR03.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000001 40 0 0 1
GKH2GR04.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000010 40 0 0 1
GKH2GR05.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000010 40 0 0 1
GKH2GR06.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000010 40 0 0 1
GKH2GR07.def 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 111111111 000000100 40 0 0 1

При загрузке редактора все текстовики из этой папкой сливаются по-хитрому с zeobjts.txt, не мешая друг другу.
Iv, hippocamus, Etoprostoya, Richter
14 Jul 2019, 22:01 Инженерный анализ
Reverse Engineering
Формат файлов кампаний:

Код
Heroes 3 Campaign (h3c) format after unpacking (gz).
=================================
byte    = 1 byte (0..255)
word    = 2 bytes (0..65535)
integer = 4 bytes (-2147483648..2147483647)
boolean = 1 byte (0 = false, 1 = true)
---------------------------------
const
  (* Hardcoded in camptext.txt, differs for each campaign index. Number of zones in current campaign *)
  NUM_ZONES = ?;

var
  Header: THeader;
  Zones:  array NUM_ZONES of TZone;
  Maps:   array NUM_ZONES of TMap | None;

type
  TString = record
    Length: integer;
    Value:  array Length of char;
  end;

  THeader = record
    GameVersion:             integer = 5 (Armageddon Blade) | 6 (WoG);
    CampaignInd:             byte; // Index of campaign (from 0), see camptext.txt
    CampaignName:            TString;
    CampaignDesc:            TString; // Description
    UserCanSelectDifficulty: boolean;
    MusicTheme:              byte;
  end; // THeader

  TZonePrologue = record
    HasPrologue: boolean;

    if HasPrologue then
      VideoId: byte;
      MusicId: byte;
      Text:    TString;
    end;
  end;

  TZoneEpilogue = record
    HasEpilogue: boolean;

    if HasEpilogue then
      VideoId: byte;
      MusicId: byte;
      Text:    TString;
    end;
  end;

  TStartingOpts = record
    OptsType: byte; // StartingBonus = 1, CrossoverHero = 2, InitialHero = 3

    if OptsType = 1 then
      PlayerColor: byte;
      NumBonuses:  byte;
      Bonuses:     array NumBonuses of record
        BonusType: byte;

        if Bonuses = 0 (spell) then
          Hero:  word; 65023 for most powerful hero
          Spell: byte;
        end;

        if Bonuses = 1 (creature) then
          Creature: word;
          Number:   word;
        end;

        if Bonuses = 3 (artifact) then
          Hero: word;
          Art:  word;
        end;

        if Bonuses = 4 (spell scroll) then
          Hero:  word;
          Spell: byte;
        end

        if Bonuses = 5 (primary skills) then
          Hero:       word;
          PrimSkills: array 4] of byte;
        end;

        if Bonuses = 6 (secondary skill) then
          Hero:     word;
          SecSkill: byte;
          Level:    byte;
        end;

        if Bonuses = 7 (resource) then
          Resource: byte;
          Quantity: integer;
        end;
      end; // Bonuses
    end; // if

    if OptsType = 2 then
      PlayerColor: byte;
      ZoneIndex:   byte;
    end;
  end; // .TStartingOpts

  TZone = record
    FileName:           TString;
    FileSize:           integer;
    RequiredZones:      byte; // Zone prerequisites; bitmask: 1 bit for each zone
    ZoneColor:          byte;
    DifficultyLevel:    byte;
    RegionRmbText:      TString; // Right mouse button hint
    Prologue:           TZonePrologue;
    Epilogue:           TZoneEpilogue;
    HeroesRetain:       byte; // Bitmask of Experience (bit 0), Primary Skills (bit 1), Secondary Skills (bit 2), Spells (bit 3), Artifacts (bit 4)
    CrossoverCreatures: array of 19 bytes; // 1 bit for every creature. Creature ID: 0..159
    CrossoverArts:      array of 18 bytes; // 1 bit for every artifact. Artifact ID: 0..143
    StartingOpts:       TStartingOpts;
  end;

  TMap = unpacked h3m (gz) map
IQUARE, Etoprostoya
14 Jul 2019, 00:31 Обсуждение инженерного анализа
https://stackoverflow.com/questions/1546141...ddress-op-codes
push/ret will unbalance the return-address predictor stack. mov eax,addr / jmp eax is only 1 byte longer and doesn't have that problem. See also Call an absolute pointer in x86 machine code.

Предсказание переходов работает с чётными парами call..ret. Непарные ret его нарушают, что определённо влияет на производительность в худшую сторону. Но с учётом всего навороченного в игре и требований это может быть абсолютно незаметно.
tolich, MasterOfPuppets
12 Jul 2019, 22:04 Обсуждение инженерного анализа
А почему на этом месте не освоить Erm Hooker 2.0?
Richter
07 Jul 2019, 16:37 Era II [ENG]
New concept in modding
Version 2.8.4
------------------------
Код
[+] Greatly improved WoG code performance by removing functions prolog and epilog code, that was added by ZVS in debug purposes.

[+] Improved ERM errors reporting: valid file name, line and positions are displayed, as long as appropriate context. Errors reporting now
    works correctly during ERM compilation. No more double/tripple error messages. The whole receiver is skipped in case of error.

[+] Rewritten scripts loading/saving/exporting engine. Removed restriction on 100 unique ERM scripts. Previously Era used to join 99+ scripts
    into single one. A few bugs of not unloading previous map scripts were fixed. Loading saved game with the same scripts set as current one
    is now really fast and does not require ERM recompilation. It means that loading game is much faster now.

[+] ERM memory limit is extended to 128 MB. Memory is now allocated gradually as needed, saving system resources.

[+] All maps are always treated as WoG format.

[+] Scripts from map global events are now managed by Era: they are preprocessed (named functions and labels support) and can be extracted via F11
    and reapllied on F12. They are loaded before scripts from map separate directory.

[+] Each map can have its own directory in Maps. For "Arrogance.h3m" it's Maps/Arrogance. For campaign Zc2.h3c (the first map) it's Maps\Zc2_1.
    The last number is map zone index in campaign. 1 for Zone A, 2 for Zone B, etc. Custom map scripts can be put inside map directory under Data/s subpath.
    Script names can have any names, they are loaded first and do not depend on global script names. If Maps/[MapName]/Data/s/load only these scripts.txt is present,
    only those global scripts, which are written there (one name per line), will be loaded from global Data/s directory. Anyway, all map scripts will
    be loaded in the first place. Map scripts are stored in saved game, can be reloaded, extracted, can use named functions and labels.

[+] All language Lang/*.json files are loaded from map directory (ex. Maps/Arrogance/Lang/arrogance.json), stored in saved games are applied. Thus
    maps can be supplied with translatable language data.

[+] WoG Option 5 (Wogify) meaning was changed for both map start or scripts reloading via F12:
    - 0: don't load any global ERM scripts (previously - load global ERM scripts for maps with 'RANDOM MAP' like name);
    - 1, 2: always load global ERM scripts, unless map forces other value;
    - 3: load global ERM scripts, but if map has its own scripts and does not force fixed set of global scripts,
      ask user, whether to skip global scripts loading or not.

    If there exists "Maps/[MapName]/Data/s/load only these scripts.txt" file, then global scripts specified in the file are loaded without confirmation
    and WoG Option 5 is set to "2".
    If user choses to skip or load global scripts in confirmation dialog, WoG Option 5 is changed to either 0 or 2.

    Summary:
    - Backward compatibility with existing maps/scripted campaigns is preserved. They usually set !!UN:P905/0 (disable wogification), which
      disables global ERM scripts loading.
    - Because all maps are now treated as WoG Format, option 1 is the same as option 2.
    - Scripts reloading via F12 always honor the option.

[+] Scripts from WoG Campaigns were fixed and extracted to separate directories. Bug fixes applied.
New service for scripts extraction was published: https://tools.bsoft.parkingby.icu/scripts-extractor/

[+] UN:J3 command was improved. Specify ':clear:' option instead of file name to turn off all WoG Options and set Map Rules to "use selected below".

[+] Added UN:J13 command. It resets commanders, according to current WoG Options 3 and 6.

[+] Added missing descriptions for old Era events:
  !?FU77012 = !?FU(OnStackToStackDamage). Occurs when damage dealt by one stack to another stack is calculated.
  SN:X parameters:

  ATTACKER            = 0; (attacker stack)
  DEFENDER            = 1; (defender stack)
  FINAL_DAMAGE_CONST  = 2; Do not change
  FINAL_DAMAGE        = 3;
  BASIC_DAMAGE        = 4; Normal basic damage
  DAMAGE_BONUS        = 5; Damage bonus (caused by attack-defense difference, cavalry bonus or any custom bonus)
  IS_DISTANT          = 6; (0 for melee, 1 for distant)
  DISTANCE_ARG        = 7;
  IS_THEORETICAL      = 8; (0 for real damage, 1 for estimated damage)

  !?FU77013 = !?FU(OnAICalcStackAttackEffect). Occured when AI calculates the effect of attacking stack
  SN:X parameters:

  ATTACKER            = 0; (attacker stack)
  DEFENDER            = 1; (defender stack)
  EFFECT_VALUE        = 2; (final effect)
  EFFECT_VALUE_CONST  = 3; Do not change

[+] Added "fix wog exp screen.bin" memory patch by igrik. It fixes column headers display in creature experience screen.
[+] Splice and HookCode API was improved. Added support for custom extra argument and multiple calling conventions.
[*] Savegames format was changed and is not compatible with previous Era versions.
[-] Disabled "Failed to create Debug\Era\log.txt" message if several game instances are running.
[-] Fixed UN:P3 command. Enabling/disabling commanders now enables/disables commander chests too.
[-] Mapname.erm and Mapname.cmd are not loaded anymore.
hippocamus, tolich, AKuHAK, Etoprostoya, igrik, Richter
29 Jun 2019, 13:21 Era II Рус
Делюсь новостями:

-) Перенёс, доработал и адаптировал много правок из ветки 2.55. ЕРМ скрипты из событий карт больше не грузятся, mapname.erm, mapname.cmd тоже. Баги, связанные с тем, что в памяти оставались прежние скрипты при начале новой игры или переходе между миссиями, соответственно, исчезли.

-) Движок загрузки/сохранения/экспорта скриптов свой. Больше нет ограничения на 100 скриптов (ранее те, что больше 99, сливались в один на лету).

-) Загрузка игры с тем же набором скриптов происходит почти мгновенно, ЕРМ не интерпретируется повторно.

-) Память ЕРМ увеличена до 128 МБ в пике.

-) Сильно улучшена и исправлена от багов система отчётов об ошибках как на этапе анализа ЕРМ, так и на этапе исполнения. Точные имя файла, строка и позиция, аккуратный контекст ошибки, отсутствие надоедливых двойных и тройных сообщений об ошибках, пропуск всего ресивера при ошибке в его подкоманде.

-) Производительность кода ВоГ значительно подросла. Этого удалось добиться за счёт умного зануления в исполняемом файле прологов и эпилогов функций ВоГ, в которых сохранялся отладочный мусор (потому как он Эрой не используется вообще). В результате многие простые и часто вызываемые функции сильно разгрузились.

-) Каждая карта может иметь свою папку по имени файла карты, например, Maps\Arrogance. Там может быть папка Data\s с произвольным набором ЕРМ скриптов. Эти скрипты всегда грузятся первыми, могут иметь любые имена, тоже сохраняются в файлах сохранений и даже экпортируются по F11 и перезагружаются по F12.

-) Помимо своих скриптов карта может иметь свои Lang\*.json файлы, которые так же сохраняются в файле сохранений, применяются, экспортируются, перезагружаются. Таким образом, можно распространить свою карту со скриптовыми особенностями в локализуемом формате и с поддержкой отладки.

-) Если карта — часть кампании, её имя берётся из имени файла кампании + "_" + индекс карты, начиная с нуля. Для Доброго Самаритянина это Maps\Zc2_0, Maps\Zc2_1 и т.д.
Поэтому скриптовые кампании тоже распространяются в паре h3c + папка.

-) Предупреждение о проблемах с log.txt больше не будет беспокоить Феанора.

-) Новые API Splice и HookCode доработаны, поддерживают передачу пользовательских параметров и разные соглашения о вызовах.

-) Старые сохранения загрузить не удастся, потому как ранее Воговский код по-своему сохранял и загружал скрипты. Это вынужденная мера.
hippocamus, Etoprostoya, SerAlexandr, igrik, Zabuza-san, Orzie, Ethereal, Sandris
13 Jun 2019, 22:51 Era II Рус
Уважаемое Сообщество!

Мы рады сообщить вам о выходе новой версии платформы Эра — 2.8.3.
Долгое время не обновляемый мод русификации был доработан и тоже доступен для скачивания.

Основными задачами ветки 2.8х являлись и являются:
-) Кроссплатформенность. Новая реализация виртуальной файловой системы (ВФС) дала возможность запускать Эру без режимов совместимости на Windows XP SP 3, Windows 7, Windows 10, Wine.
-) Интернационализация. Виртуальная файловая система работает теперь с кодировкой Юникод, что позволяет правильно функционировать любым скриптам и плагинам, взаимодействующим с файлами, а также ограниченно использовать локализованные имена файлов и папок. Добавилась поддержка файлов переводов в формате json (UTF-8). Функции перевода доступны как в ЕРМ, так и плагинам.
-) Производительность. Новая ВФС кэширует всю папку модов в памяти, работает очень быстро, что ярко проявилось в плавности интерфейса и исчезновении тормозов. Обновлённый патч на нагрузку процессора позволяет практически не грузить ядра ЦПУ, при этом не влияя на отзывчивость игры и скорость анимации.
-) Потокобезопасность. Все мы не любим вылеты. Поэтому код Эры использует только потокобезопасные перехватчики, а новая реализация виртуальной файловой системы проверяется в многопоточном режиме. На текущий момент основным источником вылетов без опции привязки игры только к одному ядру процессора являются события переключения музыкальных композиций и ЕРМ команды, работающие со звуком. Уже намечены шаги по изменению событий и команд для устранения или значительного смягчения данной проблемы.
-) Подготовка к переходу на Lua-скрипты. Lua - язык программирования, на котором писать и читать скрипты гораздо продуктивнее, проще и приятнее. Задача Эры — устранить устаревшее API (программный интерфейс приложения), ввести необходимые средства для организации на Lua как плагинов, так и просто пользовательских сценариев.
-) Стабильность. Попутно исправляются влияющие на стабильность баги, обновляются идущие в инсталляторе моды.
-) Прогрессивность. Благодаря великолепной работе igrik-а большинство воговских диалогов было полностью переписано с использованием родным для игры элементов управления. Новые диалоги
работают быстро, используют ресурсы из игровых архивов и масштабируются вместе с игровым разрешением в HD Mod.
-) Обратная совместимость. Мы сохранили практически полную совместимость с уже написанными ранее плагинами, устранили возможные источники вылетов, объявили устаревшими часть ранее опубликованных интерфейсов.
-) Открытость. Мы опубликовали на площадке github исходные коды основных программных компонентов: библиотеки era.dll, библиотеки редактора карт, виртуальной файловой системы, инсталлятора Эры, генератора отладочных карт и др. Любой проект может добавить на файловом уровне поддержку модов двумя вызовами функций, используя библиотеку vfs.dll, распространяемую по лицензии AGPL v3.
-) И прочее. Множество мелких технических правок и обновлений, незаметных для глаза, но необходимых для развития.

Мы надеемся, что платформа подарит вам ещё много часов увлекательной игры, экспериментов или даст возможность раскрыть свой творческий потенциал. Огромную благодарность выражаем всем, кто оказывал любую помощь в тестировании, создании сборок и модов, распространении информации, ответов на вопросы, администрировании группы и множестве других моментов, без которых не было бы того, что мы имеем сейчас smile2.gif
Bes, Iv, hippocamus, IQUARE, Spartak, lion-killer, Adept, Etoprostoya, igrik, Orzie, KypaToP_HM, Richter, Ethereal, Sandris

21 страниц V   1 2 3 > » 
Текстовая версия Сейчас: 4 August 2020 - 23:41
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика