|
|
Erdamon
Adventuring Hero
|
posted October 26, 2017 09:15 AM |
|
|
Hey fellas. Any new scripts in the works ?
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 26, 2017 05:18 PM |
|
|
I would really like it if any of you could make some "un-HotA" plug-ins.
I would like for Inferno:
* To require Mage Guild level 2 for Pit Lords again.
* Arch Devils to give only -1 to enemy luck.
I would like for Tower:
* To get their old build order back, where Mage Tower needs to be build before Altar of Wishes and Golden Pavillion. (Instead I will move some of the special ressource cost from Mage Tower to Upg. Mage Tower, this I can easily do myself.)
I would like for Conflux:
* Sprite building no longer requires Magic University.
* Firebirds immune to Fire Magic again.
It could perhaps be done with 1 plug-in containing all 5 changes or 5 separate plug-ins. I would be very happy if someone could/would do it.
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 27, 2017 01:46 AM |
bonus applied by Maurice on 29 Oct 2017. |
|
So I spent a bit of time with OllyDbg to figure out the general workings of building requirements.
e.g.
There's a function that's responsible for constructing Castle building depedencies (0x4EB810), however HotA's dll erases all that was done and move it around.
In SoD, building dependencies start around 0x6977E8 and are formed of QWORD (2x DWORD).
In HotA, because of the new town, they reworked the dependencies to a dynamic address that is rewritten every time you start the game. You might be able to fix this using hex editing of the HotA DLL but I think there's an easier way.
Since the game still needs to figure out what the building dependencies are, all of the old references to 0x6977E8 are replaced by references to the dynamic address. You can read this new reference with a plugin and that gives you the new "base" to building dependencies.
What's left to do is getting the offset to your desired building and then writing the value of the new building dependencies there.
References can be obtained from one of many places, I was inspecting this area:
int new_reference1 = *(int*)0x5D6018;
int new_reference2 = *(int*)0x5D601F; // or simply new_reference1 + 4
The offset to your building of consideration is:
int building_offset = 8 * [building_ID + town_type * 44];
building_ID: see ERM help (List of all building for CA receiver)
town_type: 0 Castle, 1 Ramp, 2 Tower, ...
int dependencies1 = *(int*)(new_reference1 + building_offset);
int dependencies2 = *(int*)(new_reference2 + building_offset);
Ok, what about dependencies?
Again, see ERM help (List of all building for CA receiver).
It's essentially 32 bits format (11111111111111....) like Maurice explained earlier in this thread which can also be done with hex easily enough.
e.g. bit vs hex
1 = 1
10 = 2
100 = 4
111 = 1 + 2 + 4 = 7
Since I've referenced ERM help, we'll follow their format. In this special case there is no need to reverse the hex/bits as ERM help put them from left to right already.
e.g. (all in hex)
If you want a particular building to require Mage Guild Level 1, the first byte should contain '01'.
... require tavern, the first byte should contain '20'
To require both, you would have 20 + 01 = 21
Example in SoD vs HotA
[Note: ERM counts bytes from 0]
Byte ~0~ in SoD is 81h
The 1 is for '01', that means Mage Guild Level 1. There is no Mage Guild Requirement in HotA because the '01' is absent.
Then we have '80', that means Fort.
Byte ~1~ is '00' -> no dependencies
Byte ~2~ is '00' -> no dependencies
Byte ~3~ is 'C0'
That is the sum of '40' + '80'
'40' for the byte #3 is 'Dwelling 1' aka Workshop
'80' for byte #3 is 'Dwelling 2' aka Parapet
Byte ~4~ is '03' '05' for HotA
That is the sum of '01' + '02' '01' + '04'
'01' is dwelling 3 aka Golem Factory
'02' is dwelling 4 aka Mage Tower but not in HotA
'04' is dwelling 5 aka Altar of Wishes in HotA
With this, you should have everything needed to figure out the dependencies and offsets you wish for now and in the future.
~~~
Archdevil -luck back to original value
_PI->WriteHexPatch(0x44AFFF, "83 3E 37 74 1B");
(restores original code, but in reverse order)
EDIT: see bottom of this post.
~~~
Firebirds
I haven't looked yet, I will edit in later. Maybe it's just a creature flag (0x4000) which would be simple enough.
EDIT: yep, intuition was correct...this should bring it back.
o_pCreatureInfo[CID_FIREBIRD].flags = 0x409B;
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
OxFEA
Promising
Famous Hero
feanor on DF2.ru
|
posted October 27, 2017 09:35 AM |
bonus applied by Maurice on 29 Oct 2017. |
Edited by OxFEA at 09:39, 27 Oct 2017.
|
Afaik, this table is dynamic, and filled after game start
Initial data, at least at vanilla and WoG-branch uses strange tree-like structure:
http://forum.df2.ru/index.php?s=&showtopic=6803&view=findpost&p=742544
#define BLD_ID_MAGE1 0
#define BLD_ID_MAGE2 1
#define BLD_ID_MAGE3 2
#define BLD_ID_MAGE4 3
#define BLD_ID_MAGE5 4
#define BLD_ID_TAVERN 5
#define BLD_ID_WHARF 6
#define BLD_ID_FORT1 7
#define BLD_ID_FORT2 8
#define BLD_ID_FORT3 9
#define BLD_ID_HALL1 10
#define BLD_ID_HALL2 11
#define BLD_ID_HALL3 12
#define BLD_ID_HALL4 13
#define BLD_ID_MARKET 14
#define BLD_ID_SILO 15
#define BLD_ID_SMITH 16
#define BLD_ID_SPEC17 17
#define BLD_ID_HORDE1 18
#define BLD_ID_HORDE1U 19
#define BLD_ID_WHARF2 20
#define BLD_ID_SPEC21 21
#define BLD_ID_SPEC22 22
#define BLD_ID_SPEC23 23
#define BLD_ID_HORDE2 24
#define BLD_ID_HORDE2U 25
#define BLD_ID_GRAIL 26
#define BLD_ID_DECOR27 27
#define BLD_ID_DECOR28 28
#define BLD_ID_DECOR29 29
#define BLD_ID_DWELL1 30
#define BLD_ID_DWELL2 31
#define BLD_ID_DWELL3 32
#define BLD_ID_DWELL4 33
#define BLD_ID_DWELL5 34
#define BLD_ID_DWELL6 35
#define BLD_ID_DWELL7 36
#define BLD_ID_DWELL1U 37
#define BLD_ID_DWELL2U 38
#define BLD_ID_DWELL3U 39
#define BLD_ID_DWELL4U 40
#define BLD_ID_DWELL5U 41
#define BLD_ID_DWELL6U 42
#define BLD_ID_DWELL7U 43
int Dependencies0[] = {
BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_WHARF, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SPEC22, BLD_ID_TAVERN, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_SMITH, -1,
BLD_ID_SPEC17, BLD_ID_WHARF, -1,
BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_SMITH, BLD_ID_MAGE1, BLD_ID_MARKET, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4, BLD_ID_DWELL1, BLD_ID_SMITH, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, -1,
BLD_ID_DWELL3, BLD_ID_DWELL4, -1,
BLD_ID_HORDE1, BLD_ID_DWELL3, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL3U, -1,
BLD_ID_SPEC21, BLD_ID_DWELL4, -1,
BLD_ID_DWELL6, BLD_ID_SPEC21, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL5, BLD_ID_DWELL4, BLD_ID_MAGE1, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL7, BLD_ID_DWELL5, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies1[] = {
BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_SPEC17, -1,
BLD_ID_SPEC21, BLD_ID_SPEC17, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_MAGE1, BLD_ID_SMITH, BLD_ID_MARKET, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL2, -1,
BLD_ID_SPEC22, BLD_ID_HORDE1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL2U, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL5, BLD_ID_DWELL3, -1,
BLD_ID_HORDE2, BLD_ID_DWELL5, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_HORDE2U, BLD_ID_DWELL5U, -1,
BLD_ID_DWELL4, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7, BLD_ID_DWELL6, BLD_ID_MAGE2, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, BLD_ID_MAGE3, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies2[] = {
BLD_ID_FORT1, -1,
BLD_ID_SPEC21, BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_MAGE1, -1,
BLD_ID_SPEC22, BLD_ID_MAGE1, -1,
BLD_ID_SPEC23, BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_SPEC17, BLD_ID_MARKET, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_MARKET, BLD_ID_SMITH, BLD_ID_MAGE1, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL2, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL2U, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4, BLD_ID_DWELL2, BLD_ID_DWELL3, BLD_ID_MAGE1, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, BLD_ID_SPEC22, -1,
BLD_ID_DWELL5, BLD_ID_DWELL4, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7, BLD_ID_DWELL5, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies3[] = {
BLD_ID_FORT1, -1,
BLD_ID_SPEC21, BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_SPEC22, BLD_ID_FORT2, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_MAGE1, -1,
BLD_ID_SPEC23, BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_SMITH, BLD_ID_MARKET, BLD_ID_MAGE1, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_HORDE2, BLD_ID_DWELL3, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_HORDE2U, BLD_ID_DWELL3U, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, BLD_ID_MAGE1, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL5, BLD_ID_DWELL4, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, BLD_ID_MAGE2, -1,
BLD_ID_DWELL7, BLD_ID_DWELL5, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies4[] = {
BLD_ID_FORT1, -1,
BLD_ID_SPEC17, BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_WHARF, -1,
BLD_ID_MAGE1, -1,
BLD_ID_SPEC21, BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_MARKET, BLD_ID_SMITH, BLD_ID_MAGE1, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_SPEC22, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1, BLD_ID_SPEC22, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_SPEC22, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, BLD_ID_SPEC21, -1,
BLD_ID_DWELL5, BLD_ID_DWELL2, BLD_ID_MAGE1, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies5[] = {
BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_SPEC22, -1,
BLD_ID_SPEC23, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_SPEC17, BLD_ID_MARKET, -1,
BLD_ID_MAGE1, -1,
BLD_ID_SPEC21, BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_SMITH, BLD_ID_MARKET, BLD_ID_MAGE1, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4, BLD_ID_DWELL3, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, -1,
BLD_ID_DWELL5, BLD_ID_DWELL4, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7, BLD_ID_DWELL5, BLD_ID_DWELL6, BLD_ID_MAGE2, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, BLD_ID_MAGE3, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies6[] = {
BLD_ID_FORT1, -1,
BLD_ID_SPEC17, BLD_ID_FORT1, -1,
BLD_ID_SPEC23, BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_SPEC22, BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_SPEC21, BLD_ID_MARKET, -1,
BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_MAGE1, BLD_ID_MARKET, BLD_ID_SMITH, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, BLD_ID_DWELL1U, -1,
BLD_ID_DWELL5, BLD_ID_DWELL2, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL7, BLD_ID_DWELL5, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, BLD_ID_SMITH, -1,
BLD_ID_DWELL4, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, BLD_ID_MAGE1, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies7[] = {
BLD_ID_FORT1, -1,
BLD_ID_SPEC21, BLD_ID_FORT1, -1,
BLD_ID_SPEC22, BLD_ID_SPEC21, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_SPEC17, BLD_ID_HALL2, BLD_ID_SPEC21, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_MARKET, BLD_ID_SMITH, BLD_ID_MAGE1, -1,
BLD_ID_WHARF, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, BLD_ID_TAVERN, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL6, BLD_ID_DWELL2, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, -1,
BLD_ID_DWELL5, BLD_ID_DWELL3, BLD_ID_DWELL2, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, BLD_ID_SILO, -1,
BLD_ID_DWELL7, BLD_ID_DWELL6, BLD_ID_DWELL4, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_GRAIL, -1,
-100
};
int Dependencies8[] = {
BLD_ID_FORT1, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_WHARF, -1,
BLD_ID_TAVERN, -1,
BLD_ID_SMITH, -1,
BLD_ID_MARKET, -1,
BLD_ID_SILO, BLD_ID_MARKET, -1,
BLD_ID_SPEC17, BLD_ID_MARKET, -1,
BLD_ID_MAGE1, -1,
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_SPEC21, BLD_ID_MAGE1, -1,
BLD_ID_HALL2, BLD_ID_TAVERN, -1,
BLD_ID_HALL3, BLD_ID_HALL2, BLD_ID_MARKET, BLD_ID_SMITH, BLD_ID_MAGE1, -1,
BLD_ID_HALL4, BLD_ID_HALL3, BLD_ID_FORT3, -1,
BLD_ID_DWELL1, BLD_ID_FORT1, -1,
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
BLD_ID_DWELL2, BLD_ID_DWELL1, BLD_ID_MAGE1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL3, BLD_ID_DWELL1, BLD_ID_MAGE1, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4, BLD_ID_DWELL2, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, BLD_ID_DWELL2U, -1,
BLD_ID_DWELL5, BLD_ID_DWELL3, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6, BLD_ID_DWELL4, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, BLD_ID_MAGE2, -1,
BLD_ID_DWELL7, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
BLD_ID_GRAIL, -1,
-100
};
//"Upgrade" relationship (replacement of obsolete building with new one)
int ObsolutionsAll[] = {
BLD_ID_MAGE2, BLD_ID_MAGE1, -1,
BLD_ID_MAGE3, BLD_ID_MAGE2, -1,
BLD_ID_MAGE4, BLD_ID_MAGE3, -1,
BLD_ID_MAGE5, BLD_ID_MAGE4, -1,
BLD_ID_FORT2, BLD_ID_FORT1, -1,
BLD_ID_FORT3, BLD_ID_FORT2, -1,
BLD_ID_HALL2, BLD_ID_HALL1, -1,
BLD_ID_HALL3, BLD_ID_HALL2, -1,
BLD_ID_HALL4, BLD_ID_HALL3, -1,
BLD_ID_HORDE1U, BLD_ID_HORDE1, -1,
BLD_ID_HORDE2U, BLD_ID_HORDE2, -1,
BLD_ID_DWELL1U, BLD_ID_DWELL1, -1,
BLD_ID_DWELL2U, BLD_ID_DWELL2, -1,
BLD_ID_DWELL3U, BLD_ID_DWELL3, -1,
BLD_ID_DWELL4U, BLD_ID_DWELL4, -1,
BLD_ID_DWELL5U, BLD_ID_DWELL5, -1,
BLD_ID_DWELL6U, BLD_ID_DWELL6, -1,
BLD_ID_DWELL7U, BLD_ID_DWELL7, -1,
-100
};
int Obsolutions0[] = {
BLD_ID_SPEC22, BLD_ID_TAVERN, -1,
BLD_ID_HORDE1, BLD_ID_DWELL3, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL3U, BLD_ID_HORDE1, -1,
-100
};
int Obsolutions1[] = {
BLD_ID_HORDE1, BLD_ID_DWELL2, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL2U, BLD_ID_HORDE1, -1,
BLD_ID_HORDE2, BLD_ID_DWELL5, -1,
BLD_ID_HORDE2U, BLD_ID_DWELL5U, BLD_ID_HORDE2, -1,
BLD_ID_SPEC21, BLD_ID_SPEC17, -1,
-100
};
int Obsolutions2[] = {
BLD_ID_HORDE1, BLD_ID_DWELL2, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL2U, BLD_ID_HORDE1, -1,
-100
};
int Obsolutions3[] = {
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1, -1,
BLD_ID_HORDE2, BLD_ID_DWELL3, -1,
BLD_ID_HORDE2U, BLD_ID_DWELL3U, BLD_ID_HORDE2, -1,
-100
};
int Obsolutions4[] = {
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1, -1,
-100
};
int Obsolutions5[] = {
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1, -1,
-100
};
int Obsolutions6[] = {
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1, -1,
-100
};
int Obsolutions7[] = {
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1, -1,
-100
};
int Obsolutions8[] = {
BLD_ID_HORDE1, BLD_ID_DWELL1, -1,
BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1, -1,
-100
};
//for patch in DllMain (later data are gone and we'll have to patch bitfields)
*(int*)0x004EB816 = (int)Dependencies0;
*(int*)0x004EB8B3 = (int)Dependencies1;
*(int*)0x004EB971 = (int)Dependencies2;
*(int*)0x004EBA39 = (int)Dependencies3;
*(int*)0x004EBA48 = (int)Dependencies4;
*(int*)0x004EBA5C = (int)Dependencies5;
*(int*)0x004EBA70 = (int)Dependencies6;
*(int*)0x004EBA84 = (int)Dependencies7;
*(int*)0x004EBA98 = (int)Dependencies8;
*(int*)0x004EBAC9 = (int)ObsolutionsAll;
*(int*)0x004EBB04 = (int)ObsolutionsAll;
*(int*)0x004EBB3F = (int)ObsolutionsAll;
*(int*)0x004EBB7A = (int)ObsolutionsAll;
*(int*)0x004EBC74 = (int)ObsolutionsAll;
*(int*)0x004EBAD8 = (int)Obsolutions0;
*(int*)0x004EBB13 = (int)Obsolutions1;
*(int*)0x004EBB89 = (int)Obsolutions2;
*(int*)0x004EBB4E = (int)Obsolutions3;
*(int*)0x004EBB98 = (int)Obsolutions4;
*(int*)0x004EBBA7 = (int)Obsolutions5;
*(int*)0x004EBBB6 = (int)Obsolutions6;
*(int*)0x004EBBC5 = (int)Obsolutions7;
*(int*)0x004EBBD4 = (int)Obsolutions8;
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 27, 2017 03:56 PM |
|
|
Thanks, OxFEA. I still find it a bit confusing so I decided to implement my suggestion into an easy-to-use header and hook.
Line 9 is an example for Naga Dwelling.
First argument is town id.
Second argument is building id.
Third argument is a list of all buildings you want as requirement to build the current building. Separated by | means logical OR;
in English it means require all of these buildings.
You'll need this:
[url=https://github.com/RoseKavalier/h3_plugins/blob/master/includes/town_dependencies.h[/url]
Include it directly in "homm3.h" with the other includes there.
It's easy enough for my taste and works in SoD and HotA. Did not check WoG.
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Ben80
Famous Hero
|
posted October 27, 2017 06:50 PM |
|
|
@RoseKavalier,
Can you commit bug fix for Air Shield during Siege Combat ?
____________
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 27, 2017 07:11 PM |
|
|
Ben80 said: @RoseKavalier,
Can you commit bug fix for Air Shield during Siege Combat ?
The Armorer bug fix also works for Air Shield. (same bug, same fix)
e.g. No armorer but expert Air Shield: (50%)
BTW, anyone is free to contribute to that repository.
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Baronus
Legendary Hero
|
posted October 27, 2017 07:49 PM |
|
|
GREAT! YOU KNOW HOW REMOVE DEPENDIENCES! Big discovery!
So how to remove biggest fail dependence capitol from castle in SoD/HotA?
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 27, 2017 08:50 PM |
|
|
Baronus said: GREAT! YOU KNOW HOW REMOVE DEPENDIENCES! Big discovery!
So how to remove biggest fail dependence capitol from castle in SoD/HotA?
Not really a discovery if it was known before
According to Game Manual, it requires City Hall + Castle.
int HOTA_EXE = (*(int*)0x41C6B5 != 0x21620);
for (int town_id = 0; town_id < 8 + HOTA_EXE; town_id++)
o_TownDependencies->ChangeDepedency(town_id, BLD_ID_CAPITOL, BLD_REQ_CITY_HALL);
There might be an offset that has the number of towns instead of comparing the hero structures offset but I couldn't be bothered to look.
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Ben80
Famous Hero
|
posted October 28, 2017 09:22 AM |
|
Edited by Ben80 at 13:38, 28 Oct 2017.
|
Spell Mirth at any school level acts on all friendly units. Moral is always increased by 1 and (if final moral is positive) additionally probability of extra attacks is increased - depending on Water school level by 50/50/75/100% from bonus value, related to moral.
For example, if we initially have Moral equal 3, after Expert Mirth we well have probability of extra attacks equal 25%, not 12.5%. Besides, secondary skill Leadership (besides usual increase of Moral) now also increase probability of extra attacks - by 10/20/30% from bonus value, related to moral. For example, if we have Moral equal 3 and we have Expert Leadership, probability of extra attacks will be equal 16.25%, not 12.5%.
Procedure of "weighting" of spell by AI is completely rewritten. AI is using such procedures for spells in battle to select spell which will be applied.
Tested on SoD/Complete.
NewMirthLeadershipStrongAI
____________
|
|
Ben80
Famous Hero
|
posted October 28, 2017 09:23 AM |
|
|
Erdamon said: Hey fellas. Any new scripts in the works ?
We need help of people who used such scripts - bug reports, feedback.
____________
|
|
Baronus
Legendary Hero
|
posted October 28, 2017 10:54 AM |
|
|
Thanks. So if I give ff and ff instead 0 to 8 for all cities dependency will be removed.
|
|
Ben80
Famous Hero
|
posted October 28, 2017 02:46 PM |
|
|
|
Serp
Known Hero
|
posted October 28, 2017 03:58 PM |
|
|
Great work with the depedencies, also thank you for the town_dependencies.h !
@RoseKavallier:
1) Please add town_dependencies also to your HoMM3includes upload
Or is it not meant to be updated with new stuff?
That way it is also easier to see what is new in your homm3.h file.
2) Btw... all those .h and .cpp files work for HoTA and for Complete Heroes?
3) Was the spelling "ChangeDepedency" intended? Or do you plan to change it to "ChangeDependency" ?
4) You wrote you will do something with homm3.h , so the following is not necessary anymore:
"Configuration Properties -> C/C++ -> Code Generation, and set Struct Member Alignment to "1 Byte (/Zp1)""
Did you already do that with your homm3.h in towndependencies?
5) I tried to make a plugin for Conflux SpriteNoDependencies with your includes, but I get this error:
town_dependencies.h(4) : fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory
Where do I get the stdint.h file?
6) And I'm not sure what to put into your ChangeDepedency function if I don't want any dependency, will it work to just leave it blank?
int __stdcall new_town_dependencies(LoHook *h, HookContext *c)
{
// IDs see town_dependencies.h file
o_TownDependencies->ChangeDepedency(TOWN_ID_CONFLUX, BLD_ID_DWELL1U); // town, building, dependencies seperated by |
return EXEC_DEFAULT;
}
Or should I put "false" or "true" as third argument?
|
|
Serp
Known Hero
|
posted October 28, 2017 04:29 PM |
|
|
I solved 5) by downloading an open source stdint.h and putting it into my includes folder. And changing <stdint.h> to "stdint.h" within the town_depencies.h file.
But I hope there is a better solution, to add this stdint.h file to my Visual Studio 2008 Express Version.
I circumvent 6) by using mage guild 1 as only depedency. But still would be interested to know how to change it to "no depedency".
Here is the plugin:
http://handbookhmm.ru/forum/viewtopic.php?p=17059#p17059
|
|
phoenix4ever
Legendary Hero
Heroes is love, Heroes is life
|
posted October 28, 2017 05:38 PM |
|
|
Thanks for those two Conflux plug-ins RoseKavalier and Serp. Very nice.
(If you download the Firebird plug-in, don't forget to change Firebird AI Value, in crtraits.txt, from 4336 -> 4547 like in original game.)
RoseKavalier said: Archdevil -luck back to original value
_PI->WriteHexPatch(0x44AFFF, "83 3E 37 74 1B");
(restores original code, but in reverse order)
This doesn'nt seem to be working for me though...
|
|
RoseKavalier
Admirable
Supreme Hero
|
posted October 28, 2017 05:41 PM |
|
|
Serp said: Great work with the depedencies, also thank you for the town_dependencies.h !
@RoseKavallier:
1) Please add town_dependencies also to your HoMM3includes upload
Or is it not meant to be updated with new stuff?
That way it is also easier to see what is new in your homm3.h file.
2) Btw... all those .h and .cpp files work for HoTA and for Complete Heroes?
3) Was the spelling "ChangeDepedency" intended? Or do you plan to change it to "ChangeDependency" ?
4) You wrote you will do something with homm3.h , so the following is not necessary anymore:
"Configuration Properties -> C/C++ -> Code Generation, and set Struct Member Alignment to "1 Byte (/Zp1)""
Did you already do that with your homm3.h in towndependencies?
5) I tried to make a plugin for Conflux SpriteNoDependencies with your includes, but I get this error:
town_dependencies.h(4) : fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory
Where do I get the stdint.h file?
6) And I'm not sure what to put into your ChangeDepedency function if I don't want any dependency, will it work to just leave it blank?
int __stdcall new_town_dependencies(LoHook *h, HookContext *c)
{
// IDs see town_dependencies.h file
o_TownDependencies->ChangeDepedency(TOWN_ID_CONFLUX, BLD_ID_DWELL1U); // town, building, dependencies seperated by |
return EXEC_DEFAULT;
}
Or should I put "false" or "true" as third argument?
1) everything will be here from now on
2) yes as far as I can tell from my limited interaction with HotA so far
3) Yea it's a typo, I've updated it.
4) structures and classes are contained within
#pragma pack(push, 1)
{...}
#pragma pack(pop)
5) it should already be there but I guess not for versions of VS pre-2010. I will redefine the variable types instead.
6) Needs 3 arguments, just put '0' for requirement, or the newly added 'NO_REQ'
~~~~
RoseKavalier said: Archdevil -luck back to original value
_PI->WriteHexPatch(0x44AFFF, "83 3E 37 74 1B");
(restores original code, but in reverse order)
This doesn'nt seem to be working for me though...
I have not tested it. In theory it should work unless the HotA patch there is somehow applied later. Let me check.
EDIT:
indeed, the HotA patch is applied during the modifications just before 0x4EEA79.
Just place the HexPatch within a LoHook at 0x44AFFF, that works 100%.
BTW, this is only HotA. For SoD compatibility do the following instead:
_PI->WriteHexPatch(0x44AFFF, "83 3E 36 74 1B");
_PI->WriteByte(0x44B011, 0x37);
____________
My Let's Plays: Metataxer's Revenge - The Empire of The World 2
|
|
Ben80
Famous Hero
|
posted October 28, 2017 06:45 PM |
|
|
@RoseKavalier,
Thank you very much for town_dependencies.h !
This is cool !
____________
|
|
Ben80
Famous Hero
|
posted October 28, 2017 07:07 PM |
|
|
Serp said:
But I hope there is a better solution, to add this stdint.h file to my Visual Studio 2008 Express Version.
Amusingly, I also use Visual C++ 2008 Express Version (not whole Visual Studio).
____________
|
|
Erdamon
Adventuring Hero
|
posted October 28, 2017 08:29 PM |
|
|
Ben80 said:
Erdamon said: Hey fellas. Any new scripts in the works ?
We need help of people who used such scripts - bug reports, feedback.
You found your man. I've been hitting the Russian website and download the plugin ever since you first mentioned it. Just let me know what aspects are you interested in and where should I submit my feedback.
|
|
|
|