Jump to content

Display Soldiers' XP and Mobility in Character Card View


johnnylump

Recommended Posts

Here are some upk_mod files to update this for the latest EW patch (patch 1). It now includes display of Psi XP if you have at least one Psi XP, and the advanced servomotors foundry project now modifies the mobility stat. However, the +4 mobility for hte kinetic strike module is not working at this time.

 

SoldierStats_UpdateData@UIStrategyComponent@XcomStrategyGame

 

 

 

MODFILEVERSION=4
UPKFILE=XComStrategyGame.upk
GUID=9C F8 70 10 21 38 A0 41 8B 33 A4 2E E8 71 23 00 // EW Patch 1
FUNCTION=UpdateData@UIStrategyComponent_SoldierStats
RESIZE=ee
KEYWORD=Display mobility, PSI XP and XP in barracks' character card

[BEFORE_HEX]
[HEADER]
d1 05 00 00 b9 03 00 00 
[/HEADER]
[CODE]
0F 00 98 1D 00 00 70 01 8E 1D 00 00 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16 
//Health = m_strStatHealth $ m_kLocalMgr.m_kHeader.txtHP.StrValue

07 46 01 82 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 18 22 00 81 19 01 8A 1D 00 00 0A 00 71 4C 00 00 00 2D 01 71 4C 00 00 16 16 
//if((m_kLocalMgr.m_kHeader.txtHPMod.StrValue != "") && !m_kLocalMgr.m_bCovertOperativeMode)

	0E 99 F9 FF FF 61 42 00 98 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Health $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtHPMod.StrValue, 4, 20)

0F 00 97 1D 00 00 70 01 8D 1D 00 00 12 20 6C FE FF FF 93 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 09 F9 FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 35 C4 FA FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 4A 16 16 
//Will = m_strStatWill $ class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtWill.StrValue, m_kLocalMgr.m_kHeader.txtWill.iState)

07 99 02 9A 35 C4 FA FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 0B 16 
//if(m_kLocalMgr.m_kHeader.txtWill.iState == 11)

	0E 99 F9 FF FF 61 42 00 97 1D 00 00 1F 3C 69 6D 67 20 73 72 63 3D 27 70 72 6F 6D 6F 74 65 5F 70 73 69 27 20 77 69 64 74 68 3D 22 32 30 22 20 68 65 69 67 68 74 3D 22 32 30 22 3E 3C 2F 69 6D 67 3E 00 16 
	//Will $= "<img src='promote_psi' width=\\"20\\" height=\\"20\\"></img>"

07 60 03 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 
//if(m_kLocalMgr.m_kHeader.txtWillMod.StrValue != "")

	0E 99 F9 FF FF 61 42 00 97 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Will $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtWillMod.StrValue, 4, 20)

0F 00 96 1D 00 00 70 01 8C 1D 00 00 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16 
//Defense = m_strStatDefense $ m_kLocalMgr.m_kHeader.txtDefense.StrValue

07 80 04 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 
//if(m_kLocalMgr.m_kHeader.txtDefenseMod.StrValue != "")

	0E 99 F9 FF FF 61 42 00 96 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Defense $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtDefenseMod.StrValue, 4, 20)

0F 00 95 1D 00 00 70 01 8B 1D 00 00 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16 
//Offense = m_strStatOffense $ m_kLocalMgr.m_kHeader.txtOffense.StrValue

07 A0 05 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 
//if(m_kLocalMgr.m_kHeader.txtOffenseMod.StrValue != "")

	0E 99 F9 FF FF 61 42 00 95 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Offense $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtOffenseMod.StrValue, 4, 20)

1C 9F 1D 00 00 00 98 1D 00 00 00 97 1D 00 00 00 96 1D 00 00 00 95 1D 00 00 16 
//AS_SetSoldierStats(Health, Will, Defense, Offense)

04 0B 
	//return

53 
//	
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
57 07 00 00 a7 04 00 00
[/HEADER]
[CODE]

0F 00 98 1D 00 00 70 35 09 F9 FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 20 20 20 20 00 16
//Health = m_kLocalMgr.m_kHeader.txtstrength.StrValue (XP) $ "    "

0f 00 98 1D 00 00 70 70 00 98 1D 00 00 01 8E 1D 00 00 16 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16 
//Health = Health $ m_strStatHealth $ m_kLocalMgr.m_kHeader.txtHP.StrValue

07 a7 01 82 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 18 22 00 81 19 01 8A 1D 00 00 0A 00 71 4C 00 00 00 2D 01 71 4C 00 00 16 16 
//if((m_kLocalMgr.m_kHeader.txtHPMod.StrValue != "") && !m_kLocalMgr.m_bCovertOperativeMode)

	0E 99 F9 FF FF 61 42 00 98 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Health $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtHPMod.StrValue, 4, 20)

0F 00 97 1D 00 00 70 01 8D 1D 00 00 12 20 6C FE FF FF 93 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 09 F9 FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 35 C4 FA FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 4A 16 16 
//Will = m_strStatWill $ class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtWill.StrValue, m_kLocalMgr.m_kHeader.txtWill.iState)

07 2b 03 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 
//if(m_kLocalMgr.m_kHeader.txtWillMod.StrValue != "")

	0E 99 F9 FF FF 61 42 00 97 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Will $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtWillMod.StrValue, 4, 20)

0f 00 96 1D 00 00 70 35 09 F9 FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 20 20 20 20 00 16
//Defense = m_kLocalMgr.m_kHeader.txtcritshot.StrValue $ "    " (Psi XP: )

0f 00 96 1D 00 00 70 70 00 96 1D 00 00 1F 4D 6F 62 3a 00 16 35 09 F9 FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16 0b
//Defense = Defense $ "Mob: " $ m_kLocalMgr.m_kHeader.txtspeed.StrValue

07 aa 04 7b 35 04 F9 FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16
//if (m_kLocalMgr.m_kHeader.txtSpeedMod.StrValue != "")
	
	0E 99 F9 FF FF 61 42 00 96 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Defense $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtSpeedMod.StrValue, 4, 20)

0f 00 96 1D 00 00 70 70 70 00 96 1D 00 00 1f 20 20 20 20 00 16 01 8C 1D 00 00 16 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16
//Defense = Defense $ "    " $ m_strStatDefense $ m_kLocalMgr.m_kHeader.txtDefense.StrValue

07 dd 05 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 
//if(m_kLocalMgr.m_kHeader.txtDefenseMod.StrValue != "")

	0E 99 F9 FF FF 61 42 00 96 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Defense $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtDefenseMod.StrValue, 4, 20)

0F 00 95 1D 00 00 70 01 8B 1D 00 00 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 16 
//Offense = m_strStatOffense $ m_kLocalMgr.m_kHeader.txtOffense.StrValue

07 fd 06 7B 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 1F 00 16 
//if(m_kLocalMgr.m_kHeader.txtOffenseMod.StrValue != "")

	0E 99 F9 FF FF 61 42 00 95 1D 00 00 12 20 6C FE FF FF 52 00 6A F9 FF FF 00 1B 1F 12 00 00 00 00 00 00 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00 2C 04 2C 14 16 16 
	//Offense $= class'UIUtilities'.static.GetHTMLColoredText(m_kLocalMgr.m_kHeader.txtOffenseMod.StrValue, 4, 20)

0F 00 98 1D 00 00 70 1F 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 00 98 1D 00 00 16
// Health = bunchaspaces $ Health

1C 9F 1D 00 00 00 98 1D 00 00 00 97 1D 00 00 00 96 1D 00 00 00 95 1D 00 00 16 
//AS_SetSoldierStats(Health, Will, Defense, Offense)

04 0B 
	//return

53 
[/CODE]
[/AFTER_HEX]

Health = 

1F 4D 6F 76 65 3A 00 = "Move"
1F 20 20 20 20 00 16 = "    "

XP: m_kLocalMgr.m_kHeader.txtStrength.StrValue ==> attach to HP
PsiXP: m_kLocalMgr.m_kHeader.txtCritShot.StrValue ==> Attach to defense, before Mobility
Mob: m_kLocalMgr.m_kHeader.txtSpeed.StrValue + ?m_kHeader.txtSpeedMod.StrValue ==> Attach to Defense


35 09 F9 FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00
        	//XP: m_kLocalMgr.m_kHeader.txtstrength.StrValue

35 09 F9 FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00
         	//Mob: m_kLocalMgr.m_kHeader.txtspeed.StrValue

35 09 F9 FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00
         	//Psi XP: m_kLocalMgr.m_kHeader.txtcritshot.StrValue

35 04 F9 FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 00 19 01 8A 1D 00 00 09 00 7F 4C 00 00 00 01 7F 4C 00 00
         	//Mob bonuses: m_kLocalMgr.m_kHeader.txtspeedMod.StrValue

 

 

 

UpdateHeader@XGSoldierUI@XComStrategyGame

 

 

MODFILEVERSION=4
UPKFILE=XComStrategyGame.upk
GUID=9C F8 70 10 21 38 A0 41 8B 33 A4 2E E8 71 23 00 // EW Patch 1
FUNCTION=UpdateHeader@XGSoldierUI
Keyword=Display Soldier XP, PSI XP and mobility in barracks card view (1 of 4)
RESIZE=123

[BEFORE_HEX]
[HEADER]
6f 0f 00 00 c7 09 00 00 
[/HEADER]
[CODE]
14 2D 00 00 4D 00 00 12 20 34 FE FF FF 3D 00 2E FF FF FF 00 1C FB FB FF FF 35 DE F8 FF FF CB F9 FF FF 00 01 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 2C 47 16 
//bHasMindShield = class'XGTacticalGameCoreNativeBase'.static.TInventoryHasItemType(m_kSoldier.m_kChar.kInventory, 71)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 4F 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 A8 19 01 78 4C 00 00 0C 00 6E 53 00 00 00 1B 84 12 00 00 00 00 00 00 24 04 16 19 01 78 4C 00 00 0C 00 6E 53 00 00 00 1B 84 12 00 00 00 00 00 00 24 03 16 16 
//m_kHeader.txtName.StrValue = m_kSoldier.GetName(4) @ m_kSoldier.GetName(3)

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 4F 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtName.iState = 0

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 4E 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 19 01 78 4C 00 00 0C 00 6E 53 00 00 00 1B 84 12 00 00 00 00 00 00 24 02 16 
//m_kHeader.txtNickname.StrValue = m_kSoldier.GetName(2)

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 4E 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 09 
//m_kHeader.txtNickname.iState = 9

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4D 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6F 4C 00 00 
//m_kHeader.txtStatus.strLabel = m_strLabelStatus

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4D 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 19 01 78 4C 00 00 0A 00 74 53 00 00 00 1B 52 13 00 00 00 00 00 00 16 
//m_kHeader.txtStatus.StrValue = m_kSoldier.GetStatusString()

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4D 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 19 01 78 4C 00 00 0A 00 76 53 00 00 00 1B 53 13 00 00 00 00 00 00 16 
//m_kHeader.txtStatus.iState = m_kSoldier.GetStatusUIState()

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6E 4C 00 00 
//m_kHeader.txtOffense.strLabel = m_strLabelOffense

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0B 00 C3 52 00 00 00 1B 9F 11 00 00 00 00 00 00 26 16 
//m_kHeader.txtOffense.StrValue = string(m_kSoldier.GetCurrentStat(1))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtOffense.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtOffense.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6D 4C 00 00 
//m_kHeader.txtDefense.strLabel = m_strLabelDefense

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0C 00 C3 52 00 00 00 1B 9F 11 00 00 00 00 00 00 2C 02 16 
//m_kHeader.txtDefense.StrValue = string(m_kSoldier.GetCurrentStat(2))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtDefense.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtDefense.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6C 4C 00 00 
//m_kHeader.txtHP.strLabel = m_strLabelHPSPACED

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0B 00 C3 52 00 00 00 1B 9F 11 00 00 00 00 00 00 25 16 
//m_kHeader.txtHP.StrValue = string(m_kSoldier.GetCurrentStat(0))

07 7A 05 19 01 78 4C 00 00 0A 00 05 53 00 00 00 1B EB 17 00 00 00 00 00 00 16 
//if(m_kSoldier.IsInjured())

	0E 99 F9 FF FF 61 42 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2F 00 38 53 19 01 78 4C 00 00 0B 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 25 16 16 16 
	//m_kHeader.txtHP.StrValue $= ("/" $ string(m_kSoldier.GetMaxStat(0)))

	0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtHP.iState = 3

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
	//m_kHeader.txtHP.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6B 4C 00 00 
	//m_kHeader.txtSpeed.strLabel = m_strLabelMobility

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 90 93 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 2C 03 16 2C 09 16 2C 0a 16 
	//m_kHeader.txtSpeed.StrValue = string((m_kSoldier.GetMaxStat(3) - 9) * 10)

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
	//m_kHeader.txtSpeed.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
	//m_kHeader.txtSpeed.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6A 4C 00 00 
	//m_kHeader.txtWill.strLabel = m_strLabelWill

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 2C 07 16 
	//m_kHeader.txtWill.StrValue = string(m_kSoldier.GetMaxStat(7))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 45 2D 00 00 4D 00 00 02 00 2C 0B 01 00 25 
	//m_kHeader.txtWill.iState = ((bHasMindShield) ? 11 : 0)

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
	//m_kHeader.txtWill.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 69 4C 00 00 
	//m_kHeader.txtStrength.strLabel = m_strLabelStrength

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 2C 04 16 
	//m_kHeader.txtStrength.StrValue = string(m_kSoldier.GetMaxStat(4))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
	//m_kHeader.txtStrength.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
	//m_kHeader.txtStrength.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 68 4C 00 00 
	//m_kHeader.txtCritShot.strLabel = m_strLabelCritical

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 2C 0D 16 
	//m_kHeader.txtCritShot.StrValue = string(m_kSoldier.GetMaxStat(13))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
	//m_kHeader.txtCritShot.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
	//m_kHeader.txtCritShot.bNumber = true

19 1B 5E 2F 00 00 00 00 00 00 16 44 00 00 00 00 00 00 1B 49 11 00 00 00 00 00 00 35 DE F8 FF FF CB F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 00 01 4D 00 00 16 
	//TACTICAL().GetBackpackItemArray(m_kSoldier.m_kChar.kInventory, arrBackPackItems)

19 1B 5E 2F 00 00 00 00 00 00 16 8B 00 00 00 00 00 00 1B 2D 12 00 00 00 00 00 00 00 02 4D 00 00 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 19 1B 5E 2F 00 00 00 00 00 00 16 3B 00 05 FF FF FF 00 1B C5 11 00 00 00 00 00 00 35 DE F8 FF FF CB F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 16 00 01 4D 00 00 16 
	//TACTICAL().GetInventoryStatModifiers(aModifiers, m_kSoldier.m_kChar, TACTICAL().GetEquipWeapon(m_kSoldier.m_kChar.kInventory), arrBackPackItems)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 B6 0B 9B 1A 26 00 02 4D 00 00 25 16


	//m_kHeader.txtOffenseMod.StrValue = ""
 
	//if(aModifiers[1] != 0)

07 47 0B 97 1A 26 00 02 4D 00 00 25 16 
	//if(aModifiers[1] > 0)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 26 00 02 4D 00 00 16 
	//m_kHeader.txtOffenseMod.StrValue = "+" $ string(aModifiers[1])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
	//m_kHeader.txtOffenseMod.iState = 2

06 B6 0B 
	//goto J0xBB6

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 26 00 02 4D 00 00 
	//m_kHeader.txtOffenseMod.StrValue = string(aModifiers[1])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtOffenseMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 F4 0C 9B 1A 2C 02 00 02 4D 00 00 25 16 
	//m_kHeader.txtDefenseMod.StrValue = ""


	//if(aModifiers[2] != 0)

07 84 0C 97 1A 2C 02 00 02 4D 00 00 25 16 
	//if(aModifiers[2] > 0)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 2C 02 00 02 4D 00 00 16 
	//m_kHeader.txtDefenseMod.StrValue = "+" $ string(aModifiers[2])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
	//m_kHeader.txtDefenseMod.iState = 2

06 F4 0C 
	//goto J0xCF4

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 2C 02 00 02 4D 00 00 
	//m_kHeader.txtDefenseMod.StrValue = string(aModifiers[2])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtDefenseMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 2E 0E 9B 1A 25 00 02 4D 00 00 25 16 
	//m_kHeader.txtHPMod.StrValue = ""


	//if(aModifiers[0] != 0)

07 BF 0D 97 1A 25 00 02 4D 00 00 25 16 
	//if(aModifiers[0] > 0)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 25 00 02 4D 00 00 16 
	//m_kHeader.txtHPMod.StrValue = "+" $ string(aModifiers[0])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
	//m_kHeader.txtHPMod.iState = 2

06 2E 0E 
	//goto J0xE2E

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 25 00 02 4D 00 00 
	//m_kHeader.txtHPMod.StrValue = string(aModifiers[0])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtHPMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 6C 0F 9B 1A 2C 07 00 02 4D 00 00 25 16 
	//m_kHeader.txtWillMod.StrValue = ""


	//if(aModifiers[7] != 0)

07 FC 0E 97 1A 2C 07 00 02 4D 00 00 25 16 
	//if(aModifiers[7] > 0)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 2C 07 00 02 4D 00 00 16 
	//m_kHeader.txtWillMod.StrValue = "+" $ string(aModifiers[7])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
	//m_kHeader.txtWillMod.iState = 2

06 6C 0F 
	//goto J0xF6C

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 2C 07 00 02 4D 00 00 
	//m_kHeader.txtWillMod.StrValue = string(aModifiers[7])

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtWillMod.iState = 3

04 0B 
	//return

53 
	
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
02 11 00 00 ea 0a 00 00 
[/HEADER]
[CODE]

14 2D 00 00 4D 00 00 12 20 34 FE FF FF 3D 00 2E FF FF FF 00 1C FB FB FF FF 35 DE F8 FF FF CB F9 FF FF 00 01 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 2C 47 16 
//bHasMindShield = class'XGTacticalGameCoreNativeBase'.static.TInventoryHasItemType(m_kSoldier.m_kChar.kInventory, 71)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 4F 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 A8 19 01 78 4C 00 00 0C 00 6E 53 00 00 00 1B 84 12 00 00 00 00 00 00 24 04 16 19 01 78 4C 00 00 0C 00 6E 53 00 00 00 1B 84 12 00 00 00 00 00 00 24 03 16 16 
//m_kHeader.txtName.StrValue = m_kSoldier.GetName(4) @ m_kSoldier.GetName(3)

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 4F 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtName.iState = 0

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 4E 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 19 01 78 4C 00 00 0C 00 6E 53 00 00 00 1B 84 12 00 00 00 00 00 00 24 02 16 
//m_kHeader.txtNickname.StrValue = m_kSoldier.GetName(2)

0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 4E 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 09 
//m_kHeader.txtNickname.iState = 9

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4D 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6F 4C 00 00 
//m_kHeader.txtStatus.strLabel = m_strLabelStatus

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4D 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 19 01 78 4C 00 00 0A 00 74 53 00 00 00 1B 52 13 00 00 00 00 00 00 16 
//m_kHeader.txtStatus.StrValue = m_kSoldier.GetStatusString()

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4D 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 19 01 78 4C 00 00 0A 00 76 53 00 00 00 1B 53 13 00 00 00 00 00 00 16 
//m_kHeader.txtStatus.iState = m_kSoldier.GetStatusUIState()

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6E 4C 00 00 
//m_kHeader.txtOffense.strLabel = m_strLabelOffense

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0B 00 C3 52 00 00 00 1B 9F 11 00 00 00 00 00 00 26 16 
//m_kHeader.txtOffense.StrValue = string(m_kSoldier.GetCurrentStat(1))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtOffense.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 4C 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtOffense.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6D 4C 00 00 
//m_kHeader.txtDefense.strLabel = m_strLabelDefense

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0C 00 C3 52 00 00 00 1B 9F 11 00 00 00 00 00 00 2C 02 16 
//m_kHeader.txtDefense.StrValue = string(m_kSoldier.GetCurrentStat(2))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtDefense.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 4B 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtDefense.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6C 4C 00 00 
//m_kHeader.txtHP.strLabel = m_strLabelHPSPACED

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0B 00 C3 52 00 00 00 1B 9F 11 00 00 00 00 00 00 25 16 
//m_kHeader.txtHP.StrValue = string(m_kSoldier.GetCurrentStat(0))

07 7A 05 19 01 78 4C 00 00 0A 00 05 53 00 00 00 1B EB 17 00 00 00 00 00 00 16 
//if(m_kSoldier.IsInjured())

	0E 99 F9 FF FF 61 42 35 09 F9 FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2F 00 38 53 19 01 78 4C 00 00 0B 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 25 16 16 16 
	//m_kHeader.txtHP.StrValue $= ("/" $ string(m_kSoldier.GetMaxStat(0)))

	0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtHP.iState = 3

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 4A 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtHP.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6B 4C 00 00 
//m_kHeader.txtSpeed.strLabel = m_strLabelMobility

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 90 93 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 2C 03 16 2C 00 16 2C 01 16 
//m_kHeader.txtSpeed.StrValue = string((m_kSoldier.GetMaxStat(3) - 0) * 1)

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtSpeed.iState = 0

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 49 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtSpeed.bNumber = true

0F 35 0A F9 FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 01 6A 4C 00 00 
//m_kHeader.txtWill.strLabel = m_strLabelWill

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 1B 61 12 00 00 00 00 00 00 2C 07 16 
//m_kHeader.txtWill.StrValue = string(m_kSoldier.GetMaxStat(7))

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 45 2D 00 00 4D 00 00 02 00 2C 0B 01 00 25 
//m_kHeader.txtWill.iState = ((bHasMindShield) ? 11 : 0)

14 2D 35 2C FF FF FF B9 F9 FF FF 00 00 35 48 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 27 
//m_kHeader.txtWill.bNumber = true

0F 35 C4 FA FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 25 
//m_kHeader.txtStrength.iState = 0

0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 47 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 A8 A8 A8 1F 58 50 3A 00 38 53 35 DE FA FF FF C1 F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B2 52 00 00 00 01 B2 52 00 00 16 1F 2F 00 16 38 53 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 19 1B 5E 2F 00 00 00 00 00 00 16 17 00 98 FB FF FF 00 1B 99 13 00 00 00 00 00 00 92 19 01 78 4C 00 00 0A 00 C6 52 00 00 00 1B 00 13 00 00 00 00 00 00 16 26 16 16 16
//m_kHeader.txtStrength.StrValue = (("XP:" @ string(m_kSoldier.m_kSoldier.iXP)) @ "/") @ string(m_kSoldier.TACTICAL().GetXPRequired(m_kSoldier.GetRank() + 1))

0f 35 09 F9 FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1f 00 0b 0b 0b

07 d6 09 97 35 E0 FA FF FF C1 F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B2 52 00 00 00 01 B2 52 00 00 24 00 16
//m_kHeader.txtCritShot.StrValue = "" 
//if m_kSoldier.m_kSoldier.iPsiXP > 0

	0F 35 09 F9 FF FF B9 F9 FF FF 00 00 35 46 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 a8 a8 a8 1f 50 58 50 3a 00 38 53 35 e0 FA FF FF C1 F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B2 52 00 00 00 01 B2 52 00 00 16 1F 2F 00 16 38 53 19 01 78 4C 00 00 0C 00 C0 52 00 00 00 19 1B 5E 2F 00 00 00 00 00 00 16 17 00 98 FB FF FF 00 1B f6 12 00 00 00 00 00 00 92 19 01 78 4C 00 00 0A 00 C6 52 00 00 00 1B f5 12 00 00 00 00 00 00 16 26 16 16 16
	//m_kHeader.txtCritShot.StrValue = (("PXP:" @ string (m_kSoldier.m_kSoldier.iPsiXP)) @ "/") @ string (m_kSoldier.TACTICAL().GetPsiXPRequired((GetPsiRank()) + 1))

19 1B 5E 2F 00 00 00 00 00 00 16 44 00 00 00 00 00 00 1B 49 11 00 00 00 00 00 00 35 DE F8 FF FF CB F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 00 01 4D 00 00 16 
//TACTICAL().GetBackpackItemArray(m_kSoldier.m_kChar.kInventory, arrBackPackItems)

19 1B 5E 2F 00 00 00 00 00 00 16 8B 00 00 00 00 00 00 1B 2D 12 00 00 00 00 00 00 00 02 4D 00 00 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 19 1B 5E 2F 00 00 00 00 00 00 16 3B 00 05 FF FF FF 00 1B C5 11 00 00 00 00 00 00 35 DE F8 FF FF CB F9 FF FF 00 00 19 01 78 4C 00 00 09 00 B3 52 00 00 00 01 B3 52 00 00 16 00 01 4D 00 00 16 
//TACTICAL().GetInventoryStatModifiers(aModifiers, m_kSoldier.m_kChar, TACTICAL().GetEquipWeapon(m_kSoldier.m_kChar.kInventory), arrBackPackItems)

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 0b 0c 9B 1A 26 00 02 4D 00 00 25 16
//m_kHeader.txtOffenseMod.StrValue = ""
 
//if(aModifiers[1] != 0)

07 9c 0B 97 1A 26 00 02 4D 00 00 25 16 
	//if(aModifiers[1] > 0)

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 26 00 02 4D 00 00 16 
		//m_kHeader.txtOffenseMod.StrValue = "+" $ string(aModifiers[1])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
		//m_kHeader.txtOffenseMod.iState = 2

	06 0b 0c 
	//goto J0xBB6

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 26 00 02 4D 00 00 
		//m_kHeader.txtOffenseMod.StrValue = string(aModifiers[1])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 45 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
		//m_kHeader.txtOffenseMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 49 0d 9B 1A 2C 02 00 02 4D 00 00 25 16 
//m_kHeader.txtDefenseMod.StrValue = ""

//if(aModifiers[2] != 0)

	07 d9 0c 97 1A 2C 02 00 02 4D 00 00 25 16 
	//if(aModifiers[2] > 0)

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 2C 02 00 02 4D 00 00 16 
		//m_kHeader.txtDefenseMod.StrValue = "+" $ string(aModifiers[2])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
		//m_kHeader.txtDefenseMod.iState = 2

	06 49 0d 
	//goto J0xCF4

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 2C 02 00 02 4D 00 00 
		//m_kHeader.txtDefenseMod.StrValue = string(aModifiers[2])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 44 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
		//m_kHeader.txtDefenseMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 83 0E 9B 1A 25 00 02 4D 00 00 25 16 
//m_kHeader.txtHPMod.StrValue = ""

	//if(aModifiers[0] != 0)

	07 14 0e 97 1A 25 00 02 4D 00 00 25 16 
	//if(aModifiers[0] > 0)

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 25 00 02 4D 00 00 16 
		//m_kHeader.txtHPMod.StrValue = "+" $ string(aModifiers[0])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
		//m_kHeader.txtHPMod.iState = 2

	06 83 0E 
	//goto J0xE2E

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 25 00 02 4D 00 00 
		//m_kHeader.txtHPMod.StrValue = string(aModifiers[0])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 43 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
		//m_kHeader.txtHPMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 07 c1 0F 9B 1A 2C 07 00 02 4D 00 00 25 16 
//m_kHeader.txtWillMod.StrValue = ""

//if(aModifiers[7] != 0)

	07 51 0f 97 1A 2C 07 00 02 4D 00 00 25 16 
	//if(aModifiers[7] > 0)

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 2C 07 00 02 4D 00 00 16 
		//m_kHeader.txtWillMod.StrValue = "+" $ string(aModifiers[7])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
		//m_kHeader.txtWillMod.iState = 2

	06 c1 0F 
	//goto J0xF6C

		0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 2C 07 00 02 4D 00 00 
		//m_kHeader.txtWillMod.StrValue = string(aModifiers[7])

		0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 41 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
		//m_kHeader.txtWillMod.iState = 3

0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 1F 00 0b
//m_kHeader.txtSpeedMod.StrValue = ""

07 7c 10 97 1A 24 03 00 02 4D 00 00 2C 00 16
//if(aModifiers[3] > 0)

	0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 70 1F 2B 00 38 53 1A 2C 03 00 02 4D 00 00 16 
	//m_kHeader.txtSpeedMod.StrValue = "+" $ string(aModifiers[3])

	0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 02 
	//m_kHeader.txtSpeedMod.iState = 2

07 ff 10 96 1A 24 03 00 02 4D 00 00 2C 00 16
//if(aModifiers[3] < 0)

	0F 35 04 F9 FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 38 53 1A 2C 03 00 02 4D 00 00 
	//m_kHeader.txtSpeedMod.StrValue = string(aModifiers[3])

	0F 35 C1 FA FF FF B3 F9 FF FF 00 00 35 42 1A 00 00 50 1A 00 00 00 01 01 7F 4C 00 00 2C 03 
	//m_kHeader.txtSpeedMod.iState = 3

04 0B 
	//return

53 

[/CODE]
[/AFTER_HEX]

 

 

 

GetXPRequired@XGTacticalGameCore@XcomGame

 

 

MODFILEVERSION=4
UPKFILE=XComGame.upk
GUID=5B 06 B8 18 67 22 12 44 85 9B A8 5B 9D 57 1D 4B // EW Patch 1
FUNCTION=GetXPRequired@XGTacticalGameCore
Keyword=Display Soldier XP, PSI XP and mobility in barracks card view (4 of 4); this sets xp beyond colonel to 99999 to save space

[BEFORE_HEX]
[CODE]
1d 80 96 98 00 
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[CODE]
1d 9f 86 01 00 
[/CODE]
[/AFTER_HEX]

 

 

 

GetInventoryStatModifiers@[email protected]

 

 

MODFILEVERSION=4
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=GetInventoryStatModifiers@XGTacticalGameCore
RESIZE=86

[BEFORE_HEX]
[HEADER]
53 02 00 00 8f 01 00 00
[/HEADER]
[CODE]
0F 00 7E 84 00 00 25 
	//iStat = 0

07 50 02 96 00 7E 84 00 00 2C 13 16 
	//if(iStat < 19)

0F 1A 00 7E 84 00 00 48 82 84 00 00 92 1B 4A 37 00 00 00 00 00 00 00 7E 84 00 00 00 7F 84 00 00 48 81 84 00 00 16 1B E2 3B 00 00 00 00 00 00 00 7E 84 00 00 38 3A 00 80 84 00 00 48 81 84 00 00 16 16 
	//aModifiers[iStat] = (GetBackpackStatBonus(iStat, arrBackPackItems, kCharacter)) + (GetWeaponStatBonus(iStat, iEquippedWeapon, kCharacter))

A1 1A 00 7E 84 00 00 48 82 84 00 00 1B 35 37 00 00 00 00 00 00 00 7E 84 00 00 35 4B 0F 00 00 4C 0F 00 00 00 00 35 55 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 48 81 84 00 00 16 16 
	//aModifiers[iStat] += (GetArmorStatBonus(iStat, kCharacter.kInventory.iArmor, kCharacter))

07 59 01 97 1A 2C 1B 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
	//if(kCharacter.aUpgrades[27] > 0)

A1 1A 00 7E 84 00 00 48 82 84 00 00 1B 6F 38 00 00 00 00 00 00 00 7E 84 00 00 35 4B 0F 00 00 4C 0F 00 00 00 00 35 55 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 16 16 
	//aModifiers[iStat] += (GetExtraArmorStatBonus(iStat, kCharacter.kInventory.iArmor))

05 7E 84 00 00 00 00 7E 84 00 00 
	//switch(iStat)

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

07 AD 01 97 1A 2C 1F 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
	//if(kCharacter.aUpgrades[31] > 0)

A1 1A 00 7E 84 00 00 48 82 84 00 00 2C 04 16 
	//aModifiers[iStat] += 4

06 42 02 
	//goto J0x242

0A 3F 02 25 
	//case 0:

07 3C 02 97 1A 2C 7B 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
	//if(kCharacter.aUpgrades[123] > 0)

07 3C 02 84 9A 35 56 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 2C 03 16 18 25 00 9A 38 3A 35 4F 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 38 3A 24 06 16 16 
	//if((kCharacter.iType == 3) || kCharacter.eClass == 6)

A1 1A 00 7E 84 00 00 48 82 84 00 00 2C 03 16 
	//aModifiers[iStat] += 3

06 42 02 
	//goto J0x242

0A FF FF 
	//default:

A5 00 7E 84 00 00 16 
	//++ iStat

06 0B 00 
	//goto J0x0B

04 0B 
	//return

53 
//	
[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
1d 03 00 00 15 02 00 00
[/HEADER]
[CODE]
0F 00 7E 84 00 00 25 
	//iStat = 0

07 1a 03 96 00 7E 84 00 00 2C 13 16 
	//if(iStat < 19)

	0F 1A 00 7E 84 00 00 48 82 84 00 00 92 1B 4A 37 00 00 00 00 00 00 00 7E 84 00 00 00 7F 84 00 00 48 81 84 00 00 16 1B E2 3B 00 00 00 00 00 00 00 7E 84 00 00 38 3A 00 80 84 00 00 48 81 84 00 00 16 16 
	//aModifiers[iStat] = (GetBackpackStatBonus(iStat, arrBackPackItems, kCharacter)) + (GetWeaponStatBonus(iStat, iEquippedWeapon, kCharacter))

	A1 1A 00 7E 84 00 00 48 82 84 00 00 1B 35 37 00 00 00 00 00 00 00 7E 84 00 00 35 4B 0F 00 00 4C 0F 00 00 00 00 35 55 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 48 81 84 00 00 16 16 
	//aModifiers[iStat] += (GetArmorStatBonus(iStat, kCharacter.kInventory.iArmor, kCharacter))

	07 59 01 97 1A 2C 1B 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
	//if(kCharacter.aUpgrades[27] > 0)

	A1 1A 00 7E 84 00 00 48 82 84 00 00 1B 6F 38 00 00 00 00 00 00 00 7E 84 00 00 35 4B 0F 00 00 4C 0F 00 00 00 00 35 55 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 16 16 
	//aModifiers[iStat] += (GetExtraArmorStatBonus(iStat, kCharacter.kInventory.iArmor))

	05 7E 84 00 00 00 00 7E 84 00 00 
	//switch(iStat)

	0A 7a 02 2C 03 
		//case 3:

		07 AD 01 97 1A 2C 1F 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
		//if(kCharacter.aUpgrades[31] > 0) // Sprinter

			A1 1A 00 7E 84 00 00 48 82 84 00 00 2C 04 16 
			//aModifiers[iStat] += 4

		07 77 02 84 9A 35 56 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 2C 03 16 18 25 00 9A 38 3A 35 4F 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 38 3A 24 06 16 16 
		//if((kCharacter.iType == 3) || kCharacter.eClass == 6)

			07 35 02 97 1A 2C 7a 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
			//if(kCharacter.aUpgrades[122] > 0) // Adv Servo

				A1 1A 00 7E 84 00 00 48 82 84 00 00 2C 03 16 
				//aModifiers[iStat] += 3

			//07 77 02 97 1a 2c 51 35 53 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 		
				//if(kCharacter.aAbilities[81] > 0 // Didn't work

			07 77 02 1c 7a 10 00 00 35 55 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 2c 16 16 
			// if TInventoryHasItemType (kCharacter.kInventory, 22) doesn't work in vanilla

				A1 1A 00 7E 84 00 00 48 82 84 00 00 2C 04 16 
				//aModifiers[iStat] += 4

	06 0c 03 
	//goto J0x242

	0A 09 03 25 
	//case 0:

		07 06 03 97 1A 2C 7B 35 54 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 25 16 
		//if(kCharacter.aUpgrades[123] > 0) //

			07 06 03 84 9A 35 56 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 2C 03 16 18 25 00 9A 38 3A 35 4F 0F 00 00 58 0F 00 00 00 00 48 81 84 00 00 38 3A 24 06 16 16 
			//if((kCharacter.iType == 3) || kCharacter.eClass == 6)

				A1 1A 00 7E 84 00 00 48 82 84 00 00 2C 03 16 
				//aModifiers[iStat] += 3

	06 0c 03 
	//goto J0x242

	0A FF FF 
	//default:

		A5 00 7E 84 00 00 16 
		//++ iStat

		06 0B 00 
		//goto J0x0B

04 0B 
	//return

53 
[/CODE]
[/AFTER_HEX]

 

 

Edited by johnnylump
Link to comment
Share on other sites

  • Replies 53
  • Created
  • Last Reply

Top Posters In This Topic

I can confirm that these work, and that the KSM mobility increase show up when the above is paired with my MEC loadout mod.

 

However, the KSM and Advanced Servomotors mobility increases are being added twice. Their mobility increases are directly added in XGUnitNativeBase.GetMaxPathLength. The GetInventoryStatModifiers function is used by the tactical game to get the modifiers for both the strategy and tactical games, so those stats would be getting added twice.

 

The following change will prevent the KSM and Advanced Servomotor mobility bonuses from being applied in GetMaxPathLength (so they will only be applied via GetInventoryStatModifiers, which I verified do actually apply to the tactical game).

 

GetMaxPathLength@[email protected]

 

 

MODFILEVERSION=4
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=GetMaxPathLength@XGUnitNativeBase

// remove inventory/perk-related hard-coded mobility increases

[BEFORE_HEX]
[HEADER]
//A5 04 00 00 4D 03 00 00 
[/HEADER]
[CODE]
//bIgnorePoison = false
//49 02 00 28 15 

//iMaxMobility = m_kCharacter.GetCharMaxPathLength() + m_aInventoryStats[3]
//0F 00 B8 38 00 00 92 19 01 35 3A 00 00 0A 00 02 B6 00 00 00 1B 9A 37 00 00 00 00 00 00 16 1A 2C 03 01 37 3A 00 00 16 

//if((GetAppliedAbility(31)) != none)  // eAbility_CombatStim
//07 B9 00 77 1B 30 37 00 00 00 00 00 00 2C 1F 16 2A 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.4
//	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 04 16 

//if(IsAffectedByAbility(72))  // eAbility_BloodCall
//07 33 01 1B E2 43 00 00 00 00 00 00 2C 48 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.4
//	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 04 16 

//if(IsAffectedByAbility(74))  // eAbility_AdrenalNeurosympathy
//07 AD 01 1B E2 43 00 00 00 00 00 00 2C 4A 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.2
//	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 02 16 

//if(GetCharacter().HasUpgrade(122))  // ePerk_Foundry_AdvancedServomotors
07 59 02 19 1B 8F 37 00 00 00 00 00 00 16 0C 00 14 B6 00 00 00 1B 55 3D 00 00 00 00 00 00 2C 7A 16 

	//if((IsATank()) || IsAugmented())
	07 59 02 84 1B FC 43 00 00 00 00 00 00 16 18 0B 00 1B 04 44 00 00 00 00 00 00 16 16 

		//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.3
		A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 03 16 

//if((IsAugmented()) && GetInventory().HasItemOfType(22))  // eItem_MecKineticArm
07 F8 02 82 1B 04 44 00 00 00 00 00 00 16 18 23 00 19 1B FE 38 00 00 00 00 00 00 16 0C 00 AD B9 00 00 00 1B 13 3D 00 00 00 00 00 00 24 16 16 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.4
	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 04 16 

//if(IsAffectedByAbility(57))  // eAbility_Mindfray
//07 8C 03 1B E2 43 00 00 00 00 00 00 2C 39 16 

	//iMaxMobility *= XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.0.50
//	9F 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 05 00 1F 32 00 00 00 1E 00 00 00 3F 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//if(!bIgnorePoison && IsPoisoned())
//07 D8 03 82 81 2D 00 BA 38 00 00 16 18 0B 00 1B 62 45 00 00 00 00 00 00 16 16 

	//iMaxMobility *= (1.0 - 0.250)
//	9F 00 B8 38 00 00 AF 1E 00 00 80 3F 1E 00 00 80 3E 16 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//if(IsAffectedByAbility(15))  // eAbility_FlashBang
//07 15 04 1B E2 43 00 00 00 00 00 00 2C 0F 16 

	//iMaxMobility *= (1.0 - 0.50)
//	9F 00 B8 38 00 00 AF 1E 00 00 80 3F 1E 00 00 00 3F 16 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//if(m_bWasJustStrangling && m_kCharacter.m_kChar.iType != 23)
//07 90 04 82 2D 01 1F 3A 00 00 18 36 00 9B 35 56 0F 00 00 58 0F 00 00 00 00 19 01 35 3A 00 00 09 00 E8 B5 00 00 00 01 E8 B5 00 00 2C 17 16 16 

	//iMaxMobility *= ((100.0 - float(75)) / 100.0)
//	9F 00 B8 38 00 00 AC AF 1E 00 00 C8 42 38 3F 2C 4B 16 1E 00 00 C8 42 16 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//return iMaxMobility
//04 00 B8 38 00 00 

//return ReturnValue
//04 3A B9 38 00 00 

//EOS
//53 

[/CODE]
[/BEFORE_HEX]


[AFTER_HEX]
[HEADER]
//A5 04 00 00 4D 03 00 00 
[/HEADER]
[CODE]
//bIgnorePoison = false
//49 02 00 28 15 

//iMaxMobility = m_kCharacter.GetCharMaxPathLength() + m_aInventoryStats[3]
//0F 00 B8 38 00 00 92 19 01 35 3A 00 00 0A 00 02 B6 00 00 00 1B 9A 37 00 00 00 00 00 00 16 1A 2C 03 01 37 3A 00 00 16 

//if((GetAppliedAbility(31)) != none)  // eAbility_CombatStim
//07 B9 00 77 1B 30 37 00 00 00 00 00 00 2C 1F 16 2A 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.4
//	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 04 16 

//if(IsAffectedByAbility(72))  // eAbility_BloodCall
//07 33 01 1B E2 43 00 00 00 00 00 00 2C 48 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.4
//	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 04 16 

//if(IsAffectedByAbility(74))  // eAbility_AdrenalNeurosympathy
//07 AD 01 1B E2 43 00 00 00 00 00 00 2C 4A 16 

	//iMaxMobility += XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.2
//	A1 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 02 00 1F 32 00 00 00 2C 02 16 

//null ops to replace hard-coded Servomotors and KSM increase
00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 
00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 00 00 B8 38 00 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 

//if(IsAffectedByAbility(57))  // eAbility_Mindfray
//07 8C 03 1B E2 43 00 00 00 00 00 00 2C 39 16 

	//iMaxMobility *= XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.0.50
//	9F 00 B8 38 00 00 19 19 2E 2D 32 00 00 19 12 20 36 FE FF FF 0A 00 9E F9 FF FF 00 1C DE FB FF FF 16 09 00 5C F9 FF FF 00 01 5C F9 FF FF 09 00 1F 32 00 00 00 01 1F 32 00 00 05 00 1F 32 00 00 00 1E 00 00 00 3F 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//if(!bIgnorePoison && IsPoisoned())
//07 D8 03 82 81 2D 00 BA 38 00 00 16 18 0B 00 1B 62 45 00 00 00 00 00 00 16 16 

	//iMaxMobility *= (1.0 - 0.250)
//	9F 00 B8 38 00 00 AF 1E 00 00 80 3F 1E 00 00 80 3E 16 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//if(IsAffectedByAbility(15))  // eAbility_FlashBang
//07 15 04 1B E2 43 00 00 00 00 00 00 2C 0F 16 

	//iMaxMobility *= (1.0 - 0.50)
//	9F 00 B8 38 00 00 AF 1E 00 00 80 3F 1E 00 00 00 3F 16 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//if(m_bWasJustStrangling && m_kCharacter.m_kChar.iType != 23)
//07 90 04 82 2D 01 1F 3A 00 00 18 36 00 9B 35 56 0F 00 00 58 0F 00 00 00 00 19 01 35 3A 00 00 09 00 E8 B5 00 00 00 01 E8 B5 00 00 2C 17 16 16 

	//iMaxMobility *= ((100.0 - float(75)) / 100.0)
//	9F 00 B8 38 00 00 AC AF 1E 00 00 C8 42 38 3F 2C 4B 16 1E 00 00 C8 42 16 16 

	//iMaxMobility = Max(iMaxMobility, 2)
//	0F 00 B8 38 00 00 FA 00 B8 38 00 00 2C 02 16 

//return iMaxMobility
//04 00 B8 38 00 00 

//return ReturnValue
//04 3A B9 38 00 00 

//null ops

//EOS
//53 
[/CODE]
[/AFTER_HEX] 

 

 

Edited by Amineri
Link to comment
Share on other sites

  • 3 weeks later...

I tested this with vanilla EW patch 1, both johnnylump and Amineri changes. Used AFTER_HEX to apply it via PatchUPK.

 

Results are following:

1. Psi XP is not displayed not for regular, nor for gifted soldiers.

2. MEC +3 Advanced Servomotors displayed correctly.

3. Support with Sprinter shows +4 Mobility.

4. Support with Sprinter in Psi Armor shows +6 mobility.

5. Hover SHIV shows 14+6 mobility.

 

I tested it in tactical game:

1. Regular soldier with 12 mobility is able to cover 7 tiles in one move and 15 tiles while dashing.

2. MEC with KSM moves for 7 + 5 tiles (15 + 10 while dashing).

3. MEC without KSM moves for 7 + 2 (15 + 4).

4. Support with Sprinter: 7 + 3 (15 + 6).

5. Support with Sprinter in Psi Armor: 7 + 4 (15 + 8 ).

6. Hover SHIV: 7 + 6 (15 + 11).

 

Looks strange to me.

Edited by wghost81
Link to comment
Share on other sites

Psi XP is a separate stat from regular XP, and so required a further change (which JL has put in and we're testing, but hasn't been released yet).

 

Mobility is shown using the same metric as it is defined in the DefaultGameCore.ini (and how the stat is stored internally to the game), which is measured in meters. Apparently 64 Unreal Units = 1 meter is the correct conversion. However each displayed tile in the game is 1.5m x 1.5m. So 12 mobility = 12 meters => 24 meters when dashing. 12 meters = ~8 tiles, while 24 meters = ~16 tiles. There may be some odd rounding going on in the game engine, as the actual mechanic converts mobility from meters to unreal units, and uses the Unreal pathfinding algorithm, and limits allowed distances to that.

 

I've noticed that sometimes the preview is not perfectly in sync with the actual movement. I've had soldier moves were I moved 1 tile into the displayed dashing zone, but the actual move only consumed a single move.

 

I'm not totally sure if I still have the vanilla settings in my file, but I think the vanilla settings are:

soldier mobility = 12

visibility for all units but battlescanner = 27

battlescanner visibility = 18

skeleton and ghost mobility bonus = +3

psi mobility bonus = +2

Alloy SHIV mobility bonus = +1

Hover SHIV mobility bonus = +3

 

KSM and Advanced Servomotors are hard-coded in the upk in GetMaxPathLength (and advanced servomotors applies to SHIVs as well as MECs)

KSM mobility bonus = +4

Advanced Servomotors bonus = +3

 

Sprinter bonus is hard-coded into XGTacticalGameCore.GetInventoryStatModifiers as a +4 mobility bonus:

            case 3:
                if(kCharacter.aUpgrades[31] > 0)
                {
                    aModifiers[iStat] += 4;
                }

Tanks are separate characters and so have a separate Characters= statline in the DGC.ini with Mobility=14. So yes, Hover SHIVs have a ridiculously overpowered 20 mobility (compared to 27 visibility) once advanced servomotors is complete.

 

Looking at your specific examples, using the (I think correct vanilla values)

  • Support with Sprinter shows +4 Mobility. - sprinter grants +4 mobility as defined in the hex code
  • Support with Sprinter in Psi Armor shows +6 mobility - sprinter grants +4 and psi armor grants +2
  • Hover SHIV shows 14+6 mobility - Tank base mobility is 14, +3 for Hover SHIV, +3 for advanced servomotors
1. Regular soldier with 12 mobility is able to cover 7 tiles in one move and 15 tiles while dashing. -- this is 1 tile short of theoretical (probably a rounding error)
2. MEC with KSM moves for 7 + 5 tiles (15 + 10 while dashing). -- KSM + adv servos is +4 +3 = +7 = 4.67 tiles, which together with the leftover bit from not quite getting to 8, leads to +5
3. MEC without KSM moves for 7 + 2 (15 + 4). -- this is with the Advanced Servomotors, yes? So +3 mobility = ~2 tiles extra
4. Support with Sprinter: 7 + 3 (15 + 6). -- +4 mobility = ~2.67, combined with the leftover bit from not getting to 8, leads to effectively +3
5. Support with Sprinter in Psi Armor: 7 + 4 (15 + 8 ). -- +4 for sprinter +2 for psi = +6 total = ~4.0 tiles
6. Hover SHIV: 7 + 6 (15 + 11). -- SHIVs have inherent 14 mobility, so should have at least 9 tiles (not 7) inherent. Then +3 adv servos and +3 Hover SHIV should be 20 mobility = ~13.33 tiles, and observed is 13, but it should be 9 + 4. Hover SHIVs without adv servos should be at 14 + 3 = 17 = ~11.33, so 9 + 2
Displaying fractional tiles is problematic, plus I'm not sure but what the game counts some vertical travel. In addition the pathfinding is sometimes a little goofy so a soldier doesn't move in quite the way you'd expect (I've noticed problems with curbs in EU). Given all of this the simplest thing to do was to display the base mobility stat, which is at least comparatively accurate.
Link to comment
Share on other sites

This all is very confusing. :sad: Especially since Sprinter description says +3 (tiles), I see +4 (meters, but I don't know they are meters) displayed and immediately get crazy. :smile:

 

Everything seems to work well, except SHIV, which somehow "lost" 2 tiles, as with servos it was only able to move for 7 + 3 + 3 tiles.

Link to comment
Share on other sites

This all is very confusing. :sad: Especially since Sprinter description says +3 (tiles), I see +4 (meters, but I don't know they are meters) displayed and immediately get crazy. :smile:

 

Everything seems to work well, except SHIV, which somehow "lost" 2 tiles, as with servos it was only able to move for 7 + 3 + 3 tiles.

 

The original code actually had some stuff in there to display mobility which Firaxis removed, presumably because of similar confusion from the QA testers. Mobility stat doesn't act as an easy predictor of the number of tiles a unit can move, but it is at least comparatively useful. Especially on the skews/diagonals.

 

Note that +3 (tiles) is also potentially misleading if the unit doesn't start with 12 mobility (if NCE is turned on).

 

As to the SHIV, I'm not seeing how it lost 2 tiles. A Hover SHIV with adv servomotors should have mobility 20 = 13.33 tiles, so should be able to move 13 tiles, and 7 + 3 + 3 = 13, as expected. The issue is that base mobility for all tanks is actually 14 = 9.33 = 9 tiles. So a basic SHIV without adv servomotors. A Hover SHIV should be at 14 + 3 = 17 = 11.33, so 11 tiles.

 

The part that is the most confusing (and what is never explained) is that each tile is 1.5m x 1.5m.

Link to comment
Share on other sites

Sorry, SHIV is OK. As I said, I'm already crazy with all the conversions. :smile: "7 + 6" because I've compared all units to soldier with base 12 mobility and no modifiers.

 

BTW, you can display summary value divided to 1.5 in brackets to give at least an estimate of how many tiles a unit will be able to move.

Link to comment
Share on other sites

Sorry, SHIV is OK. As I said, I'm already crazy with all the conversions. :smile: "7 + 6" because I've compared all units to soldier with base 12 mobility and no modifiers.

 

BTW, you can display summary value divided to 1.5 in brackets to give at least an estimate of how many tiles a unit will be able to move.

 

That's a good idea. Although then I'm sure we'll get all sorts of bug reports because 12 / 1.5 = 8 tiles, but such soldiers can only move 7 ~_~.

Link to comment
Share on other sites

May be an engine counts a tile soldier standing at as a first tile? This corresponds with 8 tiles. And everything else seems to be rounded up. This will explain 7 + 7 = 14 tiles while moving and 15 tiles while dashing: 7 + 1 = 8 and 15 + 1 = 16, which corresponds with 12/1.5 = 8 and 8 * 2 = 16.
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...