Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Программа для разведки

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 537
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 122 раз.

Re: Программа для разведки

Сообщение void_17 » 19 ноя 2023, 15:25

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


Ну т.е. как в четвёрке. Я предлагал, вроде бы это ничем не закончилось.
Вернуться к началу

offlinetemig  
имя: Артем
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 02 ноя 2023, 14:24
Пол: Мужчина
Поблагодарили: 10 раз.

Re: Программа для разведки

Сообщение temig » 23 ноя 2023, 14:59

Пока разбирался как строятся деревья, ломал голову, почему по моим расчетам все классы считаются правильно, кроме навигаторов, и обнаружил, что в HCTRAITS.TXT у меня для них лога 6, разведка 3, навигация 2. А в Физмиге, на который я ориентировался, лога 3, разведка 2, навигация 6)
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Программа для разведки

Сообщение AlexSpl » 23 ноя 2023, 15:46

HotA многие значения из HotA.dat берёт. Если уверены, что веса вторичных навыков точно берутся из HCTRAITS.TXT, то у Навигаторов однозначный баг (должны быть, как FizMiG'е, ибо Навигаторы должны уметь плавать). Другое дело, зачем им Навигация на картах без воды (а почти все играют именно такие карты)? :smile5: Может быть, из-за этого веса и поменяли, забыв обновить чейнджлог. Или даже сделали два варианта (я бы так и поступил): один для карт без воды, другой - для карт с водой (хотя, вроде, в чейнджлоге это не указано, значит, вряд ли).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Программа для разведки

Сообщение AlexSpl » 23 ноя 2023, 17:27

Проверил. Что с опцией "Без воды", что с опцией "Острова" веса у класса Navigator одинаковые:

Код: Выделить всё
Pathfinding = 6
Archery = 6
Logistics = 6
Scouting = 3
Diplomacy = 2
Navigation = 2
Leadership = 2
Wisdom = 8
Mysticism = 3
Luck = 4
Ballistics = 2
Eagle Eye = 2
Necromancy = 0
Estates = 2
Fire Magic = 2
Air Magic = 6
Water Magic = 9
Earth Magic = 5
Scholar = 5
Tactics = 4
Artillery = 1
Learning = 4
Offense = 4
Armorer = 1
Intelligence = 8
Sorcery = 6
Resistance = 5
First Aid = 4
Interference = 1

Однозначно баг с весом вторичного навыка Navigation.

* * *
Или неудачное название класса. Для класса Captain вес Navigation уже 6:

Код: Выделить всё
Pathfinding = 8
Archery = 9
Logistics = 6
Scouting = 4
Diplomacy = 5
Navigation = 6
Leadership = 6
Wisdom = 1
Mysticism = 1
Luck = 7
Ballistics = 5
Eagle Eye = 4
Necromancy = 0
Estates = 4
Fire Magic = 2
Air Magic = 3
Water Magic = 2
Earth Magic = 4
Scholar = 1
Tactics = 6
Artillery = 5
Learning = 2
Offense = 9
Armorer = 2
Intelligence = 3
Sorcery = 2
Resistance = 3
First Aid = 2
Interference = 3

В FizMiG'е для обоих классов Cove вес Navigation указан 6. Более того, в официальной документации HotA вес Navigation тоже указан 6 для обоих классов :!: Но нужно, конечно, использовать веса, которые есть в игре реально, чтобы дерево считалось правильно. LMOracle читает веса из памяти, поэтому всё OK.
Вернуться к началу

offlinetemig  
имя: Артем
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 02 ноя 2023, 14:24
Пол: Мужчина
Поблагодарили: 10 раз.

Re: Программа для разведки

Сообщение temig » 23 ноя 2023, 18:28

Разбираюсь дальше в генерации на основании этого обсуждения:
http://heroescommunity.com/viewthread.p ... enumber=12

Некоторые вопросы возникли по переменной SEC.
Опытным путем у меня получилось, что при расчете левого слота (апгрейд навыка, кроме магии) или генерации нового навыка в левый слот (если все навыки уже экспертны), для расчета правого слота нужно использовать значение SEC, измененное после генерации левого слота при вызове _rand. Но, если в левый слот апгрейдится магия, то при ее расчете значение SEC наоборот не нужно обновлять и для расчета правого слота использовать исходное, что мне показалось не очень логичным. Или я что-то не так понимаю? Т.к. пока я не убрал обновление переменной SEC при расчете апгрейда магии, правый слот у меня рассчитывался некорректно, когда в левый идет апгрейд магии.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Программа для разведки

Сообщение AlexSpl » 23 ноя 2023, 18:38

См. эти две процедуры:

Код: Выделить всё
procedure H3OptLevelUp(var Hero: TH3RecOpt; out nSkill2L, nSkill2R: BYTE);
var R, N: Integer;
    MinLvl: BYTE;

begin
  with Hero do
  begin
    inc(Level);

    R := ($343FD * Level + $26497 * GTreeNo + $259DF) * $343FD + $269EC3;

    if Yog_BB then
    begin
      if Level > 9 then N := Weights.PW10[0] + Weights.PW10[1] else
        N := Weights.PW[0] + Weights.PW[1];
      if N > 1 then R := R * $343FD + $269EC3;
    end;

    // ----- Secondary skills -----
    MinLvl := BYTE(NumOfSkills > 7);

    H3OptGetSecSkill(Hero, 1, 3, SS_NONE, nSkill2L, R);
    if nSkill2L = SS_NONE then
      H3OptGetSecSkill(Hero, MinLvl, 3, SS_NONE, nSkill2L, R);

    if nSkill2L = SS_WISDOM then Last_Wisdom := Level;
    if (nSkill2L = SS_FIRE_MAGIC) or (nSkill2L = SS_AIR_MAGIC) or
       (nSkill2L = SS_WATER_MAGIC) or (nSkill2L = SS_EARTH_MAGIC) then
       Last_Magic := Level;

    H3OptGetSecSkill(Hero, MinLvl, 1, nSkill2L, nSkill2R, R);
    if nSkill2R = SS_NONE then
      H3OptGetSecSkill(Hero, MinLvl, 3, nSkill2L, nSkill2R, R);

    if nSkill2R = SS_WISDOM then Last_Wisdom := Level;
    if (nSkill2R = SS_FIRE_MAGIC) or (nSkill2R = SS_AIR_MAGIC) or
       (nSkill2R = SS_WATER_MAGIC) or (nSkill2R = SS_EARTH_MAGIC) then
       Last_Magic := Level;
  end;
end;


Код: Выделить всё
procedure H3OptGetSecSkill(var Hero: TH3RecOpt; MinLvl, MaxLvl, LeftSkill: BYTE;
          var Skill: BYTE; var rnd: Integer);

var i, Q, SUM_W: Integer;

begin
  with Hero do
  begin
    if MinLvl >= MaxLvl then
    begin
      Skill := SS_NONE;
      Exit;
    end;

    if (Last_Wisdom + Delta_Wisdom <= Level) and
       (SkLearnt[SS_WISDOM] >= MinLvl) and (SkLearnt[SS_WISDOM] < MaxLvl) and
       (LeftSkill <> SS_WISDOM) and not Weights.SR[SS_WISDOM] then
    begin
      Skill := SS_WISDOM;
      Exit;
    end;

    if (Last_Magic + Delta_Magic <= Level) and
       (LeftSkill <> SS_FIRE_MAGIC) and (LeftSkill <> SS_AIR_MAGIC) and
       (LeftSkill <> SS_WATER_MAGIC) and (LeftSkill <> SS_EARTH_MAGIC) then
    begin
      //----- 004DB176 ------
      SUM_W := 0;
      for i := SS_FIRE_MAGIC to SS_EARTH_MAGIC do
      begin
        if (SkLearnt[i] >= MinLvl) and (SkLearnt[i] < MaxLvl) and not Weights.SR[i] then
        if SkLearnt[i] = 0 then inc(SUM_W, Weights.SW[i]) else inc(SUM_W);
      end;

      if SUM_W <> 0 then
      begin
        if SUM_W > 1 then
        begin
          rnd := rnd * $343FD + $269EC3;
          Q := (rnd shr $10) and $7FFF;
          Q := Q mod SUM_W + 1;
        end else Q := 1;

        SUM_W := Q;
        for i := SS_FIRE_MAGIC to SS_EARTH_MAGIC do
        begin
          if (SkLearnt[i] >= MinLvl) and (SkLearnt[i] < MaxLvl) and not Weights.SR[i] then
          if SkLearnt[i] = 0 then dec(SUM_W, Weights.SW[i]) else dec(SUM_W);

          if SUM_W <= 0 then
          begin
            Skill := i;
            Exit;
          end;
        end;
      end;
    end;

    SUM_W := 0;
    for i := SS_PATHFINDING to H3LastSSkill do
    if (SkLearnt[i] >= MinLvl) and (SkLearnt[i] < MaxLvl) and (i <> LeftSkill) then
    begin
      if not Weights.SR[i] and (Weights.SW[i] <> 0) then inc(SUM_W, Weights.SW[i]) else
      if SkLearnt[i] > 0 then inc(SUM_W);
    end;

    if SUM_W <> 0 then
    begin
      if SUM_W > 1 then
      begin
        rnd := rnd * $343FD + $269EC3;
        Q := (rnd shr $10) and $7FFF;
        Q := Q mod SUM_W + 1;
      end else Q := 1;

      SUM_W := Q;
      for i := SS_PATHFINDING to H3LastSSkill do
      begin
        if (SkLearnt[i] >= MinLvl) and (SkLearnt[i] < MaxLvl) and (i <> LeftSkill) then
          begin
            if not Weights.SR[i] and (Weights.SW[i] <> 0) then dec(SUM_W, Weights.SW[i]) else
            if SkLearnt[i] > 0 then dec(SUM_W);
          end;

        if SUM_W <= 0 then
        begin
          Skill := i;
          Exit;
        end;
      end;
    end; {if}
  end;

  Skill := SS_NONE;
end;

С магией, которая идёт "внепланово", действительно исключение. В этом случае веса грейдов всех школ приравниваются к 1, т.е. школы выпадают равновероятно.

Цитата:
There is one exception (I've already mentioned about it in my previous post): if Advanced or Expert level of "forced" Magic School is offered, weights of all allowed Magic Schools are equal.

Это справедливо не только для "внеплановых" школ. Обратите внимание на строчку if SkLearnt[i] = 0 then inc(SUM_W, Weights.SW[i]) else inc(SUM_W); в цикле по навыкам. Для грейдов вес равен 1. Неочевидное исключение, но если его учесть, всё должно у Вас завестись :smile1:

Weights.SR[i], если не догадались, это булевый массив запрещённых навыков. Так что тоже учитывайте. В HotA, например, запрещён навык Resistance (не знаю, правда, на всех ли картах или есть исключения). Герои с Resistance забанены или исправлены. H3LastSSkill - это последний навык (27 - для SoD, 28 - для HotA), т.е. алгоритм будет строить деревья и в случае появления новых вторичных навыков.

Код: Выделить всё
H3OptGetSecSkill(Hero, 1, 3, SS_NONE, nSkill2L, R);
if nSkill2L = SS_NONE then
  H3OptGetSecSkill(Hero, MinLvl, 3, SS_NONE, nSkill2L, R);

Этот код гарантирует грейд навыка (параметры 1 и 3 - это диапазон ступеней, которые следует рассматривать: [1; 3)). И только если нет навыков, которые ещё можно грейдить, пытается выбрать новый ([0; 3)). Очень полезный апгрейд алгоритма прокачки Героев 2, где герою грейд навыка не гарантирован, и поэтому, например, там можно получить Basic Logistics и ходить с ней несколько уровней подряд :smile1:

Алгоритм очень гибкий, кстати. Достаточно поменять верхний лимит: MaxLvl = 3 на 5, например, и он будет генерить навыки с 5-ю ступенями (это сделано в ACM - Advanced Classes Mod - достаточно известном моде для ERA). Можно ещё гарантировать грейд в Героях 2 (отличная идея для плагина). Можно предлагать на левел-апе 3 или 4 навыка на выбор, просто добавив аргументы и закопипастив код генерации навыка в слот :smile10:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Программа для разведки

Сообщение AlexSpl » 24 ноя 2023, 20:29

:!: Информация неверна. См. мой пост ниже. :!:

Интересно, зачем всё-таки автор алгоритма генерации навыков на левел-апе сделал грейды вторичных навыков выпадающими равновероятно? Ведь веса никто не отменял, и, скажем, если у героя класса Navigator есть Advanced Logistics (W = 6) и Advanced Eagle Eye (W = 2), то в левый слот попадёт Expert Logistics или Expert Eagle Eye с одинаковой вероятностью 50% :!: Логично же дать Логистике вероятность 6/8, а Орлиному глазу - 2/8.

Этот момент как может сыграть игроку на руку, так и замедлить прокачку в зависимости от навыков. Например, в примере выше нам совершенно не нужно фифти-фифти с Орлоглазом. Но! Если герою удалось выучить очень полезный навык, вес которого для класса данного героя мал, то загрейдить такой навык будет уже куда легче.
Последний раз редактировалось AlexSpl 25 ноя 2023, 00:27, всего редактировалось 1 раз.
Вернуться к началу

offlinetemig  
имя: Артем
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 02 ноя 2023, 14:24
Пол: Мужчина
Поблагодарили: 10 раз.

Re: Программа для разведки

Сообщение temig » 24 ноя 2023, 21:25

Я что-то думал, что равновероятный апгрейд навыков только для магических школ при магическом исключении. Вы же сами писали тут http://heroescommunity.com/viewthread.php3?TID=17812&PID=724354#focus:
Цитата:
Example #3
Let's assume Barbarian (lvl1) has Basic Logistics (W = 7), Advanced Eagle Eye (W = 2) and Basic Necromancy (W = 1). Don't laugh!
SUM = W(LOG) + W(EAGLE) + W(NECRO) = 10.
Now let's roll SUM-sided dice (In this particular case - 10-sided dice)!
Q = SEC mod SUM + 1 (1 <= Q <= SUM).
Let Q = 8, for example.
Subtract the weights of the skills from this value (Q) one after another until you get 0 or negative result.
8 - W(LOG) = 8 - 7 = 1 > 0
1 - W(EAGLE) = 1 - 2 = -1 < 0 => Expert Eagle Eye will be placed in the left slot.

As you can see,
if Q = 10 then our hero gets Advanced Necromancy (1 case out of 10),
if Q = 8 or 9 then our hero gets Expert Eagle Eye (2 cases out 10),
if Q <= 7 then Advanced Logistics will be offered (7 cases out 10).


т.е. 7 шансов на логу, 2 на орлоглаз и 1 на некромантию.

Или это неверная информация?
Вернуться к началу

offlinetemig  
имя: Артем
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 02 ноя 2023, 14:24
Пол: Мужчина
Поблагодарили: 10 раз.

Re: Программа для разведки

Сообщение temig » 24 ноя 2023, 22:43

Также понял свою ошибку в расчетах, посмотрев Ваш код. Я вызывал rand и перерасчитывал значение SEC каждый раз, когда определял навык. А нужно вызывать, только если сумма весов больше единицы :) Соответственно, если сумма весов = 1, то и Q = автоматически 1, rand не вызывается (действительно, нечего ранодомить) и SEC остается старым для расчета правого навыка, а если больше единицы, то вызывается, и SEC уже новый при расчете правого навыка)
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Программа для разведки

Сообщение AlexSpl » 25 ноя 2023, 00:25

Цитата:
т.е. 7 шансов на логу, 2 на орлоглаз и 1 на некромантию.

Или это неверная информация?

Верная :smile20: Старею :smile4: Показалось, что обычный выбор грейда вторичных навыков осуществляется так же, как и выбор грейда "внеплановых" магических школ. Но сейчас посмотрел код внимательнее:

"Внеплановые" магические школы:
Код: Выделить всё
if (SkLearnt[i] >= MinLvl) and (SkLearnt[i] < MaxLvl) and not Weights.SR[i] then
if SkLearnt[i] = 0 then inc(SUM_W, Weights.SW[i]) else inc(SUM_W);


Обычный выбор навыков:
Код: Выделить всё
if not Weights.SR[i] and (Weights.SW[i] <> 0) then inc(SUM_W, Weights.SW[i]) else
if SkLearnt[i] > 0 then inc(SUM_W);


В первом случае грейды всех "внеплановых" магических школ действительно получают вес 1, т.к. выполняется ветка else inc(SUM_W); Во втором случае всё иначе. Фрагменты кода очень похожи, но делают разные вещи. Здесь мы видим, что если навык не запрещён и его вес не равен 0, то к сумме добавляется его вес. В противном случае - прибавляется 1. А противный случай - это не грейды, как мне показалось. Противный случай - это когда навык запрещён или имеет нулевой вес, но герой его знает. Это сделано для того, чтобы такие навыки грейдились, а не "зависали", если герою как-то удалось их получить. Вес Necromancy в примере выше 1 именно поэтому (для Варвара вес Necromancy равен 0).

Поэтому отставить новое исключение :D Теперь я, наоборот, считаю, что исключение с грейдами "внеплановых" магических школ - это баг. Сумма их весов должна считаться так же, как и для обычных навыков.
Вернуться к началу

Пред.След.

Вернуться в Техническая часть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6