Jump to content

UI Mod - Bigger Perk Tree


Amineri

Recommended Posts

 

S_UiSoldierPromotion_UpdateAbilityData.upk_mod shows up in red when testing it's status

 

This may be because you didn't decompress UPKFILE=UICollection_Strategy_SF.upk

 

This file contains the Flash (actionscript + sprite) changes necessary to allow additional perk icons. The vanilla perk tree sprite was actually hard-coded to the 1-2-2-2-2-1-2 format, so the sprite had to be extended to allow up to 3 perk icons per level.

 

 

Is there a way to determine what the error was?

 

UPKmodder isn't very good about dynamically refreshing the contents of the project pane when changes are made to the contents via Windows Explorer. It's one of the bigger workarounds I still have to deal with -- if rearranging or renaming files in Windows Explorer, it's necessary to close and re-open UPKmodder to get it to refresh properly. For a smaller mod like this it's not too cumbersome, but Long War with it's 1000+ files is a bit more awkward.

Link to comment
Share on other sites

  • Replies 193
  • Created
  • Last Reply

Top Posters In This Topic

 

S_UiSoldierPromotion_UpdateAbilityData.upk_mod shows up in red when testing it's status

This may be because you didn't decompress UPKFILE=UICollection_Strategy_SF.upk

 

This file contains the Flash (actionscript + sprite) changes necessary to allow additional perk icons. The vanilla perk tree sprite was actually hard-coded to the 1-2-2-2-2-1-2 format, so the sprite had to be extended to allow up to 3 perk icons per level.

 

Actually, that file is listed as being UPKFILE=XComStrategyGame.upk. Either way, all of them should be decompressed.

 

Edit: Alright, so.

 

I went through the __S_UiSoldierPromotion_UpdateAbilityData.upk_mod row by row, and I found the following hexes weren't matching up with the XComStrategyGame.upk (marked down by row in Notepad+):

 

Row 88.
Does not exist:
07 19 02 99 00 FB 1A 00 00 00 F7 1A 00 00 16

Does exist:
06 19 02 99 00 FB 1A 00 00 00 F7 1A 00 00 16

Row 122.
Does not exist:
07 CD 04 99 00 FB 1A 00 00 00 F7 1A 00 00 16

Does exist:
06 CD 04 99 00 FB 1A 00 00 00 F7 1A 00 00 16

So by replacing those and removing the "__" in front of the name of two of the files (because for some reason, they just wouldn't install otherwise.. maybe this was intentional?), everything seems to now have installed just fine. I haven't tried launching XCom yet, though, so.. here's hoping it'll work. I have to first update the .ini-files, though, to conform to the new format.

 

Edit 2: AHA! It seems to be working! Unfortunately, it broke "Rig the Roulette Wheel" (http://www.nexusmods.com/xcom/mods/449/?), but I'm going to see if I can get them both working at the same time, by uninstalling both, re-installing the Bigger Perk Tree, and then examine Rig the Roulette Wheel to see if I can hit it with a wrench until it gives in and gives me both.

 

Thanks for all the help. :smile:

 

Edit 3: Oh christ almighty who arth in heaven, I'm retarded, god dammit, I'm so sorry for wasting your time. I think it was the Rig the Roulette Wheel mod that was interfering the whole time. It specifically changes 07 19 02 to 06 19 02 and 07 CD 04 to 06 CD 04. I have no idea what I was thinking, I've been brainwashed by press-button-to-install mods for way too long, I'd forgotten the first tenet of troubleshooting - reduction of parameters. That is, remove all the fedging mods that might interfere. God. Dammit.

Edited by SwedenRebel
Link to comment
Share on other sites

Well, I'm glad you were able to get it figured out :)

 

And yes, it appears that the "Rig the Roulette Wheel" mod had modded some hexcode that the Expanded Perk Tree also wanted to mod, thus making them incompatible.

 

When starting a line like that 07 is the token for 'jumpifnot', basically creating an if-statement. 06 is the token for 'unconditionaljump'. So the "Rig the Roulette Wheel" was changing those two if statements into unconditional jumps, thus preventing them from ever executing.

 

The first change breaks the conditional displaying "unknown" icon instead of the actual perk icon for perks above the current rank.

The second change breaks the conditional to hid the background info for perks above the current rank.

 

For the Expanded Perk Tree I work it differently -- instead of displaying "unknown" the perks are entirely hidden. This turned out to be necessary for Long War, because the later perks aren't even known until after the 1st rank perks are picked -- a consequence of the subclass system (e.g. Support class can't determine perks for ranks 2-7 until after the first rank perk is picked setting subclass to either Medic or Engineer).

 

Anyhow, that's not really needed for the core Expanded perk tree, so feel free to further mod in a version to display future perks.

Link to comment
Share on other sites

Also, sorry about leaving the double underscore prefix on a couple of those files. The double underscore prefix is a code to UPKmodder that a file is deprecated and should be applied/reverted as part of a bulk apply/revert process -- it's still possible to apply/revery by opening the file and using the apply/revert buttons directly, however.

 

Those two files were updated for Long War -- in both cases the substantial changes to the psionics system required rewriting those functions. However, instead of totally rewriting them I kept the simpler versions but deprecated them and created new versions that merged the expanded perk tree + Long War psionics. My goal in doing this was precisely to keep a version of the Expanded Perk Tree mod that was independent of the Long War psionic changes.

 

However, I forgot to removed the deprecation marks before uploading -- my apologies.

Link to comment
Share on other sites

First of all, thanks for all the help. :smile:

[...]

Anyhow, that's not really needed for the core Expanded perk tree, so feel free to further mod in a version to display future perks.


Secondly, I'm trying, at the moment. However, I can't figure out how the structure in these files work, in the .upk_mod-files. Clearly and obviously the [bEFORE_HEX] is the section to be changed, while [AFTER_HEX] is the section detailing what to change the previous section into, but how do I know which part of the BEFORE_HEX correspond to the AFTER_HEX? Can I at all?

Because I need to find what is originally 07 19 02 and 07 CD 04, to be able to determine what to change them into for a "Rig the Roulette Wheel" setup. Rig the Roulette Wheel wants to change these sections into 06 19 02 and 06 CD 04 respectively, but obviously I cannot find these first parts (since they are changed by the Bigger Perk Tree), nor should I change them into exactly what the Rig the Roulette Wheel mod wants to change it to (since these parts now look differently).

I tried matching the BEFORE_HEX and AFTER_HEX sections up side-by-side, but it doesn't always correspond straight over, and I'm having a hard time working out how the 07 19 02 99 00 FB 1A 00 00 00 F7 1A 00 00 16 (which contains the 07 19 02) string and the 07 CD 04 99 00 FB 1A 00 00 00 F7 1A 00 00 16 (which contains the 07 CD 04) string looks post-Bigger Perk Tree.

Edit: Actually, thinking about it, I shouldn't need to do that, because if I understand what you're saying, I should just (..."just") have to remove the parts of your Bigger Perk Tree mod that ends up hiding the perks completely (rather than displaying "Unknown"). Unfortunately, I have absolutely no clue how to do that, but that seems like the more likely solution.

Edit 2: I cannot for the life of me find the function that hides the perks, although I can see that you added a function that makes it so that if there is a duplicate Perk (a very real possibility with 3 perks/rank), you cannot take it, provided I'm reading this right. Neat. That said, I feel like the more I stare at this the more I understand.

...I've been looking for something you added that made the Perks not display, but I'm looking in the wrong place, aren't I? If you simply took the function out, nothing would display. What I need to try to do is to look at the code before the mod was applied, and actually re-add the function that makes the perks display, and then make it ignore the function that made it display the "Unknown" icons. This should be... interesting.

I'm surprised I still haven't irrevocably broken something.

Edited by SwedenRebel
Link to comment
Share on other sites

The BEFORE and AFTER sections of code work basically like a Search and Replace using a hex editor. If there's no resizing, it works exactly like that. With resizing it works similarly, except that UPKmodder does a whole bunch of extra stuff in the background to fix up UPK positions and such so that the UPK still functions properly -- this is on the order of 10,000 to 50,000 individual changes !

 

I think the section of modded hex you'd want to change is :

	// if(column >= SoldierRank)
	07 D3 00 99 00 FB 1A 00 00 00 F7 1A 00 00 16

This is the part that sets up to hide the future perks -- the mod actually hides the perks and background instead of displaying a "locked" icon. Changing the leading 07 to 06 changes it from a conditional to unconditional jump, basically making it act as though the conditional were always false.

Link to comment
Share on other sites

The BEFORE and AFTER sections of code work basically like a Search and Replace using a hex editor. If there's no resizing, it works exactly like that. With resizing it works similarly, except that UPKmodder does a whole bunch of extra stuff in the background to fix up UPK positions and such so that the UPK still functions properly -- this is on the order of 10,000 to 50,000 individual changes !

 

I think the section of modded hex you'd want to change is :

	// if(column >= SoldierRank)
	07 D3 00 99 00 FB 1A 00 00 00 F7 1A 00 00 16
This is the part that sets up to hide the future perks -- the mod actually hides the perks and background instead of displaying a "locked" icon. Changing the leading 07 to 06 changes it from a conditional to unconditional jump, basically making it act as though the conditional were always false.

 

Hmmm.. changing that particular bit of code for 07 ... to 06 ... doesn't seem to have changed anything by itself. Now, this is how the Rig the Roulette Wheel does it's thing, completely separate from Bigger Perk Tree:

 

UPK_FILE=XComStrategyGame.upk
OBJECT=UISoldierPromotion.UpdateAbilityData
[BEFORE_HEX]
07 19 02
[AFTER_HEX]
06 19 02
[BEFORE_HEX]
07 CD 04
[AFTER_HEX]
06 CD 04

OBJECT=XGSoldierUI.GetHighlightedPerk
[BEFORE_HEX]
07 D6 00
[AFTER_HEX]
07 C9 00

OBJECT=XGSoldierUI.GetHighlightedPerkDescription
[BEFORE_HEX]
07 7D 01
[AFTER_HEX]
07 50 01

OBJECT=XGSoldierUI.GetHighlightedPromoPerkName
[BEFORE_HEX]
07 0B 01
[AFTER_HEX]
07 C9 00
Now, the lower three aren't changed by Bigger Perk Tree at all - or if it is, then Rig the Roulette Wheel doesn't seem to care when installing via the XCOM Patcher GUI. But the upper two are each part of the Bigger Perk Tree mod, in these two instances:

 

        // if(column >= SoldierRank)
        07 19 02 99 00 FB 1A 00 00 00 F7 1A 00 00 16

            // AS_SetAbilityIcon(column, Row, "unknown", m_kSoldier.HasPerk(Perk))
            1B 5C 02 00 00 00 00 00 00 00 FB 1A 00 00 00 FA 1A 00 00 1F 75 6E 6B 6E 6F 77 6E 00 19 01 BE 1A 00 00 13 00 39 54 00 00 00 1B 42 14 00 00 00 00 00 00 00 F9 1A 00 00 16 16
and

        // if(column >= SoldierRank)
        07 CD 04 99 00 FB 1A 00 00 00 F7 1A 00 00 16

            // AS_SetColumnData(column, Caps(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetRankString(column + 1)), 3)
            1B 75 02 00 00 00 00 00 00 00 FB 1A 00 00 EB 19 19 2E 55 FE FF FF 19 12 20 C6 FE FF FF 0A 00 8F FA FF FF 00 1C 3E FD FF FF 16 09 00 77 FA FF FF 00 01 77 FA FF FF 09 00 46 FA FF FF 00 01 46 FA FF FF 18 00 FD F8 FF FF 00 1B 18 13 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 4A 4A 16 16 2C 03 16

Now, it would seem to me, when I look over this, that the first corresponds to the section of the modded hex that you posted;

    // if(column >= SoldierRank)
    07 D3 00 99 00 FB 1A 00 00 00 F7 1A 00 00 16
But changing the 07 (if) to a 06 (else) doesn't seem to do anything.

 

I'll keep poking at it in the morning.

Edited by SwedenRebel
Link to comment
Share on other sites

  • 1 month later...

Am posting up my latest revision of the Expanded Perk Tree mod, including various testing that's gone on in our internal Long War testing. I've also consolidated all of the actionscript/sprite changes into a single upk_mod file that's a bit easier to install.

 

Actionscript/Sprite change:

 

 

MODFILEVERSION=4
UPKFILE=UICollection_Strategy_SF.upk
GUID=7B 52 25 96 F3 8E 7C 48 8F 11 3B 40 43 3F BD 3F
FUNCTION=SoldierPromotion@gfxSoldierPromotion

// set of flash sprite / actionscript changes to enable 3x7 grid of perks

//Change MAX_ROWS_PER_COLUMN = 2 to MAX_ROWS_PER_COLUMN = 3
[BEFORE_HEX]
96 02 00 04 03 3E 4F 96 09 00 04 02 08 35 07 02 00 00 00 4F 96 09 00 04 02 08 5C 07 E0 FF FF FF 
[/BEFORE_HEX]

[AFTER_HEX]
96 02 00 04 03 3E 4F 96 09 00 04 02 08 35 07 03 00 00 00 4F 96 09 00 04 02 08 5C 07 E0 FF FF FF 
[/AFTER_HEX]


//Change InitializeTree to allow setting of upper-left window icon
[BEFORE_HEX]
96 04 00 04 01 08 1E 4E 12 12 9D 02 00 22 00 96 0B 00 04 06 07 01 00 00 00 04 01 08 08 4E 96 02 00 08 09 4E 96 02 00 08 3D 4E 96 02 00 08 20 52 17 4F 
[/BEFORE_HEX]

[AFTER_HEX]
96 0B 00 04 06 07 01 00 00 00 04 01 08 08 4E 96 02 00 08 09 4E 96 02 00 08 3D 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 1E 4E 12 12 9D 02 00 22 00 4F 
[/AFTER_HEX]


//Replace psiTree sprite with normalTree sprite
[BEFORE_HEX]
96 04 00 04 01 08 1E 4E 96 02 00 05 01 49 12 9D 02 00 45 00 96 0B 00 08 1F 07 01 00 00 00 04 01 08 08 4E 96 02 00 08 20 52 17 96 0B 00 08 21 07 01 00 00 00 04 01 08 0F 
[/BEFORE_HEX]

[AFTER_HEX]
96 04 00 04 01 08 1E 4E 96 02 00 05 01 49 12 9D 02 00 45 00 96 0B 00 08 26 07 01 00 00 00 04 01 08 08 4E 96 02 00 08 20 52 17 96 0B 00 08 27 07 01 00 00 00 04 01 08 0F 
[/AFTER_HEX]


//Change SetColumnData to allow turning off columns
[BEFORE_HEX]
96 04 00 04 02 08 48 8E 23 00 00 03 00 07 29 00 04 63 6F 6C 75 6D 6E 49 6E 64 65 78 00 06 6C 61 62 65 6C 00 05 73 74 61 74 65 00 C8 03 96 02 00 04 05 87 01 00 00 96 04 00 04 01 08 49 4E 66 9D 02 00 35 00 96 06 00 04 00 04 01 08 4A 4E 66 9D 02 00 8E 00 96 06 00 04 00 04 01 08 4B 4E 66 9D 02 00 E7 00 96 06 00 04 00 04 01 08 4C 4E 66 9D 02 00 0E 01 99 02 00 72 01 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 01 4F 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 07 00 08 44 07 64 00 00 00 4F 96 0B 00 08 4D 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 07 00 08 44 07 64 00 00 00 4F 99 02 00 09 01 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 01 4F 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 0B 00 08 4D 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 06 00 08 44 04 01 08 4E 4E 4F 99 02 00 A0 00 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 00 4F 96 0B 00 08 26 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 99 02 00 69 00 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 00 4F 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 06 00 08 44 04 01 08 47 4E 4F 96 0B 00 08 4F 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 06 00 08 44 04 01 08 47 4E 4F 99 02 00 00 00 96 09 00 06 00 00 00 00 00 00 00 00 87 01 00 03 17 96 06 00 04 03 04 01 08 34 4E 96 02 00 04 04 4E 96 02 00 08 50 4E 48 12 9D 02 00 88 01 96 04 00 04 01 08 34 4E 96 02 00 04 04 4E 96 02 00 04 03 4E 87 01 00 02 17 96 02 00 04 05 87 01 00 00 96 04 00 04 01 08 49 4E 66 9D 02 00 35 00 96 06 00 04 00 04 01 08 4B 4E 66 9D 02 00 5F 00 96 06 00 04 00 04 01 08 4A 4E 66 9D 02 00 9E 00 96 06 00 04 00 04 01 08 4C 4E 66 9D 02 00 C8 00 99 02 00 13 01 96 04 00 04 02 08 36 4E 96 07 00 08 44 07 64 00 00 00 4F 96 04 00 04 01 08 24 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 D9 00 96 04 00 04 02 08 43 4E 96 02 00 05 01 49 12 12 9D 02 00 13 00 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 04 00 04 01 08 22 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 8A 00 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 04 00 04 01 08 24 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 50 00 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 47 4E 4F 96 0B 00 08 4F 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 51 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 00 00 96 02 00 04 03 50 87 01 00 03 17 99 02 00 5B FE 96 04 00 04 01 08 1E 4E 12 12 9D 02 00 45 00 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 52 4E 96 04 00 08 53 04 06 4F 96 04 00 08 30 04 04 47 4B 96 09 00 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 31 4E 96 02 00 08 20 52 17 4F  
[/BEFORE_HEX]

[AFTER_HEX]
96 04 00 04 02 08 48 8E 23 00 00 03 00 07 29 00 04 63 6F 6C 75 6D 6E 49 6E 64 65 78 00 06 6C 61 62 65 6C 00 05 73 74 61 74 65 00 C8 03 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 00 4F 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 01 4F 96 02 00 04 05 87 01 00 00 96 04 00 04 01 08 49 4E 66 9D 02 00 35 00 96 06 00 04 00 04 01 08 4A 4E 66 9D 02 00 8E 00 96 06 00 04 00 04 01 08 4B 4E 66 9D 02 00 E7 00 96 06 00 04 00 04 01 08 4C 4E 66 9D 02 00 F8 00 99 02 00 0E 01 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 01 4F 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 07 00 08 44 07 64 00 00 00 4F 96 0B 00 08 4D 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 07 00 08 44 07 64 00 00 00 4F 99 02 00 A5 00 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 01 4F 96 04 00 04 01 08 32 4E 96 02 00 04 04 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 0B 00 08 4D 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 06 00 08 44 04 01 08 4E 4E 4F 99 02 00 3C 00 96 0B 00 08 26 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 20 52 17 99 02 00 1B 00 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 04 00 08 0A 05 00 4F 99 02 00 00 00 96 09 00 06 00 00 00 00 00 00 00 00 87 01 00 03 17 96 06 00 04 03 04 01 08 34 4E 96 02 00 04 04 4E 96 02 00 08 50 4E 48 12 9D 02 00 9A 01 96 04 00 04 01 08 34 4E 96 02 00 04 04 4E 96 02 00 04 03 4E 87 01 00 02 17 96 04 00 04 02 08 36 4E 96 07 00 08 44 07 64 00 00 00 4F 96 02 00 04 05 87 01 00 00 96 04 00 04 01 08 49 4E 66 9D 02 00 35 00 96 06 00 04 00 04 01 08 4B 4E 66 9D 02 00 73 00 96 06 00 04 00 04 01 08 4A 4E 66 9D 02 00 B2 00 96 06 00 04 00 04 01 08 4C 4E 66 9D 02 00 F0 00 99 02 00 12 01 96 04 00 04 02 08 43 4E 96 02 00 05 01 49 12 9D 02 00 13 00 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 04 00 04 01 08 24 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 C4 00 96 04 00 04 02 08 43 4E 96 02 00 05 01 49 12 12 9D 02 00 13 00 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 04 00 04 01 08 22 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 75 00 96 04 00 04 02 08 43 4E 96 02 00 05 01 49 12 9D 02 00 13 00 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 4E 4E 4F 96 04 00 04 01 08 24 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 27 00 96 04 00 04 01 08 22 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 99 02 00 00 00 96 02 00 04 03 50 87 01 00 03 17 99 02 00 49 FE 96 04 00 04 01 08 1E 4E 12 9D 02 00 21 00 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 31 4E 96 04 00 08 0A 05 00 4F 99 02 00 29 00 96 04 00 08 30 04 04 47 4B 96 09 00 07 01 00 00 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 31 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 2C 4E 96 02 00 04 04 4E 96 02 00 08 52 4E 96 04 00 08 53 04 06 4F 96 02 00 00 00 17 4F  
[/AFTER_HEX]


// SetAbilityIcon -- actively set icon hilighing (HasPerk) state for every icon -- don't assume it's false
[BEFORE_HEX]
96 04 00 04 02 08 3F 8E 2D 00 00 04 00 07 29 00 03 63 6F 6C 75 6D 6E 00 04 72 6F 77 00 06 69 63 6F 6E 4C 61 62 65 6C 00 05 69 73 48 69 6C 69 67 68 74 65 64 00 85 01 96 04 00 04 01 08 34 4E 96 02 00 04 03 4E 96 02 00 04 04 4E 87 01 00 02 17 96 03 00 04 02 03 49 12 9D 02 00 20 00 96 04 00 08 40 04 03 47 96 02 00 08 41 47 96 02 00 04 04 47 96 02 00 08 42 47 26 96 01 00 03 3E 96 0B 00 04 06 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 20 52 17 96 02 00 04 05 12 9D 02 00 A1 00 96 06 00 04 02 08 43 05 01 4F 96 04 00 04 02 08 36 4E 96 07 00 08 44 07 64 00 00 00 4F 96 04 00 04 01 08 22 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 29 4E 96 02 00 08 45 4E 96 01 00 03 49 4C 9D 02 00 12 00 17 96 06 00 04 03 04 01 08 29 4E 96 02 00 08 45 4E 67 12 9D 02 00 2C 00 96 04 00 04 01 08 29 4E 96 04 00 08 45 04 03 4F 96 04 00 08 46 04 03 47 96 09 00 07 01 00 00 00 04 01 08 29 4E 96 02 00 08 20 52 17 99 02 00 73 00 96 04 00 04 01 08 29 4E 96 02 00 08 45 4E 96 01 00 03 49 4C 9D 02 00 15 00 17 96 04 00 04 01 08 29 4E 96 02 00 08 45 4E 96 02 00 04 03 67 12 9D 02 00 2C 00 96 04 00 04 01 08 29 4E 96 04 00 08 45 04 03 4F 96 04 00 08 46 04 03 47 96 09 00 07 01 00 00 00 04 01 08 29 4E 96 02 00 08 20 52 17 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 47 4E 4F 96 06 00 04 02 08 0A 05 01 4F 4F  
[/BEFORE_HEX]

[AFTER_HEX]
96 04 00 04 02 08 3F 8E 2D 00 00 04 00 07 29 00 03 63 6F 6C 75 6D 6E 00 04 72 6F 77 00 06 69 63 6F 6E 4C 61 62 65 6C 00 05 69 73 48 69 6C 69 67 68 74 65 64 00 85 01 96 04 00 04 01 08 34 4E 96 02 00 04 03 4E 96 02 00 04 04 4E 87 01 00 02 17 96 03 00 04 02 03 49 12 9D 02 00 20 00 96 04 00 08 40 04 03 47 96 02 00 08 41 47 96 02 00 04 04 47 96 02 00 08 42 47 26 96 01 00 03 3E 96 0B 00 04 06 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 20 52 17 96 06 00 04 02 08 43 04 05 4F 96 02 00 04 05 12 9D 02 00 97 00 96 04 00 04 02 08 36 4E 96 07 00 08 44 07 64 00 00 00 4F 96 04 00 04 01 08 22 4E 96 09 00 07 01 00 00 00 04 02 08 36 4E 96 02 00 08 3A 4E 96 02 00 08 20 52 17 96 04 00 04 01 08 29 4E 96 02 00 08 45 4E 96 01 00 03 49 4C 9D 02 00 12 00 17 96 06 00 04 03 04 01 08 29 4E 96 02 00 08 45 4E 67 12 9D 02 00 2C 00 96 04 00 04 01 08 29 4E 96 04 00 08 45 04 03 4F 96 04 00 08 46 04 03 47 96 09 00 07 01 00 00 00 04 01 08 29 4E 96 02 00 08 20 52 17 99 02 00 73 00 96 04 00 04 01 08 29 4E 96 02 00 08 45 4E 96 01 00 03 49 4C 9D 02 00 15 00 17 96 04 00 04 01 08 29 4E 96 02 00 08 45 4E 96 02 00 04 03 67 12 9D 02 00 2C 00 96 04 00 04 01 08 29 4E 96 04 00 08 45 04 03 4F 96 04 00 08 46 04 03 47 96 09 00 07 01 00 00 00 04 01 08 29 4E 96 02 00 08 20 52 17 96 04 00 04 02 08 36 4E 96 06 00 08 44 04 01 08 47 4E 4F 96 06 00 04 02 08 0A 05 01 4F 4F  
[/AFTER_HEX]


// Correct size of tagged block that contains ability icons sprite
[BEFORE_HEX]
FF 09 55 04 00 00 9D 00 
[/BEFORE_HEX]

[AFTER_HEX]
FF 09 42 05 00 00 9D 00 
[/AFTER_HEX]


//Add ability icon locations (21 ability icons, 3 rows per each of 7 columns) 
// get space by shortening constant pool of Environment package
[BEFORE_HEX]
FF 0A 0B 00 00 00 6E 6F 72 6D 61 6C 54 72 65 65 00 BF 06 1E 00 00 00 36 2B 00 8D 00 1D 36 27 2C E0 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 36 00 BF 06 1E 00 00 00 36 2F 00 8D 00 1D 36 26 98 20 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 35 00 BF 06 1E 00 00 00 36 33 00 8D 00 1D 36 26 03 E0 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 34 00 BF 06 1E 00 00 00 36 37 00 8D 00 1D 36 25 6F 80 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 33 00 BF 06 1E 00 00 00 36 3B 00 8D 00 1D 36 24 DA C0 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 32 00 BF 06 1E 00 00 00 36 3F 00 8D 00 1D 36 24 46 00 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 31 00 BF 06 1E 00 00 00 36 43 00 8D 00 1F 9B 12 EC 48 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 30 00 BF 06 14 00 00 00 36 47 00 8E 00 1D 83 BD E1 40 09 00 69 63 6F 6E 31 5F 31 00 BF 06 14 00 00 00 36 49 00 8F 00 1D C8 8D DF E0 09 00 69 63 6F 6E 31 5F 30 00 BF 06 14 00 00 00 36 4B 00 8E 00 1B 07 79 CD 00 09 00 69 63 6F 6E 32 5F 31 00 BF 06 14 00 00 00 36 4D 00 8F 00 1B 91 19 CD 80 09 00 69 63 6F 6E 32 5F 30 00 BF 06 14 00 00 00 36 4F 00 8E 00 1B 07 7C 29 80 09 00 69 63 6F 6E 33 5F 31 00 BF 06 13 00 00 00 36 51 00 8F 00 19 22 30 96 09 00 69 63 6F 6E 33 5F 30 00 BF 06 14 00 00 00 36 53 00 8E 00 1B 07 7E 73 00 09 00 69 63 6F 6E 34 5F 31 00 BF 06 13 00 00 00 36 55 00 8F 00 19 22 39 CE 09 00 69 63 6F 6E 34 5F 30 00 BF 06 14 00 00 00 36 57 00 8E 00 1B 07 73 19 00 09 00 69 63 6F 6E 36 5F 31 00 BF 06 13 00 00 00 36 59 00 8F 00 19 22 2C 68 09 00 69 63 6F 6E 36 5F 30 00 BF 06 14 00 00 00 36 5B 00 90 00 1B 07 AF FE 80 09 00 69 63 6F 6E 35 5F 30 00 BF 06 14 00 00 00 36 5D 00 90 00 1D 83 D5 18 80 09 00 69 63 6F 6E 30 5F 30 00 BF 06 21 00 00 00 36 5F 00 99 00 C9 41 E3 50 6F 0E CA 5A C5 90 09 00 73 65 6C 65 63 74 6F 72 42 72 61 63 6B 65 74 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 02 07 01 00 02 07 07 00 02 07 0D 00 02 07 13 00 02 07 19 00 02 07 1F 00 02 07 25 00 02 07 2B 00 02 07 2F 00 02 07 33 00 02 07 37 00 02 07 4F 00 02 07 51 00 02 07 53 00 02 07 55 00 02 07 57 00 02 07 59 00 02 07 5B 00 FF 0A 08 00 00 00 70 73 69 54 72 65 65 00 BF 06 13 00 00 00 36 01 00 9C 00 19 96 B5 A2 13 00 62 6F 72 64 65 72 32 00 BF 06 14 00 00 00 36 03 00 9C 00 1B CB 5B 16 00 13 00 62 6F 72 64 65 72 31 00 BF 06 14 00 00 00 36 05 00 9C 00 1B CB 58 C3 80 13 00 62 6F 72 64 65 72 30 00 88 06 05 3B 00 1D 36 36 02 00 88 06 05 3F 00 1D 36 1D 6E 00 88 06 05 43 00 1D 36 1C DA 00 88 06 05 47 00 1D 39 DF 08 C0 88 06 05 49 00 1D 74 87 08 C0 88 06 05 4B 00 1D 39 DF 9C 20 88 06 05 4D 00 1D 74 87 9C 20 88 06 05 5D 00 1D 35 DE 40 A0 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 00 00 FF 09 95 00 00 00 9E 00 01 00 BF 06 16 00 00 00 26 01 00 62 00 1D D7 74 3D 00 70 72 6F 6D 6F 74 69 6F 6E 42 47 00 BF 06 19 00 00 00 26 0D 00 63 00 20 88 BF E0 6A 73 6F 6C 64 69 65 72 53 74 61 74 73 4D 43 00 BF 06 18 00 00 00 26 0E 00 64 00 1E D8 E3 15 A0 73 6F 6C 64 69 65 72 49 6E 66 6F 4D 43 00 BF 06 17 00 00 00 26 0F 00 51 00 1E D9 14 01 F8 6D 65 63 41 62 69 6C 69 74 79 4D 43 00 BF 06 11 00 00 00 26 1B 00 9D 00 17 0D AD D0 74 68 65 54 72 65 65 00 40 00 00 00 3F 0E 1B 00 00 00 01 00 9E 00 53 6F 6C 64 69 65 72 50 72 6F 6D 6F 74 69 6F 6E 53 63 72 65 65 6E 00 BF 06 14 00 00 00 26 01 00 9E 00 1E B6 04 F8 18 74 68 65 53 63 72 65 65 6E 00 FF 09 06 00 00 00 9F 00 00 00 00 00 3F 0E 1B 00 00 00 01 00 9F 00 5F 5F 50 61 63 6B 61 67 65 73 2E 49 44 69 73 70 6F 73 61 62 6C 65 00 FF 0E 44 00 00 00 9F 00 88 16 00 02 00 5F 67 6C 6F 62 61 6C 00 49 44 69 73 70 6F 73 61 62 6C 65 00 96 02 00 08 00 1C 96 02 00 08 01 4E 12 12 9D 02 00 14 00 96 02 00 08 00 1C 96 02 00 08 01 9B 05 00 00 00 00 00 00 4F 17 00 FF 09 06 00 00 00 A0 00 00 00 00 00 3F 0E 1B 00 00 00 01 00 A0 00 5F 5F 50 61 63 6B 61 67 65 73 2E 45 6E 76 69 72 6F 6E 6D 65 6E 74 00 FF 0E CA 16 00 00 A0 00 88 A9 06 6E 00 5F 67 6C 6F 62 61 6C 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 00 67 66 78 45 78 74 65 6E 73 69 6F 6E 73 00 64 65 62 75 67 67 69 6E 67 00 67 66 78 50 6C 61 79 65 72 00 67 66 78 56 65 72 73 69 6F 6E 00 72 65 73 6F 6C 75 74 69 6F 6E 00 66 6C 61 73 68 00 67 65 6F 6D 00 52 65 63 74 61 6E 67 6C 65 00 73 61 66 65 41 72 65 61 00 61 72 72 4E 6F 74 69 66 79 55 70 6F 6E 52 65 73 6F 6C 75 74 69 6F 6E 43 68 61 6E 67 65 00 41 72 72 61 79 00 61 72 72 4E 6F 74 69 66 79 55 70 6F 6E 49 6E 70 75 74 43 68 61 6E 67 65 00 49 4E 54 00 53 65 74 4C 61 6E 67 75 61 67 65 00 70 72 6F 74 6F 74 79 70 65 00 49 44 69 73 70 6F 73 61 62 6C 65 00 69 6E 73 74 61 6E 63 65 00 5F 69 6E 73 74 61 6E 63 65 00 64 69 73 70 6F 73 65 64 00 57 41 52 4E 49 4E 47 3A 20 52 65 2D 63 72 65 61 74 69 6E 67 20 61 20 6E 65 77 20 73 69 6E 67 6C 65 74 6F 6E 20 69 6E 73 74 61 6E 63 65 20 6F 66 20 45 6E 76 69 72 6F 6E 6D 65 6E 74 28 29 20 61 66 74 65 72 20 64 69 73 70 6F 73 65 21 00 64 69 73 70 6F 73 65 00 70 6C 61 74 66 6F 72 6D 00 74 6F 53 74 72 69 6E 67 00 7B 45 6E 76 69 72 6F 6E 6D 65 6E 74 00 7C 5F 67 6C 6F 62 61 6C 2E 67 66 78 45 78 74 65 6E 73 69 6F 6E 73 3A 00 7C 5F 67 6C 6F 62 61 6C 2E 64 65 62 75 67 67 69 6E 67 3A 00 7C 6D 6F 75 73 65 41 63 74 69 76 65 3A 00 62 49 73 4D 6F 75 73 65 45 6E 61 62 6C 65 64 00 7C 7D 00 53 65 74 56 69 65 77 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 2E 53 65 74 56 69 65 77 3A 20 00 2C 20 00 57 41 52 4E 49 4E 47 3A 20 55 49 20 45 6E 76 69 72 6F 6E 6D 65 6E 74 2E 53 65 74 56 69 65 77 28 29 20 72 65 63 65 69 76 65 64 20 73 61 66 65 20 61 72 65 61 20 61 62 6F 76 65 20 31 2E 30 3A 20 00 4E 6F 74 69 66 79 52 65 73 6F 6C 75 74 69 6F 6E 43 68 61 6E 67 65 00 69 50 6C 61 74 66 6F 72 6D 00 67 65 74 41 6E 63 68 6F 72 00 41 4E 43 48 4F 52 5F 54 4F 50 5F 4C 45 46 54 00 41 4E 43 48 4F 52 5F 54 4F 50 5F 43 45 4E 54 45 52 00 41 4E 43 48 4F 52 5F 54 4F 50 5F 52 49 47 48 54 00 41 4E 43 48 4F 52 5F 4D 49 44 44 4C 45 5F 4C 45 46 54 00 41 4E 43 48 4F 52 5F 4D 49 44 44 4C 45 5F 43 45 4E 54 45 52 00 41 4E 43 48 4F 52 5F 4D 49 44 44 4C 45 5F 52 49 47 48 54 00 41 4E 43 48 4F 52 5F 42 4F 54 54 4F 4D 5F 4C 45 46 54 00 41 4E 43 48 4F 52 5F 42 4F 54 54 4F 4D 5F 43 45 4E 54 45 52 00 41 4E 43 48 4F 52 5F 42 4F 54 54 4F 4D 5F 52 49 47 48 54 00 6C 65 66 74 00 74 6F 70 00 72 69 67 68 74 00 62 6F 74 74 6F 6D 00 50 6F 69 6E 74 00 49 73 4D 6F 75 73 65 41 63 74 69 76 65 00 73 65 74 4D 6F 75 73 65 41 63 74 69 76 65 00 47 46 58 5F 49 4E 50 55 54 3A 20 53 65 74 4D 6F 75 73 65 41 63 74 69 76 65 3A 20 27 00 27 00 54 6F 67 67 6C 65 4D 6F 75 73 65 48 69 74 44 65 62 75 67 67 69 6E 67 00 54 6F 67 67 6C 69 6E 67 20 4D 6F 75 73 65 20 48 69 74 20 44 65 62 75 67 67 69 6E 67 20 66 6F 72 20 27 00 6F 6E 4D 6F 75 73 65 4D 6F 76 65 00 44 65 62 75 67 4D 6F 75 73 65 54 61 72 67 65 74 69 6E 67 00 4D 6F 75 73 65 00 67 65 74 54 6F 70 4D 6F 73 74 45 6E 74 69 74 79 00 63 75 72 72 65 6E 74 4D 6F 75 73 65 54 61 72 67 65 74 00 4D 6F 75 73 65 20 74 61 72 67 65 74 20 63 68 61 6E 67 65 64 3A 20 00 49 73 50 43 00 50 4C 41 54 46 4F 52 4D 5F 50 43 00 49 73 50 53 33 00 50 4C 41 54 46 4F 52 4D 5F 50 53 33 00 49 73 58 62 6F 78 00 50 4C 41 54 46 4F 52 4D 5F 58 42 4F 58 00 53 75 62 73 63 72 69 62 65 54 6F 52 65 73 6F 6C 75 74 69 6F 6E 55 70 64 61 74 65 00 6C 65 6E 67 74 68 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 2E 53 75 62 73 63 72 69 62 65 54 6F 52 65 73 6F 6C 75 74 69 6F 6E 55 70 64 61 74 65 28 29 3A 20 44 75 70 6C 69 63 61 74 65 20 73 75 62 73 63 72 69 70 74 69 6F 6E 3F 20 59 6F 75 27 72 65 20 61 6C 72 65 61 64 79 20 73 75 62 73 63 72 69 62 65 64 20 76 69 61 20 74 68 69 73 20 66 75 6E 63 74 69 6F 6E 3A 20 00 70 75 73 68 00 55 6E 73 75 62 73 63 72 69 62 65 54 6F 52 65 73 6F 6C 75 74 69 6F 6E 55 70 64 61 74 65 00 73 70 6C 69 63 65 00 46 52 41 00 53 50 41 00 49 54 41 00 44 45 55 00 4B 4F 52 00 52 55 53 00 4A 50 4E 00 50 4F 4C 00 6C 61 6E 67 75 61 67 65 00 4C 41 4E 47 55 41 47 45 5F 46 52 41 00 4C 41 4E 47 55 41 47 45 5F 53 50 41 00 4C 41 4E 47 55 41 47 45 5F 49 54 41 00 4C 41 4E 47 55 41 47 45 5F 44 45 55 00 4C 41 4E 47 55 41 47 45 5F 4B 4F 52 00 4C 41 4E 47 55 41 47 45 5F 52 55 53 00 4C 41 4E 47 55 41 47 45 5F 4A 50 4E 00 4C 41 4E 47 55 41 47 45 5F 50 4F 4C 00 4C 41 4E 47 55 41 47 45 5F 49 4E 54 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 2E 53 65 74 4C 61 6E 67 75 61 67 65 3A 20 42 41 44 20 4C 41 4E 47 55 41 47 45 20 53 45 54 21 20 27 00 27 2E 20 44 65 66 61 75 6C 74 69 6E 67 20 74 6F 20 49 4E 54 2E 00 67 65 74 4C 61 6E 67 75 61 67 65 00 69 73 4C 61 6E 67 75 61 67 65 00 73 65 74 4B 6F 72 65 61 6E 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 53 77 61 70 00 62 4B 6F 72 65 61 6E 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 53 77 61 70 00 49 73 4B 6F 72 65 61 6E 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 53 77 61 70 41 63 74 69 76 65 00 47 65 74 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 49 63 6F 6E 00 49 63 6F 6E 5F 42 5F 43 69 72 63 6C 65 00 49 63 6F 6E 5F 41 5F 58 00 47 65 74 42 61 63 6B 42 75 74 74 6F 6E 49 63 6F 6E 00 53 43 52 45 45 4E 5F 57 49 44 54 48 00 53 43 52 45 45 4E 5F 48 45 49 47 48 54 00 41 4E 43 48 4F 52 5F 4E 4F 4E 45 00 4D 4F 55 53 45 5F 44 4F 55 42 4C 45 5F 43 4C 49 43 4B 5F 53 50 45 45 44 00 41 53 53 65 74 50 72 6F 70 46 6C 61 67 73 00   
[/BEFORE_HEX]


[AFTER_HEX]
FF 0A 0B 00 00 00 6E 6F 72 6D 61 6C 54 72 65 65 00 BF 06 1E 00 00 00 36 2B 00 8D 00 1D 36 27 2C E0 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 36 00 BF 06 1E 00 00 00 36 2F 00 8D 00 1D 36 26 98 20 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 35 00 BF 06 1E 00 00 00 36 33 00 8D 00 1D 36 26 03 E0 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 34 00 BF 06 1E 00 00 00 36 37 00 8D 00 1D 36 25 6F 80 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 33 00 BF 06 1E 00 00 00 36 3B 00 8D 00 1D 36 24 DA C0 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 32 00 BF 06 1E 00 00 00 36 3F 00 8D 00 1D 36 24 46 00 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 31 00 BF 06 1E 00 00 00 36 43 00 8D 00 1F 9B 12 EC 48 09 00 70 72 6F 6D 6F 74 69 6F 6E 42 72 61 63 6B 65 74 30 00 BF 06 14 00 00 00 36 45 00 8E 00 1D 83 05 4A E0 09 00 69 63 6F 6E 30 5F 32 00 BF 06 14 00 00 00 36 47 00 8E 00 1D A5 85 4A E0 09 00 69 63 6F 6E 30 5F 31 00 BF 06 14 00 00 00 36 49 00 8E 00 1D C8 05 4A E0 09 00 69 63 6F 6E 30 5F 30 00 BF 06 14 00 00 00 36 4B 00 8E 00 1D 83 05 DF 60 09 00 69 63 6F 6E 31 5F 32 00 BF 06 14 00 00 00 36 4D 00 8E 00 1D A5 85 DF 60 09 00 69 63 6F 6E 31 5F 31 00 BF 06 14 00 00 00 36 4F 00 8E 00 1D C8 05 DF 60 09 00 69 63 6F 6E 31 5F 30 00 BF 06 14 00 00 00 36 51 00 8E 00 1D 83 06 73 E0 09 00 69 63 6F 6E 32 5F 32 00 BF 06 14 00 00 00 36 53 00 8E 00 1D A5 86 73 E0 09 00 69 63 6F 6E 32 5F 31 00 BF 06 14 00 00 00 36 55 00 8E 00 1D C8 06 73 E0 09 00 69 63 6F 6E 32 5F 30 00 BF 06 14 00 00 00 36 57 00 8E 00 1D 83 07 08 60 09 00 69 63 6F 6E 33 5F 32 00 BF 06 14 00 00 00 36 59 00 8E 00 1D A5 87 08 60 09 00 69 63 6F 6E 33 5F 31 00 BF 06 14 00 00 00 36 5B 00 8E 00 1D C8 07 08 60 09 00 69 63 6F 6E 33 5F 30 00 BF 06 14 00 00 00 36 5D 00 8E 00 1D 83 07 9C E0 09 00 69 63 6F 6E 34 5F 32 00 BF 06 14 00 00 00 36 5F 00 8E 00 1D A5 87 9C E0 09 00 69 63 6F 6E 34 5F 31 00 BF 06 14 00 00 00 36 61 00 8E 00 1D C8 07 9C E0 09 00 69 63 6F 6E 34 5F 30 00 BF 06 14 00 00 00 36 63 00 8E 00 1D 83 00 31 60 09 00 69 63 6F 6E 35 5F 32 00 BF 06 14 00 00 00 36 65 00 8E 00 1D A5 80 31 60 09 00 69 63 6F 6E 35 5F 31 00 BF 06 14 00 00 00 36 67 00 8E 00 1D C8 00 31 60 09 00 69 63 6F 6E 35 5F 30 00 BF 06 14 00 00 00 36 69 00 8E 00 1D 83 00 C5 E0 09 00 69 63 6F 6E 36 5F 32 00 BF 06 14 00 00 00 36 6B 00 8E 00 1D A5 80 C5 E0 09 00 69 63 6F 6E 36 5F 31 00 BF 06 14 00 00 00 36 6D 00 8E 00 1D C8 00 C5 E0 09 00 69 63 6F 6E 36 5F 30 00 BF 06 21 00 00 00 36 5F 00 99 00 C9 41 E3 50 6F 0E CA 5A C5 90 09 00 73 65 6C 65 63 74 6F 72 42 72 61 63 6B 65 74 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 02 07 01 00 02 07 07 00 02 07 0D 00 02 07 13 00 02 07 19 00 02 07 1F 00 02 07 25 00 02 07 2B 00 02 07 2F 00 02 07 33 00 02 07 37 00 02 07 4F 00 02 07 51 00 02 07 53 00 02 07 55 00 02 07 57 00 02 07 59 00 02 07 5B 00 FF 0A 08 00 00 00 70 73 69 54 72 65 65 00 BF 06 13 00 00 00 36 01 00 9C 00 19 96 B5 A2 13 00 62 6F 72 64 65 72 32 00 BF 06 14 00 00 00 36 03 00 9C 00 1B CB 5B 16 00 13 00 62 6F 72 64 65 72 31 00 BF 06 14 00 00 00 36 05 00 9C 00 1B CB 58 C3 80 13 00 62 6F 72 64 65 72 30 00 88 06 05 3B 00 1D 36 36 02 00 88 06 05 3F 00 1D 36 1D 6E 00 88 06 05 43 00 1D 36 1C DA 00 88 06 05 47 00 1D 39 DF 08 C0 88 06 05 49 00 1D 74 87 08 C0 88 06 05 4B 00 1D 39 DF 9C 20 88 06 05 4D 00 1D 74 87 9C 20 88 06 05 5D 00 1D 35 DE 40 A0 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 40 00 00 00 FF 09 95 00 00 00 9E 00 01 00 BF 06 16 00 00 00 26 01 00 62 00 1D D7 74 3D 00 70 72 6F 6D 6F 74 69 6F 6E 42 47 00 BF 06 19 00 00 00 26 0D 00 63 00 20 88 BF E0 6A 73 6F 6C 64 69 65 72 53 74 61 74 73 4D 43 00 BF 06 18 00 00 00 26 0E 00 64 00 1E D8 E3 15 A0 73 6F 6C 64 69 65 72 49 6E 66 6F 4D 43 00 BF 06 17 00 00 00 26 0F 00 51 00 1E D9 14 01 F8 6D 65 63 41 62 69 6C 69 74 79 4D 43 00 BF 06 11 00 00 00 26 1B 00 9D 00 17 0D AD D0 74 68 65 54 72 65 65 00 40 00 00 00 3F 0E 1B 00 00 00 01 00 9E 00 53 6F 6C 64 69 65 72 50 72 6F 6D 6F 74 69 6F 6E 53 63 72 65 65 6E 00 BF 06 14 00 00 00 26 01 00 9E 00 1E B6 04 F8 18 74 68 65 53 63 72 65 65 6E 00 FF 09 06 00 00 00 9F 00 00 00 00 00 3F 0E 1B 00 00 00 01 00 9F 00 5F 5F 50 61 63 6B 61 67 65 73 2E 49 44 69 73 70 6F 73 61 62 6C 65 00 FF 0E 44 00 00 00 9F 00 88 16 00 02 00 5F 67 6C 6F 62 61 6C 00 49 44 69 73 70 6F 73 61 62 6C 65 00 96 02 00 08 00 1C 96 02 00 08 01 4E 12 12 9D 02 00 14 00 96 02 00 08 00 1C 96 02 00 08 01 9B 05 00 00 00 00 00 00 4F 17 00 FF 09 06 00 00 00 A0 00 00 00 00 00 3F 0E 1B 00 00 00 01 00 A0 00 5F 5F 50 61 63 6B 61 67 65 73 2E 45 6E 76 69 72 6F 6E 6D 65 6E 74 00 FF 0E DD 15 00 00 A0 00 88 BC 05 6E 00 5F 67 6C 6F 62 61 6C 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 00 67 66 78 45 78 74 65 6E 73 69 6F 6E 73 00 64 65 62 75 67 67 69 6E 67 00 67 66 78 50 6C 61 79 65 72 00 67 66 78 56 65 72 73 69 6F 6E 00 72 65 73 6F 6C 75 74 69 6F 6E 00 66 6C 61 73 68 00 67 65 6F 6D 00 52 65 63 74 61 6E 67 6C 65 00 73 61 66 65 41 72 65 61 00 61 72 72 4E 6F 74 69 66 79 55 70 6F 6E 52 65 73 6F 6C 75 74 69 6F 6E 43 68 61 6E 67 65 00 41 72 72 61 79 00 61 72 72 4E 6F 74 69 66 79 55 70 6F 6E 49 6E 70 75 74 43 68 61 6E 67 65 00 49 4E 54 00 53 65 74 4C 61 6E 67 75 61 67 65 00 70 72 6F 74 6F 74 79 70 65 00 49 44 69 73 70 6F 73 61 62 6C 65 00 69 6E 73 74 61 6E 63 65 00 5F 69 6E 73 74 61 6E 63 65 00 64 69 73 70 6F 73 65 64 00 57 41 52 4E 49 4E 47 3A 20 00 64 69 73 70 6F 73 65 00 70 6C 61 74 66 6F 72 6D 00 74 6F 53 74 72 69 6E 67 00 7B 45 6E 76 69 72 6F 6E 6D 65 6E 74 00 7C 5F 67 6C 6F 62 61 6C 2E 67 66 78 45 78 74 65 6E 73 69 6F 6E 73 3A 00 7C 5F 67 6C 6F 62 61 6C 2E 64 65 62 75 67 67 69 6E 67 3A 00 7C 6D 6F 75 73 65 41 63 74 69 76 65 3A 00 62 49 73 4D 6F 75 73 65 45 6E 61 62 6C 65 64 00 7C 7D 00 53 65 74 56 69 65 77 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 2E 53 65 74 56 69 65 77 3A 20 00 2C 20 00 57 41 52 4E 49 4E 47 3A 20 00 4E 6F 74 69 66 79 52 65 73 6F 6C 75 74 69 6F 6E 43 68 61 6E 67 65 00 69 50 6C 61 74 66 6F 72 6D 00 67 65 74 41 6E 63 68 6F 72 00 41 4E 43 48 4F 52 5F 54 4F 50 5F 4C 45 46 54 00 41 4E 43 48 4F 52 5F 54 4F 50 5F 43 45 4E 54 45 52 00 41 4E 43 48 4F 52 5F 54 4F 50 5F 52 49 47 48 54 00 41 4E 43 48 4F 52 5F 4D 49 44 44 4C 45 5F 4C 45 46 54 00 41 4E 43 48 4F 52 5F 4D 49 44 44 4C 45 5F 43 45 4E 54 45 52 00 41 4E 43 48 4F 52 5F 4D 49 44 44 4C 45 5F 52 49 47 48 54 00 41 4E 43 48 4F 52 5F 42 4F 54 54 4F 4D 5F 4C 45 46 54 00 41 4E 43 48 4F 52 5F 42 4F 54 54 4F 4D 5F 43 45 4E 54 45 52 00 41 4E 43 48 4F 52 5F 42 4F 54 54 4F 4D 5F 52 49 47 48 54 00 6C 65 66 74 00 74 6F 70 00 72 69 67 68 74 00 62 6F 74 74 6F 6D 00 50 6F 69 6E 74 00 49 73 4D 6F 75 73 65 41 63 74 69 76 65 00 73 65 74 4D 6F 75 73 65 41 63 74 69 76 65 00 47 46 58 5F 49 4E 50 55 54 3A 20 53 65 74 4D 6F 75 73 65 41 63 74 69 76 65 3A 20 27 00 27 00 54 6F 67 67 6C 65 4D 6F 75 73 65 48 69 74 44 65 62 75 67 67 69 6E 67 00 54 6F 67 67 6C 69 6E 67 20 4D 6F 75 73 65 20 48 69 74 20 44 65 62 75 67 67 69 6E 67 20 66 6F 72 20 27 00 6F 6E 4D 6F 75 73 65 4D 6F 76 65 00 44 65 62 75 67 4D 6F 75 73 65 54 61 72 67 65 74 69 6E 67 00 4D 6F 75 73 65 00 67 65 74 54 6F 70 4D 6F 73 74 45 6E 74 69 74 79 00 63 75 72 72 65 6E 74 4D 6F 75 73 65 54 61 72 67 65 74 00 4D 6F 75 73 65 20 74 61 72 67 65 74 20 63 68 61 6E 67 65 64 3A 20 00 49 73 50 43 00 50 4C 41 54 46 4F 52 4D 5F 50 43 00 49 73 50 53 33 00 50 4C 41 54 46 4F 52 4D 5F 50 53 33 00 49 73 58 62 6F 78 00 50 4C 41 54 46 4F 52 4D 5F 58 42 4F 58 00 53 75 62 73 63 72 69 62 65 54 6F 52 65 73 6F 6C 75 74 69 6F 6E 55 70 64 61 74 65 00 6C 65 6E 67 74 68 00 45 20 00 70 75 73 68 00 55 6E 73 75 62 73 63 72 69 62 65 54 6F 52 65 73 6F 6C 75 74 69 6F 6E 55 70 64 61 74 65 00 73 70 6C 69 63 65 00 46 52 41 00 53 50 41 00 49 54 41 00 44 45 55 00 4B 4F 52 00 52 55 53 00 4A 50 4E 00 50 4F 4C 00 6C 61 6E 67 75 61 67 65 00 4C 41 4E 47 55 41 47 45 5F 46 52 41 00 4C 41 4E 47 55 41 47 45 5F 53 50 41 00 4C 41 4E 47 55 41 47 45 5F 49 54 41 00 4C 41 4E 47 55 41 47 45 5F 44 45 55 00 4C 41 4E 47 55 41 47 45 5F 4B 4F 52 00 4C 41 4E 47 55 41 47 45 5F 52 55 53 00 4C 41 4E 47 55 41 47 45 5F 4A 50 4E 00 4C 41 4E 47 55 41 47 45 5F 50 4F 4C 00 4C 41 4E 47 55 41 47 45 5F 49 4E 54 00 45 6E 76 69 72 6F 6E 6D 65 6E 74 2E 53 65 74 4C 61 6E 67 3A 20 42 41 44 20 4C 41 4E 47 55 41 47 45 20 53 45 54 21 20 27 00 27 2E 20 44 65 66 61 75 6C 74 69 6E 67 20 74 6F 20 49 4E 54 2E 00 67 65 74 4C 61 6E 67 75 61 67 65 00 69 73 4C 61 6E 67 75 61 67 65 00 73 65 74 4B 6F 72 65 61 6E 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 53 77 61 70 00 62 4B 6F 72 65 61 6E 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 53 77 61 70 00 49 73 4B 6F 72 65 61 6E 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 53 77 61 70 41 63 74 69 76 65 00 47 65 74 41 64 76 61 6E 63 65 42 75 74 74 6F 6E 49 63 6F 6E 00 49 63 6F 6E 5F 42 5F 43 69 72 63 6C 65 00 49 63 6F 6E 5F 41 5F 58 00 47 65 74 42 61 63 6B 42 75 74 74 6F 6E 49 63 6F 6E 00 53 43 52 45 45 4E 5F 57 49 44 54 48 00 53 43 52 45 45 4E 5F 48 45 49 47 48 54 00 41 4E 43 48 4F 52 5F 4E 4F 4E 45 00 4D 4F 55 53 45 5F 44 4F 55 42 4C 45 5F 43 4C 49 43 4B 5F 53 50 45 45 44 00 41 53 53 65 74 50 72 6F 70 46 6C 61 67 73 00   
[/AFTER_HEX] 

 

 

 

Core unreal changes:

 

 

 

MODFILEVERSION=3
UPKFILE=XComGame.upk 
GUID=5B 06 B8 18 67 22 12 44 85 9B A8 5B 9D 57 1D 4B  // XComGame_EW_patch1.upk
FUNCTION=GetPerkInTree@XComPerkManager

// alters GetPerk in Tree to retrieve more perks from DGC.ini
// GetPerkInTreePsi is no longer used -- instead Psi Perks are stored in class eSC_Psi

[BEFORE_HEX]
[HEADER]
99 02 00 00 B9 01 00 00 
[/HEADER]
[code]
//null op -- optional parameter
0B 
	
//if(bIsPsiTree)
07 2B 00 2D 00 02 71 00 00 

	//return GetPerkInTreePsi(branch, Option)
	04 1B 5F 3A 00 00 00 00 00 00 00 04 71 00 00 00 03 71 00 00 16 

//bFound = false
14 2D 00 FF 70 00 00 28 

//foreach SoldierPerkTrees(kTree,)
58 01 18 2B 00 00 00 00 71 00 00 00 4A 8C 00 

	//if(kTree.SoldierType == soldierClass)
	07 8B 00 9A 38 3A 35 0A 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 38 3A 00 05 71 00 00 16 

		//bFound = true
		14 2D 00 FF 70 00 00 27 

		//break
		06 8C 00 

	//IN
	31 
		
	//IP
	30 
	
//if(bFound)
07 8B 02 2D 00 FF 70 00 00 

	//switch(branch)
	05 04 71 00 00 00 00 04 71 00 00 

		//case 1:
		0A CE 00 26 

			//return kTree.Squaddie
			04 35 09 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 2:
		0A 1F 01 2C 02 

			//if(Option == 0)
			07 02 01 9A 00 03 71 00 00 25 16 

				//return kTree.Corporal1
				04 35 08 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

			//else
			06 1F 01 

				//return kTree.Corporal2
				04 35 07 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 3:
		0A 70 01 2C 03 

			//if(Option == 0)
			07 53 01 9A 00 03 71 00 00 25 16 

				//return kTree.Sergeant1
				04 35 06 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

			//else
			06 70 01 

				//return kTree.Sergeant2
				04 35 05 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 4:
		0A C1 01 2C 04 

			//if(Option == 0)
			07 A4 01 9A 00 03 71 00 00 25 16 

				//return kTree.Lieutenant1
				04 35 04 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

			//else
			06 C1 01 

				//return kTree.Lieutenant2
				04 35 03 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 5:
		0A 12 02 2C 05 

			//if(Option == 0)
			07 F5 01 9A 00 03 71 00 00 25 16 

				//return kTree.Captain1
				04 35 02 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

			//else
			06 12 02 

				//return kTree.Captain2
				04 35 01 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 6:
		0A 34 02 2C 06 

			//return kTree.Major
			04 35 00 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 7:
		0A 85 02 2C 07 

			//if(Option == 0)
			07 68 02 9A 00 03 71 00 00 25 16 

				//return kTree.Colonel1
				04 35 FF 2A 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

			//else
			06 85 02 

				//return kTree.Colonel2
				04 35 FE 2A 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//default:
		0A FF FF 

			//break
			06 8B 02 

//return 0
04 24 00 

//return ReturnValue
04 3A 01 71 00 00 

//EOS
53 
	
[/CODE]
[/BEFORE_HEX]


// snag int local variable from another function to store iteration count
// 00 1E 71 00 00  -- iNumGeneMods from NumGeneMods@XComPerkManager

[AFTER_HEX]
[HEADER]
55 02 00 00 B9 01 00 00 
[/HEADER]
[code]
//null op -- optional parameter
0B 

//if(bIsPsiTree)
07 1A 00 2D 00 02 71 00 00 

	// soldierClass = eSC_Psi (5)
	0F 00 05 71 00 00 24 05 

//bFound = false
14 2D 00 FF 70 00 00 28 

// iNumGeneMods = 0
0F 00 1E 71 00 00 2C 00 


//foreach SoldierPerkTrees(kTree,)
58 01 18 2B 00 00 00 00 71 00 00 00 4A A9 00 

	//if(kTree.SoldierType == soldierClass)
	07 A8 00 9A 38 3A 35 0A 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 38 3A 00 05 71 00 00 16 

		// if(iNumGeneMods == Option)
		07 9D 00 9A 00 1E 71 00 00 00 03 71 00 00 16 

			//bFound = true
			14 2D 00 FF 70 00 00 27 

			//break
			06 A9 00 

		//iNumGeneMods++;
		A3 00 1E 71 00 00 16 

	//IN
	31 
		
	//IP
	30 

//if(bFound)
07 BD 01 2D 00 FF 70 00 00 

	//switch(branch)
	05 04 71 00 00 00 00 04 71 00 00 

		//case 1:
		0A EB 00 26 

			//return kTree.Squaddie
			04 35 09 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 2:
		0A 0D 01 2C 02 

			//return kTree.Corporal1
			04 35 08 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 3:
		0A 2F 01 2C 03 

			//return kTree.Sergeant1
			04 35 06 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 4:
		0A 51 01 2C 04 

			//return kTree.Lieutenant1
			04 35 04 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 5:
		0A 73 01 2C 05 

			//return kTree.Captain1
			04 35 02 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 6:
		0A 95 01 2C 06 

			//return kTree.Major
			04 35 00 2B 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//case 7:
		0A B7 01 2C 07 

			//return kTree.Colonel1
			04 35 FF 2A 00 00 0B 2B 00 00 00 00 00 00 71 00 00 

		//default:
		0A FF FF 

			//break
			06 BD 01 

//return 0
04 24 00 

//return ReturnValue
04 3A 01 71 00 00 

//null-ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

/null-ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

//EOS
53 

[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=4
UPKFILE=XComStrategyGame.upk
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=PreviousPerksToAssign@XGSoldierUI

// altered to check for 3 perks per rank

[BEFORE_HEX]
[HEADER]
34 01 00 00 E4 00 00 00 
[/HEADER]
[code]
//if((GetAbilityTreeBranch()) > 0)
07 27 01 97 1B 1D 11 00 00 00 00 00 00 16 25 16 

	//iBranch = 1
	0F 00 B1 4C 00 00 26 

	//if(iBranch < (GetAbilityTreeBranch()))
	07 27 01 96 00 B1 4C 00 00 1B 1D 11 00 00 00 00 00 00 16 16 

		//perkA = m_kSoldier.HasPerk(m_kSoldier.GetPerkInClassTree(iBranch, 0, m_iCurrentView == 2))
		14 2D 00 B0 4C 00 00 19 01 78 4C 00 00 42 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 38 3A 19 01 78 4C 00 00 21 00 E4 52 00 00 00 1B DB 12 00 00 00 00 00 00 00 B1 4C 00 00 25 9A 01 1C 09 00 00 2C 02 16 16 16 

		//perkB = m_kSoldier.HasPerk(m_kSoldier.GetPerkInClassTree(iBranch, 1, m_iCurrentView == 2))
		14 2D 00 AF 4C 00 00 19 01 78 4C 00 00 42 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 38 3A 19 01 78 4C 00 00 21 00 E4 52 00 00 00 1B DB 12 00 00 00 00 00 00 00 B1 4C 00 00 26 9A 01 1C 09 00 00 2C 02 16 16 16 

		//if(!perkA && !perkB)
		07 19 01 82 81 2D 00 B0 4C 00 00 16 18 0D 00 81 2D 00 AF 4C 00 00 16 16 

			//return true
			04 27 

		//++ iBranch
		A5 00 B1 4C 00 00 16 

	//while loop
	06 1B 00 

//return false
04 28 

//return ReturnValue
04 3A B2 4C 00 00 

//EOS
53 
[/CODE]
[/BEFORE_HEX]

// uses local int iMedalIndex from XGSoldierUI.GetMedalName 	00 0D 4D 00 00 
[AFTER_HEX]
[HEADER]
34 01 00 00 E4 00 00 00 
[/HEADER]
[code]
//if((GetAbilityTreeBranch()) > 0)
07 15 01 97 1B 1D 11 00 00 00 00 00 00 16 25 16 

	//iBranch = 1
	0F 00 B1 4C 00 00 26 

	//if(iBranch < (GetAbilityTreeBranch()))
	07 15 01 96 00 B1 4C 00 00 1B 1D 11 00 00 00 00 00 00 16 16 

		// perkB = false
		14 2D 00 AF 4C 00 00 28 

		//iMedalIndex = 0
		0F 00 0D 4D 00 00 25 

		//if (iMedalIndex < 3)
		07 F6 00 96 00 0D 4D 00 00 2C 03 16 

			//perkA = m_kSoldier.HasPerk(m_kSoldier.GetPerkInClassTree(iBranch, iMedalIndex, m_iCurrentView == 2))
			14 2D 00 B0 4C 00 00 19 01 78 4C 00 00 4A 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 38 3A 19 01 78 4C 00 00 29 00 E4 52 00 00 00 1B DB 12 00 00 00 00 00 00 00 B1 4C 00 00 00 0D 4D 00 00 9A 01 1C 09 00 00 2C 02 16 16 16 

			// perkB = perkB || perkA
			14 2D 00 AF 4C 00 00 84 2D 00 AF 4C 00 00 18 0B 00 2D 00 B0 4C 00 00 16 

			// ++ iMedalIndex
			A5 00 0D 4D 00 00 16 

			// while loop
			06 4A 00 

		//if(!perkB)
		07 07 01 81 2D 00 AF 4C 00 00 16 

			//return true
			04 27 

		//++ iBranch
		A5 00 B1 4C 00 00 16 

		//while loop
		06 1B 00 

//return false
04 28 

//return ReturnValue
04 3A B2 4C 00 00 

//null ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

//EOS
53 
[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=4
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=AssignRandomPerks@XGStrategySoldier
//RESTART=0

//fix up random perk assignment to work with more perks
// now creates a virtual 3x7 array of random perks

[BEFORE_HEX]
[HEADER]
B8 01 00 00 38 01 00 00 
[/HEADER]
[code]
//kPerkMan = PERKS()
0F 00 DD 52 00 00 1B DA 27 00 00 00 00 00 00 16 

//m_arrRandomPerks.Length = 0
0F 36 01 9F 52 00 00 25 

//I = 2
0F 00 DC 52 00 00 26 

//if(I < 8)
07 B5 01 96 00 DC 52 00 00 2C 08 16 

	//J = 0
	0F 00 DB 52 00 00 25 

	//if(J < 2)
	07 A7 01 96 00 DB 52 00 00 2C 02 16 

		//ePerk = kPerkMan.GetPerkInTree(m_kChar.eClass, I, J)
		0F 00 DE 52 00 00 19 00 DD 52 00 00 39 00 1C FF FF FF 00 1B DD 12 00 00 00 00 00 00 35 02 FF FF FF CB F9 FF FF 00 00 01 B3 52 00 00 00 DC 52 00 00 00 DB 52 00 00 4A 16 

		//if(kPerkMan.IsFixedPerk(ePerk))
		07 F2 00 19 00 DD 52 00 00 13 00 61 FF FF FF 00 1B C9 17 00 00 00 00 00 00 00 DE 52 00 00 16 

			//m_arrRandomPerks.AddItem(ePerk)
			55 01 9F 52 00 00 0A 00 00 DE 52 00 00 16 

		//else
		06 75 01 

			//ePerk = kPerkMan.GetRandomPerk()
			0F 00 DE 52 00 00 19 00 DD 52 00 00 0A 00 1A FF FF FF 00 1B FE 12 00 00 00 00 00 00 16 

			//if(!IsRandomPerkValidToAdd(ePerk))
			07 5F 01 81 1B 3A 18 00 00 00 00 00 00 00 DE 52 00 00 16 16 

				//ePerk = kPerkMan.GetRandomPerk()
				0F 00 DE 52 00 00 19 00 DD 52 00 00 0A 00 1A FF FF FF 00 1B FE 12 00 00 00 00 00 00 16 

				//while loop
				06 1B 01 

			//m_arrRandomPerks.AddItem(ePerk)
			55 01 9F 52 00 00 0A 00 00 DE 52 00 00 16 

		//if((I == 1) || I == 6)
		07 99 01 84 9A 00 DC 52 00 00 26 16 18 0E 00 9A 00 DC 52 00 00 2C 06 16 16 

			//break
			06 A7 01 

		//++ J
		A3 00 DB 52 00 00 16 

		//while loop (J)
		06 46 00 

	//++ I
	A3 00 DC 52 00 00 16 

	//while loop (I)
	06 2B 00 

//return
04 0B 

//EOS
53 

[/CODE]
[/BEFORE_HEX]

// using local int Y  -- 00 7D 22 00 00   // from XComHeadquartersCheatManager.FacilityStressTest
[AFTER_HEX]
[HEADER]
AB 01 00 00 38 01 00 00 
[/HEADER]
[code]
// Y = GetClass()
0F 00 7D 22 00 00 38 3A 1B 64 11 00 00 00 00 00 00 16 

//kPerkMan = PERKS()
0F 00 DD 52 00 00 1B DA 27 00 00 00 00 00 00 16 

//m_arrRandomPerks.Length = 0
0F 36 01 9F 52 00 00 25 

//I = 1
0F 00 DC 52 00 00 2C 01 

//if(I < 8)
07 9C 01 96 00 DC 52 00 00 2C 08 16 

	//J = 0
	0F 00 DB 52 00 00 25 

	//if(J < 3)
	07 8E 01 96 00 DB 52 00 00 2C 03 16 

		// if ( true ) // switch to enable subclass perk selection for Long War
		07 A6 00 27 

			// if(m_iEnergy < 20 && I > 1)
			07 A6 00 82 96 01 AD 52 00 00 2C 14 16 18 0B 00 97 00 DC 52 00 00 2C 01 16 16 

				//Y = m_iEnergy
				0F 00 7D 22 00 00 01 AD 52 00 00 

		//ePerk = kPerkMan.GetPerkInTree(byte(Y), I, J)
		0F 00 DE 52 00 00 19 00 DD 52 00 00 28 00 1C FF FF FF 00 1B DD 12 00 00 00 00 00 00 38 3D 00 7D 22 00 00 00 DC 52 00 00 00 DB 52 00 00 4A 16 

		//if(kPerkMan.IsFixedPerk(ePerk)) // 
		07 1B 01 19 00 DD 52 00 00 13 00 61 FF FF FF 00 1B C9 17 00 00 00 00 00 00 00 DE 52 00 00 16 

		//else
		06 6A 01 

			//ePerk = 0
			0F 00 DE 52 00 00 25 

			//if(!IsRandomPerkValidToAdd(ePerk))
			07 6A 01 81 1B 3A 18 00 00 00 00 00 00 00 DE 52 00 00 16 16 

				//ePerk = kPerkMan.GetRandomPerk()
				0F 00 DE 52 00 00 19 00 DD 52 00 00 0A 00 1A FF FF FF 00 1B FE 12 00 00 00 00 00 00 16 

				//while loop
				06 26 01 

		//m_arrRandomPerks.AddItem(ePerk)
		55 01 9F 52 00 00 0A 00 00 DE 52 00 00 16 

		//++ J
		A3 00 DB 52 00 00 16 

		//while loop (J)
		06 5D 00 

	//++ I
	A3 00 DC 52 00 00 16 

	//while loop (I)
	06 42 00 

//return
04 0B 

//null ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

//EOS
53 

[/CODE]
[/AFTER_HEX]
 
MODFILEVERSION=4
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=GetPerkInClassTree@XGStrategySoldier

//fix up random perk retrieval to work with more perks
// now assumes the random perks are placed in a 3x7 grid array

[BEFORE_HEX]
[HEADER]
24 02 00 00 98 01 00 00 
[/HEADER]
[code]
//null -- default value for optional parameter
0B 
	
//if((IsOptionEnabled(4)) && !IsASuperSoldier())
07 AD 01 82 1B 22 18 00 00 00 00 00 00 24 04 16 18 0D 00 81 1B 6C 17 00 00 00 00 00 00 16 16 16 

	//if(bIsPsiTree)
	07 61 00 2D 00 E5 52 00 00 

		//return PERKS().GetPerkInTreePsi(branch, Option)
		04 19 1B DA 27 00 00 00 00 00 00 16 1C 00 1B FF FF FF 00 1B DE 12 00 00 00 00 00 00 00 E7 52 00 00 00 E6 52 00 00 16 

	//switch(branch)
	05 E7 52 00 00 00 00 E7 52 00 00 

		//case 1:
		0A 86 00 26 

			//I = 0
			0F 00 E3 52 00 00 25 

			//break
			06 99 01 

		//case 2:
		0A B7 00 2C 02 

			//if(Option == 0)
			07 A8 00 9A 00 E6 52 00 00 25 16 

				//I = 1
				0F 00 E3 52 00 00 26 

			//else
			06 B4 00 

				//I = 2
				0F 00 E3 52 00 00 2C 02 

			//break
			06 99 01 

		//case 3:
		0A E9 00 2C 03 

			//if(Option == 0)
			07 DA 00 9A 00 E6 52 00 00 25 16 

				//I = 3
				0F 00 E3 52 00 00 2C 03 

			//else
			06 E6 00 

				//I = 4
				0F 00 E3 52 00 00 2C 04 

			//break
			06 99 01 

		//case 4:
		0A 1B 01 2C 04 

			//if(Option == 0)
			07 0C 01 9A 00 E6 52 00 00 25 16 

				//I = 5
				0F 00 E3 52 00 00 2C 05 

			//else
			06 18 01 

				//I = 6
				0F 00 E3 52 00 00 2C 06 

			//break
			06 99 01 

		//case 5:
		0A 4D 01 2C 05 

			//if(Option == 0)
			07 3E 01 9A 00 E6 52 00 00 25 16 

				//I = 7
				0F 00 E3 52 00 00 2C 07 

			//else
			06 4A 01 

				//I = 8
				0F 00 E3 52 00 00 2C 08 

			//break
			06 99 01 

		//case 6:
		0A 61 01 2C 06 

			//I = 9
			0F 00 E3 52 00 00 2C 09 

			//break
			06 99 01 

		//case 7:
		0A 93 01 2C 07 

			//if(Option == 0)
			07 84 01 9A 00 E6 52 00 00 25 16 

				//I = 10
				0F 00 E3 52 00 00 2C 0A 

			//else
			06 90 01 

				//I = 11
				0F 00 E3 52 00 00 2C 0B 

			//break
			06 99 01 

		//default:
		0A FF FF 

			//return 0
			04 24 00 

	//return m_arrRandomPerks[I]
	04 10 00 E3 52 00 00 01 9F 52 00 00 

//return PERKS().GetPerkInTree(m_kSoldier.kClass.eType, branch, Option, bIsPsiTree)
04 19 1B DA 27 00 00 00 00 00 00 16 55 00 1C FF FF FF 00 1B DD 12 00 00 00 00 00 00 35 01 FF FF FF CA F9 FF FF 00 00 35 DC F8 FF FF C1 F9 FF FF 00 00 01 B2 52 00 00 00 E7 52 00 00 00 E6 52 00 00 2D 00 E5 52 00 00 16 

//return ReturnValue
04 3A E4 52 00 00 

//EOS
53 

[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
F8 01 00 00 98 01 00 00 
[/HEADER]
[code]
//null -- default value for optional parameter
0B 
	
//if(bIsPsiTree)
07 7A 00 2D 00 E5 52 00 00 

	//return PERKS().GetPerkInTree(m_kSoldier.kClass.eType, branch, Option, bIsPsiTree)
	04 19 1B DA 27 00 00 00 00 00 00 16 55 00 1C FF FF FF 00 1B DD 12 00 00 00 00 00 00 35 01 FF FF FF CA F9 FF FF 00 00 35 DC F8 FF FF C1 F9 FF FF 00 00 01 B2 52 00 00 00 E7 52 00 00 00 E6 52 00 00 2D 00 E5 52 00 00 16 

//if((IsOptionEnabled(4)) && !IsASuperSoldier() && branch != 1) // add explicitly that first rank perks can't be randomized -- used for subclass system
07 D3 00 82 82 1B 22 18 00 00 00 00 00 00 24 04 16 18 0D 00 81 1B 6C 17 00 00 00 00 00 00 16 16 16 18 0F 00 9B 00 E7 52 00 00 2C 01 16 16 

	//return m_arrRandomPerks[(branch-1)*3 + Option]
	04 10 92 90 2C 03 93 00 E7 52 00 00 2C 01 16 16 00 E6 52 00 00 16 01 9F 52 00 00 

// I = GetClass()
0F 00 E3 52 00 00 38 3A 1B 64 11 00 00 00 00 00 00 16 

// if(false) // switch to enable retrieval of subclasses' perks
07 1F 01 28 

	// if(branch != 1  || IsAugmented()) // subclass perks not retrieved for first rank 
	07 1F 01 84 9B 00 E7 52 00 00 2C 01 16 18 0B 00 1B 76 17 00 00 00 00 00 00 16 16 

		// I = m_iEnergy;
		0F 00 E3 52 00 00 01 AD 52 00 00 

//return PERKS().GetPerkInTree(byte(I), branch, Option, bIsPsiTree)
04 19 1B DA 27 00 00 00 00 00 00 16 31 00 1C FF FF FF 00 1B DD 12 00 00 00 00 00 00 38 3D 00 E3 52 00 00 00 E7 52 00 00 00 E6 52 00 00 2D 00 E5 52 00 00 16 

//return ReturnValue
04 3A E4 52 00 00 

//null ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

//EOS
53 

[/CODE]
[/AFTER_HEX]
 
MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2  // XComStrategyGame_EW_patch1.upk
FUNCTION=HasAvailablePerksToAssign@XGStrategySoldier

// updated to handle up to 3 perks

//psionics case
[BEFORE_HEX]
[code]
//if(jIndex < 2)
07 2C 01 96 00 EA 52 00 00 2C 02 16 
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[code]
//if(jIndex < 3)
07 2C 01 96 00 EA 52 00 00 2C 03 16 
[/CODE]
[/AFTER_HEX]


//regular tree case
[BEFORE_HEX]
[code]
if(jIndex < 2)
07 E7 01 96 00 EA 52 00 00 2C 02 16 
[/CODE]
[/BEFORE_HEX]

[AFTER_HEX]
[code]
if(jIndex < 3)
07 E7 01 96 00 EA 52 00 00 2C 03 16 
[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=4
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=IsRandomPerkValidToAdd@XGStrategySoldier

// ensure that the 0 perk is not considered a valid random perk

[BEFORE_HEX]
[HEADER]
28 01 00 00 E0 00 00 00 
[/HEADER]
[code]
//if(m_arrRandomPerks.Find(Perk) != -1)
07 22 00 9B 46 01 9F 52 00 00 0A 00 00 E1 52 00 00 16 1D FF FF FF FF 16 

	//return false
	04 28 

//if(Perk == 23)
07 4D 00 9A 38 3A 00 E1 52 00 00 38 3A 24 17 16 

	//return m_arrRandomPerks.Find(54) == -1
	04 9A 46 01 9F 52 00 00 03 00 24 36 16 1D FF FF FF FF 16 

//if(Perk == 54)
07 78 00 9A 38 3A 00 E1 52 00 00 38 3A 24 36 16 

	//return m_arrRandomPerks.Find(23) == -1
	04 9A 46 01 9F 52 00 00 03 00 24 17 16 1D FF FF FF FF 16 

//if(Perk == 94)
07 DE 00 9A 38 3A 00 E1 52 00 00 38 3A 24 5E 16 

	//if((m_kChar.eClass == 2) || m_kChar.eClass == 6)
	07 DE 00 84 9A 38 3A 35 02 FF FF FF CB F9 FF FF 00 00 01 B3 52 00 00 38 3A 24 02 16 18 25 00 9A 38 3A 35 02 FF FF FF CB F9 FF FF 00 00 01 B3 52 00 00 38 3A 24 06 16 16 

		//return false
		04 28 

//if(Perk == 26)
07 1B 01 9A 38 3A 00 E1 52 00 00 38 3A 24 1A 16 

	//if(m_kChar.eClass == 1)
	07 1B 01 9A 38 3A 35 02 FF FF FF CB F9 FF FF 00 00 01 B3 52 00 00 38 3A 24 01 16 

		//return false
		04 28 

//return true
04 27 

//return ReturnValue
04 3A E0 52 00 00 

//EOS
53 
[/CODE]
[/BEFORE_HEX]

// using local int X  --  00 7E 22 00 00   // from XComHeadQuartersCheatManager.FacilityStressTest
[AFTER_HEX]
[HEADER]
1B 01 00 00 E0 00 00 00 
[/HEADER]
[code]
// X = m_kChar.eClass
0F 00 7E 22 00 00 38 3A 35 02 FF FF FF CB F9 FF FF 00 00 01 B3 52 00 00 

//if(Perk == 0)
07 3B 00 9A 38 3A 00 E1 52 00 00 25 16 

	// return false
	04 28 

//if(m_arrRandomPerks.Find(Perk) != -1)
07 5D 00 9B 46 01 9F 52 00 00 0A 00 00 E1 52 00 00 16 1D FF FF FF FF 16 

	//return false
	04 28 

//switch (Perk)
05 E1 52 00 00 00 00 E1 52 00 00 

	//case 23:  // ePerk_RapidReaction
	0A 8C 00 24 17 

		//return m_arrRandomPerks.Find(54) == -1  // ePerk_Sentinel
		04 9A 46 01 9F 52 00 00 03 00 24 36 16 1D FF FF FF FF 16 

	//case 54: // ePerk_Sentinel
	0A A8 00 24 36 

		//return m_arrRandomPerks.Find(23) == -1  // ePerk_RapidReaction
		04 9A 46 01 9F 52 00 00 03 00 24 17 16 1D FF FF FF FF 16 

	// case 94:  // ePerk_Gunslinger
	0A D1 00 24 5E 

		//if((X == 2) || X == 6)
		07 D1 00 84 9A 00 7E 22 00 00 2C 02 16 18 25 00 9A 00 7E 22 00 00 2C 06 16 16 

			//return false
			04 28 

	// case 26: // ePerk_BulletSwarm
	0A E8 00 24 1A 

		//if(X == 1)
		07 E8 00 9A 00 7E 22 00 00 2C 01 16 

			//return false
			04 28 

	//case default
	0A FF FF 

		//break
		06 EE 00 

//return true
04 27 

//return ReturnValue
04 3A E0 52 00 00 

//null ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

//EOS
53 
[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2  // XComStrategyGame_EW_patch1.upk
 // XComStrategyGame_EU_patch4.upk
FUNCTION=UpdateAbilityData@UISoldierPromotion

// alters display mechanic to hide ranks below current
// alters display of perks to allow 3 perks per rank
// alters display of perks to display nothing if perk value is 0

[BEFORE_HEX]
[HEADER]
75 05 00 00 DD 03 00 00 
[/HEADER]
[code]
// if(m_bPsiPromotion)
07 45 00 2D 01 C0 1A 00 00  

	// abilityColumns = 3
	0F 00 F8 1A 00 00 2C 03 

	// SoldierRank = m_kSoldier.GetPsiRank()
	0F 00 F7 1A 00 00 19 01 BE 1A 00 00 0A 00 C8 52 00 00 00 1B F5 12 00 00 00 00 00 00 16 

// else
06 7A 00 

	// abilityColumns = 7
	0F 00 F8 1A 00 00 2C 07 

	// SoldierRank = m_kSoldier.GetRank()
	0F 00 F7 1A 00 00 19 01 BE 1A 00 00 0A 00 C6 52 00 00 00 1B 00 13 00 00 00 00 00 00 16 

// isFirstPromotableColumn = true
14 2D 00 F5 1A 00 00 27 

// column = 0
0F 00 FB 1A 00 00 25 

// if(column < abilityColumns)
07 67 05 96 00 FB 1A 00 00 00 F8 1A 00 00 16 

	// isColumnPromotable = true
	14 2D 00 F6 1A 00 00 27 

	// Row = 0
	0F 00 FA 1A 00 00 25 

	// if(Row < 2)
	07 B4 02 96 00 FA 1A 00 00 2C 02 16 

		// if(Row > 0)
		07 18 01 97 00 FA 1A 00 00 25 16 

			if(column == 0)
			07 F3 00 9A 00 FB 1A 00 00 25 16 

				// break
				06 B4 02 

			// else
			06 18 01 

				// if((m_bPsiPromotion == false) && column == 5)
				07 18 01 82 F2 2D 01 C0 1A 00 00 28 16 18 0E 00 9A 00 FB 1A 00 00 2C 05 16 16 

					//break
					06 B4 02 

		// Perk = m_kSoldier.GetPerkInClassTree(column + 1, Row, m_bPsiPromotion)
		0F 00 F9 1A 00 00 38 3A 19 01 BE 1A 00 00 29 00 E4 52 00 00 00 1B DB 12 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 00 FA 1A 00 00 2D 01 C0 1A 00 00 16 

		// if(m_kSoldier.HasPerk(Perk) || column >= SoldierRank)
		07 B2 01 84 19 01 BE 1A 00 00 13 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 00 F9 1A 00 00 16 18 15 00 99 00 FB 1A 00 00 00 F7 1A 00 00 16 16 

			// isColumnPromotable = false
			14 2D 00 F6 1A 00 00 28 

		// if(column >= SoldierRank)
		07 19 02 99 00 FB 1A 00 00 00 F7 1A 00 00 16 

			// AS_SetAbilityIcon(column, Row, "unknown", m_kSoldier.HasPerk(Perk))
			1B 59 02 00 00 00 00 00 00 00 FB 1A 00 00 00 FA 1A 00 00 1F 75 6E 6B 6E 6F 77 6E 00 19 01 BE 1A 00 00 13 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 00 F9 1A 00 00 16 16 

		//else
		06 A6 02 

			// AS_SetAbilityIcon(column, Row, class'UIUtilities'.static.GetPerkIconLabel(Perk, GetMgr().perkMgr()), m_kSoldier.HasPerk(Perk))
			1B 59 02 00 00 00 00 00 00 00 FB 1A 00 00 00 FA 1A 00 00 12 20 6C FE FF FF 34 00 5E F9 FF FF 00 1B D9 12 00 00 00 00 00 00 00 F9 1A 00 00 19 1B 71 12 00 00 00 00 00 00 4A 16 0A 00 0C 01 00 00 00 1B D9 27 00 00 00 00 00 00 16 16 19 01 BE 1A 00 00 13 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 00 F9 1A 00 00 16 16 

		// ++ Row
		A3 00 FA 1A 00 00 16 

		//while loop
		06 BF 00 

	// if(isColumnPromotable)
	07 26 04 2D 00 F6 1A 00 00 

	// if(isFirstPromotableColumn)
	07 96 03 2D 00 F5 1A 00 00 

			// isFirstPromotableColumn = false
			14 2D 00 F5 1A 00 00 28 

			// GetMgr().SetAbilityTreeBranch(column + 1)
			19 1B 71 12 00 00 00 00 00 00 4A 16 16 00 00 00 00 00 00 1B 58 2A 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 16 

			// AS_SetColumnData(column, Caps(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetRankString(column + 1)), 1)
			1B 72 02 00 00 00 00 00 00 00 FB 1A 00 00 EB 19 19 2E 5C FE FF FF 19 12 20 CD FE FF FF 0A 00 A8 FA FF FF 00 1C 49 FD FF FF 16 09 00 91 FA FF FF 00 01 91 FA FF FF 09 00 60 FA FF FF 00 01 60 FA FF FF 18 00 1B F9 FF FF 00 1B 02 13 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 4A 4A 16 16 26 16 

		//else
		06 23 04 

			// AS_SetColumnData(column, Caps(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetRankString(column + 1)), 2)
			1B 72 02 00 00 00 00 00 00 00 FB 1A 00 00 EB 19 19 2E 5C FE FF FF 19 12 20 CD FE FF FF 0A 00 A8 FA FF FF 00 1C 49 FD FF FF 16 09 00 91 FA FF FF 00 01 91 FA FF FF 09 00 60 FA FF FF 00 01 60 FA FF FF 18 00 1B F9 FF FF 00 1B 02 13 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 4A 4A 16 16 2C 02 16 

	//else
	06 59 05 

		// if(column >= SoldierRank)
		07 CD 04 99 00 FB 1A 00 00 00 F7 1A 00 00 16 

			// AS_SetColumnData(column, Caps(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetRankString(column + 1)), 3)
			1B 72 02 00 00 00 00 00 00 00 FB 1A 00 00 EB 19 19 2E 5C FE FF FF 19 12 20 CD FE FF FF 0A 00 A8 FA FF FF 00 1C 49 FD FF FF 16 09 00 91 FA FF FF 00 01 91 FA FF FF 09 00 60 FA FF FF 00 01 60 FA FF FF 18 00 1B F9 FF FF 00 1B 02 13 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 4A 4A 16 16 2C 03 16 

		// else
		06 59 05 

			// AS_SetColumnData(column, Caps(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetRankString(column + 1)), 0)
			1B 72 02 00 00 00 00 00 00 00 FB 1A 00 00 EB 19 19 2E 5C FE FF FF 19 12 20 CD FE FF FF 0A 00 A8 FA FF FF 00 1C 49 FD FF FF 16 09 00 91 FA FF FF 00 01 91 FA FF FF 09 00 60 FA FF FF 00 01 60 FA FF FF 18 00 1B F9 FF FF 00 1B 02 13 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 4A 4A 16 16 25 16 

	// ++ column
	A3 00 FB 1A 00 00 16 

	// while loop
	06 91 00 

// RealizeSelected()
1C FE 1A 00 00 4A 16 

// return
04 0B 

// EOS
53 	

[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
E5 04 00 00 DD 03 00 00 
[/HEADER]
[code]
// if(m_bPsiPromotion)
07 45 00 2D 01 C0 1A 00 00 

	// abilityColumns = 3
	0F 00 F8 1A 00 00 2C 03 

	// SoldierRank = m_kSoldier.GetPsiRank()
	0F 00 F7 1A 00 00 19 01 BE 1A 00 00 0A 00 C8 52 00 00 00 1B F5 12 00 00 00 00 00 00 16 

// else
06 7A 00 

	// abilityColumns = 7
	0F 00 F8 1A 00 00 2C 07 

	// SoldierRank = m_kSoldier.GetRank()
	0F 00 F7 1A 00 00 19 01 BE 1A 00 00 0A 00 C6 52 00 00 00 1B 00 13 00 00 00 00 00 00 16 

// isFirstPromotableColumn = true
14 2D 00 F5 1A 00 00 27 

// column = 0
0F 00 FB 1A 00 00 25 

// if(column < 7)
07 74 03 96 00 FB 1A 00 00 2C 07 16 

	// if(column >= SoldierRank)
	07 D3 00 99 00 FB 1A 00 00 00 F7 1A 00 00 16  

		// Row = 3
		0F 00 FA 1A 00 00 2C 03 

		// isFirstPromotableColumn = false
		14 2D 00 F5 1A 00 00 28 

	//else
	06 C9 02 

		// Row = 0
		0F 00 FA 1A 00 00 2C 00 

		// isColumnPromotable = true
		14 2D 00 F6 1A 00 00 27 

		// if(Row < 3)  //increase to 3 to allow up to 3 perks per rank
		07 4D 02 96 00 FA 1A 00 00 2C 03 16 

			// Perk = m_kSoldier.GetPerkInClassTree(column + 1, Row, m_bPsiPromotion) // get perk -- can be zero, which means display no icon
			0F 00 F9 1A 00 00 38 3A 19 01 BE 1A 00 00 29 00 E4 52 00 00 00 1B DB 12 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 00 FA 1A 00 00 2D 01 C0 1A 00 00 16 

			// if(m_kSoldier.HasPerk(Perk) || column >= SoldierRank)
			07 95 01 84 19 01 BE 1A 00 00 13 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 00 F9 1A 00 00 16 18 15 00 99 00 FB 1A 00 00 00 F7 1A 00 00 16 16 

				// isColumnPromotable = false
				14 2D 00 F6 1A 00 00 28 

			// if (isFirstPromotableColumn)
			07 3F 02 2D 00 F5 1A 00 00 

				// if(Perk > 0)
				07 3F 02 97 00 F9 1A 00 00 2C 00 16 

					// AS_SetAbilityIcon(column, Row, class'UIUtilities'.static.GetPerkIconLabel(Perk, GetMgr().perkMgr()), m_kSoldier.HasPerk(Perk))
					1B 59 02 00 00 00 00 00 00 00 FB 1A 00 00 00 FA 1A 00 00 12 20 6C FE FF FF 34 00 5E F9 FF FF 00 1B D9 12 00 00 00 00 00 00 00 F9 1A 00 00 19 1B 71 12 00 00 00 00 00 00 4A 16 0A 00 0C 01 00 00 00 1B D9 27 00 00 00 00 00 00 16 16 19 01 BE 1A 00 00 13 00 8B 53 00 00 00 1B 28 14 00 00 00 00 00 00 00 F9 1A 00 00 16 16 

			// ++ Row
			A3 00 FA 1A 00 00 16 

			//while loop
			06 EB 00 

		// if(isColumnPromotable)
		07 BD 02 2D 00 F6 1A 00 00 

			// if(isFirstPromotableColumn)
			07 AE 02 2D 00 F5 1A 00 00 

				// mode 1 -- column is highlighted and active
				// Row = 1;
				0F 00 FA 1A 00 00 26 

				// isFirstPromotableColumn = false
				14 2D 00 F5 1A 00 00 28 

				// GetMgr().SetAbilityTreeBranch(column + 1)
				19 1B 71 12 00 00 00 00 00 00 4A 16 16 00 00 00 00 00 00 1B 58 2A 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 16 

			//else
			06 BA 02 

				// mode 2 -- column is faded and inactive
				// Row = 2;
				0F 00 FA 1A 00 00 2C 02 

		//else
		06 C9 02 

			// mode 0 -- column has been promoted -- column highlighting is off
			// Row = 0;
			0F 00 FA 1A 00 00 2C 00 

	// AS_SetColumnData(column, Caps(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetRankString(column + 1, , m_bPsiPromotion)), Row)
	1B 72 02 00 00 00 00 00 00 00 FB 1A 00 00 EB 19 19 2E 5C FE FF FF 19 12 20 CD FE FF FF 0A 00 A8 FA FF FF 00 1C 49 FD FF FF 16 09 00 91 FA FF FF 00 01 91 FA FF FF 09 00 60 FA FF FF 00 01 60 FA FF FF 21 00 1B F9 FF FF 00 1B 02 13 00 00 00 00 00 00 92 00 FB 1A 00 00 26 16 4A 2D 01 C0 1A 00 00 16 16 00 FA 1A 00 00 16 

	// ++ column
	A3 00 FB 1A 00 00 16 

	// while loop
	06 91 00 

// RealizeSelected()
1C FE 1A 00 00 4A 16 

// return
04 0B 

// null ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B  
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B  
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B  
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

// EOS
53 	

[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2  // XComStrategyGame_EW_patch1.upk
FUNCTION=PerkLockedOut@XGStrategySoldier

// updated to handle up to 3 perks

// subsumed into Psionics rework version

[BEFORE_HEX]
[code]
if(iOptions < 2)
07 CE 00 96 00 F0 52 00 00 2C 02 16 
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[code]
if(iOptions < 3)
07 CE 00 96 00 F0 52 00 00 2C 03 16 
[/CODE]
[/AFTER_HEX] 

 

 

 

To install the above changes UICollection_Strategy_SF.upk, XComGame.upk, and XComStrategyGame.upk must be decompressed.

 

 

The following changes patch up gamepad/keyboard functionality. If you're only using a mouse you can skip these:

 

 

 

MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=OnPromotionDown@XGSoldierUI

//clamp keyboard/gamepad down motion to no more than current soldier rank

[BEFORE_HEX]
[HEADER]
79 00 00 00 61 00 00 00 
[/HEADER]
[code]
//newBranch = (GetAbilityTreeBranch()) + 1
0F 00 BE 4C 00 00 92 1B 1D 11 00 00 00 00 00 00 16 26 16 

//if(newBranch > ((m_iCurrentView == 1) ? 7 : 3))
07 59 00 97 00 BE 4C 00 00 45 9A 01 1C 09 00 00 26 16 02 00 2C 07 02 00 2C 03 16 

	//newBranch = ((m_iCurrentView == 1) ? 7 : 3)
	0F 00 BE 4C 00 00 45 9A 01 1C 09 00 00 26 16 02 00 2C 07 02 00 2C 03 

//SetAbilityTreeBranch(newBranch)
1B 58 2A 00 00 00 00 00 00 00 BE 4C 00 00 16 

//PlayScrollSound()
1B 0F 28 00 00 00 00 00 00 16 

//return
04 0B 

//EOS
53 
	
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
75 00 00 00 61 00 00 00 
[/HEADER]
[code]
// newBranch = ((m_iCurrentView == 1) ? m_kSoldier.GetRank() : m_kSoldier.GetPsiRank())
//0F 00 BE 4C 00 00 45 9A 01 1C 09 00 00 26 16 1F 00 19 01 78 4C 00 00 0A 00 C6 52 00 00 00 1B 00 13 00 00 00 00 00 00 16 1F 00 19 01 78 4C 00 00 0A 00 C8 52 00 00 00 1B F5 12 00 00 00 00 00 00 16 

// newBranch = Min(GetAbilityTreeBranch() + 1, newBranch)
//0F 00 BE 4C 00 00 F9 92 1B 1D 11 00 00 00 00 00 00 16 26 16 00 BE 4C 00 00 16 

//SetAbilityTreeBranch(newBranch)
//1B 58 2A 00 00 00 00 00 00 00 BE 4C 00 00 16 

//setAbilityTreeBranch(Min(GetAbilityTreeBranch()+1, ((m_iCurrentView == 1) ? m_kSoldier.GetRank() : m_kSoldier.GetPsiRank()))
1B 58 2A 00 00 00 00 00 00 F9 92 1B 1D 11 00 00 00 00 00 00 16 26 16 45 9A 01 1C 09 00 00 26 16 1F 00 19 01 78 4C 00 00 0A 00 C6 52 00 00 00 1B 00 13 00 00 00 00 00 00 16 1F 00 19 01 78 4C 00 00 0A 00 C8 52 00 00 00 1B F5 12 00 00 00 00 00 00 16 16 16 

//PlayScrollSound()
1B 0F 28 00 00 00 00 00 00 16 

//return
04 0B 

//null ops


//EOS
53 
[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=OnPromotionLeft@XGSoldierUI

//redirect to call RotateSoldier@XGSoldierUI

[BEFORE_HEX]
[code]
1B 59 2A 00 00 00 00 00 00 26 16 1B 0F 28 00 00 00 00 00 00 16 
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[code]
1B EF 29 00 00 00 00 00 00 26 16 1B 0F 28 00 00 00 00 00 00 16 
[/CODE]
[/AFTER_HEX]
 
MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=OnPromotionRight@XGSoldierUI

//redirect to call RotateSoldier@XGSoldierUI

[BEFORE_HEX]
[code]
1B 59 2A 00 00 00 00 00 00 25 16 1B 0F 28 00 00 00 00 00 00 16 
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[code]
1B EF 29 00 00 00 00 00 00 25 16 1B 0F 28 00 00 00 00 00 00 16 
[/CODE]
[/AFTER_HEX] 
MODFILEVERSION=3
UPKFILE=XComStrategyGame.upk 
GUID=31 9C 3B 3F 9C 5D E4 40 AB AF 92 8E 25 65 74 F2 // XComStrategyGame_EW_patch1.upk
FUNCTION=RotateSoldier@XGSoldierUI

//turn into helper function for left/right keyboard/gamepad perk selection

[BEFORE_HEX]
[HEADER]
75 00 00 00 51 00 00 00 
[/HEADER]
[code]
07 72 00 82 77 01 78 4C 00 00 2A 16 18 22 00 77 19 01 78 4C 00 00 09 00 A1 52 00 00 00 01 A1 52 00 00 2A 16 16 19 19 01 78 4C 00 00 09 00 A1 52 00 00 00 01 A1 52 00 00 13 00 00 00 00 00 00 1B ED 29 00 00 00 00 00 00 00 9B 4C 00 00 16 04 0B 53 
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
55 00 00 00 51 00 00 00 
[/HEADER]
[code]
SetAbilityTreeOption(Clamp(GetAbilityTreeOption() + (Dir *2) - 1, 0, 2); (39 bytes)
1B 59 2A 00 00 00 00 00 00 FB 93 92 1B 1E 11 00 00 00 00 00 00 16 90 00 9B 4C 00 00 2C 02 16 16 26 16 25 2C 02 16 16 

null ops
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 

return, EOS
04 0B 53 
[/CODE]
[/AFTER_HEX] 

 

 

 

To make changes to the DGC.ini, you'll need to have installed the XComEW.exe-patch to force the game to load DefaultGameCore.ini from file instead of Resource Cache.

 

Perks are configured in the DGC.ini using the following template:

SoldierPerkTrees=(SoldierType=eSC_Sniper,		Squaddie=ePerk_SquadSight, 			Corporal1=ePerk_SquadSight, Corporal2=0, Sergeant1=ePerk_DamnGoodGround, Sergeant2=0, Lieutenant1=ePerk_BattleScanner,  Lieutenant2=0, Captain1=ePerk_Opportunist, Captain2=0, Major=0, 				Colonel1=ePerk_DoubleTap, 	Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Sniper,		Squaddie=0, 						Corporal1=0, 				Corporal2=0, Sergeant1=0, 					 Sergeant2=0, Lieutenant1=0, 					Lieutenant2=0, Captain1=0, 				   Captain2=0, Major=ePerk_LowProfile, 	Colonel1=0, 				Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Sniper,		Squaddie=ePerk_LightningReflexes, 	Corporal1=ePerk_SnapShot, 	Corporal2=0, Sergeant1=ePerk_Gunslinger, 	 Sergeant2=0, Lieutenant1=ePerk_DisablingShot,  Lieutenant2=0, Captain1=ePerk_Executioner, Captain2=0, Major=0, 				Colonel1=ePerk_InTheZone, 	Colonel2=0)

SoldierPerkTrees=(SoldierType=eSC_HeavyWeapons,	Squaddie=ePerk_FireRocket, 			Corporal1=ePerk_TracerBeams, Corporal2=0, Sergeant1=ePerk_FocusedSuppression, 	Sergeant2=0, Lieutenant1=ePerk_RapidReaction, 	Lieutenant2=0, Captain1=ePerk_DangerZone, Captain2=0, Major=0, 					 Colonel1=ePerk_Mayhem, 	Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_HeavyWeapons,	Squaddie=0,  						Corporal1=0, 				 Corporal2=0, Sergeant1=0, 							Sergeant2=0, Lieutenant1=0, 					Lieutenant2=0, Captain1=0, 				  Captain2=0, Major=ePerk_WillToSurvive, Colonel1=0, 				Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_HeavyWeapons,	Squaddie=ePerk_FocusedSuppression, 	Corporal1=ePerk_BulletSwarm, Corporal2=0, Sergeant1=ePerk_ShredderRocket, 		Sergeant2=0, Lieutenant1=ePerk_HEATAmmo, 		Lieutenant2=0, Captain1=ePerk_Grenadier,  Captain2=0, Major=0, 					 Colonel1=ePerk_Rocketeer, 	Colonel2=0)

SoldierPerkTrees=(SoldierType=eSC_Support,		Squaddie=ePerk_FieldMedic, 	Corporal1=ePerk_CoveringFire, Corporal2=0, Sergeant1=ePerk_SmokeAndMirrors, Sergeant2=0, Lieutenant1=ePerk_FocusedSuppression,  Lieutenant2=0, Captain1=ePerk_CombatDrugs, 	Captain2=0, Major=0, 				 Colonel1=ePerk_Sentinel, 	Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Support,		Squaddie=0, 				Corporal1=0,  Corporal2=0, Sergeant1=0, 					Sergeant2=0, Lieutenant1=0, 						Lieutenant2=0, Captain1=0, 					Captain2=0, Major=ePerk_DeepPockets, Colonel1=0, 				Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Support,		Squaddie=ePerk_Grenadier, 	Corporal1=ePerk_Sprinter, 	  Corporal2=0, Sergeant1=ePerk_FieldMedic, 		Sergeant2=0, Lieutenant1=ePerk_Revive, 				Lieutenant2=0, Captain1=ePerk_DenseSmoke, 	Captain2=0, Major=0, 				 Colonel1=ePerk_Savior, 	Colonel2=0)

SoldierPerkTrees=(SoldierType=eSC_Assault,		Squaddie=ePerk_RunAndGun, 	Corporal1=ePerk_Aggression, 	Corporal2=0, Sergeant1=ePerk_CloseAndPersonal, 	Sergeant2=0, Lieutenant1=ePerk_RapidFire, 	Lieutenant2=0, Captain1=ePerk_BringEmOn, 			 Captain2=0, Major=0, 					    Colonel1=ePerk_KillerInstinct,  Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Assault,		Squaddie=0, 				Corporal1=0, 					Corporal2=0, Sergeant1=0, 						Sergeant2=0, Lieutenant1=0, 				Lieutenant2=0, Captain1=0, 							 Captain2=0, Major=ePerk_ExtraConditioning, Colonel1=0, 					Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Assault,		Squaddie=ePerk_BulletSwarm, Corporal1=ePerk_TacticalSense, 	Corporal2=0, Sergeant1=ePerk_LightningReflexes, Sergeant2=0, Lieutenant1=ePerk_Flush, 		Lieutenant2=0, Captain1=ePerk_CloseCombatSpecialist, Captain2=0, Major=0, 					    Colonel1=ePerk_Resilience,  	Colonel2=0)

SoldierPerkTrees=(SoldierType=eSC_Psi,			Squaddie=0, 			 Corporal1=ePerk_PsiPanic, 			Corporal2=0, Sergeant1=ePerk_MindControl, 	  	Sergeant2=0, Lieutenant1=0,	Lieutenant2=0, Captain1=0, 	Captain2=0, Major=0, Colonel1=0,	Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Psi,			Squaddie=ePerk_MindFray, Corporal1=0, 						Corporal2=0, Sergeant1=0, 					 	Sergeant2=0, Lieutenant1=0, Lieutenant2=0, Captain1=0, 	Captain2=0, Major=0, Colonel1=0, 	Colonel2=0)
SoldierPerkTrees=(SoldierType=eSC_Psi,			Squaddie=0, 			 Corporal1=ePerk_PsiInspiration, 	Corporal2=0, Sergeant1=ePerk_TelekineticField, 	Sergeant2=0, Lieutenant1=0, Lieutenant2=0, Captain1=0, 	Captain2=0, Major=0, Colonel1=0, 	Colonel2=0)

Unfortunately this hasn't been converted into a more end-user-friendly method of installation such as Toolboks or UPK-Utils. I've managed to avoid resizing any functions so it should be able to be converted into either format.

Hey Amineri, I was just wondering if you ever plan on converting it to the custom mod format for Toolboks or Utils? Or at least a tutorial on how to convert it, as I can't seem to figure out how on my own, and I would really love for this to work on EW.

 

One other question, is there a way, once this is installed, to have a separate mod file to recreate the perk trees, like the old mod file? I can't seem to enable direct ini loading, for various reasons :sad: And I was hoping there was a UPK-Utils method of replacing perks or adding perks.

 

Thanks in advance for your reply.

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...