Jump to content

Adding Additional Perks to Aliens


Krazyguy75

Recommended Posts

Hello,

 

I've been working on a mod that makes it much harder for me to win, via giving the Aliens additional abilities. But I wanted something more than that: I wanted additional perks.

 

I was wondering if anyone has gathered research on how to add perks to Alien types. I see a lot of research on giving your soldier cool new perk trees, but I have yet to find any code on giving Aliens perks.

 

Is it possible to do this?

Link to comment
Share on other sites

It is possible, with some substantial hex editing. Generally you should only give the aliens 'passive' perks, not ones (like Run N' Gun) that would require additional AI for them to utilize.

 

This thread has a few of the basics

 

What we've done in Long War is take over and rewrite a debugging function to grant perks to semi-randomly to aliens after a certain amount of time has passed. Unfortunately, in Long War it is integrated with several other features (like larger pods and alien research) so I'm not sure sharing only the specific perk-granting code would help you very much, but I'd be happy to if you'd like.

Link to comment
Share on other sites

I created a simplified version of what was done in Long War, calling the XGUnit.DebugAnims function that was taken over in order to assign perks to aliens from the XGUnit.Init instead of from the pod creation.

 

I also set up a basic ternary hex template which can be more easily duplicated to assign new perks to aliens without having to calculate jump offsets, so it's a bit more friendly for novice hex coders.

 

The prototype ternary hex looks like so:

(Offset == ## ? m_kCharacter.GivePerk(##) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C ## 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C ## 16 01 00 0B 

Offset is the holder of the alien's pawn type. Pawn types can be looked up using Bertilsson's excellent reverse lookup tool : http://hem.bredband.net/bertrich/XCOM/ReverseLookup.htm

 

I also have a "cheatsheet" of alien pawntypes:

 

 

PawnTypes:
28 = 1C = ePawnType_Sectoid,
29 = 1D = ePawnType_Sectoid_Commander,
30 = 1E = ePawnType_Floater,
31 = 1F = ePawnType_Floater_Heavy,
32 = 20 = ePawnType_Muton,
33 = 21 = ePawnType_Muton_Elite,
34 = 22 = ePawnType_Muton_Berserker,
35 = 23 = ePawnType_ThinMan,
36 = 24 = ePawnType_Elder,
37 = 25 = ePawnType_CyberDisc,
38 = 26 = ePawnType_Reaper,
39 = 27 = ePawnType_Chryssalid,
40 = 28 = ePawnType_Sectopod,
41 = 29 = ePawnType_SectopodDrone,
42 = 2A = ePawnType_Zombie,
43 = 2B = ePawnType_Outsider,
44 = 2C = ePawnType_EtherealUber, 

 

 

 

So there's really two parts to this.

 

The first is to apply the hex change the causes XGUnit.Init to call DebugAnims for alien units:

 

 

 

XGUnit.Init
original hex:
40 B0 00 00 50 55 00 00 00 00 00 00 25 B0 00 00 13 32 00 00 00 00 00 00 2B B0 00 00 00 00 00 00 7D 05 00 00 01 BF 00 00 4F 02 00 00 BF 01 00 00 49 02 00 28 15 49 02 00 27 15 1C 13 32 00 00 00 2B B0 00 00 00 2A B0 00 00 00 29 B0 00 00 2D 00 28 B0 00 00 4A 16 0F 01 62 AF 00 00 01 ED F9 FF FF 0F 01 0A 31 00 00 00 2A B0 00 00 19 01 0A 31 00 00 0A 00 00 00 00 00 00 1B F3 3A 00 00 00 00 00 00 16 1B 5C 02 00 00 00 00 00 00 35 CE 0D 00 00 D5 0D 00 00 00 00 19 01 0A 31 00 00 09 00 C3 A2 00 00 00 01 C3 A2 00 00 4A 16 0F 01 63 AF 00 00 00 2B B0 00 00 1B E8 5D 00 00 00 00 00 00 16 1B D5 5D 00 00 00 00 00 00 16 1B DE 5D 00 00 00 00 00 00 16 1B E6 5D 00 00 00 00 00 00 16 14 2D 01 89 AF 00 00 19 01 0A 31 00 00 0A 00 B7 A2 00 00 00 2D 01 B7 A2 00 00 1B 20 62 00 00 00 00 00 00 24 00 16 1B 9E 66 00 00 00 00 00 00 2D 00 27 B0 00 00 4A 16 07 52 01 72 01 09 31 00 00 2A 16 04 28 07 6E 01 2D 00 28 B0 00 00 07 6E 01 1B E1 19 00 00 00 00 00 00 16 04 28 19 00 29 B0 00 00 15 00 00 00 00 00 00 1B 75 02 00 00 00 00 00 00 17 2D 01 F1 30 00 00 16 07 B2 01 1B C6 3C 00 00 00 00 00 00 16 1B 5B 3A 00 00 00 00 00 00 16 06 BF 01 07 BF 01 1B 82 3D 00 00 00 00 00 00 16 07 03 02 9A 35 D3 0D 00 00 D5 0D 00 00 00 00 19 01 0A 31 00 00 09 00 C3 A2 00 00 00 01 C3 A2 00 00 2C 0E 16 14 2D 01 EF 30 00 00 27 1B 2F 63 00 00 00 00 00 00 4A 16 1B BC 61 00 00 00 00 00 00 24 00 16 1B 6E 13 00 00 00 00 00 00 16 1B F1 01 00 00 00 00 00 00 16 0F 01 68 AF 00 00 1B 2F 35 00 00 00 00 00 00 16 04 27 04 3A 26 B0 00 00 53 
	

new hex: (virtual 0x253)
40 B0 00 00 50 55 00 00 00 00 00 00 25 B0 00 00 13 32 00 00 00 00 00 00 2B B0 00 00 00 00 00 00 7D 05 00 00 01 BF 00 00 53 02 00 00 BF 01 00 00 49 02 00 28 15 49 02 00 27 15 1C 13 32 00 00 00 2B B0 00 00 00 2A B0 00 00 00 29 B0 00 00 2D 00 28 B0 00 00 4A 16 0F 01 62 AF 00 00 01 ED F9 FF FF 0F 01 0A 31 00 00 00 2A B0 00 00 19 01 0A 31 00 00 0A 00 00 00 00 00 00 1B F3 3A 00 00 00 00 00 00 16 1B 5C 02 00 00 00 00 00 00 35 CE 0D 00 00 D5 0D 00 00 00 00 19 01 0A 31 00 00 09 00 C3 A2 00 00 00 01 C3 A2 00 00 4A 16 0F 01 63 AF 00 00 00 2B B0 00 00 1B E8 5D 00 00 00 00 00 00 16 1B D5 5D 00 00 00 00 00 00 16 1B DE 5D 00 00 00 00 00 00 16 1B E6 5D 00 00 00 00 00 00 16 14 2D 01 89 AF 00 00 19 01 0A 31 00 00 0A 00 B7 A2 00 00 00 2D 01 B7 A2 00 00 1B 20 62 00 00 00 00 00 00 24 00 16 1B 9E 66 00 00 00 00 00 00 2D 00 27 B0 00 00 4A 16 07 52 01 72 01 09 31 00 00 2A 16 04 28 07 6E 01 2D 00 28 B0 00 00 07 6E 01 1B E1 19 00 00 00 00 00 00 16 04 28 19 00 29 B0 00 00 15 00 00 00 00 00 00 1B 75 02 00 00 00 00 00 00 17 2D 01 F1 30 00 00 16 07 CD 01 1B C6 3C 00 00 00 00 00 00 16 1B 5B 3A 00 00 00 00 00 00 16 1B 91 14 00 00 00 00 00 00 00 2B B0 00 00 00 2B B0 00 00 16 0B 0B 07 11 02 9A 35 D3 0D 00 00 D5 0D 00 00 00 00 19 01 0A 31 00 00 09 00 C3 A2 00 00 00 01 C3 A2 00 00 2C 0E 16 14 2D 01 EF 30 00 00 27 1B 2F 63 00 00 00 00 00 00 4A 16 1B BC 61 00 00 00 00 00 00 24 00 16 1B 6E 13 00 00 00 00 00 00 16 1B F1 01 00 00 00 00 00 00 16 0F 01 68 AF 00 00 1B 2F 35 00 00 00 00 00 00 16 04 27 53  

 

 

 

This changes the lines:

    if(IsAI())
    {
        InitBehavior();
    }
    else // 3 bytes
    {
        if(isHuman()) 
        {
        }
    }

to:

    if(IsAI())
    {
        InitBehavior();
        DebugAnims(local1, local2);
    }

The second step is re-building the DebugAnims function to assign perks to aliens based on pawn type.

 

Here's some example broken down hex lines that illustrate how a variety of perks are given to different aliens in DebugAnims :

 

 

Offset = int(GetPawnType()); +4 virtual bytes (18 file, 22 virtual)
0F 00 97 B5 00 00 38 3A 1B F1 33 00 00 00 00 00 00 16 

// Sectoid given Low Profile
(Offset == 28 ? m_kCharacter.GivePerk(5) : nothing) (40 bytes perk added) + 12 = 0xC virtual bytes per call
45 9A 00 97 B5 00 00 2C 1C 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 05 16 01 00 0B 

// Sectoid Commander given Low Profile
(Offset == 29 ? m_kCharacter.GivePerk(5) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 1D 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 05 16 01 00 0B 

// Floater given Aggression
(Offset == 30 ? m_kCharacter.GivePerk(32) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 1E 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 20 16 01 00 0B 

// Heavy Floater given Aggression
(Offset == 31 ? m_kCharacter.GivePerk(32) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 1F 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 20 16 01 00 0B 

// Muton given Covering Fire
(Offset == 32 ? m_kCharacter.GivePerk(47) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 20 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 2F 16 01 00 0B 

// Thin Man given Damn Good Ground
(Offset == 35 ? m_kCharacter.GivePerk(15) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 23 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 0F 16 01 00 0B 

// Muton Elite given Will To Survive
(Offset == 33 ? m_kCharacter.GivePerk(17) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 21 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 11 16 01 00 0B 

// Cyberdisc given Close and Personal
(Offset == 37 ? m_kCharacter.GivePerk(34) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 25 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 22 16 01 00 0B 

// Chryssalid given Lightning Reflexes
(Offset == 39 ? m_kCharacter.GivePerk(35) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 27 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 23 16 01 00 0B 

// Sectopod given Resilience
(Offset == 40 ? m_kCharacter.GivePerk(43) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 28 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 2B 16 01 00 0B 

// Sectopod given Bring Em On
(Offset == 40 ? m_kCharacter.GivePerk(39) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 28 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 27 16 01 00 0B 

// Drone given HoloTargeting
(Offset == 41 ? m_kCharacter.GivePerk(19) : nothing) (40 bytes perk added)
45 9A 00 97 B5 00 00 2C 29 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 13 16 01 00 0B 


null-ops (2062 bytes)
0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 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, endofscript
04 0B 53  

 

 

 

One slightly tricky bit is updating the function header based on the number of perk lines added. Each new ternary operator line assigning a new perk adds 40 file bytes and 52 memory bytes (so +12 memory bytes). This means that the memory size in the function header has to be increased by 12 = 0x0C for every line added.

 

Here's an example of before / after code including the different headers. The before section is the original vanilla code for DebugAnims (which is being entirely replaced).

 

 

XGUnit.DebugAnims


original hex:( 2562 bytes )
header:
B3 B5 00 00 50 55 00 00 00 00 00 00 93 B5 00 00 00 00 00 00 00 00 00 00 9E B5 00 00 00 00 00 00 FE 23 00 00 84 8D 04 00 B2 0E 00 00 02 0A 00 00 

body:
14 2D 00 99 B5 00 00 27 0F 00 98 B5 00 00 25 14 2D 00 95 B5 00 00 FE 19 00 9D B5 00 00 09 00 CD 6E 00 00 00 01 CD 6E 00 00 19 17 09 00 04 FA FF FF 00 01 04 FA FF FF 16 07 AF 0E 82 82 77 01 09 31 00 00 2A 16 18 20 00 19 00 9D B5 00 00 0A 00 FD 6E 00 00 00 2D 01 FD 6E 00 00 16 18 39 00 84 FE 19 00 9D B5 00 00 09 00 CD 6E 00 00 00 01 CD 6E 00 00 21 50 55 00 00 00 00 00 00 16 18 0B 00 2D 00 95 B5 00 00 16 16 0F 00 94 B5 00 00 19 00 9E B5 00 00 13 00 D4 F8 FF FF 00 1C 13 FC FF FF 01 DE F8 FF FF 16 19 00 9E B5 00 00 11 00 00 00 00 00 00 1C 12 FC FF FF 24 FF 24 FF 24 FF 4A 16 19 00 9E B5 00 00 4A 00 00 00 00 00 00 1C 11 FC FF FF 35 1C FD FF FF 5B F9 FF FF 00 00 00 94 B5 00 00 B8 35 1B FD FF FF 5B F9 FF FF 00 01 00 94 B5 00 00 1E 00 00 70 41 16 4A 16 19 00 9E B5 00 00 26 00 00 00 00 00 00 1C 15 FC FF FF 38 57 19 17 09 00 04 FA FF FF 00 01 04 FA FF FF 4A 4A 4A 4A 16 19 00 9E B5 00 00 4A 00 00 00 00 00 00 1C 11 FC FF FF 35 1C FD FF FF 5B F9 FF FF 00 00 00 94 B5 00 00 B8 35 1B FD FF FF 5B F9 FF FF 00 01 00 94 B5 00 00 1E 00 00 70 41 16 4A 16 19 00 9E B5 00 00 28 00 00 00 00 00 00 1C 15 FC FF FF A8 1F 43 75 72 72 41 63 74 69 6F 6E 3A 00 38 56 01 E2 30 00 00 16 4A 4A 4A 4A 16 07 8C 02 1B DB 3D 00 00 00 00 00 00 16 19 00 9E B5 00 00 11 00 00 00 00 00 00 1C 12 FC FF FF 24 96 24 FF 24 96 4A 16 06 B2 02 19 00 9E B5 00 00 11 00 00 00 00 00 00 1C 12 FC FF FF 24 FF 24 96 24 96 4A 16 19 00 9E B5 00 00 4A 00 00 00 00 00 00 1C 11 FC FF FF 35 1C FD FF FF 5B F9 FF FF 00 00 00 94 B5 00 00 B8 35 1B FD FF FF 5B F9 FF FF 00 01 00 94 B5 00 00 1E 00 00 70 41 16 4A 16 19 00 9E B5 00 00 6A 00 00 00 00 00 00 1C 15 FC FF FF A8 A8 A8 1F 4C 6F 63 61 74 69 6F 6E 3A 00 38 58 19 01 09 31 00 00 09 00 DE F8 FF FF 00 01 DE F8 FF FF 16 1F 52 6F 74 61 74 69 6F 6E 3A 00 16 38 59 19 01 09 31 00 00 09 00 DD F8 FF FF 00 01 DD F8 FF FF 16 4A 4A 4A 4A 16 19 00 9E B5 00 00 4A 00 00 00 00 00 00 1C 11 FC FF FF 35 1C FD FF FF 5B F9 FF FF 00 00 00 94 B5 00 00 B8 35 1B FD FF FF 5B F9 FF FF 00 01 00 94 B5 00 00 1E 00 00 70 41 16 4A 16 19 00 9E B5 00 00 1D 00 00 00 00 00 00 1C 15 FC FF FF A8 1F 53 74 61 74 65 3A 00 38 57 61 1C 16 16 4A 4A 4A 4A 16 19 00 9E B5 00 00 4A 00 00 00 00 00 00 1C 11 FC FF FF 35 1C FD FF FF 5B F9 FF FF 00 00 00 94 B5 00 00 B8 35 1B FD FF FF 5B F9 FF FF 00 01 00 94 B5 00 00 1E 00 00 70 41 16 4A 16 19 00 9E B5 00 00 B5 00 00 00 00 00 00 1C 15 FC FF FF A8 A8 A8 A8 A8 1F 50 68 79 73 69 63 73 3A 00 38 52 19 01 09 31 00 00 09 00 C3 FE FF FF 00 01 C3 FE FF FF 16 1F 50 68 79 73 57 65 69 67 68 74 3A 00 16 38 55 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 D2 FC FF FF 00 01 D2 FC FF FF 16 1F 4D 6F 74 6F 72 3A 00 16 38 55 19 2E CF 37 00 00 01 09 31 00 00 09 00 04 36 00 00 00 01 04 36 00 00 16 4A 4A 4A 4A 16 19 00 9E B5 00 00 11 00 00 00 00 00 00 1C 12 FC FF FF 24 FF 24 FF 24 FF 4A 16 07 AF 0E 82 77 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 2A 16 18 22 00 77 19 01 09 31 00 00 09 00 EE 34 00 00 00 01 EE 34 00 00 2A 16 16 07 25 06 82 77 19 01 09 31 00 00 09 00 ED 34 00 00 00 01 ED 34 00 00 2A 16 18 35 00 19 19 01 09 31 00 00 09 00 ED 34 00 00 00 01 ED 34 00 00 0A 00 A2 FF FF FF 00 2D 01 A2 FF FF FF 16 0F 00 98 B5 00 00 26 06 30 06 0F 00 98 B5 00 00 25 07 C0 06 77 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 0A 00 E4 F9 FF FF 00 1B F9 34 00 00 00 00 00 00 16 2A 16 0F 00 96 B5 00 00 19 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 0A 00 E4 F9 FF FF 00 1B F9 34 00 00 00 00 00 00 16 09 00 00 FA FF FF 00 01 00 FA FF FF 06 D3 06 0F 00 96 B5 00 00 21 9C 6D 00 00 00 00 00 00 07 DE 07 82 77 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 0A 00 E4 F9 FF FF 00 1B F9 34 00 00 00 00 00 00 16 2A 16 18 4D 00 77 19 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 0A 00 E4 F9 FF FF 00 1B F9 34 00 00 00 00 00 00 16 09 00 E3 F9 FF FF 00 01 E3 F9 FF FF 2A 16 16 0F 00 9A B5 00 00 19 19 19 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 0A 00 E4 F9 FF FF 00 1B F9 34 00 00 00 00 00 00 16 09 00 E3 F9 FF FF 00 01 E3 F9 FF FF 09 00 F5 F9 FF FF 00 01 F5 F9 FF FF 09 00 04 FA FF FF 00 01 04 FA FF FF 06 F1 07 0F 00 9A B5 00 00 21 9C 6D 00 00 00 00 00 00 07 FD 08 84 9B 38 3A 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 B0 FE FF FF 00 01 B0 FE FF FF 38 3A 24 02 16 18 3C 00 9B 38 3A 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 AF FE FF FF 00 01 AF FE FF FF 38 3A 24 00 16 16 0F 00 9B B5 00 00 70 70 70 70 1F 52 4D 20 5B 00 38 52 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 B0 FE FF FF 00 01 B0 FE FF FF 16 1F 5D 20 52 4D 52 20 5B 00 16 38 52 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 AF FE FF FF 00 01 AF FE FF FF 16 1F 5D 00 16 07 FC 09 9B 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 2C 04 16 0F 00 9C B5 00 00 A8 A8 A8 A8 A8 70 70 70 70 1F 28 00 38 53 36 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 D4 FF FF FF 00 01 D4 FF FF FF 16 1F 3A 00 16 38 57 00 9A B5 00 00 16 1F 29 00 16 38 53 92 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 26 16 16 1F 4D 72 3A 00 16 38 53 00 98 B5 00 00 16 00 9B B5 00 00 16 38 57 00 96 B5 00 00 16 06 C5 0C 07 AD 0B 82 82 9A 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 2C 04 16 18 38 00 9B 19 19 01 09 31 00 00 09 00 EE 34 00 00 00 01 EE 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 2C 21 16 16 18 38 00 9B 19 19 01 09 31 00 00 09 00 EE 34 00 00 00 01 EE 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 2C 22 16 16 0F 00 9C B5 00 00 A8 A8 A8 A8 A8 A8 70 70 70 70 1F 28 00 38 53 36 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 D4 FF FF FF 00 01 D4 FF FF FF 16 1F 3A 00 16 38 57 00 9A B5 00 00 16 1F 29 00 16 38 53 92 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 26 16 16 38 53 92 19 19 01 09 31 00 00 09 00 EE 34 00 00 00 01 EE 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 26 16 16 1F 4D 72 3A 00 16 38 53 00 98 B5 00 00 16 00 9B B5 00 00 16 38 57 00 96 B5 00 00 16 06 C5 0C 0F 00 9C B5 00 00 A8 A8 A8 A8 A8 A8 A8 70 70 70 70 1F 28 00 38 53 36 19 19 01 09 31 00 00 09 00 57 FD FF FF 00 01 57 FD FF FF 09 00 D4 FF FF FF 00 01 D4 FF FF FF 16 1F 3A 00 16 38 57 00 9A B5 00 00 16 1F 29 00 16 38 53 92 19 19 01 09 31 00 00 09 00 F1 34 00 00 00 01 F1 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 26 16 16 38 53 92 19 19 01 09 31 00 00 09 00 EE 34 00 00 00 01 EE 34 00 00 09 00 37 FA FF FF 00 01 37 FA FF FF 26 16 16 1F 4D 72 3A 00 16 38 53 00 98 B5 00 00 16 00 9B B5 00 00 16 38 57 19 01 53 AF 00 00 03 00 05 FA FF FF 00 61 1C 16 16 38 57 00 96 B5 00 00 16 07 54 0D 97 36 01 44 AF 00 00 25 16 0F 00 97 B5 00 00 7E 10 93 36 01 44 AF 00 00 26 16 01 44 AF 00 00 1F 5D 00 4A 4A 4A 16 07 54 0D 82 9B 00 97 B5 00 00 1D FF FF FF FF 16 18 33 00 7A 7F 10 93 36 01 44 AF 00 00 26 16 01 44 AF 00 00 92 00 97 B5 00 00 2C 02 16 4A 16 00 9C B5 00 00 16 16 14 2D 00 99 B5 00 00 28 07 E9 0D 2D 00 99 B5 00 00 07 7F 0D 97 36 01 44 AF 00 00 2C 14 16 40 01 44 AF 00 00 25 26 16 55 01 44 AF 00 00 23 00 A8 70 70 1F 5B 00 38 53 A5 01 43 AF 00 00 16 16 1F 5D 00 16 00 9C B5 00 00 16 16 07 CC 0D 97 01 43 AF 00 00 1D E8 03 00 00 16 0F 01 43 AF 00 00 25 07 E9 0D 2D 00 95 B5 00 00 07 E9 0D 7B 00 9B B5 00 00 1F 00 16 07 AF 0E 19 00 9D B5 00 00 0A 00 FC 6E 00 00 00 2D 01 FC 6E 00 00 58 01 44 AF 00 00 00 9C B5 00 00 00 4A AE 0E 19 00 9E B5 00 00 4A 00 00 00 00 00 00 1C 11 FC FF FF 35 1C FD FF FF 5B F9 FF FF 00 00 00 94 B5 00 00 B8 35 1B FD FF FF 5B F9 FF FF 00 01 00 94 B5 00 00 1E 00 00 70 41 16 4A 16 19 00 9E B5 00 00 17 00 00 00 00 00 00 1C 15 FC FF FF 00 9C B5 00 00 4A 4A 4A 4A 16 31 30 04 0B 53 


new hex:(virtual 0xA02 base with no functions) + 0x094 = 0xA96
header:
B3 B5 00 00 50 55 00 00 00 00 00 00 93 B5 00 00 00 00 00 00 00 00 00 00 9E B5 00 00 00 00 00 00 FE 23 00 00 84 8D 04 00 96 0A 00 00 02 0A 00 00 

body:
0F 00 97 B5 00 00 38 3A 1B F1 33 00 00 00 00 00 00 16 45 9A 00 97 B5 00 00 2C 1C 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 05 16 01 00 0B 45 9A 00 97 B5 00 00 2C 1D 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 05 16 01 00 0B 45 9A 00 97 B5 00 00 2C 1E 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 20 16 01 00 0B 45 9A 00 97 B5 00 00 2C 1F 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 20 16 01 00 0B 45 9A 00 97 B5 00 00 2C 20 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 2F 16 01 00 0B 45 9A 00 97 B5 00 00 2C 23 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 0F 16 01 00 0B 45 9A 00 97 B5 00 00 2C 21 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 11 16 01 00 0B 45 9A 00 97 B5 00 00 2C 25 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 22 16 01 00 0B 45 9A 00 97 B5 00 00 2C 27 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 23 16 01 00 0B 45 9A 00 97 B5 00 00 2C 28 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 2B 16 01 00 0B 45 9A 00 97 B5 00 00 2C 28 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 27 16 01 00 0B 45 9A 00 97 B5 00 00 2C 29 16 21 00 19 01 0A 31 00 00 0C 00 EA A2 00 00 00 1B B7 35 00 00 00 00 00 00 2C 13 16 01 00 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 04 0B 53 

 

 

 

The original function's header is:

header:
B3 B5 00 00 50 55 00 00 00 00 00 00 93 B5 00 00 00 00 00 00 00 00 00 00 9E B5 00 00 00 00 00 00 FE 23 00 00 84 8D 04 00 B2 0E 00 00 02 0A 00 00 

The key parts here are the last two 4 byte words, 0xEB2 and 0xA02. 0xEB2 is the memory size of the function and 0xA02 is the file size of the function. If these don't match the game will CTD on startup.

 

The new function's header is:

B3 B5 00 00 50 55 00 00 00 00 00 00 93 B5 00 00 00 00 00 00 00 00 00 00 9E B5 00 00 00 00 00 00 FE 23 00 00 84 8D 04 00 96 0A 00 00 02 0A 00 00 

Note that the file size of 0xA02 is unchanged, but the memory size declared has been reduced to 0x48D.

 

The first line assigning the pawntype to the variable Offset adds 4 memory bytes. There are 12 perks being assigned, and each adds 12 memory bytes. This results in 12 * 12 + 4 = 148 = 0x94 additional required memory bytes above the basic file size. 0xA02 + 0x94 = 0xA96, which is the new function's declared memory size.

Link to comment
Share on other sites

Wow, I can't believe I missed that with all my searching...

 

But thank you all for your help, it's been very useful!

 

Now the Ethereal Uber should have Vengeance shots for the non-deflected attacks (of course, there were other changes, but this is my favorite; hopefully vengeance works with the Elder Weapon).

Link to comment
Share on other sites

Now the Ethereal Uber should have Vengeance shots for the non-deflected attacks (of course, there were other changes, but this is my favorite; hopefully vengeance works with the Elder Weapon).

Very unlikely, because Vengeance force unit to take reaction shot against attacker, and it seems like Elder Weapon cannot do overwatch/reaction shots at all. Or any shots at all. While Psi-Lance is treated like normal shot (hit percentages affected by cover and all), but ultimately is an ability of Ethereal itself (ie character ability), and Elder Weapon is needed to launch those Psi-Lances in similar way, how Heavy needs his rocket lancher to fire rockets.

Edited by Tycus
Link to comment
Share on other sites

 

Now the Ethereal Uber should have Vengeance shots for the non-deflected attacks (of course, there were other changes, but this is my favorite; hopefully vengeance works with the Elder Weapon).

Very unlikely, because Vengeance force unit to take reaction shot against attacker, and it seems like Elder Weapon cannot do overwatch/reaction shots at all. Or any shots at all. While Psi-Lance is treated like normal shot (hit percentages affected by cover and all), but ultimately is an ability of Ethereal itself (ie character ability), and Elder Weapon is needed to launch those Psi-Lances in similar way, how Heavy needs his rocket lancher to fire rockets.

 

I'm slightly confused. Would adding the ShotStandard and Overwatch abilities to the item allow it to be used for reaction? I lack much experience with the games coding, so I'm not quite sure why it would be very different from, say, the Sectopods overwatch cannon. It doesn't have CantReact..? Is it because it lacks a Rifle or Secondary, or etc? Or is there some other variable which determines which items can be used for reaction?

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...