Wake of Gods Forum | Форум Во Имя Богов

Full Version: Исследование героев
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
XEPOMAHT, таблицу, мб, подумаю на досуге, если опыт позволит)
Однако вопрос именно в моментальном переодевании, чтобы ии, получив книгу земли, смог сразу использовать и спастись либо напасть.
(18.07.2019 12:57)daemon_n Wrote: [ -> ]Однако вопрос именно в моментальном переодевании, чтобы ии, получив книгу земли, смог сразу использовать и спастись либо напасть.

В триггере пост-посещения артефакта проверяешь ИИ-чность, если ИИ, то ищешь артефакт в сумке, если артефакт найден в сумке, то читаешь номер слота из структуры артефакта и AI value артефакта и проверяешь в слотах куклы героя те же AI value, а затем сравниваешь их. Если AI value подобранного на карте артефакта больше уже одетого, то меняешь их местами.

Перед битвой так же можно сравнивать всю куклу героя с рюкзаком на AI value, т.к. артефакты у героев могут появляться в любой момент времени и это затратно отслеживать (т.к. особые функции при этом не нужны, достаточно просто изменить байт в структуре героя).
Слишком много факторов учитывать надо. К примеру, Сферу Земли когда ИИ надевать? Когда у него есть полезные заклинания этой школы. Когда они полезнее заклинаний других школ. Когда колдовство не запрещено полностью (Сфера Запрещения) или частично (Проклятая Земля), но не запрещается колдовство наиболее полезных заклов. Когда нужные заклинания изучены. Когда есть книга заклинаний. Как прокачана мудрость и сила магии. Есть ли свободный слот. Каковы свойства заклинаний. Нет ли надетого артефакта, который нивелирует свойства Сферы. Иммунитеты существ - своих и чужих. Наконец, не надет ли более полезный артефакт или дублирующий свойства Сферы. И еще невесть какие факторы, о которых вспомнишь только в игре.
И это условия полезности лишь для одного артефакта. Какая ещё таблица AI value, когда всё так ситуативно?
MOP, вот поэтому он будет среди последних)
(19.07.2019 15:25)MOP Wrote: [ -> ]Какая ещё таблица AI value, когда всё так ситуативно?

С точки зрения заядлого игрока, знающего все вышеперечисленные особенности - да, использование AI value не приведёт ИИ до уровня эксперта по игре. Тогда для и монстров давайте тоже перестанем использовать AI value по той же причине ситуативности (вроде в игре работает норм, даже в MoP с почти удвоенным их количеством).

Например как играю я: поднимаю с карты ту же Сферу Земли, помещаю на куклу героя взамен какого-нибудь барахла и играю дальше, не думая ни о каких-то факторах (на Героях мозг обычно должен отдохнуть, это развлечение). Конечно, можно сказать, что хардкорщиков-задротов сейчас наверное большинство (от того и рулят моды, не содержащие коренных изменений игрового процесса), но я бы всё всё равно предложил для ИИ схему по-проще (например, в MoP уже больше 400 артефактов, сложную схему для ИИ сделать жизни не хватит).
Ну если упрощённо, то такая система AI value уже есть в игре - градация по классам артефактов. И она худо-бедно работает - потому что и создана для ИИ. Вот только лучше бы вместо классов в качестве value была выбрана стоимость в золоте - иными словами, не четыре ступени ценности, а неограниченный ценностный диапазон.
(19.07.2019 19:30)MOP Wrote: [ -> ]Ну если упрощённо, то такая система AI value уже есть в игре - градация по классам артефактов. И она худо-бедно работает - потому что и создана для ИИ. Вот только лучше бы вместо классов в качестве value была выбрана стоимость в золоте - иными словами, не четыре ступени ценности, а неограниченный ценностный диапазон.

Но это только если Артефакт подбирается с земли.
(17.12.2019 12:42)Algor Wrote: [ -> ]Как вариант, конечно, раскопать какую-нить функцию типа "мощь армии королевства" из обзора королевства, но не уверен, что там будет именно то, что нужно.
Отдельно взятой такой функции нет. Есть только участок кода внутри функции, но его никак нельзя использовать через ERM
Проще скриптом запилить...
Но есть проблема: никакой ERM переменной не хватит для хранения таких чисел.
Quote:Но есть проблема: никакой ERM переменной не хватит для хранения таких чисел.
e2?
(17.12.2019 16:17)Berserker Wrote: [ -> ]
Quote:Но есть проблема: никакой ERM переменной не хватит для хранения таких чисел.
e2?
Даже если не хватит, я не думаю, что облагаться налогом будет каждая единица FV 118
(13.02.2020 15:49)Berserker Wrote: [ -> ]I will need to send generator state over net on online PvP battle. ~3 KB for Mersenne Twister.

Передача данных по сети:
Code:
// структура передачи данных по сети
struct _NetData_
{
_int_ recipient_id;  // +0   (номер игрока кому передаётся. (-1 = всем) )
_int_ field_04;      // +4
_int_ msg_id;        // +8   (id данных)
_int_ size;          // +12  (размер _NetData_ = 20 + sizeof(Data) )
_int_ field_10;      // +16
_int_ Data[];        // +20  (передаваемые данные (массив))


inline _int32_ SendData() {return CALL_4(_int32_, __fastcall, 0x5549E0, this, 127, 0, 1);}
inline _int32_ SendShortData() {return CALL_1(_int32_, __thiscall, 0x481CB0, this);}
};

Принимать и обрабатывать данные (рядом с этими адресами):
Code:
0x405E81 [карта приключений]
0x473D5E [битва]
0x588AC3 [меню выбора карт]
вопрос только один - что за адрес используется нестандартный 6933756 ?
я почему-то ожидал здесь адрес основного игрового менеджера (6919480)... есть у кого объяснение? Unsure
69CCFC - структура текущего игрока

Code:
Byte *GamerStruc(int hn)
{
  #include "templ.h"
  if(hn==-1){
    __asm mov eax,0x69CCFC
    __asm mov eax,[eax]
    __asm mov BPDummy,eax
    RETURN(BPDummy)
Выбор и кэширование зацикленных звуков объектов вблизи активного героя.
PHP Code:
00000000 AdvMgr              struc ; (sizeof=0x258mappedto_380)
00000000 field_0             db 548 dup(?)                           ; string(C)
00000224 cachedLoopsSoundsMask dd ?                                  ; DEPRECATED
00000228 cachedLoopSounds    HeroClosestLoopSound 4 dup
(?)
00000248 cachedLoopSoundWavs dd 4 dup(?)                             ; offset
00000258 AdvMgr              ends
00000258
00000000 
; ---------------------------------------------------------------------------
00000000
00000000 HeroClosestLoopSound struc 
; (sizeof=0x8mappedto_381)     ; XREFAdvMgr/r
00000000 loopSoundId         dd 
?
00000004 distance            dd ?
00000008 HeroClosestLoopSound ends

418B70 void __thiscall MapItem_Start_Loop_Sound
(AdvMgr *advMgrint xint yint zint distanceint allowCaching)
{
  
AdvMgr *self// esi
  
signed int determinedLoopSoundId// edi
  
AdvMgrConsts cachedLoopSoundIndex// eax
  
HeroClosestLoopSound *cachedLoopSound// ecx
  
int farthestDistance// edx
  
signed int newLoopSoundIndex// ebx
  
AdvMgrConsts i// eax
  
int prevLoopSoundId// eax
  
int *soundDistanceToCheck// [esp+14h] [ebp+8h]

  
self advMgr;
  if ( 
>= && >= && >= && MapSizeX && MapSizeY )
  {
    
determinedLoopSoundId AdvMgr_MapItem_Determine_Sound(xyz);
    if ( 
determinedLoopSoundId != -)
    {
      
cachedLoopSoundIndex 0;
      
cachedLoopSound self->cachedLoopSounds;
      while ( 
cachedLoopSound->loopSoundId != determinedLoopSoundId )
      {
        ++
cachedLoopSoundIndex;
        ++
cachedLoopSound;
        if ( 
cachedLoopSoundIndex >= MAX_CACHED_LOOP_SOUNDS )// Such looped sound not found in cache
        
{
          if ( 
allowCaching != )
          {
            
farthestDistance distance;
            
newLoopSoundIndex = -1;
            
0;
            
soundDistanceToCheck = &self->cachedLoopSounds[0].distance;
            do
            {
              if ( *
soundDistanceToCheck farthestDistance )
              {
                
farthestDistance = *soundDistanceToCheck;
                
newLoopSoundIndex i;
              }
              ++
i;
              
soundDistanceToCheck += 2;
            }
            while ( 
MAX_CACHED_LOOP_SOUNDS );
            if ( 
newLoopSoundIndex != -)
            {
              
prevLoopSoundId self->cachedLoopSounds[newLoopSoundIndex].loopSoundId;
              if ( 
prevLoopSoundId != -)
                
StopBINKVideo_AIL(o_SoundMgr, *(self->cachedLoopSoundWavs[prevLoopSoundId] + 7));
              
self->cachedLoopSounds[newLoopSoundIndex].loopSoundId determinedLoopSoundId;
              
self->cachedLoopSounds[newLoopSoundIndex].distance distance;
              if ( 
determinedLoopSoundId > -1
                
&& determinedLoopSoundId 70
                
&& !self->cachedLoopSoundWavs[determinedLoopSoundId] )
              {
                
Dlg_KingdomOverviewPrepare(self4);
                
self->cachedLoopSoundWavs[determinedLoopSoundId] = LoadWAV2((&off_0065F794)[determinedLoopSoundId]);
              }
              *(
self->cachedLoopSoundWavs[determinedLoopSoundId] + 11) = dword_0063A64C[distance];
              *(
self->cachedLoopSoundWavs[determinedLoopSoundId] + 12) = 0;
              *(
self->cachedLoopSoundWavs[determinedLoopSoundId] + 10) = 3;
              
NotifyPlayerWithBINKandSound(o_SoundMgrself->cachedLoopSoundWavs[determinedLoopSoundId]);
              
self->cachedLoopsSoundsMask ^= << self->cachedLoopSounds[newLoopSoundIndex].loopSoundId;
            }
          }
          return;
        }
      }
      if ( 
self->cachedLoopSounds[cachedLoopSoundIndex].distance distance )
      {
        
self->cachedLoopSounds[cachedLoopSoundIndex].distance distance;
        
self->cachedLoopsSoundsMask |= << self->cachedLoopSounds[cachedLoopSoundIndex].loopSoundId;
      }
    }
  }

Список идентификаторов игровых диалогов (получены в ERA2)
Code:
4205280 - карта приключений (КП)
    5755920 - окно сохранения
    5884864 - книга заклинаний
    4789216 - режим "дверь измерений"
    4790240 - режим "затопить корабль"
    6039360 - окно выбор города (без HD; для закла ГП или через врата Инферно)
    5217680 - окно повышения уровня героя
    5378592 - окно обзора королевства
    5976864 - окно настроек КП
    4216352 - окно действий на КП
    6275296 - обзор мира (включая заклы Просмотр земли/воздуха)
    5425744 - карта-загадка
    6068832 - гильдия воров
    5675664 - инфо по сценарию
    6100112 - окно гарнизона
    6099296 - окно оставления существ (включая шахты)
    5570288 - жилища существ/фабрика машин
    5637600 - жертвенный алтарь
    6228784 - университет
    6105344 - верфь
    6183568 - чёрный рынок/торговец артефактами (покупка)
    6167072 - рынок (обмен ресурсами)
    6175376 - рынок (передача ресурсов игроку)
    6241984 - окно статистики монстра/отряда
    5144224 - форт на холме
    6201472 - гильдия наёмников
    6126720 - таверна
** (одноимённые диалоги вне КП имеют те же ID и ниже не упоминаются)

4662240 - окно битвы
    4649504 - окно настроек в битве
    4658576 - статистика боя

5117840 - окно героя
    4304960 - окно командира (с WND)
    5432976 - окно журнала (без плагина на новый диалог)
    4304960 - окно журнала (с плагином на новый диалог)

6053040 - окно города
    6087968 - гильдия магов
    6081760 - зал совета
        6119232 - инфо о постройке
    6147920 - форт/замок
    6102528 - кузница
    5661104 - преобразователь скелетов
    6193120 - торговец артефактами (продажа)

5957344 - окно встечи героев

4782512 - прочие диалоги (включая IF:M/IF:Q; и все новые от HD)
4304960 - WoG-диалоги (с WND: опыт существ, сфинкс, проклятья, IF:G/IF:B и пр.)
- - -     WoG-диалоги без WND не пропускают (OnKeyPressed), потому хз как их пощупать
Reference URL's