Current time: 13.04.2025, 04:47 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Ваши вопросы по ERM-скриптам
Author Message
ALEXALEX3434 Offline

Posts: 272
Post: #5221

Не знаю правильно ли тему выбрал....

При колдовстве Берсеркера героем заклинание сбрасывается...баг еры или сода?
И можно ли исправить ,может скриптом?
28.03.2019 19:15
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3881
Post: #5222

В ES (Bug fixes.erm) если в область каста не попадают восприимчивые вражеские отряды каст Берсерка отменяется чтобы заклинание не тратилось впустую.
Перепроверь - возможно у вражеской цели резист к берсерку или брелок с иммуном к берсерку у вражеского героя.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
28.03.2019 20:10
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 815
Post: #5223

Разбирал воговские скрипты и наткнулся на пару моментов, требующих уточнения.
1. В 43 wog - mysticism skill enhancement.erm в строке 42 вызывается функция 8165:
!!FU8165&-10:P;
Кто-нибудь знает, что это за функция? Нигде в воговских скриптах ее нет (я наверное все пересмотрел), то есть нигде нет ее описания вида !?FU8165
Или это просто при правках скриптов забыли вычистить и я зря голову ломаю?
2. В скрипте правила карты (правило 11 удвоение хода) нашел такой код:
  1. !!FU709:P11; [check for rule 11]
  2. !!OW&3:H-1/2/0; [number of heroes current player has: v2]
  3. !!DO703/1/v2/1&3/v2>0:P; [double hero movement of current player's heroes]
  4. ***
  5. !?FU703;
  6. !!OW:H-1/3/x16; [store hero number of hero x16 in v3]
  7. !!HEv3:W?y1; [get hero's movement: y1]
  8. !!VRy1:*2; [double hero's movement: y1]
  9. !!HEv3:Wy1 Gy1; [set hero's new movement plus initial hero movement values]
Это меня очень заинтересовало, и вот почему.
Ведь таким образом можно заменять те места в коде, где перебираются все герои от 0 до 155 и проверяются на принадлежность текущему игроку. Типа вместо первого примера было бы так:
  1. !!FU709:P11; эта функция устанавливает флаг 3 (правило включено/выключено)
  2. !!DO703/0/155/1&3:P; перебираем всех героев от 0 до 155
  3. ***
  4. !?FU703;
  5. !!HEx16:O?y1; узнаем владельца героя
  6. !!OW:C?y2; узнаем текущего игрока
  7. !!FU&y1<>y2:E; выход, если не совпадают
  8. !!HEx16:W?y1; [get hero's movement: y1]
  9. !!VRy1:*2; [double hero's movement: y1]
  10. !!HEx16:Wy1 Gy1; [set hero's new movement plus initial hero movement values]
При этом количество циклов уменьшается в разы!
Такой код, как во втором примере, часто используется (можно сказать, это стандартный прием) и таких мест в скриптах можно немало найти.
Стоит ли пытаться заменять такие места для улучшения быстродействия или здесь есть какие-то подводные камни?
Конечно, в каждом отдельном случае это очень маленькое изменение, но в сумме может они и дадут какой-то эффект.
3. Ну и последнее, нашел ошибку в скрипте 30 wog - enhanced secondary skills.erm.
В функции 7020 два раза проверяется переменная v7190, которая отвечает за Learning, а должна второй раз проверяться v7188 (Estates):
  1. !?FU7020;
  2. !!HEx16:O?v7021; [get owner of iterated hero]
  3. !!HEx16&v7021=v7026:S0/?y1; [get hero's pathfinding skill level]
  4. !!FU7025&v7194=1/v7021=v7026/y1>0:Px16/y1; [if hero has pathfinding, is in use and it's that hero's owner's turn, continue in function 7025 - if enabled]
  5. !!FU&x1=1:E; [exit if using day 1 timer]
  6. !!HEx16&v7021=v7026:S21/?y1; [get hero's learning skill level]
  7. !!FU7021&v7190=1/v7021=v7026/y1>0:Px16/y1; [if hero has learning, is in use and it's that hero's owner's turn, continue in function 7021 - if enabled]
  8. !!HEx16&v7021=v7026:S13/?y1 E?y2/?y3/1; [get hero's estates skill level, hero level]
  9. !!FU7005&v7190=1/v7021=v7026/y1>0:Py1/y3; [if hero has estates, is in use and it's that hero's owner's turn, continue in function 7005 - if enabled]
Если обе опции включены или обе выключены, то ничего страшного, но если включена только одна из них, скрипт работает неправильно.
Надо бы исправить 148
(This post was last modified: 02.04.2019 14:10 by wessonsm.)
31.03.2019 21:07
Find all posts by this user Quote this message in a reply
ALEXALEX3434 Offline

Posts: 272
Post: #5224

Algor, Берсерек сбрасывается во время хода противника с любого существа(версия ера 2.4 ,не последняя).Заклинание не работает.

Есть ли решение?
(This post was last modified: 01.04.2019 12:38 by ALEXALEX3434.)
31.03.2019 21:21
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3881
Post: #5225

ALEXALEX3434, в описании ERA Scripts указано: Скриптпак/мод для ERA 2.74+:
Перепроверь на свежей версии.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
02.04.2019 15:15
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #5226

(31.03.2019 21:07)wessonsm Wrote:  Разбирал воговские скрипты и наткнулся на пару моментов, требующих уточнения.
1. Видимо функцию !?FU8165 просто при создании скрипта забыли удалить. Ничего страшного, но всё же лучше закоментировать этот вызов.
3. Да это ошибка.
П.1 и 3 я исправил в сборке и они будут доступны в след.релизе.

Теперь что касается п.2:
Да, предложенный алгоритм тобой будет быстрее. Но по настоящему быстрее будет исполозование SN:G вместо DO и т.п.
Всё из за особенностей запуска функций типа !?FU. Если коротко, то цикл SN:G в десятки, если даже не в сотни раз быстрее цикла DO, потому что в нем не происходит каждый раз вызов функции !?FU.
Для справки: один вызов функций FU вызывает уеву тучу циклов на С++ для сохранения и обнуления, а потом восстановления локальных переменных (см. исходник Вог)
Code:
int ERM_Function(char Cmd,int Num,_ToDo_*sp,Mes *Mp)
{
  int i,j,v;
  int   _lYVarInsideFunction;
  int   OldX[16];
  int   OldY[100];
  float OldF[100];
  char OldString[10][512];
  if(WoG==0) RETURN(0) // поддерживается только в WoG
//  VarNum *vnp=(VarNum *)&sp->Pointer;
  switch(Cmd){
    case 'P': // вызвать функцию
      for(i=0;i<16;i++) { OldX[i]=ERMVarX[i]; }
      for(i=0;i<100;i++){ OldY[i]=ERMVarY[i]; }
      for(i=0;i<100;i++){ OldF[i]=ERMVarF[i]; }
      for(i=0;i<10;i++) for(j=0;j<512;j++) { OldString[i][j]=ERMLString[i][j]; }
      for(i=0;i<Num;i++){ ERMVarX[i]=Mp->n[i]; }
      for(i=0;i<100;i++){ ERMVarY[i]=0; }
      for(i=0;i<100;i++){ ERMVarF[i]=0; }
      v=GetVarVal(&sp->Par[0]);
      _lYVarInsideFunction=YVarInsideFunction;
      YVarInsideFunction=1;
      FUCall(v);
      YVarInsideFunction=_lYVarInsideFunction;
      // 3.58 return values
      // first restore y vars (and others)
      for(i=0;i<100;i++){ ERMVarY[i]=OldY[i]; }
      for(i=0;i<100;i++){ ERMVarF[i]=OldF[i]; }
      for(i=0;i<10;i++) for(j=0;j<512;j++) { ERMLString[i][j]=OldString[i][j]; }
      // now if used ?y, it will be stored correctly
      for(i=0;i<Num;i++){
        if(Mp->VarI[i].Check!=1) continue; // не ?
        Apply(&ERMVarX[i],4,Mp,(char)i);
      }
      for(i=0;i<16;i++) { ERMVarX[i]=OldX[i]; }
      break;


game bug fixes extended.dll || My Plugins || My GitHub
02.04.2019 16:03
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 815
Post: #5227

igrik, большое спасибо, буду пытаться разобраться с SN:G.

И вот что я еще нашел.
В скрипте вогификации 78 wog - wogify.erm почти в самом начале (сразу после таймера TM1) описывается функция для генерации случайного заклинания, удовлетворяющего заданным начальным условиям, и приводится пример использования этой функции.
Так вот, оказывается этот код, приведенный просто для примера, реально выполняется в теле таймера TM1.
    !!FU$spell$:P3/3/2/5/1/1/52; (строка 227 скрипта)
То есть реально генерируется заклинание 3 уровня, боевое, принадлежащее к школе магии огня или воздуха, с проверкой на бан, кроме Неудачи (№52).
Это все бы ничего, ну подумаешь, сгенерировали одно ненужное заклинание. Так, чепуха.
Но как оно генерируется!
Я чуть со стула не упал. Короче, сначала генерируется абсолютно любое случайное заклинание, от №0 до №69, а потом проверяется на соответствие заданным условиям. Угадали - хорошо, а если не угадали - запускаем цикл сначала и генерируем новое, и так пока не угадаем или пока не закончатся циклы. Счетчик циклов выставлен на 500:
!!DO7778/1/500/1:Px1/x2/x3/x4/x5/x6/x7/x8/x9/x10/x11/x12/x13/x14/x15; (строка 265 скрипта)
То есть эта штука может вхолостую крутиться до 500 раз, и это в ежедневном таймере для всех игроков!
Я не посчитал, сколько раз у меня крутился этот цикл, но по erm tracking.erm началось это все в строке 11404 и закончилось в строке 12065.
600 строк ERM-кода на ровном месте! (ну или около того). Так я эту красоту и нашел.
А потом люди спрашивают, почему компьютер долго ходит Sm))

igrik, проверь пожалуйста, может я ошибаюсь, но если нет, это обязательно надо исправить тоже.
(This post was last modified: 02.04.2019 19:46 by wessonsm.)
02.04.2019 18:49
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16734
Post: #5228

600 команд — это ещё не много ))
Но в целом да, простор для оптимизаций.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
02.04.2019 19:15
Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 815
Post: #5229

Berserker, так весь прикол в том, что это заклинание вообще не нужное, оно дальше нигде не используется. Оно просто приведено в качестве примера, как использовать эту функцию, такой себе мини-хелп.
Оно должно было быть закомментировано, но по ошибке оказался рабочий код.
(This post was last modified: 02.04.2019 20:07 by wessonsm.)
02.04.2019 19:29
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3881
Post: #5230

wessonsm, Эт фигня. Ты дальше посмотри - !?FU7779;
У меня в ES несколько WoG-скриптов поправлено (и этот тоже), поэтому, если возьмешься оптимизировать, бери оттуда, а не из оригинала.
А еще в том же скрипте секция замены объектов очень просится на переработку. Все никак не соберусь с духом.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
02.04.2019 22:41
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 815
Post: #5231

(02.04.2019 16:03)igrik Wrote:  Но по настоящему быстрее будет исполозование SN:G вместо DO и т.п.
Всё из за особенностей запуска функций типа !?FU. Если коротко, то цикл SN:G в десятки, если даже не в сотни раз быстрее цикла DO, потому что в нем не происходит каждый раз вызов функции !?FU.
Значит ли это, что вызов функции с помощью !!SN:C тоже будет быстрее обычного вызова функции с помощью !!FU?
Я имею в виду такой код:
  1. !?FU345345;
  2. !!SN:C0/456456/?y1; получить адрес функции 456456
  3. !!SN:Cy1/0; перейти к функции
  4. !?FU456456;
  5. ...что-то делаем
  6. !!SN:R; возврат к предыдущей функции (345345)
И если вызов с помощью SN:C действительно быстрее, то как таким способом вызвать функцию с параметрами, то есть написать аналог например такой команды:
  1. !!FU456456:Px1/x2/x3/x4;
У меня есть одна догадка, но я не уверен в ее правильности.
Буду очень благодарен, если кто-нибудь подтвердит ее или наоборот опровергнет или предложит лучший способ:
  1. !?FU345345;
  2. !!SN:M-1/4/0/0; выделение массива из 4-х чисел в свободный слот памяти, № слота v1
  3. !!SN:Mv1/0/x1 Mv1/1/x2 Mv1/2/x3 Mv1/3/x4; записываем значения x1, x2, x3, x4 в слот v1
  4. !!SN:C0/456456/?y1;
  5. !!SN:Cy1/0; выполняется функция 456456
  6. !!SN:Mv1; удаляем слот v1
  7. !?FU456456;
  8. !!SN:Mv1/0/?x1 Mv1/1/?x2 Mv1/2/?x3 Mv1/3/?x3; считываем значения
  9. ...что-то делаем
  10. !!SN:R;
или может лучше так:
  1. !?FU345345;
  2. !!SN:M456456/4/0/0; выделение слота памяти
  3. !!SN:M456456/0/x1 M456456/1/x2 M456/2/x3 M456/3/x4; записываем значения x1, x2, x3, x4
  4. !!SN:C0/456456/?y1;
  5. !!SN:Cy1/0; выполняется функция 456456
  6. !!SN:M456456; удаляем слот
  7. !?FU456456;
  8. !!SN:M456456/0/?x1 M456456/1/?x2 M456456/2/?x3 M456456/3/?x3; считываем значения
  9. ...что-то делаем
  10. !!SN:R;
Или может все это вообще бесполезно и вызов с помощью SN:C ничем не быстрее?
(This post was last modified: 10.04.2019 21:37 by wessonsm.)
10.04.2019 21:28
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16734
Post: #5232

Это устаревшая возможность, я бы её не трогал, если честно. Вызывайте пока обычные функции. Оптимизацией будет использование Луа.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
12.04.2019 18:25
Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 815
Post: #5233

Спасибо, понял. Если бы еще кто-то объяснил, как хотя бы простейший скрипт на Луа для героев написать. Я еще ни одного не видел...
ERM как-то привычнее.
14.04.2019 20:09
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2420
Post: #5234

(14.04.2019 20:09)wessonsm Wrote:  Если бы еще кто-то объяснил, как хотя бы простейший скрипт на Луа для героев написать. Я еще ни одного не видел...

Создаёшь в папке scripts текстовик helloworld.lua и пишешь в нём это:

print "hello world";

Сохраняешь, и наблюдаешь результат при загрузке игры.

(14.04.2019 20:09)wessonsm Wrote:  ERM как-то привычнее.

Лично для меня лучше всего подходит ассемблерный WERD, база которого позволяет делать в игре многие вещи, вплоть до добавления новых игровых фракций. ERM тоже штука удобная, но слишком медленная и скромная по возможностям - хорошо подходит для картописателей и небольших модов-опций, но плохо - для глобальных модов. Для LUA крайне необходимо знание основ программирования на языках высоких уровней, т.е. это нововведение позитивно принимается профессиональными программистами и негативно/прохладно всеми остальными. Может быть найдётся человек, который сделает конвертер кода из ERM в LUA (хотя в WoG 3.59 команды от ERM вроде бы работали прямо в LUA, непонятно как...), тогда и у простых смертных появится какая-никакая возможность перейти на LUA.
15.04.2019 02:07
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16734
Post: #5235

wessonsm, я застопорился на исправлении багов в новой реализации виртуальной системы, что не пошёл дописывать обёртку с Луа на ЕРМ. Сейчас писать скрипты можно, даже с практически всеми возможностями, но не удобно без готовых высокоуровневых переходников на ЕРМ и АПИ не конечное. Почитайте по Луа чуть-чуть. В файле D:\Heroes 3\Mods\WoG\Data\Scripts\TESTING.lua есть пример скрипта.

Code:
era.on('OnHeroScreenMouseClick', function (event, handler)
  erm.currHero():w(100, 888)
  erm('IF:W-1; IF:M^%W100^')

  local r = math.random(3)
  
  if r <= 2 then
    era.on('OnHeroScreenMouseClick', handler, { oneTime = true })
  end
end, { oneTime = true })

Но для разъяснения придётся писать документацию.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
16.04.2019 23:40
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2025 MyBB Group