Jump to content

Probably found a way to edit ability tree's of your troops and ene


Nolanoth

Recommended Posts

Alright I opened the file:

 

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  7B 65 00 00 D4 54 00 00 00 00 00 00 66 65 00 00  {e..ÔT......fe..
00000010  00 00 00 00 00 00 00 00 69 65 00 00 00 00 00 00  ........ie......
00000020  92 01 00 00 DB 3D 00 00 57 01 00 00 0F 01 00 00  ’...Ű=..W.......
00000030  07 15 00 9A 00 69 65 00 00 26 16 04 2C 06 06 4A  ...š.ie..&..,..J
00000040  01 07 4F 00 9A 00 69 65 00 00 2C 02 16 07 3A 00  ..O.š.ie..,...:.
00000050  9A 00 68 65 00 00 25 16 04 2C 20 06 4C 00 07 4C  š.he..%.., .L..L
00000060  00 9A 00 68 65 00 00 26 16 04 2C 21 06 4A 01 07  .š.he..&..,!.J..
00000070  89 00 9A 00 69 65 00 00 2C 03 16 07 74 00 9A 00  ‰.š.ie..,...t.š.
00000080  68 65 00 00 25 16 04 2C 22 06 86 00 07 86 00 9A  he..%..,".†..†.š
00000090  00 68 65 00 00 26 16 04 2C 23 06 4A 01 07 C3 00  .he..&..,#.J..Ă.
000000A0  9A 00 69 65 00 00 2C 04 16 07 AE 00 9A 00 68 65  š.ie..,...®.š.he
000000B0  00 00 25 16 04 2C 24 06 C0 00 07 C0 00 9A 00 68  ..%..,$.Ŕ..Ŕ.š.h
000000C0  65 00 00 26 16 04 2C 25 06 4A 01 07 FD 00 9A 00  e..&..,%.J..ý.š.
000000D0  69 65 00 00 2C 05 16 07 E8 00 9A 00 68 65 00 00  ie..,...č.š.he..
000000E0  25 16 04 2C 27 06 FA 00 07 FA 00 9A 00 68 65 00  %..,'.ú..ú.š.he.
000000F0  00 26 16 04 2C 28 06 4A 01 07 13 01 9A 00 69 65  .&..,(.J....š.ie
00000100  00 00 2C 06 16 04 2C 1B 06 4A 01 07 4A 01 9A 00  ..,...,..J..J.š.
00000110  69 65 00 00 2C 07 16 07 38 01 9A 00 68 65 00 00  ie..,...8.š.he..
00000120  25 16 04 2C 29 06 4A 01 07 4A 01 9A 00 68 65 00  %..,).J..J.š.he.
00000130  00 26 16 04 2C 2B 04 25 04 3A 67 65 00 00 53 00  .&..,+.%.:ge..S.
00000140  00 00 02 00 02 00 BE 33 00 00 00 00 00 00        ......ľ3......

 

GetPerkInTreeAssault.Function

 

I'm guessing this is the full list of perks for the class? How do I find the one I need in this code?

Edited by Nolanoth
Link to comment
Share on other sites

Now you kinda gotta mess around with values... remember to back-up xcomgame.upk in case you mess up.

 

Now look at this reference:

 

http://dl.dropbox.com/u/32777109/Games/XCOM%202012/output.txt

 

You can see things like 9A represents an == in the UE explorer, 9B is != 26 is a special hex value for 1, and 25 for 0. SO if you find a 1 represented by 26, at this point you can only change that value between 1 and 0.

 

Those are just examples... i don't really have much of an idea of what i'm doing... you can also use:

 

http://www.maxi-pedia.com/hex+to+decimal+converter

 

To convert between hex values and their decimal values.

Link to comment
Share on other sites

Example... you want to change the first perk in the tree..

 

It happens to be a 6, you find the first value of 6... but in this case it must be after a 2C, which determines a IntConstByte.

 

So the first 2C 06 is 26 16 04 2C 06 06 4A 01

 

I don't know much but if you change that 06 to another number representing another perk it will give that perk to your soldier at level 1.

Link to comment
Share on other sites

I was checking the Assault abilities further and they seem like a one big, gigantic mess to be honest. So the way I understand it if I change the 2C 06 06 to let's say 2C 21 06 I should get suppression right? But the next 2C value looks like this 2C 02 16 and that 02 is BuildPerk(2, 1, "PrecisionShot"); => return 2 of the GetPerkInTreeSniper which is called ingame as "Headshot" and that's just hella weird! o_O

 

Ah wait you meant 2C 06 then (06) XX <- after it is the ability? But then it's still a mess... where did all the other abilities go? Or... nah that can't be right. The first 06 is the ability right?

 

But then where's the second ability? 2C 02 16?

Edited by Nolanoth
Link to comment
Share on other sites

Oh, niceties. How about really specializing the classes. Some ways it always bothered me that all classes were somewhat hybrids. The fact that snipers have battlescannerwhatchacallit is plain stupid. Sama skill for some forward soldier would be actually useful.
Link to comment
Share on other sites

I was checking the Assault abilities further and they seem like a one big, gigantic mess to be honest. So the way I understand it if I change the 2C 06 06 to let's say 2C 21 06 I should get suppression right? But the next 2C value looks like this 2C 02 16 and that 02 is BuildPerk(2, 1, "PrecisionShot"); => return 2 of the GetPerkInTreeSniper which is called ingame as "Headshot" and that's just hella weird! o_O

 

Ah wait you meant 2C 06 then (06) XX <- after it is the ability? But then it's still a mess... where did all the other abilities go? Or... nah that can't be right. The first 06 is the ability right?

 

But then where's the second ability? 2C 02 16?

 

The first six was the ability.... yes the 2C 02 16 would be the second ability.

 

16 means End function parms.. in other words ) ... and then the 4A 01 is the return 1

 

26 is an IntOne, unfortunately you can't change those yet, other than to 25, which is int0.

 

also 9A is == and 9B is !=

 

07s and 06s are you jump tokens.

 

And if you screw up the code it doesn't compile anything after where you messed up.. that's why it because a big mess in UE Explorer

Link to comment
Share on other sites

Thx I got this stuff working. Now all need is to write down a list of the things we need to know. Separate each perk code and describe it so I'll edit this text in a while with some general info.

 

XComGame.upk => XComPerkManager list:

 

        BuildPerk(0, 0, "Unknown");
       BuildPerk(2, 1, "PrecisionShot");
       BuildPerk(3, 0, "SquadSight");
       BuildPerk(95, 0, "Gunslinger");
       BuildPerk(5, 0, "LowProfile");
       BuildPerk(16, 0, "SnapShot");
       BuildPerk(9, 1, "DisablingShot");
       BuildPerk(10, 0, "Opportunist");
       BuildPerk(11, 0, "Executioner");
       BuildPerk(12, 0, "ButtonUp");
       BuildPerk(15, 0, "DamnGoodGround");
       BuildPerk(13, 0, "DoubleTap");
       BuildPerk(14, 0, "InTheZone");
       BuildPerk(8, 1, "BattleScanner");
       BuildPerk(18, 0, "FireRocket");
       BuildPerk(19, 0, "TracerBeams");
       BuildPerk(20, 0, "HEATRockets");
       BuildPerk(91, 0, "HEATAmmo");
       BuildPerk(21, 1, "Suppression");
       BuildPerk(22, 1, "ShredderRocket");
       BuildPerk(23, 0, "RapidReaction");
       BuildPerk(24, 0, "Grenadier");
       BuildPerk(25, 0, "DangerZone");
       BuildPerk(26, 0, "BulletSwarm");
       BuildPerk(27, 0, "ExtraConditioning");
       BuildPerk(30, 0, "ReadyForAnything");
       BuildPerk(94, 0, "Mayhem");
       BuildPerk(29, 0, "FirstBlood");
       BuildPerk(93, 0, "Rocketeer");
       BuildPerk(44, 1, "SmokeBomb");
       BuildPerk(47, 0, "CoveringFire");
       BuildPerk(48, 0, "FieldMedic");
       BuildPerk(49, 1, "RifleSuppression");
       BuildPerk(56, 1, "Revive");
       BuildPerk(51, 0, "CombatDrugs");
       BuildPerk(52, 0, "DenseSmoke");
       BuildPerk(53, 0, "DeepPockets");
       BuildPerk(54, 0, "Sentinel");
       BuildPerk(55, 0, "Savior");
       BuildPerk(6, 1, "RunAndGun");
       BuildPerk(31, 0, "Sprinter");
       BuildPerk(32, 0, "Aggression");
       BuildPerk(33, 0, "TacticalSense");
       BuildPerk(34, 0, "CloseAndPersonal");
       BuildPerk(35, 0, "LightningReflexes");
       BuildPerk(36, 1, "RapidFire");
       BuildPerk(37, 1, "Flush");
       BuildPerk(38, 0, "FlameOn");
       BuildPerk(39, 0, "BringEmOn");
       BuildPerk(40, 0, "CloseCombatSpecialist");
       BuildPerk(17, 0, "WillToSurvive");
       BuildPerk(41, 0, "KillerInstinct");
       BuildPerk(42, 0, "Vengeance");
       BuildPerk(43, 0, "Resilience");
       BuildPerk(92, 0, "SmokeAndMirrors");
       BuildPerk(57, 0, "HeightAdvantage");
       BuildPerk(59, 0, "ImmuneToDisabled");
       BuildPerk(58, 0, "DisablingShot");
       BuildPerk(60, 0, "SuppressedActive");
       BuildPerk(61, 0, "CriticallyWounded");
       BuildPerk(62, 0, "Flying");
       BuildPerk(63, 0, "Stealth");
       BuildPerk(65, 0, "ChitinPlating");
       BuildPerk(66, 0, "CombatStimsActive");
       BuildPerk(68, 0, "Panicked");
       BuildPerk(69, 1, "PsiMindfray");
       BuildPerk(71, 1, "PsiInspiration");
       BuildPerk(72, 1, "PsiMindControl");
       BuildPerk(70, 1, "PsiPanic");
       BuildPerk(73, 1, "PsiTelekineticField");
       BuildPerk(74, 1, "PsiRift");
       BuildPerk(81, 1, "Launch");
       BuildPerk(80, 1, "Evasion");
       BuildPerk(78, 1, "MindMerge2");
       BuildPerk(79, 1, "MindMerge2");
       BuildPerk(82, 1, "Bombard");
       BuildPerk(83, 1, "Leap");
       BuildPerk(84, 1, "PoisonSpit");
       BuildPerk(85, 1, "PoisonSpit");
       BuildPerk(86, 1, "Bloodcall");
       BuildPerk(87, 1, "Intimidate");
       BuildPerk(89, 1, "Bloodlust");
       BuildPerk(90, 1, "Bullrush");
       BuildPerk(75, 1, "MindMerge");
       BuildPerk(76, 1, "MindMerge");
       BuildPerk(96, 1, "HeatWave");
       BuildPerk(97, 1, "ClusterBomb");
       BuildPerk(98, 1, "PsiLance");
       BuildPerk(99, 1, "DeathBlossom");
       BuildPerk(100, 1, "Overload");
       BuildPerk(77, 0, "Harden");
       BuildPerk(101, 1, "PsiMindControl");
       BuildPerk(102, 1, "PsiDrain");
       BuildPerk(103, 1, "Repair");
       BuildPerk(104, 1, "CannonFire");
       BuildPerk(105, 0, "Implant");
       BuildPerk(106, 0, "Implant");
       BuildPerk(7, 0, "AutopsyRequired");
       BuildPerk(88, 0, "FallenComrades");
       BuildPerk(107, 0, "BattleFatigue");
       BuildPerk(108, 0, "MindShield");
       BuildPerk(46, 0, "Stun");
       BuildPerk(109, 0, "DONT_USE_ItemRangeBonus");
       BuildPerk(110, 0, "DONT_USE_ItemRangePenalty");

 

Classes / Tree Info:

 

function int GetPerkInTreePsi(int branch, int Option)
{
// End:0x15 Loop:False
if(branch == 1)
{
	return 69;
}
// End:0x9c
else
{
	// End:0x4f Loop:False
	if(branch == 2)
	{
		// End:0x3a Loop:False
		if(Option == 0)
		{
			return 70;
		}
		// End:0x4c
		else
		{
			// End:0x4c Loop:False
			if(Option == 1)
			{
				return 71;
			}
		}
	}
	// End:0x9c
	else
	{
		// End:0x89 Loop:False
		if(branch == 3)
		{
			// End:0x74 Loop:False
			if(Option == 0)
			{
				return 72;
			}
			// End:0x86
			else
			{
				// End:0x86 Loop:False
				if(Option == 1)
				{
					return 73;
				}
			}
		}
		// End:0x9c
		else
		{
			// End:0x9c Loop:False
			if(branch == 4)
			{
				return 74;
			}
		}
	}
}
return 0;
}

function int GetPerkInTreeSniper(int branch, int Option)
{
// End:0x15 Loop:False
if(branch == 1)
{
	return 2;
}
// End:0x14a
else
{
	// End:0x4f Loop:False
	if(branch == 2)
	{
		// End:0x3a Loop:False
		if(Option == 0)
		{
			return 3;
		}
		// End:0x4c
		else
		{
			// End:0x4c Loop:False
			if(Option == 1)
			{
				return 16;
			}
		}
	}
	// End:0x14a
	else
	{
		// End:0x89 Loop:False
		if(branch == 3)
		{
			// End:0x74 Loop:False
			if(Option == 0)
			{
				return 15;
			}
			// End:0x86
			else
			{
				// End:0x86 Loop:False
				if(Option == 1)
				{
					return 95;
				}
			}
		}
		// End:0x14a
		else
		{
			// End:0xc3 Loop:False
			if(branch == 4)
			{
				// End:0xae Loop:False
				if(Option == 0)
				{
					return 8;
				}
				// End:0xc0
				else
				{
					// End:0xc0 Loop:False
					if(Option == 1)
					{
						return 9;
					}
				}
			}
			// End:0x14a
			else
			{
				// End:0xfd Loop:False
				if(branch == 5)
				{
					// End:0xe8 Loop:False
					if(Option == 0)
					{
						return 10;
					}
					// End:0xfa
					else
					{
						// End:0xfa Loop:False
						if(Option == 1)
						{
							return 11;
						}
					}
				}
				// End:0x14a
				else
				{
					// End:0x113 Loop:False
					if(branch == 6)
					{
						return 5;
					}
					// End:0x14a
					else
					{
						// End:0x14a Loop:False
						if(branch == 7)
						{
							// End:0x138 Loop:False
							if(Option == 0)
							{
								return 13;
							}
							// End:0x14a
							else
							{
								// End:0x14a Loop:False
								if(Option == 1)
								{
									return 14;
								}
							}
						}
					}
				}
			}
		}
	}
}
return 0;
}

function int GetPerkInTreeHeavyWeapons(int branch, int Option)
{
// End:0x15 Loop:False
if(branch == 1)
{
	return 18;
}
// End:0x14a
else
{
	// End:0x4f Loop:False
	if(branch == 2)
	{
		// End:0x3a Loop:False
		if(Option == 0)
		{
			return 19;
		}
		// End:0x4c
		else
		{
			// End:0x4c Loop:False
			if(Option == 1)
			{
				return 26;
			}
		}
	}
	// End:0x14a
	else
	{
		// End:0x89 Loop:False
		if(branch == 3)
		{
			// End:0x74 Loop:False
			if(Option == 0)
			{
				return 21;
			}
			// End:0x86
			else
			{
				// End:0x86 Loop:False
				if(Option == 1)
				{
					return 22;
				}
			}
		}
		// End:0x14a
		else
		{
			// End:0xc3 Loop:False
			if(branch == 4)
			{
				// End:0xae Loop:False
				if(Option == 0)
				{
					return 23;
				}
				// End:0xc0
				else
				{
					// End:0xc0 Loop:False
					if(Option == 1)
					{
						return 91;
					}
				}
			}
			// End:0x14a
			else
			{
				// End:0xfd Loop:False
				if(branch == 5)
				{
					// End:0xe8 Loop:False
					if(Option == 0)
					{
						return 25;
					}
					// End:0xfa
					else
					{
						// End:0xfa Loop:False
						if(Option == 1)
						{
							return 24;
						}
					}
				}
				// End:0x14a
				else
				{
					// End:0x113 Loop:False
					if(branch == 6)
					{
						return 17;
					}
					// End:0x14a
					else
					{
						// End:0x14a Loop:False
						if(branch == 7)
						{
							// End:0x138 Loop:False
							if(Option == 0)
							{
								return 94;
							}
							// End:0x14a
							else
							{
								// End:0x14a Loop:False
								if(Option == 1)
								{
									return 93;
								}
							}
						}
					}
				}
			}
		}
	}
}
return 0;
}

function int GetPerkInTreeAssault(int branch, int Option)
{
// End:0x15 Loop:False
if(branch == 1)
{
	return 6;
}
// End:0x14a
else
{
	// End:0x4f Loop:False
	if(branch == 2)
	{
		// End:0x3a Loop:False
		if(Option == 0)
		{
			return 32;
		}
		// End:0x4c
		else
		{
			// End:0x4c Loop:False
			if(Option == 1)
			{
				return 33;
			}
		}
	}
	// End:0x14a
	else
	{
		// End:0x89 Loop:False
		if(branch == 3)
		{
			// End:0x74 Loop:False
			if(Option == 0)
			{
				return 34;
			}
			// End:0x86
			else
			{
				// End:0x86 Loop:False
				if(Option == 1)
				{
					return 35;
				}
			}
		}
		// End:0x14a
		else
		{
			// End:0xc3 Loop:False
			if(branch == 4)
			{
				// End:0xae Loop:False
				if(Option == 0)
				{
					return 36;
				}
				// End:0xc0
				else
				{
					// End:0xc0 Loop:False
					if(Option == 1)
					{
						return 37;
					}
				}
			}
			// End:0x14a
			else
			{
				// End:0xfd Loop:False
				if(branch == 5)
				{
					// End:0xe8 Loop:False
					if(Option == 0)
					{
						return 39;
					}
					// End:0xfa
					else
					{
						// End:0xfa Loop:False
						if(Option == 1)
						{
							return 40;
						}
					}
				}
				// End:0x14a
				else
				{
					// End:0x113 Loop:False
					if(branch == 6)
					{
						return 27;
					}
					// End:0x14a
					else
					{
						// End:0x14a Loop:False
						if(branch == 7)
						{
							// End:0x138 Loop:False
							if(Option == 0)
							{
								return 41;
							}
							// End:0x14a
							else
							{
								// End:0x14a Loop:False
								if(Option == 1)
								{
									return 43;
								}
							}
						}
					}
				}
			}
		}
	}
}
return 0;
}

function int GetPerkInTreeSupport(int branch, int Option)
{
// End:0x15 Loop:False
if(branch == 1)
{
	return 44;
}
// End:0x14a
else
{
	// End:0x4f Loop:False
	if(branch == 2)
	{
		// End:0x3a Loop:False
		if(Option == 0)
		{
			return 47;
		}
		// End:0x4c
		else
		{
			// End:0x4c Loop:False
			if(Option == 1)
			{
				return 31;
			}
		}
	}
	// End:0x14a
	else
	{
		// End:0x89 Loop:False
		if(branch == 3)
		{
			// End:0x74 Loop:False
			if(Option == 0)
			{
				return 92;
			}
			// End:0x86
			else
			{
				// End:0x86 Loop:False
				if(Option == 1)
				{
					return 48;
				}
			}
		}
		// End:0x14a
		else
		{
			// End:0xc3 Loop:False
			if(branch == 4)
			{
				// End:0xae Loop:False
				if(Option == 0)
				{
					return 49;
				}
				// End:0xc0
				else
				{
					// End:0xc0 Loop:False
					if(Option == 1)
					{
						return 56;
					}
				}
			}
			// End:0x14a
			else
			{
				// End:0xfd Loop:False
				if(branch == 5)
				{
					// End:0xe8 Loop:False
					if(Option == 0)
					{
						return 51;
					}
					// End:0xfa
					else
					{
						// End:0xfa Loop:False
						if(Option == 1)
						{
							return 52;
						}
					}
				}
				// End:0x14a
				else
				{
					// End:0x113 Loop:False
					if(branch == 6)
					{
						return 53;
					}
					// End:0x14a
					else
					{
						// End:0x14a Loop:False
						if(branch == 7)
						{
							// End:0x138 Loop:False
							if(Option == 0)
							{
								return 54;
							}
							// End:0x14a
							else
							{
								// End:0x14a Loop:False
								if(Option == 1)
								{
									return 55;
								}
							}
						}
					}
				}
			}
		}
	}
}
return 0;
}

 

Hexes:

 

Note to self: 2C 02 16 => 2C is like the start of an ability, 02 is the ability itself. 16 um ends it I guess.

 

Hexes will not be checked in practice for a while until I start full scale testing, but they do work (at least the ones I changed so far).

 

GetPsiPerks.Function:

 

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  58 65 00 00 D4 54 00 00 00 00 00 00 42 65 00 00  Xe..ÔT......Be..
00000010  00 00 00 00 00 00 00 00 46 65 00 00 00 00 00 00  ........Fe......
00000020  B9 00 00 00 F2 29 00 00 6F 00 00 00 4F 00 00 00  ą...ň)..o...O...
00000030  55 00 45 65 00 00 03 00 2C 45 16 55 00 45 65 00  U.Ee....,E.U.Ee.
00000040  00 03 00 2C 46 16 55 00 45 65 00 00 03 00 2C 47  ...,F.U.Ee....,G
00000050  16 55 00 45 65 00 00 03 00 2C 48 16 55 00 45 65  .U.Ee....,H.U.Ee
00000060  00 00 03 00 2C 49 16 55 00 45 65 00 00 03 00 2C  ....,I.U.Ee....,
00000070  4A 16 04 00 45 65 00 00 04 3A 46 65 00 00 53 00  J...Ee...:Fe..S.
00000080  00 00 02 01 02 00 07 34 00 00 00 00 00 00        .......4......

 

Psi Tree:

 

0

 

return 69 => BuildPerk(69, 1, "PsiMindfray"); Hex => 2C 45 16

 

1

 

Return 70 => BuildPerk(70, 1, "PsiPanic"); Hex => 2C 46 16

 

Return 71 => BuildPerk(71, 1, "PsiInspiration"); Hex => 2C 47 16

 

2

 

Return 72 => BuildPerk(72, 1, "PsiMindControl"); Hex => 2C 48 16

Return 73 => BuildPerk(73, 1, "PsiTelekineticField"); Hex => 2C 49 16

 

3

 

Return 74 => BuildPerk(74, 1, "PsiRift"); Hex => 2C 4A 16

 

-------------------------------------------------------------

 

GetPerkInTreeSniper.Function:

 

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

 

00000000 73 65 00 00 D4 54 00 00 00 00 00 00 5E 65 00 00 se..ÔT......^e..

00000010 00 00 00 00 00 00 00 00 61 65 00 00 00 00 00 00 ........ae......

00000020 2C 01 00 00 65 36 00 00 57 01 00 00 0F 01 00 00 ,...e6..W.......

00000030 07 15 00 9A 00 61 65 00 00 26 16 04 2C 02 06 4A ...š.ae..&..,..J

00000040 01 07 4F 00 9A 00 61 65 00 00 2C 02 16 07 3A 00 ..O.š.ae..,...:.

00000050 9A 00 60 65 00 00 25 16 04 2C 03 06 4C 00 07 4C š.`e..%..,..L..L

00000060 00 9A 00 60 65 00 00 26 16 04 2C 10 06 4A 01 07 .š.`e..&..,..J..

00000070 89 00 9A 00 61 65 00 00 2C 03 16 07 74 00 9A 00 ‰.š.ae..,...t.š.

00000080 60 65 00 00 25 16 04 2C 0F 06 86 00 07 86 00 9A `e..%..,..†..†.š

00000090 00 60 65 00 00 26 16 04 2C 5F 06 4A 01 07 C3 00 .`e..&..,_.J..Ă.

000000A0 9A 00 61 65 00 00 2C 04 16 07 AE 00 9A 00 60 65 š.ae..,...®.š.`e

000000B0 00 00 25 16 04 2C 08 06 C0 00 07 C0 00 9A 00 60 ..%..,..Ŕ..Ŕ.š.`

000000C0 65 00 00 26 16 04 2C 09 06 4A 01 07 FD 00 9A 00 e..&..,..J..ý.š.

000000D0 61 65 00 00 2C 05 16 07 E8 00 9A 00 60 65 00 00 ae..,...č.š.`e..

000000E0 25 16 04 2C 0A 06 FA 00 07 FA 00 9A 00 60 65 00 %..,..ú..ú.š.`e.

000000F0 00 26 16 04 2C 0B 06 4A 01 07 13 01 9A 00 61 65 .&..,..J....š.ae

00000100 00 00 2C 06 16 04 2C 05 06 4A 01 07 4A 01 9A 00 ..,...,..J..J.š.

00000110 61 65 00 00 2C 07 16 07 38 01 9A 00 60 65 00 00 ae..,...8.š.`e..

00000120 25 16 04 2C 0D 06 4A 01 07 4A 01 9A 00 60 65 00 %..,..J..J.š.`e.

00000130 00 26 16 04 2C 0E 04 25 04 3A 5F 65 00 00 53 00 .&..,..%.:_e..S.

00000140 00 00 02 00 02 00 C1 33 00 00 00 00 00 00 ......Á3......

 

Sniper Tree:

 

0

 

Return 2 => BuildPerk(2, 1, "PrecisionShot"); AKA "Headshot" Hex => 2C 02 06

 

1

 

Return 3 => BuildPerk(3, 0, "SquadSight"); Hex => 2C 03 06

 

Return 16 => BuildPerk(16, 0, "SnapShot"); Hex => 2C 10 06

 

2

 

Return 15 => BuildPerk(15, 0, "DamnGoodGround"); Hex => 2C 0F 06

 

Return 95 => BuildPerk(95, 0, "Gunslinger"); Hex => 2C 5F 06

 

3

 

Return 8 => BuildPerk(8, 1, "BattleScanner"); Hex => 2C 08 06

 

Return 9 => BuildPerk(9, 1, "DisablingShot"); Hex => 2C 09 06

 

4

 

Return 10 => BuildPerk(10, 0, "Opportunist"); Hex => 2C 0A 06

 

Return 11 => BuildPerk(11, 0, "Executioner"); Hex => 2C 0B 06

 

5

 

Return 5 => BuildPerk(5, 0, "LowProfile"); Hex => 2C 05 06

 

6

 

Return 13 => BuildPerk(13, 0, "DoubleTap"); Hex => 2C 0D 06

 

Return 14 => BuildPerk(14, 0, "InTheZone"); Hex => 2C 0E 04

 

-------------------------------------------------------------

 

GetPerkInTreeHeavyWeapons.Function:

 

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

 

00000000 77 65 00 00 D4 54 00 00 00 00 00 00 62 65 00 00 we..ÔT......be..

00000010 00 00 00 00 00 00 00 00 65 65 00 00 00 00 00 00 ........ee......

00000020 5F 01 00 00 20 3A 00 00 57 01 00 00 0F 01 00 00 _... :..W.......

00000030 07 15 00 9A 00 65 65 00 00 26 16 04 2C 12 06 4A ...š.ee..&..,..J

00000040 01 07 4F 00 9A 00 65 65 00 00 2C 02 16 07 3A 00 ..O.š.ee..,...:.

00000050 9A 00 64 65 00 00 25 16 04 2C 13 06 4C 00 07 4C š.de..%..,..L..L

00000060 00 9A 00 64 65 00 00 26 16 04 2C 1A 06 4A 01 07 .š.de..&..,..J..

00000070 89 00 9A 00 65 65 00 00 2C 03 16 07 74 00 9A 00 ‰.š.ee..,...t.š.

00000080 64 65 00 00 25 16 04 2C 15 06 86 00 07 86 00 9A de..%..,..†..†.š

00000090 00 64 65 00 00 26 16 04 2C 16 06 4A 01 07 C3 00 .de..&..,..J..Ă.

000000A0 9A 00 65 65 00 00 2C 04 16 07 AE 00 9A 00 64 65 š.ee..,...®.š.de

000000B0 00 00 25 16 04 2C 17 06 C0 00 07 C0 00 9A 00 64 ..%..,..Ŕ..Ŕ.š.d

000000C0 65 00 00 26 16 04 2C 5B 06 4A 01 07 FD 00 9A 00 e..&..,[.J..ý.š.

000000D0 65 65 00 00 2C 05 16 07 E8 00 9A 00 64 65 00 00 ee..,...č.š.de..

000000E0 25 16 04 2C 19 06 FA 00 07 FA 00 9A 00 64 65 00 %..,..ú..ú.š.de.

000000F0 00 26 16 04 2C 18 06 4A 01 07 13 01 9A 00 65 65 .&..,..J....š.ee

00000100 00 00 2C 06 16 04 2C 11 06 4A 01 07 4A 01 9A 00 ..,...,..J..J.š.

00000110 65 65 00 00 2C 07 16 07 38 01 9A 00 64 65 00 00 ee..,...8.š.de..

00000120 25 16 04 2C 5E 06 4A 01 07 4A 01 9A 00 64 65 00 %..,^.J..J.š.de.

00000130 00 26 16 04 2C 5D 04 25 04 3A 63 65 00 00 53 00 .&..,].%.:ce..S.

00000140 00 00 02 00 02 00 BF 33 00 00 00 00 00 00 ......ż3......

 

Heavy Tree:

 

0

 

Return 18 => BuildPerk(18, 0, "FireRocket"); Hex => 2C 12 06

 

1

 

Return 19 => BuildPerk(19, 0, "TracerBeams"); AKA "Holo Targeting" Hex => 2C 13 06

 

Return 26 => BuildPerk(26, 0, "BulletSwarm"); Hex => 2C 1A 06

 

2

 

Return 21 => BuildPerk(21, 1, "Suppression"); Hex => 2C 15 06

 

Return 22 => BuildPerk(22, 1, "ShredderRocket"); Hex => 2C 16 06

 

3

 

Return 23 => BuildPerk(23, 0, "RapidReaction"); Hex => 2C 17 06

 

Return 91 => BuildPerk(91, 0, "HEATAmmo"); Hex => 2C 5B 06

 

4

 

Return 25 => BuildPerk(25, 0, "DangerZone"); Hex => 2C 19 06

 

Return 24 => BuildPerk(24, 0, "Grenadier"); Hex => 2C 18 06

 

5

 

Return 17 => BuildPerk(17, 0, "WillToSurvive"); Hex => 2C 11 06

 

6

 

Return 94 => BuildPerk(94, 0, "Mayhem"); Hex => 2C 5E 06

 

Return 93 => BuildPerk(93, 0, "Rocketeer"); Hex => 2C 5D 04

 

-------------------------------------------------------------

 

GetPerkInTreeAssault.Function:

 

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

 

00000000 7B 65 00 00 D4 54 00 00 00 00 00 00 66 65 00 00 {e..ÔT......fe..

00000010 00 00 00 00 00 00 00 00 69 65 00 00 00 00 00 00 ........ie......

00000020 92 01 00 00 DB 3D 00 00 57 01 00 00 0F 01 00 00 ’...Ű=..W.......

00000030 07 15 00 9A 00 69 65 00 00 26 16 04 2C 06 06 4A ...š.ie..&..,..J

00000040 01 07 4F 00 9A 00 69 65 00 00 2C 02 16 07 3A 00 ..O.š.ie..,...:.

00000050 9A 00 68 65 00 00 25 16 04 2C 20 06 4C 00 07 4C š.he..%.., .L..L

00000060 00 9A 00 68 65 00 00 26 16 04 2C 21 06 4A 01 07 .š.he..&..,!.J..

00000070 89 00 9A 00 69 65 00 00 2C 03 16 07 74 00 9A 00 ‰.š.ie..,...t.š.

00000080 68 65 00 00 25 16 04 2C 22 06 86 00 07 86 00 9A he..%..,".†..†.š

00000090 00 68 65 00 00 26 16 04 2C 23 06 4A 01 07 C3 00 .he..&..,#.J..Ă.

000000A0 9A 00 69 65 00 00 2C 04 16 07 AE 00 9A 00 68 65 š.ie..,...®.š.he

000000B0 00 00 25 16 04 2C 24 06 C0 00 07 C0 00 9A 00 68 ..%..,$.Ŕ..Ŕ.š.h

000000C0 65 00 00 26 16 04 2C 25 06 4A 01 07 FD 00 9A 00 e..&..,%.J..ý.š.

000000D0 69 65 00 00 2C 05 16 07 E8 00 9A 00 68 65 00 00 ie..,...č.š.he..

000000E0 25 16 04 2C 27 06 FA 00 07 FA 00 9A 00 68 65 00 %..,'.ú..ú.š.he.

000000F0 00 26 16 04 2C 28 06 4A 01 07 13 01 9A 00 69 65 .&..,(.J....š.ie

00000100 00 00 2C 06 16 04 2C 1B 06 4A 01 07 4A 01 9A 00 ..,...,..J..J.š.

00000110 69 65 00 00 2C 07 16 07 38 01 9A 00 68 65 00 00 ie..,...8.š.he..

00000120 25 16 04 2C 29 06 4A 01 07 4A 01 9A 00 68 65 00 %..,).J..J.š.he.

00000130 00 26 16 04 2C 2B 04 25 04 3A 67 65 00 00 53 00 .&..,+.%.:ge..S.

00000140 00 00 02 00 02 00 BE 33 00 00 00 00 00 00 ......ľ3......

 

Assault Tree:

 

0

 

Return 6 => BuildPerk(6, 1, "RunAndGun"); Hex => 2C 06 06

 

1

 

Return 32 => BuildPerk(32, 0, "Aggression"); Hex => 2C 20 06

 

Return 33 => BuildPerk(33, 0, "TacticalSense"); Hex => 2C 21 06

 

2

 

Return 34 => BuildPerk(34, 0, "CloseAndPersonal"); Hex => 2C 22 06

 

Return 35 => BuildPerk(35, 0, "LightningReflexes"); Hex => 2C 23 06

 

3

 

Return 36 => BuildPerk(36, 1, "RapidFire"); Hex => 2C 24 06

 

Return 37 => BuildPerk(37, 1, "Flush"); Hex => 2C 25 06

 

4

 

Return 39 => BuildPerk(39, 0, "BringEmOn"); Hex => 2C 27 06

 

Return 40 => BuildPerk(40, 0, "CloseCombatSpecialist"); Hex => 2C 28 06

 

5

 

Return 27 => BuildPerk(27, 0, "ExtraConditioning"); Hex => 2C 1B 06

 

6

 

Return 41 => BuildPerk(41, 0, "KillerInstinct"); Hex => 2C 29 06

 

Return 43 => BuildPerk(43, 0, "Resilience"); Hex => 2C 2B 04

 

-------------------------------------------------------------

 

GetPerkInTreeSupport.Function:

 

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

 

00000000 7F 65 00 00 D4 54 00 00 00 00 00 00 6A 65 00 00 .e..ÔT......je..

00000010 00 00 00 00 00 00 00 00 6D 65 00 00 00 00 00 00 ........me......

00000020 C5 01 00 00 A2 41 00 00 57 01 00 00 0F 01 00 00 Ĺ...˘A..W.......

00000030 07 15 00 9A 00 6D 65 00 00 26 16 04 2C 2C 06 4A ...š.me..&..,,.J

00000040 01 07 4F 00 9A 00 6D 65 00 00 2C 02 16 07 3A 00 ..O.š.me..,...:.

00000050 9A 00 6C 65 00 00 25 16 04 2C 2F 06 4C 00 07 4C š.le..%..,/.L..L

00000060 00 9A 00 6C 65 00 00 26 16 04 2C 1F 06 4A 01 07 .š.le..&..,..J..

00000070 89 00 9A 00 6D 65 00 00 2C 03 16 07 74 00 9A 00 ‰.š.me..,...t.š.

00000080 6C 65 00 00 25 16 04 2C 5C 06 86 00 07 86 00 9A le..%..,\.†..†.š

00000090 00 6C 65 00 00 26 16 04 2C 30 06 4A 01 07 C3 00 .le..&..,0.J..Ă.

000000A0 9A 00 6D 65 00 00 2C 04 16 07 AE 00 9A 00 6C 65 š.me..,...®.š.le

000000B0 00 00 25 16 04 2C 31 06 C0 00 07 C0 00 9A 00 6C ..%..,1.Ŕ..Ŕ.š.l

000000C0 65 00 00 26 16 04 2C 38 06 4A 01 07 FD 00 9A 00 e..&..,8.J..ý.š.

000000D0 6D 65 00 00 2C 05 16 07 E8 00 9A 00 6C 65 00 00 me..,...č.š.le..

000000E0 25 16 04 2C 33 06 FA 00 07 FA 00 9A 00 6C 65 00 %..,3.ú..ú.š.le.

000000F0 00 26 16 04 2C 34 06 4A 01 07 13 01 9A 00 6D 65 .&..,4.J....š.me

00000100 00 00 2C 06 16 04 2C 35 06 4A 01 07 4A 01 9A 00 ..,...,5.J..J.š.

00000110 6D 65 00 00 2C 07 16 07 38 01 9A 00 6C 65 00 00 me..,...8.š.le..

00000120 25 16 04 2C 36 06 4A 01 07 4A 01 9A 00 6C 65 00 %..,6.J..J.š.le.

00000130 00 26 16 04 2C 37 04 25 04 3A 6B 65 00 00 53 00 .&..,7.%.:ke..S.

00000140 00 00 02 00 02 00 C2 33 00 00 00 00 00 00 ......Â3......

 

Support Tree:

 

0

 

Return 44 => BuildPerk(44, 1, "SmokeBomb"); AKA "Smoke Grenade" Hex => 2C 2C 06

 

1

 

Return 47 => BuildPerk(47, 0, "CoveringFire"); Hex => 2C 2F 06

 

Return 31 => BuildPerk(31, 0, "Sprinter"); Hex => 2C 1F 06

 

2

 

Return 92 => BuildPerk(92, 0, "SmokeAndMirrors"); Hex => 2C 5C 06

 

Return 48 => BuildPerk(48, 0, "FieldMedic"); Hex => 2C 30 06

 

3

 

Return 49 => BuildPerk(49, 1, "RifleSuppression"); Hex => 2C 31 06

 

Return 56 => BuildPerk(56, 1, "Revive"); Hex => 2C 38 06

 

4

 

Return 51 => BuildPerk(51, 0, "CombatDrugs"); Hex => 2C 33 06

 

Return 52 => BuildPerk(52, 0, "DenseSmoke"); Hex => 2C 34 06

 

5

 

Return 53 => BuildPerk(53, 0, "DeepPockets"); Hex => 2C 35 06

 

6

 

Return 54 => BuildPerk(54, 0, "Sentinel"); Hex => 2C 36 06

 

Return 55 => BuildPerk(55, 0, "Savior"); Hex => 2C 37 04

 

Only the middle part of the hex I'm mentioning is responsible for each ability.

Edited by Nolanoth
Link to comment
Share on other sites

I've been following this topic and was very pleased to be able to use the info here to mod the Support class to gain the 'Battlescanner' ability/perk instead of the 'Deep Pockets' one. Since I've already modded my game (via "DefaultGameCore"/modpatcher) to provide two "backpack" (small item) slots for most armor, the Deep Pockets ability was not only a waste but actually caused a glitch for me, since it extended the inventory "off the bottom of the window" when gained.

 

I figured the best solution was to replace that ability/perk with something else, and Battlescanner seems to suit (and comes late enough in the tree to make it not feel like a "cheat" despite the Sniper class getting to choose it earlier). It really fits the Support class too, IMO.

 

With no idea how to do this, I trawled the forums here until I found this thread!

 

As far as I can see, there's no way to distribute these kinds of .upk edited mods yet (not without redistributing major game files!), so for anyone wanting to do this themselves, I've attached the two images below that hopefully show you what to change using a hex editor (most simply, you're changing that "35" to "08" as shown).

 

You'll need to use XSHAPE (search the forum here) to allow your exe to load uncompressed .upk files after you've done the edits, of course. The simplest step-by-step (though for a different mod/aim) IMO is here (though you don't need to unpack/repack if you're just hex editing XComGame.upk directly).

 

All this reminds me of learning to mod Fallout 3 before the GECK came out... Fun times!

 

Major thanks to the insanely talented folks here making these tools and solving these problems so that we can mod the game without official support! You people rock!

Edited by banjo_oz
Link to comment
Share on other sites

Bravo Banjo! I'm trying to replicate this now as I think its a great idea for the Support class and I've also modified the carrying for all armors to have 2 slots. Someone walk me through the last couple of steps here, because I think I may have done something wrong when this didn't seem to work when I loaded up an old save to see if it would.

 

1) Modify the UPK with the Hex

1a) Hidden Step?

2) Save the new UPK

3) Run XShape

4) ...play?

 

I see that the number in the hex turns red when you edit it... is there anything you have to do to the UPK Hex before you save it?

 

EDIT.

OH MY GOD IT WORKS! All I had to do was restart a new game and I changed Smoke Grenade to Battlescanner and it worked after the 1st mission!! I probably couldn't see it when I loaded an old game for whatever reason but it works! I've been trying to figure this bloody thing out all afternoon now I'm off to going mess with the classes! Hurray!

Edited by graaa
Link to comment
Share on other sites

  • Recently Browsing   0 members

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