|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 15, 2017 05:59 PM |
|
|
Ben80 said:
RoseKavalier said: I ran through 0x43B2E0 quickly (different function came after) and it gave me &(0x63B7D8) for ECX which is referenced a few times in the code, e.g. 0x436885.
Not something I've seen before.
How it can be ?
.text:0043B2F4 mov cl, ds:byte_0043B4F4[eax]
.text:0043B2FA jmp ds: off_0043B458[ecx*4]
this strings say that in ECX - surely not &(0x63B7D8)...
From which string in 0x43B2E0 ECX becomes &(0x63B7D8) ?
That's simply a switch() {} that loads the function to call to EAX, it does not call here, just returns lead to correct logic.
If you go back to 0x43A599 (one of the calls to 0x43B2E0) you can see
0x43A5A7 MOV DWORD PTR SS:[EBP-14],EAX
and a bit later...
0x43A659 MOV ECX,DWORD PTR SS:[EBP-8]
0x43A65D CALL DWORD PTR SS:[EBP-14] << your function(s)
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Ben80
Famous Hero
|
posted October 15, 2017 06:47 PM |
|
|
|
Maurice
Hero of Order
Part of the furniture
|
posted October 15, 2017 07:08 PM |
|
Edited by Maurice at 19:15, 15 Oct 2017.
|
RoseKavalier said: That's simply a switch() {} that loads the function to call to EAX, it does not call here, just returns lead to correct logic.
That's incorrect. EAX gets filled just before that, and is used as an offset to find the correct value to return to CL:
.text:0043B2E3 mov eax, [ebp+arg_0]
.text:0043B2E6 add eax, 0FFFFFFF1h
.text:0043B2E9 cmp eax, 3Ch
.text:0043B2EC ja loc_43B44E
.text:0043B2F2 xor ecx, ecx
.text:0043B2F4 mov cl, ds:byte_43B4F4[eax]
.text:0043B2FA jmp ds: off_43B458[ecx*4]
The first statement reads EAX from the stack, then it gets manipulated in the two statements that follow it. After the jump condition check, ECX is first emptied and then EAX is used to find the correct value from the jumptable, which starts off at the byte located at address 43B4F4. That value is returned into CL, which is the lower register of CX, which in turn is the lower register of ECX.
The jump table itself is as follows (note that the 90 value at the end are filler bytes):
00 00 00 00 26 26 26 26 26 26
26 26 01 02 03 04 05 06 07 08
09 0A 0B 26 26 26 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19
1A 1B 00 1C 1D 1E 1F 20 26 26
21 26 26 26 26 26 22 23 24 20
25 90 90 90 90 90 90 90 90 90
90 90 90 90 90
The value of ECX is then used to find a value for a second jump table, based on the number found in the table above, which looks like this:
.text:0043B458 off_43B458 dd offset loc_43B37F
.text:0043B45C dd offset loc_43B418
.text:0043B460 dd offset loc_43B30A
.text:0043B464 dd offset loc_43B3A3
.text:0043B468 dd offset loc_43B3F4
.text:0043B46C dd offset loc_43B406
.text:0043B470 dd offset loc_43B40F
.text:0043B474 dd offset loc_43B3FD
.text:0043B478 dd offset loc_43B313
.text:0043B47C dd offset loc_43B36D
.text:0043B480 dd offset loc_43B31C
.text:0043B484 dd offset loc_43B35B
.text:0043B488 dd offset loc_43B32E
.text:0043B48C dd offset loc_43B364
.text:0043B490 dd offset loc_43B340
.text:0043B494 dd offset loc_43B3EB
.text:0043B498 dd offset loc_43B445
.text:0043B49C dd offset loc_43B43C
.text:0043B4A0 dd offset loc_43B376
.text:0043B4A4 dd offset loc_43B3E2
.text:0043B4A8 dd offset loc_43B3BE
.text:0043B4AC dd offset loc_43B42A
.text:0043B4B0 dd offset loc_43B39A
.text:0043B4B4 dd offset loc_43B3C7
.text:0043B4B8 dd offset loc_43B433
.text:0043B4BC dd offset loc_43B3D0
.text:0043B4C0 dd offset loc_43B421
.text:0043B4C4 dd offset loc_43B3AC
.text:0043B4C8 dd offset loc_43B352
.text:0043B4CC dd offset loc_43B325
.text:0043B4D0 dd offset loc_43B3B5
.text:0043B4D4 dd offset loc_43B391
.text:0043B4D8 dd offset loc_43B337
.text:0043B4DC dd offset loc_43B349
.text:0043B4E0 dd offset loc_43B3D9
.text:0043B4E4 dd offset loc_43B44E
.text:0043B4E8 dd offset loc_43B388
.text:0043B4EC dd offset loc_43B301
.text:0043B4F0 dd offset loc_43B44E
The number found through translating the EAX value is then used to find the proper entry sequentially in this jump table.
Finally, each of those loc_ entries points to the final handler:
.text:0043B301 loc_43B301: ; DATA XREF: .text:0043B4ECo
.text:0043B301 mov eax, offset sub_437040
.text:0043B306 pop ebp
.text:0043B307 retn 4
.text:0043B30A ; ---------------------------------------------------------------------------
.text:0043B30A
.text:0043B30A loc_43B30A: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B30A ; DATA XREF: .text:0043B460o
.text:0043B30A mov eax, offset sub_438810
.text:0043B30F pop ebp
.text:0043B310 retn 4
.text:0043B313 ; ---------------------------------------------------------------------------
.text:0043B313
.text:0043B313 loc_43B313: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B313 ; DATA XREF: .text:0043B478o
.text:0043B313 mov eax, offset sub_439990
.text:0043B318 pop ebp
.text:0043B319 retn 4
.text:0043B31C ; ---------------------------------------------------------------------------
.text:0043B31C
.text:0043B31C loc_43B31C: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B31C ; DATA XREF: .text:0043B480o
.text:0043B31C mov eax, offset sub_439A30
.text:0043B321 pop ebp
.text:0043B322 retn 4
.text:0043B325 ; ---------------------------------------------------------------------------
.text:0043B325
.text:0043B325 loc_43B325: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B325 ; DATA XREF: .text:0043B4CCo
.text:0043B325 mov eax, offset sub_43A050
.text:0043B32A pop ebp
.text:0043B32B retn 4
.text:0043B32E ; ---------------------------------------------------------------------------
.text:0043B32E
.text:0043B32E loc_43B32E: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B32E ; DATA XREF: .text:0043B488o
.text:0043B32E mov eax, offset sub_437080
.text:0043B333 pop ebp
.text:0043B334 retn 4
.text:0043B337 ; ---------------------------------------------------------------------------
.text:0043B337
.text:0043B337 loc_43B337: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B337 ; DATA XREF: .text:0043B4D8o
.text:0043B337 mov eax, offset sub_438D50
.text:0043B33C pop ebp
.text:0043B33D retn 4
.text:0043B340 ; ---------------------------------------------------------------------------
.text:0043B340
.text:0043B340 loc_43B340: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B340 ; DATA XREF: .text:0043B490o
.text:0043B340 mov eax, offset sub_437D50
.text:0043B345 pop ebp
.text:0043B346 retn 4
.text:0043B349 ; ---------------------------------------------------------------------------
.text:0043B349
.text:0043B349 loc_43B349: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B349 ; DATA XREF: .text:0043B4DCo
.text:0043B349 mov eax, offset sub_43AF30
.text:0043B34E pop ebp
.text:0043B34F retn 4
.text:0043B352 ; ---------------------------------------------------------------------------
.text:0043B352
.text:0043B352 loc_43B352: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B352 ; DATA XREF: .text:0043B4C8o
.text:0043B352 mov eax, offset sub_439AD0
.text:0043B357 pop ebp
.text:0043B358 retn 4
.text:0043B35B ; ---------------------------------------------------------------------------
.text:0043B35B
.text:0043B35B loc_43B35B: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B35B ; DATA XREF: .text:0043B484o
.text:0043B35B mov eax, offset sub_439880
.text:0043B360 pop ebp
.text:0043B361 retn 4
.text:0043B364 ; ---------------------------------------------------------------------------
.text:0043B364
.text:0043B364 loc_43B364: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B364 ; DATA XREF: .text:0043B48Co
.text:0043B364 mov eax, offset sub_43AFC0
.text:0043B369 pop ebp
.text:0043B36A retn 4
.text:0043B36D ; ---------------------------------------------------------------------------
.text:0043B36D
.text:0043B36D loc_43B36D: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B36D ; DATA XREF: .text:0043B47Co
.text:0043B36D mov eax, offset sub_439810
.text:0043B372 pop ebp
.text:0043B373 retn 4
.text:0043B376 ; ---------------------------------------------------------------------------
.text:0043B376
.text:0043B376 loc_43B376: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B376 ; DATA XREF: .text:0043B4A0o
.text:0043B376 mov eax, offset sub_438A10
.text:0043B37B pop ebp
.text:0043B37C retn 4
.text:0043B37F ; ---------------------------------------------------------------------------
.text:0043B37F
.text:0043B37F loc_43B37F: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B37F ; DATA XREF: .text: off_43B458o
.text:0043B37F mov eax, offset sub_436BB0
.text:0043B384 pop ebp
.text:0043B385 retn 4
.text:0043B388 ; ---------------------------------------------------------------------------
.text:0043B388
.text:0043B388 loc_43B388: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B388 ; DATA XREF: .text:0043B4E8o
.text:0043B388 mov eax, offset sub_438660
.text:0043B38D pop ebp
.text:0043B38E retn 4
.text:0043B391 ; ---------------------------------------------------------------------------
.text:0043B391
.text:0043B391 loc_43B391: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B391 ; DATA XREF: .text:0043B4D4o
.text:0043B391 mov eax, offset sub_43B150
.text:0043B396 pop ebp
.text:0043B397 retn 4
.text:0043B39A ; ---------------------------------------------------------------------------
.text:0043B39A
.text:0043B39A loc_43B39A: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B39A ; DATA XREF: .text:0043B4B0o
.text:0043B39A mov eax, offset sub_4380E0
.text:0043B39F pop ebp
.text:0043B3A0 retn 4
.text:0043B3A3 ; ---------------------------------------------------------------------------
.text:0043B3A3
.text:0043B3A3 loc_43B3A3: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3A3 ; DATA XREF: .text:0043B464o
.text:0043B3A3 mov eax, offset sub_439D60
.text:0043B3A8 pop ebp
.text:0043B3A9 retn 4
.text:0043B3AC ; ---------------------------------------------------------------------------
.text:0043B3AC
.text:0043B3AC loc_43B3AC: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3AC ; DATA XREF: .text:0043B4C4o
.text:0043B3AC mov eax, offset sub_437220
.text:0043B3B1 pop ebp
.text:0043B3B2 retn 4
.text:0043B3B5 ; ---------------------------------------------------------------------------
.text:0043B3B5
.text:0043B3B5 loc_43B3B5: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3B5 ; DATA XREF: .text:0043B4D0o
.text:0043B3B5 mov eax, offset sub_43A150
.text:0043B3BA pop ebp
.text:0043B3BB retn 4
.text:0043B3BE ; ---------------------------------------------------------------------------
.text:0043B3BE
.text:0043B3BE loc_43B3BE: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3BE ; DATA XREF: .text:0043B4A8o
.text:0043B3BE mov eax, offset sub_437DC0
.text:0043B3C3 pop ebp
.text:0043B3C4 retn 4
.text:0043B3C7 ; ---------------------------------------------------------------------------
.text:0043B3C7
.text:0043B3C7 loc_43B3C7: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3C7 ; DATA XREF: .text:0043B4B4o
.text:0043B3C7 mov eax, offset sub_438BB0
.text:0043B3CC pop ebp
.text:0043B3CD retn 4
.text:0043B3D0 ; ---------------------------------------------------------------------------
.text:0043B3D0
.text:0043B3D0 loc_43B3D0: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3D0 ; DATA XREF: .text:0043B4BCo
.text:0043B3D0 mov eax, offset sub_438EC0
.text:0043B3D5 pop ebp
.text:0043B3D6 retn 4
.text:0043B3D9 ; ---------------------------------------------------------------------------
.text:0043B3D9
.text:0043B3D9 loc_43B3D9: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3D9 ; DATA XREF: .text:0043B4E0o
.text:0043B3D9 mov eax, offset sub_439150
.text:0043B3DE pop ebp
.text:0043B3DF retn 4
.text:0043B3E2 ; ---------------------------------------------------------------------------
.text:0043B3E2
.text:0043B3E2 loc_43B3E2: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3E2 ; DATA XREF: .text:0043B4A4o
.text:0043B3E2 mov eax, offset sub_438710
.text:0043B3E7 pop ebp
.text:0043B3E8 retn 4
.text:0043B3EB ; ---------------------------------------------------------------------------
.text:0043B3EB
.text:0043B3EB loc_43B3EB: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3EB ; DATA XREF: .text:0043B494o
.text:0043B3EB mov eax, offset sub_4387A0
.text:0043B3F0 pop ebp
.text:0043B3F1 retn 4
.text:0043B3F4 ; ---------------------------------------------------------------------------
.text:0043B3F4
.text:0043B3F4 loc_43B3F4: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3F4 ; DATA XREF: .text:0043B468o
.text:0043B3F4 mov eax, offset sub_4395F0
.text:0043B3F9 pop ebp
.text:0043B3FA retn 4
.text:0043B3FD ; ---------------------------------------------------------------------------
.text:0043B3FD
.text:0043B3FD loc_43B3FD: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B3FD ; DATA XREF: .text:0043B474o
.text:0043B3FD mov eax, offset sub_439650
.text:0043B402 pop ebp
.text:0043B403 retn 4
.text:0043B406 ; ---------------------------------------------------------------------------
.text:0043B406
.text:0043B406 loc_43B406: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B406 ; DATA XREF: .text:0043B46Co
.text:0043B406 mov eax, offset sub_439620
.text:0043B40B pop ebp
.text:0043B40C retn 4
.text:0043B40F ; ---------------------------------------------------------------------------
.text:0043B40F
.text:0043B40F loc_43B40F: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B40F ; DATA XREF: .text:0043B470o
.text:0043B40F mov eax, offset sub_439690
.text:0043B414 pop ebp
.text:0043B415 retn 4
.text:0043B418 ; ---------------------------------------------------------------------------
.text:0043B418
.text:0043B418 loc_43B418: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B418 ; DATA XREF: .text:0043B45Co
.text:0043B418 mov eax, offset sub_4388B0
.text:0043B41D pop ebp
.text:0043B41E retn 4
.text:0043B421 ; ---------------------------------------------------------------------------
.text:0043B421
.text:0043B421 loc_43B421: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B421 ; DATA XREF: .text:0043B4C0o
.text:0043B421 mov eax, offset sub_438950
.text:0043B426 pop ebp
.text:0043B427 retn 4
.text:0043B42A ; ---------------------------------------------------------------------------
.text:0043B42A
.text:0043B42A loc_43B42A: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B42A ; DATA XREF: .text:0043B4ACo
.text:0043B42A mov eax, offset sub_437F10
.text:0043B42F pop ebp
.text:0043B430 retn 4
.text:0043B433 ; ---------------------------------------------------------------------------
.text:0043B433
.text:0043B433 loc_43B433: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B433 ; DATA XREF: .text:0043B4B8o
.text:0043B433 mov eax, offset sub_439300
.text:0043B438 pop ebp
.text:0043B439 retn 4
.text:0043B43C ; ---------------------------------------------------------------------------
.text:0043B43C
.text:0043B43C loc_43B43C: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B43C ; DATA XREF: .text:0043B49Co
.text:0043B43C mov eax, offset sub_4389E0
.text:0043B441 pop ebp
.text:0043B442 retn 4
.text:0043B445 ; ---------------------------------------------------------------------------
.text:0043B445
.text:0043B445 loc_43B445: ; CODE XREF: sub_43B2E0+1Aj
.text:0043B445 ; DATA XREF: .text:0043B498o
.text:0043B445 mov eax, offset sub_438B20
.text:0043B44A pop ebp
.text:0043B44B retn 4
.text:0043B44E ; ---------------------------------------------------------------------------
.text:0043B44E
.text:0043B44E loc_43B44E: ; CODE XREF: sub_43B2E0+Cj
.text:0043B44E ; sub_43B2E0+1Aj
.text:0043B44E ; DATA XREF: ...
.text:0043B44E mov eax, offset loc_43B2D0
.text:0043B453 pop ebp
.text:0043B454 retn 4
.text:0043B454 sub_43B2E0 endp
.text:0043B454
.text:0043B454 ; ---------------------------------------------------------------------------
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 15, 2017 07:16 PM |
|
|
Maurice said:
That's incorrect. EAX gets filled just before that, and is used as an offset to find the correct value to return to CL:
.text:0043B2E3 mov eax, [ebp+arg_0]
.text:0043B2E6 add eax, 0FFFFFFF1h
.text:0043B2E9 cmp eax, 3Ch
.text:0043B2EC ja loc_43B44E
.text:0043B2F2 xor ecx, ecx
.text:0043B2F4 mov cl, ds:byte_43B4F4[eax]
.text:0043B2FA jmp ds: off_43B458[ecx*4]
This is how I understand it:
EAX is initially your switch(value), and then in the appropriate case: the appropriate address is loaded to EAX.
Everything before 0x43B301 is just manipulation, everything after is results.
? ?
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Ben80
Famous Hero
|
posted October 15, 2017 07:28 PM |
|
|
@Maurice,
but how in procedure sub_00438D50 is transmitted ECX with complex structure of variables, not just number from jump table ?
____________
|
|
Ben80
Famous Hero
|
posted October 15, 2017 07:35 PM |
|
|
@RosKavalier,
it seems ECX contains _Dlg_* Battle dialog.
____________
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 15, 2017 08:35 PM |
|
|
Serp said: I would like to see plugins for:
1) be able to remove ballista and other war machines from heroes inventory. (especiall ballista sucks with blind)
2) Tell the stupid ballista and especially tower AI, to NOT attack blinded creatures, at least if there are unblinded creatures left... In my current fight there are 6 unblinded and one blinded creature, but my towers keep attacking the blinded one (sprites)...
3) First Aid -> tent can resurrect and heals more and has more hitpoints. At the moment I consider every magic hero with ressurection to be much stronger than any might hero, just because the might hero is loosing troops in every big fight, while the magic hero never looses troops.
4) More heavy change: Allow to switch between mass- and single spell. Especially "Dispel" you normally do not want to be casted at all units. Most of the time I would like to remove "AntiMagic" from a single unit.
If you have expert, you could cast a less effective spell at all units, or a good spell on one unit. Eg. haste gives +1 or +2 more speed when casting on a single unit, compared to cast it to all units.
1)there is a check at 0x4DE4A8 to see if artifact can be placed in backpack (that includes war machines). However if you override the result and place the artifact in backpack, it vanishes - so there's something else needed to do.
2) should be possible. Personally I don't like to make big changes to gameplay mechanics so I'm really not_motivated to search for this right now when there is much else to do
3) check Phoenix4ever's mod, I'm pretty sure he improved First Aid Tent healing. Use his addresses to get started
4) see 2)
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Maurice
Hero of Order
Part of the furniture
|
posted October 15, 2017 08:46 PM |
|
Edited by Maurice at 20:47, 15 Oct 2017.
|
RoseKavalier said: EAX is initially your switch(value), and then in the appropriate case: the appropriate address is loaded to EAX.
Everything before 0x43B301 is just manipulation, everything after is results.
? ?
I think we have some miscommunication about which EAX we refer to . You use the one from the eventual procedure call, while I was referring to the initial one in the disassembly code.
I was referring to the EAX noted at 0043B2F4.
Ben80 said: @Maurice,
but how in procedure sub_00438D50 is transmitted ECX with complex structure of variables, not just number from jump table ?
I checked the code and I have to admit my disassembly knowledge falls short.
As far as I can tell, looking at the start of that procedure:
.text:00438D50 var_28 = qword ptr -28h
.text:00438D50 var_18 = qword ptr -18h
.text:00438D50 var_10 = qword ptr -10h
.text:00438D50 var_8 = qword ptr -8
.text:00438D50 arg_0 = dword ptr 8
.text:00438D50 arg_8 = dword ptr 10h
.text:00438D50 arg_10 = dword ptr 18h
.text:00438D50 arg_14 = byte ptr 1Ch
... the value of ECX is held in var_28, as per the decompiled subroutine header:
int __userpurge sub_00438D50<eax>(int a1<ecx>, long double a2<st0>, int monster, int a4, int a5, int a6, int a7, char a8)
Unless I am missing something here. But like I said, my disassembly knowledge falls short here. It seems the value in ECX isn't purged between function calls, so it should contain whatever was put into it prior to the function call.
|
|
Salamandre
Admirable
Omnipresent Hero
Wog refugee
|
posted October 15, 2017 08:48 PM |
|
|
So you guys are struggling to create Heroes 3.6 Wake of Hota?
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 15, 2017 10:05 PM |
|
|
Serp said:
3) First Aid -> tent can resurrect and heals more and has more hitpoints. At the moment I consider every magic hero with ressurection to be much stronger than any might hero, just because the might hero is loosing troops in every big fight, while the magic hero never looses troops.
Hi Serp.
I can help you with making First Aid Tent heal more, I'm not at home right now so I can't remember exactly how to hex edit it, but I can post it tomorrow if you want.
I made First Aid heal 100 at basic, 175 at advanced and 250 hp at expert.
I also gave the tent 225 hp, but it can be made as tough as an Azure Dragon if you want. You can edit hp and defense simply by editing the text file crtraits.txt and the description of what first aid skill does in sstraits.txt.
I agree with most of your other points btw, except maybe resurrection for the first aid tent. I also hate when ballista/cannon shoots at blinded targets and that you can't buy a cannon if you already have a ballista etc.
It would also be nice if first aid tent would automatically heal highest tier stack.
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 24, 2017 12:38 AM |
|
|
Can anything be done to make Resurrection and Animate Dead less OP?
I already made Animate Dead cost the same mana as Resurrection and consider moving it to level 4.
But since the reviving becomes permanent these spells seems to be some of the only spells you cast when you have them, making combat a bit boring. I could of course just disable them from a map and remove the 3 heroes specialising in them, but I don't know if they could somehow become less OP?... If they somehow could work after a battle instead of in combat, that would be much more interesting I think.
|
|
Ben80
Famous Hero
|
posted October 24, 2017 06:49 PM |
|
|
@phoenix4ever
Yes, it is very usefull spell, but usually strong players in some hypothetical battle will use not only it. In some battle, possibly, it will not be used at all...
____________
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 24, 2017 07:22 PM |
|
|
Perhaps in multiplayer, but in singleplayer once the main hero has grown strong Resurrection/Animate Dead and an occasional Chain Lightning is all I seem to cast. Some spells never feels good to cast like Remove Obstacle, Fire Wall (except Luna) and Land Mine, I even buffed the last two.
|
|
Serp
Known Hero
|
posted October 25, 2017 01:09 AM |
|
|
phoenix4ever said: Can anything be done to make Resurrection and Animate Dead less OP?
I already made Animate Dead cost the same mana as Resurrection and consider moving it to level 4.
But since the reviving becomes permanent these spells seems to be some of the only spells you cast when you have them, making combat a bit boring. I could of course just disable them from a map and remove the 3 heroes specialising in them, but I don't know if they could somehow become less OP?... If they somehow could work after a battle instead of in combat, that would be much more interesting I think.
I like resurrection, but manly because it does mean you don't loose troops.So I like your idea, that troops are not resurrected within the fight, but after the figt (like necromancy).
@Alex/Ben/RoseKavalier:
Do you think this would be possible?
@phoenix4ever:
I can help to put plugins into dll form, but I can not do the hex code stuff and most of the time also not the Code style, like you saw in my previous posts here If it is something similuar to what I have aöready done with help, I can repeat it with other settings/skills of course, as long I know the hex values.
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 25, 2017 01:45 AM |
|
|
Probably, but implementation raises a lot of questions.
How do you handle various skill levels? How do you cast it and know you're done casting? What about stacks that died on top of each other? Those creatures done for? What about AI, how will AI use those spells?
Try to formulate a complete mechanism and then it can be discussed to see how it's possible and how to code it.
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Salamandre
Admirable
Omnipresent Hero
Wog refugee
|
posted October 25, 2017 07:59 AM |
|
|
phoenix4ever said: Perhaps in multiplayer, but in singleplayer once the main hero has grown strong Resurrection/Animate Dead and an occasional Chain Lightning is all I seem to cast
Maybe the maps you're playing are not interesting then. Of course resurrect is a main key and it should remain that way, elsewhere how to design a challenging map if not allow the player to win without casualties if skilled. But resurrect phase, at least in good maps with creative battles, is triggering very late, and usually it starts ONCE the battle is already won. Is just like cleaning your F1 car once you won the race so it doesn't remain dirty.
Then chain lightning, thats a non existing issue imo, you're the only one apparently who uses or complains about it. And ofc, RK is right, without proposing a detailed and valid alternative it can't work.
____________
Era II mods and utilities
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 25, 2017 09:24 AM |
|
|
@RoseKavalier and Salamandre
Well I have not figured out exactly how they could work and I don't know if everything is possible.
It was also more like raising the topic for discussion and perhaps you guys had some ideas too? Or maybe you think they are already perfect as they are?
It's just a shame that when you have these spells that is (sometimes) all you need in combat.
Air Magic can be used on adventure map with Fly and DD and Water Magic with Summon Boat and Water Walk. But Fire Magic seems almost completely useless once you got Res/AD.
Okay I'll try to formulate my idea of "post combat resurrection":
After a battle is won you can choose creature stacks which lost creatures in previous combat and choose to resurrect/animate them.
You can do this as long as you have mana and it does'nt matter if creatures are on top of the corpse, it still works.
When AI resurrects it should prioritize higher level creatures first and first resurrect level 7's, then level 6's and so on. If neccessary it should spend all mana to try to resurrect it's army.
If you or the enemy was wearing Recanter's Cloak, Orb of Inhibition or HotAs Ring of Oblivion resurrection cannot be performed.
If possible both Resurrection and Animate Dead should require advanced Earth Magic before the spells work.
If a hero lost both living and undead units in combat and knows both advanced Resurrection and advanced Animate Dead he will get to use both after combat.
|
|
Maurice
Hero of Order
Part of the furniture
|
posted October 25, 2017 11:17 AM |
|
|
phoenix4ever said:
If you or the enemy was wearing Recanter's Cloak, Orb of Inhibition or HotAs Ring of Oblivion resurrection cannot be performed.
I agree with your points for the most part, but on this one, I disagree.
Resurrection should only be allowed for the victor of combat; the defeated Hero will lose all creatures that were dead on his side at the end of battle. Post-battle resurrection should not consider the defeated Hero (in the sense that that Hero is no longer actively present on the battlefield), nor any of its carried Artifacts. Likewise, it seems rather stupid to include such inhibiting Artifacts when worn by the victor, post combat, as it would make sense for the Hero to unequip those before starting the resurrection sequence. It's not like the Hero needs to spend hours to unequip anything and post-battle, there's no threat to the Hero anymore either.
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 25, 2017 11:25 AM |
|
|
I also meant that post resurrection should only be allowed for the victor.
And those 3 artifacts was meant as a way of limiting the use of Resurrection/Animate Dead to make them less OP.
Alternatively Resurrection and Animate could just revive only for the battle and never permanent, but that would make them really bad...
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 25, 2017 01:58 PM |
|
|
phoenix4ever said: It was also more like raising the topic for discussion and perhaps you guys had some ideas too? Or maybe you think they are already perfect as they are?
For my part I'm quite happy how they work. If the map is correctly planned, they give the AI some extra punch.
For randomly generated maps you might as well disable both spells because AI will never be smart enough to develop a good caster - and then it's only by chance that it might stumble upon resurrection.
Regarding your suggestion, it might be doable but I personally have 0 idea how to code that for AI to use.
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
|
|