Изменение счетчика населения при найме юнитов в Stronghold Crusader
-
Добрый день! Я делаю свой мод по игре Stronghold Crusader. В игре есть такая особенность при найме любых юнитов, доступные крестьяне у костра превращаются в выбранного юнита и при этом срабатывает счетчик на вычитание единицы из текущего значения населения. А рабочие юниты превращаются из крестьян без вычитания этой единицы - крестьянин просто превращается в работника и идет на работу.
Я хочу, чтобы военные(нанимаемые) юниты были как гражданские(все рабочие) в плане смерти, найма, роспуска. Чтобы они подчинялись счётчику населения один в один как рабочие, по сути дать им(нанимаемым юнитам) функции рабочих, в плане учета населения только.
Найм любого военного юнита - приравнять к - когда крестьянин превращается в любого рабочего (новый крестьянин не выходит из донжона, вместо только что ушедшего на работу)/
Умирает нанятый юнит - приравнять к умирает рабочий(отнимается единичка из населения в книжке внизу)/
Роспуск(превращение обратно в крестьян) нанятых юнитов - приравнять к заморозке производственного здания(рабочий превращается обратно в крестьянина и идёт к костру) - (прибавление количества крестьян не происходит).версия игры 1.41 eng
Что мне удалось найти в силу моих возможностей:
Я нашел функцию отвечающую за счетчик текущего населения, но если ее занопить это просто ломает сам счетчик, пробовал менять рядом регисры похожие на sub ...-1, add...1, толку нет.
Нашел так же строчки в коде которые отвечают за смерть всех юнитов(если ее занопить - ни один объект не умирает), пробовал смотреть код рядом но ничего не понятно. Так же нашел строчку кода которая отвечает за роспуск или замораживание здания и превращение юнитов/работников обратно в крестьян, по аналогии сверху толку то не дало.
Помогите пожалуйста понять где записаны эти счетчики, и как их поменять!
-
@W00D
Если ты делаешь прям мод, то бывает полезно более глобально посмотреть на код, можешь воспользоваться дизассемблером, таким как GHIDRA, она тебе псевдокод нарисует, какие переменные в функции где и откуда приходят. Попробуй его использовать -
@KRYPTOPUNK Я в принципе далек от программирования, и знания языков, поэтому самостоятельно мало что пойму, использовал иду. Делаю мод полу-колхозным методом. Мне бы хоть одну из этих функций понять как сделать, остальные думаю по аналогии можно поковырять. Я здесь просто уперся в потолок своих возможностей, мне нужна помощь в конкретном месте.
-
@W00D попробую завтра посмотреть
-
Вот тут по моему код функции на юнитов...
83 ? ? ? 0F 8D ? ? ? ? 8B 96 ? ? ? ? 69 C0
Принцип работы прост... Висит таймер на регенерацию числа, стоит проверка этого числа и стоит кол на спавн их.. если это число выше указанного, идет пропуск всего этого дела.
-
@LIRW Спасибо за ответ! Я к удивлению копался в этом месте. Там из интересного - это только максимальное количество(24) крестьян у костра, и id юнита(крестьянин) выходящего из донжона, которые можно менять в угоду балансу. Но они по моему не коррелируют с счетчиком населения в книжке внизу.
-
@W00D Ну так вот это 24 измени... и будет сколько хочешь спавнится. Оно по моему на cmp висит...
-
Хз что за версия.....
[ENABLE] aobscanmodule(ogran,Stronghold Crusader.exe,0F ? ? ? ? ? ? 01 ? 0F ? ? ? ? ? ? 8B ? ? ? ? ? ? FF) alloc(newmem,$1000) label(return) registersymbol(ogran) newmem: mov word ptr [eax+000001AA],#100 movsx edx,word ptr [eax+000001AA] jmp return ogran: jmp newmem nop 2 return: [DISABLE] ogran: db 0F BF 90 AA 01 00 00 unregistersymbol(ogran) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: Stronghold Crusader.exe+230A7 Stronghold Crusader.exe+23077: 66 39 9C 31 A8 01 00 00 - cmp [ecx+esi+000001A8],bx Stronghold Crusader.exe+2307F: 8D 8C 31 A8 01 00 00 - lea ecx,[ecx+esi+000001A8] Stronghold Crusader.exe+23086: 7E 09 - jle "Stronghold Crusader.exe"+23091 Stronghold Crusader.exe+23088: 66 83 01 FF - add word ptr [ecx],-01 Stronghold Crusader.exe+2308C: A1 E8 63 B9 00 - mov eax,["Stronghold Crusader.exe"+7963E8] Stronghold Crusader.exe+23091: 69 C0 2C 03 00 00 - imul eax,eax,0000032C Stronghold Crusader.exe+23097: 8B D5 - mov edx,ebp Stronghold Crusader.exe+23099: 69 D2 F4 39 00 00 - imul edx,edx,000039F4 Stronghold Crusader.exe+2309F: 03 C6 - add eax,esi Stronghold Crusader.exe+230A1: 8D 8A B4 82 19 01 - lea ecx,[edx+"Stronghold Crusader.exe"+D982B4] // ---------- INJECTING HERE ---------- Stronghold Crusader.exe+230A7: 0F BF 90 AA 01 00 00 - movsx edx,word ptr [eax+000001AA] // ---------- DONE INJECTING ---------- Stronghold Crusader.exe+230AE: 01 11 - add [ecx],edx Stronghold Crusader.exe+230B0: 0F BF 80 E6 00 00 00 - movsx eax,word ptr [eax+000000E6] Stronghold Crusader.exe+230B7: 8B 0C 85 A8 89 5B 00 - mov ecx,[eax*4+"Stronghold Crusader.exe"+1B89A8] Stronghold Crusader.exe+230BE: FF D1 - call ecx Stronghold Crusader.exe+230C0: 8B 0D E8 63 B9 00 - mov ecx,["Stronghold Crusader.exe"+7963E8] Stronghold Crusader.exe+230C6: 8B D1 - mov edx,ecx Stronghold Crusader.exe+230C8: 69 D2 2C 03 00 00 - imul edx,edx,0000032C Stronghold Crusader.exe+230CE: 66 39 9C 32 E4 00 00 00 - cmp [edx+esi+000000E4],bx Stronghold Crusader.exe+230D6: 8D 04 32 - lea eax,[edx+esi] Stronghold Crusader.exe+230D9: 0F 84 2A 02 00 00 - je "Stronghold Crusader.exe"+23309 }
-
@LIRW Это вообще не то, что я описал, что хочу сделать.