Jump to content

UI Mod - Bigger Perk Tree


Amineri

Recommended Posts

That looks great. Really looking forward to playing Long War and patiently waiting in the meantime. If there's ever any way us newer modders can help, like with stuff you've decided to put on the backburner/deemed as low priority, just let us know. I know I for one would be willing to pitch in, especially with the AI since I've been knee deep in those functions lately anyway.

Link to comment
Share on other sites

  • 1 month later...
  • Replies 193
  • Created
  • Last Reply

Top Posters In This Topic

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.

Link to comment
Share on other sites

  • 2 months later...

Hi i would like to try out a larger perk tree, but i am kind-of lost how to install those changes. Should i just copy those code sections to a text file, then use them with PatcherGUI? (i know it is probably explained somewhere in this thread), but could someone please explain in simple steps what to do to have those larger trait-trees? (i would like to use them with training roulette if that matters)

Link to comment
Share on other sites

  • 1 month later...

Hi i would like to try out a larger perk tree, but i am kind-of lost how to install those changes. Should i just copy those code sections to a text file, then use them with PatcherGUI? (i know it is probably explained somewhere in this thread), but could someone please explain in simple steps what to do to have those larger trait-trees? (i would like to use them with training roulette if that matters)

 

Very much this. I would like to give the Major Rank two choices, because more often than not, entire characters gets screwed up by the fact that Major only gives 1 choice. With Training Roulette, Major really should have two choices, just like any other Rank.

 

But I have no idea how to use the information in this thread, and it's 18 pages to plow through, and most of those pages are very old, maybe not even applicable to Enemy Within.

 

Help, anyone? D:

Link to comment
Share on other sites

I did my best to modularize the Expanded Perk Tree (when I updated it for EW), but there did end up being some intersection points with other Long War specific code.

 

In particular :

- The LongWar subclasses required some significant alterations

- The Psionics rework required changes to how some functions allow psionic powers to be trained

 

I haven't tested the basic Expanded Perk Tree by itself with vanilla in quite a while, so I can't guarantee that it will be compatible, but here's a link to the 13 upk_mod files in the module for Long War :

 

https://drive.google.com/folderview?id=0Bxrv8QdeQ-cybnQxUUlMVkFfT2M&usp=sharing

 

It also changes how the config data is read, as previously mentioned in the thread.

Link to comment
Share on other sites

I did my best to modularize the Expanded Perk Tree (when I updated it for EW), but there did end up being some intersection points with other Long War specific code.

 

In particular :

- The LongWar subclasses required some significant alterations

- The Psionics rework required changes to how some functions allow psionic powers to be trained

 

I haven't tested the basic Expanded Perk Tree by itself with vanilla in quite a while, so I can't guarantee that it will be compatible, but here's a link to the 13 upk_mod files in the module for Long War :

 

https://drive.google.com/folderview?id=0Bxrv8QdeQ-cybnQxUUlMVkFfT2M&usp=sharing

 

It also changes how the config data is read, as previously mentioned in the thread.

 

I really appreciate you taking the time, and I feel like a total idiot for asking, but all mods I've dealt with so far either uses the Patcher, ol' ToolBoks (I think that's the name), or editing of the .ini-files. Looking at the .upk_mod-files in Notepad+ that you just linked, they seem to contain the same (exact same?) information as you posted earlier.

 

Now.. *cough* what.. what do I actually do with them? Do I place them somewhere? Do I run them through some kind of patcher to edit the .upk-files? I'm.. at a bit of a loss.

 

Edit: Alright, so, after searching vigorously for a while, I've found the UPKModder v0.82, but I can't work out the instructions. It doesn't seem to be working, but that's likely because I have no idea how I'm supposed to configure the upk_config.ini. What information goes where? It lists files I can't even find in my folders, such as XComGame_EU_Patch4.upk and such. Also, I doubt that anyone ever had such files dumped straight in C:/Games, especially considering that the .upk-files are usually way down in the XCOM installation folders (in my case, D:\Games\Steam\SteamApps\common\XCom-Enemy-Unknown\XEW\XComGame\CookedPCConsole).

 

Any pointers on that? And I'm not even sure what the GUID lines are.

 

I've managed to create a Project and I dumped the .upk_mod-files in the modsrc-folder of the project. So if I can work out the UPKModder configurations, I think it should just be punch and go.. right? I think.

Edited by SwedenRebel
Link to comment
Share on other sites

Well, you have a few different options.

 

1) Try and work out how to configure UPKmodder -- UPKmodder isn't designed as a mod installer, although it does have some limited installation capabilities. So it won't patch the executable to load the DGC.ini, and it won't decompress the upks in the CookedPCConsole folder for you. You also have to link to the upks being modded (using the button in the lower left when a upk_mod file is open)

 

2) Convert the upk_mod files into PatchGUI format -- they are fairly similar, and none of the Expanded Perk Tree changes resize, so this should be fairly straightforward

 

3) Manually install using a hex editor -- since none of the modfiles do a resize operation, manual installation is possible

Link to comment
Share on other sites

Well, you have a few different options.

 

1) Try and work out how to configure UPKmodder -- UPKmodder isn't designed as a mod installer, although it does have some limited installation capabilities. So it won't patch the executable to load the DGC.ini, and it won't decompress the upks in the CookedPCConsole folder for you. You also have to link to the upks being modded (using the button in the lower left when a upk_mod file is open)

 

2) Convert the upk_mod files into PatchGUI format -- they are fairly similar, and none of the Expanded Perk Tree changes resize, so this should be fairly straightforward

 

3) Manually install using a hex editor -- since none of the modfiles do a resize operation, manual installation is possible

1) I've tried to figure it out, but I'm just not sure what it's asking for. The executable is patched to load the DGC.ini and the relevant .upk-files in the CookedPCConsole should be decompressed now, but I still have no idea how to configure the config file for UPKmodder. Like I said, what information goes where? And I'm not even sure what the GUID lines are. I'd love to configure it, but I just have no idea what it's asking, like I said earlier, some of the files it seems to make references to doesn't even exist in my CookedPCConsole folder (such as the aforementioned XComGame_EU_Patch4.upk).

 

Linking to the .upk:s can't be done before UPKmodder has been configured, it seems; the instructions speak of colours, but all I get is grey, and the folder in the lower left can't be pressed. Either way, that's practically a non-issue until I know how to configure the config file.

 

2) You're an amazing person with some amazing experience with these things. What is straightforward to you is certainly not straightforward for others. I'm not even sure how to get started on doing that, based on the information I have (the .upk_mod-files).

 

3) I actually tried to work that out when reading the your earlier post, but either I'm not looking at the right files or I don't have them, or something else went wrong, because I quite quickly ran into strings I couldn't find when searching. Which, obviously, means that I can't really alter them. I'll take another swing at them and see what I can work out, although I doubt I'll get far.

Link to comment
Share on other sites

To set up UPKmodder to apply files to particular upks, do the following :

 

1) Launch UPKmodder

2) Open upk_mod file by double clicking in project pane

3) At lower left it will say "no UPK file selected"

4) Click on the small folder icon next to that text

5) Navigate to the upk file that this modfile should be applied to (could be in your CookedPCConsole, but also allows applying to a back-up copy of desired)

6) Once selected, UPKmodder remembers the association between the file in the header (e.g. "UPKFILE=XComGame.upk") and will link all files with the same header entry to the same file until it is changed

7) Because of (6), steps 4-5 only have to be done once for each different UPK being modified -- for this mod, XComGame.upk, XComStrategyGame.upk, and UICollection_Strategy_SF.upk are modded.

 

Hopefully this helps

Link to comment
Share on other sites

To set up UPKmodder to apply files to particular upks, do the following :

 

1) Launch UPKmodder

2) Open upk_mod file by double clicking in project pane

3) At lower left it will say "no UPK file selected"

4) Click on the small folder icon next to that text

5) Navigate to the upk file that this modfile should be applied to (could be in your CookedPCConsole, but also allows applying to a back-up copy of desired)

6) Once selected, UPKmodder remembers the association between the file in the header (e.g. "UPKFILE=XComGame.upk") and will link all files with the same header entry to the same file until it is changed

7) Because of (6), steps 4-5 only have to be done once for each different UPK being modified -- for this mod, XComGame.upk, XComStrategyGame.upk, and UICollection_Strategy_SF.upk are modded.

 

Hopefully this helps

 

I think I can see where it went wrong before. I created projects that I put the .upk_mod-files in, and the "no UPK file selected" never showed up, nor could I press the folder. When completely disregard the whole "project" thing and just open up a .upk_mod-file straight away, it finally shows the "no UPK file selected" and the folder is pressable! Woo!

 

This is counter to what it says on the page I got the UPKmodder from, though.

 

I'll give it a swirl and see how far I get. Much love, cheers. I'll be back when things inevitably don't work out (they never do). :smile:

 

Edit: Aaaaaaaaaaaaaaaah, I can load the project, and then open up the individual files inside of the UPKmodder, and then it shows up as it should. I had no difficulties configuring it, although the __S_UiSoldierPromotion_UpdateAbilityData.upk_mod shows up in red when testing it's status. I'll see if I can hit that with a wrench and see what happens...

 

Edit 2: Is there a way to determine what the error was?

Edited by SwedenRebel
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...