08.12.2025, 02:15
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
08.12.2025, 02:32
Там в настройках безопасности системы есть новая фишка с защитой памяти ядра. Интересно будет после тестов проверить без неё:
Откройте "Безопасность Windows" (поиск в меню Пуск), перейдите в "Безопасность устройства" → "Изоляция ядра" → "Сведения об изоляции ядра" и выключите ползунок "Целостность памяти". Перезагрузите ПК для применения изменений.
Откройте "Безопасность Windows" (поиск в меню Пуск), перейдите в "Безопасность устройства" → "Изоляция ядра" → "Сведения об изоляции ядра" и выключите ползунок "Целостность памяти". Перезагрузите ПК для применения изменений.
08.12.2025, 03:30
Да-да, эту безопасность ядра я сразу после установки винды вырубил

А вот что говорит утилита, ессно запускаемая от админа. Выглядит так, будто что-то мешает, какая-то система защиты что ли...

P.S. Secure Boot тоже выключен сразу был
логи
А вот что говорит утилита, ессно запускаемая от админа. Выглядит так, будто что-то мешает, какая-то система защиты что ли...
P.S. Secure Boot тоже выключен сразу был
логи
Code:
_LOG_.txt
>> SetProcessDEPPolicy: Failed to turn DEP off
>> InstallHook: Installing NtQueryAttributesFile hook
>> InstallHook: Installing NtQueryFullAttributesFile hook
>> InstallHook: Installing NtOpenFile hook
>> InstallHook: Installing NtCreateFile hook
>> InstallHook: Installing NtClose hook
>> InstallHook: Installing NtQueryDirectoryFile hook
>> InstallHook: Installing NtQueryDirectoryFileEx hook
#
#
#
Event viewer
Faulting application name: VfsTest.exe, version: 0.0.0.0, time stamp: 0x5cf3b97e
Faulting module name: ntdll.dll, version: 10.0.26100.7171, time stamp: 0x6e13c9a6
Exception code: 0xc0000005
Fault offset: 0x00029931
Faulting process id: 0x4F70
Faulting application start time: 0x1DC67C74F91CC62
Faulting application path: D:\Games\homm3\Tools\VfsTest\VfsTest.exe
Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll
Report Id: 727536b4-2e94-4080-aa5c-d1d3997b7dd8
Faulting package full name:
Faulting package-relative application ID:08.12.2025, 20:40
(08.12.2025 03:30)n0body Wrote: [ -> ]Да-да, эту безопасность ядра я сразу после установки винды вырубил
А вот что говорит утилита, ессно запускаемая от админа. Выглядит так, будто что-то мешает, какая-то система защиты что ли...
P.S. Secure Boot тоже выключен сразу был
логи
Code:
_LOG_.txt
>> SetProcessDEPPolicy: Failed to turn DEP off
>> InstallHook: Installing NtQueryAttributesFile hook
>> InstallHook: Installing NtQueryFullAttributesFile hook
>> InstallHook: Installing NtOpenFile hook
>> InstallHook: Installing NtCreateFile hook
>> InstallHook: Installing NtClose hook
>> InstallHook: Installing NtQueryDirectoryFile hook
>> InstallHook: Installing NtQueryDirectoryFileEx hook
#
#
#
Event viewer
Faulting application name: VfsTest.exe, version: 0.0.0.0, time stamp: 0x5cf3b97e
Faulting module name: ntdll.dll, version: 10.0.26100.7171, time stamp: 0x6e13c9a6
Exception code: 0xc0000005
Fault offset: 0x00029931
Faulting process id: 0x4F70
Faulting application start time: 0x1DC67C74F91CC62
Faulting application path: D:\Games\homm3\Tools\VfsTest\VfsTest.exe
Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll
Report Id: 727536b4-2e94-4080-aa5c-d1d3997b7dd8
Faulting package full name:
Faulting package-relative application ID:
Еще немного дебага. Вот что говорит process monitor
Как видно при попытке запуска h3era.exe (не важно hd или нет) оно хочет vfs.dll и после этого почему-то закрывается. Что примечательно запуск VfsTest завершается на том же этапе. Дальше я попробовал запустить и то и другое через windbg и вот что там видно
Code:
#
# h3era.exe
#
0:000> !analyze -v
Reloading current modules
...............................................
*** WARNING: Unable to verify checksum for D:\Games\homm3\vfs.dll
************* Symbol Loading Error Summary **************
Module name Error
vfs The system cannot find the file specified
You can troubleshoot most symbol related issues by turning on symbol loading diagnostics (!sym noisy) and repeating the command that caused symbols to be loaded.
You should also verify that your symbol search path (.sympath) is correct.
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
*** WARNING: Unable to verify checksum for D:\Games\homm3\era.dll
KEY_VALUES_STRING: 1
Key : AV.Type
Value: Execute
Key : Analysis.CPU.mSec
Value: 1500
Key : Analysis.Elapsed.mSec
Value: 9855
Key : Analysis.IO.Other.Mb
Value: 0
Key : Analysis.IO.Read.Mb
Value: 1
Key : Analysis.IO.Write.Mb
Value: 43
Key : Analysis.Init.CPU.mSec
Value: 1812
Key : Analysis.Init.Elapsed.mSec
Value: 374615
Key : Analysis.Memory.CommitPeak.Mb
Value: 83
Key : Analysis.Version.DbgEng
Value: 10.0.29482.1003
Key : Analysis.Version.Description
Value: 10.2509.29.03 x86fre
Key : Analysis.Version.Ext
Value: 1.2509.29.3
Key : Failure.Bucket
Value: SOFTWARE_NX_FAULT_INVALID_POINTER_EXECUTE_CODE_c0000005_vfs.dll!Unknown
Key : Failure.Exception.Code
Value: 0xc0000005
Key : Failure.Exception.IP.Address
Value: 0x7f1bb28
Key : Failure.Exception.IP.Module
Value: vfs
Key : Failure.Exception.IP.Offset
Value: 0x2bb28
Key : Failure.Hash
Value: {477b32fd-9b88-706a-7a03-e72fd46d3552}
Key : Failure.ProblemClass.Primary
Value: SOFTWARE_NX_FAULT
Key : Faulting.IP.Type
Value: Paged
Key : Timeline.OS.Boot.DeltaSec
Value: 73949
Key : Timeline.Process.Start.DeltaSec
Value: 373
Key : WER.OS.Branch
Value: ge_release
Key : WER.OS.Version
Value: 10.0.26100.1
Key : WER.Process.Version
Value: 3.2.0.0
NTGLOBALFLAG: 70
APPLICATION_VERIFIER_FLAGS: 0
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 07f1bb28 (vfs!GetRealPathA+0x000082c8)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000008
Parameter[1]: 07f1bb28
Attempt to execute non-executable address 07f1bb28
FAULTING_THREAD: 3398
PROCESS_NAME: h3era.exe
EXECUTE_ADDRESS: 7f1bb28
ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.
EXCEPTION_CODE_STR: c0000005
EXCEPTION_PARAMETER1: 00000008
EXCEPTION_PARAMETER2: 07f1bb28
STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
04fffb0c 77e09c31 04fffb24 00701000 087a6d4c vfs!GetRealPathA+0x82c8
04fffb38 77b43e7a 04fffb44 00280026 051c5f1c ntdll!RtlSetCurrentDirectory_U+0xc1
04fffb4c 07f0dec4 051c5f1c ffffffff 07f12a62 KERNELBASE!SetCurrentDirectoryW+0x3a
04fffb78 08724141 00000000 04fffc44 08724274 vfs!RefreshVfs+0x93c
04fffbc8 00701012 00701000 00701000 04fffbfc era!GenerateDebugInfo+0x769
04fffbfc 77e4d6db 04a1b000 e497822f 00000000 h3era+0x301012
04fffc54 77e4d661 ffffffff 77e9468f 00000000 ntdll!__RtlUserThreadStart+0x2b
04fffc64 00000000 00701000 04a1b000 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: ~0s; .ecxr ; kb
IP_IN_PAGED_CODE:
vfs!GetRealPathA+82c8
07f1bb28 ff34e4 push dword ptr [esp]
SYMBOL_NAME: vfs+2bb28
MODULE_NAME: vfs
IMAGE_NAME: vfs.dll
FAILURE_BUCKET_ID: SOFTWARE_NX_FAULT_INVALID_POINTER_EXECUTE_CODE_c0000005_vfs.dll!Unknown
OS_VERSION: 10.0.26100.1
BUILDLAB_STR: ge_release
OSPLATFORM_TYPE: x86
OSNAME: Windows 10
IMAGE_VERSION: 1.0.5.29
FAILURE_ID_HASH: {477b32fd-9b88-706a-7a03-e72fd46d3552}
Followup: MachineOwner
---------Code:
#
# VfsTest.exe
#
0:004> !analyze -v
Reloading current modules
.........................................
*** WARNING: Unable to verify checksum for VfsTest.exe
************* Symbol Loading Error Summary **************
Module name Error
VfsTest The system cannot find the file specified
You can troubleshoot most symbol related issues by turning on symbol loading diagnostics (!sym noisy) and repeating the command that caused symbols to be loaded.
You should also verify that your symbol search path (.sympath) is correct.
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
KEY_VALUES_STRING: 1
Key : AV.Type
Value: Execute
Key : Analysis.CPU.mSec
Value: 953
Key : Analysis.Elapsed.mSec
Value: 2617
Key : Analysis.IO.Other.Mb
Value: 0
Key : Analysis.IO.Read.Mb
Value: 1
Key : Analysis.IO.Write.Mb
Value: 80
Key : Analysis.Init.CPU.mSec
Value: 1906
Key : Analysis.Init.Elapsed.mSec
Value: 100524
Key : Analysis.Memory.CommitPeak.Mb
Value: 87
Key : Analysis.Version.DbgEng
Value: 10.0.29482.1003
Key : Analysis.Version.Description
Value: 10.2509.29.03 x86fre
Key : Analysis.Version.Ext
Value: 1.2509.29.3
Key : Failure.Bucket
Value: SOFTWARE_NX_FAULT_INVALID_POINTER_EXECUTE_CODE_c0000005_VfsTest.exe!Unknown
Key : Failure.Exception.Code
Value: 0xc0000005
Key : Failure.Exception.IP.Address
Value: 0x629e74
Key : Failure.Exception.IP.Module
Value: VfsTest
Key : Failure.Exception.IP.Offset
Value: 0xb9e74
Key : Failure.Hash
Value: {fbeffffe-5ba8-5d9a-1a6d-a30bef8fec51}
Key : Failure.ProblemClass.Primary
Value: SOFTWARE_NX_FAULT
Key : Faulting.IP.Type
Value: Paged
Key : Timeline.OS.Boot.DeltaSec
Value: 74415
Key : Timeline.Process.Start.DeltaSec
Value: 100
Key : WER.OS.Branch
Value: ge_release
Key : WER.OS.Version
Value: 10.0.26100.1
NTGLOBALFLAG: 70
APPLICATION_VERIFIER_FLAGS: 0
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00629e74 (VfsTest!InstallConsoleLogger+0x0000d180)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000008
Parameter[1]: 00629e74
Attempt to execute non-executable address 00629e74
FAULTING_THREAD: 4a8
PROCESS_NAME: VfsTest.exe
EXECUTE_ADDRESS: 629e74
ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.
EXCEPTION_CODE_STR: c0000005
EXCEPTION_PARAMETER1: 00000008
EXCEPTION_PARAMETER2: 00629e74
STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
04cffca4 760a31f4 000002c8 760a3120 02d3c960 VfsTest!InstallConsoleLogger+0xd180
04cffccc 760a332e 00000000 02d3c960 760a3080 combase!CROIDTable::WorkerThreadLoop+0xd4
04cffd04 760a309f 760a3080 760a3080 04cffd24 combase!CRpcThread::WorkerLoop+0x11f
04cffd14 76605d49 02d3c960 76605d30 04cffd7c combase!CRpcThreadCache::RpcWorkerThreadEntry+0x1f
04cffd24 77e4d6db 02d3c960 0e68bf87 00000000 KERNEL32!BaseThreadInitThunk+0x19
04cffd7c 77e4d661 ffffffff 77e94697 00000000 ntdll!__RtlUserThreadStart+0x2b
04cffd8c 00000000 760a3080 02d3c960 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: ~4s ; .cxr ; kb
IP_IN_PAGED_CODE:
VfsTest!InstallConsoleLogger+d180
00629e74 ff34e4 push dword ptr [esp]
SYMBOL_NAME: VfsTest+b9e74
MODULE_NAME: VfsTest
IMAGE_NAME: VfsTest.exe
FAILURE_BUCKET_ID: SOFTWARE_NX_FAULT_INVALID_POINTER_EXECUTE_CODE_c0000005_VfsTest.exe!Unknown
OS_VERSION: 10.0.26100.1
BUILDLAB_STR: ge_release
OSPLATFORM_TYPE: x86
OSNAME: Windows 10
FAILURE_ID_HASH: {fbeffffe-5ba8-5d9a-1a6d-a30bef8fec51}
Followup: MachineOwner
---------
0:004> ~~[4a8]s
eax=029d0000 ebx=00000000 ecx=77a37ee0 edx=10002000 esi=000002c8 edi=77a37ee0
eip=00629e74 esp=04cffc90 ebp=04cffca4 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010246
VfsTest!InstallConsoleLogger+0xd180:
00629e74 ff34e4 push dword ptr [esp] ss:002b:04cffc90=77a37eb7Обычно в винде код возврата C0000005 означает Access Violation, что в том числе значит отсутствие чего-то в памяти, типа полез ты в переменную, а ее просто нет (просто к примеру) и все ниточки ведут к этой либе. Что там вообще такое? Как еще это можно продебажить? Я, если что, не оч продвинутый пользователь виндового дебагера (первый раз в жизни его седня увидел), мб у вас есть еще какие идеи?
09.12.2025, 00:01
n0body, тесты прямо говорят, что не вышло отключить DEP.
Вообще, в папке "help" есть подробная инструкция, как его отключать.
А вот код проверки статуса:
and press Enter.
0: DEP disabled for all processes.
1: DEP enabled for all processes (default).
2: DEP enabled for Windows system components and services only.
Вообще, в папке "help" есть подробная инструкция, как его отключать.
А вот код проверки статуса:
Code:
wmic OS Get DataExecutionPrevention_SupportPolicy0: DEP disabled for all processes.
1: DEP enabled for all processes (default).
2: DEP enabled for Windows system components and services only.
09.12.2025, 01:13
daemon_n, а кто писал этот VfsTest? Я не видел его код но уверен на 99%, что там просто либо вообще ошибки не обрабатываются, либо не обрабатывается конкретный мой кейс и оно всегда будет говорить SetProcessDEPPolicy: Failed to turn DEP off при возникновении любой (или почти любой) ошибки.
Но да ладно, к чему споры, просто чтоб доказать что я не вру я установил этот wmic, потому что в win11 его выпилили и вот результат:
Дока говорит нам, что 0 это AlwaysOff (DEP is not enabled for any processes) - ровно как я и говорил, потому что вырубал его так же как и сказано в этом help, хоть я его и не видел в глаза раньше.
Честно вам скажу, что я тоже грешу на этот DEP, но как мы все видим - он выключен, давайте может какие-то другие варианты рассмотрим?
Но да ладно, к чему споры, просто чтоб доказать что я не вру я установил этот wmic, потому что в win11 его выпилили и вот результат:
Code:
C:\Windows\System32>wmic OS Get DataExecutionPrevention_SupportPolicy
DataExecutionPrevention_SupportPolicy
0Честно вам скажу, что я тоже грешу на этот DEP, но как мы все видим - он выключен, давайте может какие-то другие варианты рассмотрим?
09.12.2025, 04:33
n0body, версия Windows полная? Официальная?
10.12.2025, 01:00
(09.12.2025 04:33)daemon_n Wrote: [ -> ]n0body, версия Windows полная? Официальная?
Вобщем спасибо daemon_n и низкий поклон - разобрались в чем дело было.
Оказывается в win 11 (и 10 скорее всего тоже) существует 2 разных параметра DEP и их ОБА обязательно надо выключить. Как это сделать написано (с картинками) в папке help .
Оч повезло что я на вас наткнулся, мужики, огромное спасибо! А теперь прошу извинить, у меня назначена встреча с детством и я не могу ее больше откладывать ^_^
10.12.2025, 04:13
На десятке ни разу в
Settings > Update & Security > Windows Security > App & browser control > Exploit protection settings > System settings > ‘Use default
не заходил. Действительно, теперь разные места для отключения.
Settings > Update & Security > Windows Security > App & browser control > Exploit protection settings > System settings > ‘Use default
не заходил. Действительно, теперь разные места для отключения.
17.12.2025, 00:14
В общем, решил я исправить переполнение Опыта Существ в WoG на уровне плагина, так как предыдущее решение на erm скрипте было громоздким, требовало наличие скрипта да и просто не нравилось мне, каким бы гениальном оно ни было.
К делу:
относительно тривиальные случаи решились хуками (постить даже нет смысла), а где-то даже и
Осталось только разобраться с тем, как починить посещение героем гарнизон города.
Как оказалось, разработчики WoG придумали интересное решение:
в случае успеха объединения армии создаётся ещё 4 армии (одна пара -- для опыта, другая -- для артефактов);
в армию копируются корректные типы существ "сверху" и "снизу", но вместо количеств устанавливаются значения количеств опыта и артефактов;
затем просто дважды вызывается функция "соединить армии", которая корректно корректно складывает значения по соответствующим слотам в нужном порядке;
решение я оценил (хотя понял и не сразу) -- такого рода хаки и я люблю делать;
к сожалению, формула подсчёта опыта была написано некорректно (обнаружил реальный глитч, который позволяет через разделение армий абузить опыт бесконечно);
ну и сама проблема int32 overflow присутствует (даже если и происходит неявно: при объединении "армий");
Не знаю, что меня укусило, но я очень не хотел переписывать логику из erm-фикса (там я с нуля написал полную логику на объединение армий, но только для опыта, что заняло ооочень много кода ) C++, так что тупо пялил в IDA, чтобы придумать как можно более короткое решение (да-да, сэкономил бы ооочень много времени, если бы просто повторил алгоритм...)
в итоге пришёл к, как мне кажется, отличному решению:
- при итерации отрядов города и героя сохранять изначальный опыт по индексам в свой массив;
- вместо опыта в псевдоармии передавать смещённый на индекс отряда байт;
- игра сама считает битсеты при передаче такой армии, какие именно отряды объединились в итоговый слот;
- по битсету отряда из 14 слотов взять итоговый опыт и отряд;
А вот файл с кодом всех исправлений, связанных с опытом, если кому надо.
К делу:
относительно тривиальные случаи решились хуками (постить даже нет смысла), а где-то даже и
патчами (Click to View)
Code:
// © daemon_n
// исправление расчёта опыта при перемещении отряда существ из слота в слот
char *srcExpPatch = "8DB0 50058600 8B06 F76D 20 F77E 04 8906 8B4D 20 894E 04"; // слот-источник
/*
lea esi, [WOG__CrExpo__Table + eax] ; esi = &Table[src]
mov eax, [esi] ; eax = Expo
imul dword ptr [ebp+source_mon_number] ; edx:eax = Expo * src (64-bit)
idiv dword ptr [esi+4] ; eax = (Expo*src)/Num
mov [esi], eax ; Table[src].Expo = eax
mov ecx, [ebp+source_mon_number]
mov [esi+4], ecx ; Table[src].Num = src
*/
_PI->WriteHexPatch(0x0719993, srcExpPatch); // patch experience
_PI->WriteCodePatch(0x07199A9, "%n", 28); // nop extra code
char *dstExpPatch = "8DB1 50058600 8B06 F76D 24 F77E 04 8906 8B4D 24 894E 04"; // слот-назначение
/*
lea esi, [WOG__CrExpo__Table + ecx] ; esi = &Table[dst]
mov eax, [esi] ; eax = Expo
imul dword ptr [ebp+dst_mon_number] ; edx:eax = Expo * dst (64-bit)
idiv dword ptr [esi+4] ; eax = (Expo*dst)/Num
mov [esi], eax ; Table[dst].Expo = eax
mov ecx, [ebp+dst_mon_number]
mov [esi+4], ecx ; Table[dst].Num = dst
*/
_PI->WriteHexPatch(0x0719A55, dstExpPatch); // patch experience
_PI->WriteCodePatch(0x0719A6B, "%n", 28); // nop extra codeКак оказалось, разработчики WoG придумали интересное решение:
в случае успеха объединения армии создаётся ещё 4 армии (одна пара -- для опыта, другая -- для артефактов);
в армию копируются корректные типы существ "сверху" и "снизу", но вместо количеств устанавливаются значения количеств опыта и артефактов;
затем просто дважды вызывается функция "соединить армии", которая корректно корректно складывает значения по соответствующим слотам в нужном порядке;
решение я оценил (хотя понял и не сразу) -- такого рода хаки и я люблю делать;
к сожалению, формула подсчёта опыта была написано некорректно (обнаружил реальный глитч, который позволяет через разделение армий абузить опыт бесконечно);
ну и сама проблема int32 overflow присутствует (даже если и происходит неявно: при объединении "армий");
Не знаю, что меня укусило, но я очень не хотел переписывать логику из erm-фикса (там я с нуля написал полную логику на объединение армий, но только для опыта, что заняло ооочень много кода ) C++, так что тупо пялил в IDA, чтобы придумать как можно более короткое решение (да-да, сэкономил бы ооочень много времени, если бы просто повторил алгоритм...)
в итоге пришёл к, как мне кажется, отличному решению:
- при итерации отрядов города и героя сохранять изначальный опыт по индексам в свой массив;
- вместо опыта в псевдоармии передавать смещённый на индекс отряда байт;
- игра сама считает битсеты при передаче такой армии, какие именно отряды объединились в итоговый слот;
- по битсету отряда из 14 слотов взять итоговый опыт и отряд;
В общем, вот код решения (захотелось похвастаться) (Click to View)
Code:
struct ArmySlotExperience
{
int number;
int experience;
} armySlots[14];
_LHF_(WoG_InTowmArmyMerge_GuardIterator)
{
const int slotId = c->eax;
// сохраняем значения опыта и количества существ для армии защитника
armySlots[slotId].experience = IntAt(c->ebp - 0x10C);
armySlots[slotId].number = reinterpret_cast<_Army_ *>(0x2846BF0)->count[slotId];
// заменить значения опыта существа на уникальный индекс для сложения в битсет
c->ecx = 1 << slotId;
return EXEC_DEFAULT;
}
_LHF_(WoG_InTowmArmyMerge_VisitorIterator)
{
const int slotId = c->ecx + 7;
// сохраняем значения опыта и количества существ для армии визитёра
armySlots[slotId].experience = IntAt(c->ebp - 0x10C);
armySlots[slotId].number = reinterpret_cast<_Army_ *>(0x2846C28)->count[slotId - 7];
// заменить значения опыта существа на уникальный индекс для сложения в битсет
c->edx = 1 << slotId;
return EXEC_DEFAULT;
}
_LHF_(WoG_InTowmArmyMerge_ExperienceCreatorIterator)
{
INT64 resultExp = 0;
_Army_ &expArmy = *reinterpret_cast<_Army_ *>(c->ebp - 0xC8);
const int slotId = IntAt(c->ebp - 0x18);
const int slotsMerged = expArmy.count[slotId];
for (size_t i = 0; i < 14; i++)
{
if (slotsMerged & (1 << i))
{
// сложение общего опыта, основываясь на начальных значениях
resultExp += static_cast<INT64>(armySlots[i].experience) * armySlots[i].number;
}
}
// установка итогового опыта делением на итоговое количество существ
const int totalCreatures = IntAt(c->ebp - 0x14);
c->eax = totalCreatures ? static_cast<int>(resultExp / totalCreatures) : 0;
c->return_address = 0x0759A2E;
return NO_EXEC_DEFAULT;
}А вот файл с кодом всех исправлений, связанных с опытом, если кому надо.
19.12.2025, 02:43
Интересное решение ) Короткое и эффективное. Уважение. 
