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

Full Version: ERA III
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
(06.09.2022 04:50)wessonsm Wrote: [ -> ]Геройская random (0x50C7C0) его будет использовать или нет?

Если ЭРА ставит туда свой перехват прямо в самое начало, подменяя всю функцию целиком, значит наверняка использует. По крайней мере Тифон вызывает 50C7C0 довольно часто и в него, надеюсь, тоже идёт получение случайных чисел из берсеркерского генератора в era.dll.

(06.09.2022 04:55)daemon_n Wrote: [ -> ]
wessonsm, 96-copy (Click to View)

Вообще не смешно, а грустно видеть подобный код. ExecErmCommand в плагинах - зло.
Все геройские и воговские rand(), random() используют движок Эры.

Code:
(* Replace Heroes PRNG with custom switchable PRNGs *)
ApiJack.StdSplice(Ptr($61841F), @Hook_SRand, ApiJack.CONV_CDECL, 1);
ApiJack.StdSplice(Ptr($61842C), @Hook_Rand, ApiJack.CONV_STDCALL, 0);
ApiJack.StdSplice(Ptr($50C7B0), @Hook_Tracking_SRand, ApiJack.CONV_THISCALL, 1);
ApiJack.StdSplice(Ptr($50C7C0), @Hook_RandomRange, ApiJack.CONV_FASTCALL, 2);

Не забывай только, что rand() ограничен 0..65535 и я это ограничение соблюдаю строго по канону С. А вот random(min, max) по адресу 50C7C0 не ограничен, его и использую, где можно. VR:R использует random(min, max) по адресу 50C7C0.

Code:
int Random(int ZLow,int ZHigh)
{
  #include "templ.h"
  __asm{
    mov    ecx,ZLow
    mov    edx,ZHigh
    mov    eax,0x50C7C0
    call   eax
    mov    IDummy,eax
  }
  RETURN(IDummy)
}
XEPOMAHT, wessonsm, куда чувство юмора делось ?166
Почему-то не работает функция WriteStrToIni(const char* Key, const char* Value, const char* SectionName, const char* FilePath). Просто не видит файл или не вызывается, похоже. При этом ReadStrFromIni может найти файл с таким же названием.
Raistlin, в какой именно файл (путь) ты пытаешься писать?
Не забудь SaveIni
SaveIni? Это хто? 148

Quote:в какой именно файл (путь) ты пытаешься писать?
Файл лежит в папке с модом. Читается нормально.
Raistlin, если я правильно помню, сохранить можно только в папку runtime и корень.

Метод назвал гипотетически. Суть в том, что файл надо сохранить после записи
С какой-то версии запись в ini кэшируется в память. Иначе сотни записей в цикле изнасилуют жёсткий диск и ЦПУ.
Потому после всех записей достаточно вызвать function SaveIni (FilePath: pchar); stdcall для сброка кэша.
Большое спасибо! Все заработало.
OnBattleStackObtainsTurn не срабатывает на старте боя (знаю, что там вызывается ф-ция поиска первого стэка из другого места, вот его и предлагаю захукать, тем самым добавив в общий пул)
Да, неприятно. Это какое там место?
Berserker, из "Start Battle", кажется.
Позднее гляну адрес
(14.09.2022 12:14)Berserker Wrote: [ -> ]С какой-то версии запись в ini кэшируется в память. Иначе сотни записей в цикле изнасилуют жёсткий диск и ЦПУ.
Потому после всех записей достаточно вызвать function SaveIni (FilePath: pchar); stdcall для сброка кэша.

Сейчас стало любопытно, а это применяется к прочтению данных из ini?
Нет, при чтении весь ini файл анализируется и сохраняется в памяти в виде карты ключ - значение. Повторные запросы на чтение не насилуют жёсткий диск вообще. Запись тоже идёт в памяти в этот словарь ключ-значение. Раньше после каждой записи весь файл на диске перезаписывался. Чтобы остановить это ужасное деяние, я добавил SaveIni.
Berserker, отлично, большое спасибо! Я забеспокоился на этот счет из-за того, что вынес во внешние файлы много игровых таблиц, и если бы при каждом запуске игры для прочтения каждого значения файл открывался и сканировался заново, было бы обидно за процессор. Но раз все так хорошо оптимизировано, моя душа спокойна Ab
Reference URL's