It's been a while since I've posted anything up on this, but that's because the tool has been stable enough that JL and I are using it quite a bit in the Long War EW development. We're currently closing in on 500 function/variable modifications, and this tool has been very helpful in making it happen.
We've been making quite noticable usage of the resizing capability, and it appears to be quite stable. I haven't counted, but I'm sure we have well over 50 function that have been increased in size, which is allowing us to do a lot of things we wouldn't otherwise be able to. On the low end sometimes we just need 7 extra bytes in a small function to fit in some extra bit of functionality. On the high end JL has drastically increased the size of XGStrategyAI.AIAddNewObjectives in an attempt to make the strategy AI a bit more interesting. He resized the function by 0x142D = 5165 bytes. The original size was 0x1BF=447 bytes and the new size is 0x15EC = 5612 bytes. Quite an increase 
-------------------
One topic I wanted to bring up is that we seem to be experiencing a lot more glitchiness when trying to use local variables from other functions or classes. Sometimes it works fine, but sometimes it doesn't work at all. Sometimes it results in CTD, sometimes the value of the local variable appears to "get lost".
So, we've starting to make more use of a feature of UPKmodder (I'm not sure if wghost's tools support this, but they probably do ^_^) -- changing the type of a variable.
I've written up a small blurb on how to use UPKmodder to change a variable type:
-----
How to change the type of return values, function parameters, local variables and class variables.
All four of these objects work similarly with respect to changing their type.
The basic UPKmodder header format is :
OBJECT_ENTRY=bWuss@MarkWussySoldiers@XGFacility_Barracks
ACTION=typechange
OBJECT_ENTRY= is functionally identical to FUNCTION=. UPKmodder allows the alternate usage to assist with clarity.
The ACTION= line specifies that this is a typechange action. Typechanges are different from "standard" hex swaps because they alter the object table entry instead of the object itself.
The body format is quite simple:
[BEFORE_HEX]
OBJECT_TYPE=Core:BoolProperty@Core
SIZE=28 // hexadecimal
[/BEFORE_HEX]
[AFTER_HEX]
OBJECT_TYPE=Core:IntProperty@Core
SIZE=28 // hexadecimal
[/AFTER_HEX]
Only 2 parameters are needed, and both are required.
The OBJECT_TYPE must resolve to a reference in the import table. This is how the upk defines variable types. Using the name makes the change more patch-safe.
Valid types are:
- BoolProperty
- ByteProperty
- IntProperty
- FloatProperty
- ObjectProperty
- ClassProperty
- StrProperty
- StructProperty
- NameProperty
- InterfaceProperty
For the most part I'd expect bool, int, float, byte, and object to be the most commonly used.
Different objects can have different sizes, which can require adjusting the specified size. Increasing the size will not resize the upk -- it is primarily used to specify a smaller size when converting objects to simpler variables, which leaves some dead space. I don't know the size of all of the types yet, but :
- BoolProperty : x28 bytes
- ByteProperty : x28 bytes
- IntProperty : x28 bytes
- FloatProperty : x28 bytes
- ObjectProperty : x2C bytes
To swap between the first 4, simply put the size the same in BEFORE and AFTER. ObjectProperties are 4 bytes larger, as the last 4 bytes of the referenced object are a reference to the particular class the object references. Changing from a simpler type to an object is currently not possible, but an object variable can be converted to a simpler type with :
OBJECT_ENTRY=kCanvas@DebugAnims@XGUnit
ACTION=typechange
[BEFORE_HEX]
OBJECT_TYPE=Core:ObjectProperty@Core
SIZE=2C // hexadecimal
[/BEFORE_HEX]
[AFTER_HEX]
OBJECT_TYPE=Core:IntProperty@Core
SIZE=28 // hexadecimal
[/AFTER_HEX]
Note that the BEFORE is an ObjectProperty with listed size of 2C, and the AFTER is an IntProperty with size 28. This creates a small 4 byte "dead space" between the kCanvas object and the next object in the upk.
Below are a couple of working examples of typechanges I've created while working on Long War EW to use as a template:
Changing an object type parameter into an int type
Changing a boolean local variable into an int variable: