Current time: 25.11.2024, 13:37 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: 792
Post: #5223

Разбирал воговские скрипты и наткнулся на пару моментов, требующих уточнения.
1. В 43 wog - mysticism skill enhancement.erm в строке 42 вызывается функция 8165:
!!FU8165&-10:P;
Кто-нибудь знает, что это за функция? Нигде в воговских скриптах ее нет (я наверное все пересмотрел), то есть нигде нет ее описания вида !?FU8165
Или это просто при правках скриптов забыли вычистить и я зря голову ломаю?
2. В скрипте правила карты (правило 11 удвоение хода) нашел такой код:
Это меня очень заинтересовало, и вот почему.
Ведь таким образом можно заменять те места в коде, где перебираются все герои от 0 до 155 и проверяются на принадлежность текущему игроку. Типа вместо первого примера было бы так:
При этом количество циклов уменьшается в разы!
Такой код, как во втором примере, часто используется (можно сказать, это стандартный прием) и таких мест в скриптах можно немало найти.
Стоит ли пытаться заменять такие места для улучшения быстродействия или здесь есть какие-то подводные камни?
Конечно, в каждом отдельном случае это очень маленькое изменение, но в сумме может они и дадут какой-то эффект.
3. Ну и последнее, нашел ошибку в скрипте 30 wog - enhanced secondary skills.erm.
В функции 7020 два раза проверяется переменная v7190, которая отвечает за Learning, а должна второй раз проверяться v7188 (Estates):
Если обе опции включены или обе выключены, то ничего страшного, но если включена только одна из них, скрипт работает неправильно.
Надо бы исправить 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: 792
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: 16657
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: 792
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: 792
Post: #5231

(02.04.2019 16:03)igrik Wrote:  Но по настоящему быстрее будет исполозование SN:G вместо DO и т.п.
Всё из за особенностей запуска функций типа !?FU. Если коротко, то цикл SN:G в десятки, если даже не в сотни раз быстрее цикла DO, потому что в нем не происходит каждый раз вызов функции !?FU.
Значит ли это, что вызов функции с помощью !!SN:C тоже будет быстрее обычного вызова функции с помощью !!FU?
Я имею в виду такой код:
И если вызов с помощью SN:C действительно быстрее, то как таким способом вызвать функцию с параметрами, то есть написать аналог например такой команды:
У меня есть одна догадка, но я не уверен в ее правильности.
Буду очень благодарен, если кто-нибудь подтвердит ее или наоборот опровергнет или предложит лучший способ:
или может лучше так:
Или может все это вообще бесполезно и вызов с помощью 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: 16657
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: 792
Post: #5233

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

Posts: 2356
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: 16657
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-2024 MyBB Group