Alien Upgrades Mod - XCOM:EU 2012
Contents
Overview
This mod adds the ability to upgrade alien's stats during the course of the strategy campaign. It also adds two NEW stats, Damage Reduction and Regeneration.
Damage Reduction : Every time the unit takes damage, the damage is reduced by the unit's Damage Reduction stat. A minimum damage of 1 is default, although this can be changed.
Regeneration : At the beginning of every turn, if the unit is still alive it regains health equal to its Regeneration stat. Health cannot be increased beyond the unit's maximum health in this way.
- Units are configured via edits to the DefaultGameCore.ini (DGC.ini) (see DefaultGameCore.ini settings - XCOM:EU 2012), which is embedded within XComGame.exe
- Starting Damage Reduction and Regeneration can be defined for each unit
- Every unit can be individually defined with two 'general' upgrade times
- At each general upgrade, all of the units stats (excepting Critical Hit chance) can be adjusted up or down -- this includes the two new stats of Damage Reduction and Regeneration
- The upgrade time is defined by the number of days since the game began.
- Additionally, a third 'limited' upgrade time is allowed for each unit
- The limited upgrade increases the unit's HP by 1
Game Version Compatibility
This subsection should give the game version (e.g. Patch 4 ( Changelist: 356266 ) ) that the mod is compatible with.
This mod is compatible with the Tank-specific damage reduction, which allows tank-type units (SHIVs, Drones, Cyberdiscs and Sectopods) to have damage reduction that scales with current HP.
Known Issues
None known yet.
Programs and Tools
UE Explorer -- finding places to make hex edits to upk files HxD Hex Editor -- making hex edits to upk files ToolBoks -- installing mod, altering DGC.ini values Resource Hacker -- altering DGC.ini values
(See Modding Tools - XCOM:EU 2012 for links.)
Details
Mechanics
The game already tracks the number of days elapsed since the start (March 1, 2015) of the strategy campaign. This mod stores that entry into the Recap values structure, in the "Days" field (field 1). This field is by default only filled out when the game is over (through the player winning or losing). This mod causes the entry to be filled out and updated whenever a new mission name is created.
The Recap data is already replicated back and forth between the strategy and tactical games. Filling out the "Days" field in the structure makes the information available within the tactical game.
Upon the start of each mission, the game updates the default unit stats based upon the current difficulty. This mod alters that function in order to modify the stats of all units based upon the value in the Recap data "Days" field.
In order to implement Damage Reduction and Regeneration, the stats 4 and 5 have been designated to store the unit's Damage Reduction and Regeneration, respectively. Previously these stats were held Strength and Psi (stats that were present in the 1994 X-COM:EU and X-COM:Apocalypse, but are not used in the current remake).
- Stat 4
- Was stat Strength
- Now holds stat Damage Reduction
- Stat 5
- Was stat Psi
- Now holds stat Regeneration
Damage Reduction
Damage Reduction is applied in the XGUnit.OnTakeDamage function. This function already applied HEAT ammo bonus damage, Shredded bonus damage, and Chitin Plating melee %-based damage reduction. Damage reduction is applied AFTER the bonuses for HEAT Ammo and Shredded status are applied, and BEFORE the Chitin Plating damage reduction is applied.
Order of bonuses/reductions to damage in OnTakeDamage:
- HEAT Ammo +100% damage against robots
- Shredding +33% damage against shredded enemies
- General stat-based damage reduction
- Combat Stims 50% damage reduction against non-melee attacks
Regeneration
Regeneration is applied in the XGUnit.BeginTurn function. This function is called once for each unit (in each team's squad) at the beginning of the turn. This function calls XGUnit.UpdateEquipment function, which was used to update the OverheatIncrement of each weapon. This feature is no longer used, so is now used to apply Regeneration effects.
The function simply calls HealBy(aCurrentStats[5]) for each unit. The HealBy function will not adjust HP by a negative amount, nor will it increase a unit's HP beyond it's maximum HP.
General Configuration
This mod re-uses the BalanceMod entries found in the DGC.ini (embedded within XComGame.exe) to configure the upgrades, damage reduction, and regeneration.
Default settings for the game apply extremely limited changes between Easy and Normal difficulties compared to the default Character stats.
- Easy has +1 HP for soldiers, -1 HP and -2 damage for Thin Men
- Normal has -1 HP and -2 Damage for Thin Men
The primary mechanisms that make Easy and Normal difficulties easier are by shackling the AI, providing hidden to-hit bonuses, and other mechanisms besides reduced alien stats.
This mod eliminates the normal function of the following entries in the DGC.ini:
- BalanceMods_Easy
- BalanceMods_Normal
- BalanceMods_Hard (associated with Classic Difficulty)
It requires that the Character entries in the DGC.ini be updated to reflect the desired alien stats on Classic difficulty. These same unit stats will be applied if the game is played on Easy or Normal as well. Impossible difficulty stats will still be adjusted by the BalanceMods_Classic DGC.ini entries
Mod Configuration Specifics
The BalanceMods_Easy and BalanceMods_Normal entries have the following gameplay effects:
- iCritHit
- stores the day after which the unit receives the upgraded stats
- iDamage
- extra damage the unit will do after iCritHit days have elapsed
- iAim
- extra aim the unit will receive after iCritHit days have elapsed
- iDefense
- extra defense the unit will receive after iCritHit days have elapsed
- iHP
- extra HP the unit will receive after iCritHit days have elapsed
- iMobility
- extra Mobility the unit will receive after iCritHit days have elapsed
- iWill
- extra Will the unit will Receive after iCritHit days have elapsed
The BalanceMods_Hard entries enable configuration of the Damage Reduction and Regeneration stats
- iDamage
- starting damage reduction for the unit
- iAim
- starting regeneration for the unit
- iDefense
- extra damage reduction the unit will receive after BalanceMods_Easy.iCritHit days have elapsed
- iHP
- extra damage reduction the unit will receive after BalanceMods_Normal.iCritHit days have elapsed
- iMobility
- extra regeneration the unit will receive after BalanceMods_Easy.iCritHit days have elapsed
- iWill
- extra regeneration the unit will receive after BalanceMods_Normal.iCritHit days have elapsed
- iCritHit
- stores the number of days after which the unit will gain +1 HP
Further Balance Changes
This mod does not alter the composition or balance of the alien squads. Certain aliens appear very infrequently as the game progresses. Altering these squad compositions is highly recommended when installing this mod.
File Changes
This mod requires hex edits in six different locations.
- XComStrategyGame.upk >> XGMission.GenerateOpName function
Updated Recap "Days" data whenever a new mission name is generated - XComGame.upk >> XGUnit.UpdateEquipment function
Applies regeneration effects - XComGame.upk >> XGUnit.OnTakeDamage function
Applies damage reduction effects - XComGame.upk >> XGTacticalGameCore.BuildCharacter function
Make default stat 4 (now damage reduction) 0. - XComGame.upk >> XGTacticalGameCore.GenerateArmorFragments function
Rewrites function into helper function to retrieve days elapsed - XComGame.upk >> XGTacticalGameCore.ModfiyStatsByDifficulty function
Substantially rewritten to apply upgrades, damage reduction and regeneration
A ToolBoks-friendly file containing all of the hex changes is available here: Hex edits in ToolBoks-friendly format
XGMission.GenerateOpName
Removes deterministic name generation for tutorial mission. Stores/updates Recap entry "Days" with the current day-count.
Hex Change
original: | 60 37 00 00 AB 1F 00 00 00 00 00 00 5D 37 00 00 00 00 00 00 00 00 00 00 60 37 00 00 00 00 00 00 07 01 00 00 90 1B 00 00 86 01 00 00 06 01 00 00 49 02 00 28 15 07 22 00 9A 01 35 37 00 00 2C 08 16 04 01 27 37 00 00 06 7B 01 0F 00 5E 37 00 00 2E 71 FE FF FF 19 19 2E 94 FE FF FF 12 20 FD FE FF FF 0A 00 3A FB FF FF 00 1C 91 FD FF FF 16 09 00 09 FB FF FF 00 01 09 FB FF FF 13 00 A4 FA FF FF 00 1B B6 0D 00 00 00 00 00 00 1F 58 47 50 61 72 61 6D 00 16 07 F7 00 2D 00 60 37 00 00 0F 19 00 5E 37 00 00 09 00 EF F9 FF FF 00 01 EF F9 FF FF 1A 2C 2E 01 29 37 00 00 0F 19 00 5E 37 00 00 09 00 EE F9 FF FF 00 01 EE F9 FF FF 1A 2C 06 01 28 37 00 00 06 51 01 0F 19 00 5E 37 00 00 09 00 EF F9 FF FF 00 01 EF F9 FF FF 1A A7 2C 35 16 01 29 37 00 00 0F 19 00 5E 37 00 00 09 00 EE F9 FF FF 00 01 EE F9 FF FF 1A A7 2C 4C 16 01 28 37 00 00 04 12 20 8C FE FF FF 14 00 09 FA FF FF 00 1B 39 0D 00 00 00 00 00 00 01 26 37 00 00 4A 16 04 3A 5F 37 00 00 53 |
new: | 60 37 00 00 AB 1F 00 00 00 00 00 00 5D 37 00 00 00 00 00 00 00 00 00 00 60 37 00 00 00 00 00 00 07 01 00 00 90 1B 00 00 66 01 00 00 06 01 00 00 49 02 00 28 15 07 22 00 9A 01 35 37 00 00 2C 08 16 04 01 27 37 00 00 06 5B 01 0F 00 5E 37 00 00 2E 71 FE FF FF 19 19 2E 94 FE FF FF 12 20 FD FE FF FF 0A 00 3A FB FF FF 00 1C 91 FD FF FF 16 09 00 09 FB FF FF 00 01 09 FB FF FF 13 00 A4 FA FF FF 00 1B B6 0D 00 00 00 00 00 00 1F 58 47 50 61 72 61 6D 00 16 1B CE 26 00 00 00 00 00 00 24 01 19 1B 4C 0E 00 00 00 00 00 00 16 0A 00 82 41 00 00 00 1B F2 0E 00 00 00 00 00 00 16 16 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0F 19 00 5E 37 00 00 09 00 EF F9 FF FF 00 01 EF F9 FF FF 1A A7 2C 35 16 01 29 37 00 00 0F 19 00 5E 37 00 00 09 00 EE F9 FF FF 00 01 EE F9 FF FF 1A A7 2C 4C 16 01 28 37 00 00 04 12 20 8C FE FF FF 14 00 09 FA FF FF 00 1B 39 0D 00 00 00 00 00 00 01 26 37 00 00 4A 16 04 3A 5F 37 00 00 53 |
Decompiled Code
Original Code
if(bTutorial) { kTag.StrValue0 = m_aFirstOpName[46]; kTag.StrValue1 = m_aSecondOpName[6]; } // End:0x151 else
New Code
STAT_SetStat(1, Game().GetDays());
XGUnit.UpdateEquipment
Applies regeneration effects.
Hex Change
original: | 49 B3 00 00 50 55 00 00 00 00 00 00 31 B3 00 00 00 00 00 00 00 00 00 00 34 B3 00 00 00 00 00 00 B5 16 00 00 09 C9 02 00 4D 01 00 00 F1 00 00 00 0F 00 34 B3 00 00 1B CC 32 00 00 00 00 00 00 16 07 4A 01 77 00 34 B3 00 00 2A 16 0F 00 32 B3 00 00 25 07 4A 01 96 00 32 B3 00 00 2C 16 16 0F 00 33 B3 00 00 2E 58 B9 00 00 19 00 34 B3 00 00 15 00 25 0A 00 00 00 1B D1 32 00 00 00 00 00 00 38 3D 00 32 B3 00 00 16 07 8D 00 72 00 33 B3 00 00 2A 16 06 3C 01 07 3C 01 82 19 00 33 B3 00 00 0C 00 4F B9 00 00 00 1B 9A 36 00 00 00 00 00 00 2C 0B 16 18 20 00 19 00 33 B3 00 00 0A 00 47 B9 00 00 00 1B F8 3D 00 00 00 00 00 00 16 16 07 1B 01 98 19 00 33 B3 00 00 09 00 1C B9 00 00 00 01 1C B9 00 00 25 16 19 00 33 B3 00 00 0A 00 00 00 00 00 00 1B B5 12 00 00 00 00 00 00 16 06 3C 01 A2 19 00 33 B3 00 00 09 00 1C B9 00 00 00 01 1C B9 00 00 26 16 A5 00 32 B3 00 00 16 06 2E 00 04 0B 53 |
new: | 49 B3 00 00 50 55 00 00 00 00 00 00 31 B3 00 00 00 00 00 00 00 00 00 00 34 B3 00 00 00 00 00 00 B5 16 00 00 09 C9 02 00 F5 00 00 00 F1 00 00 00 1B D8 36 00 00 00 00 00 00 1A 2C 05 01 0D 31 00 00 16 04 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 53 |
Decompiled Code
Original Code
function UpdateEquipment() { local XGInventory kInventory; local XGWeapon kWeapon; local int I; kInventory = GetInventory(); // End:0x14A if(kInventory != none) { I = 0; J0x2E: // End:0x14A [Loop If] if(I < 22) { kWeapon = XGWeapon(kInventory.GetItem(byte(I))); // End:0x8D if(kWeapon == none) { } // End:0x13C else { // End:0x13C if(kWeapon.HasProperty(11) && kWeapon.IsOverheated()) { // End:0x11B if(kWeapon.m_iTurnFired <= 0) { kWeapon.CoolDown(); } // End:0x13C else { kWeapon.m_iTurnFired -= 1; } } } ++ I; // [Loop Continue] goto J0x2E; } } //return; }
New Code
function UpdateEquipment() { local XGInventory kInventory; local XGWeapon kWeapon; local int I; HealBy(m_aCurrentStats[5]); return; }
XGUnit.OnTakeDamage
Applies damage reduction effects.
Hex Change
original: | 07 4E 02 1B 4F 3E 00 00 00 00 00 00 16 A1 00 98 B4 00 00 38 44 AB 38 3F 00 98 B4 00 00 19 19 19 2E FE 2C 00 00 19 12 20 4F FE FF FF 0A 00 D8 F9 FF FF 00 1C F6 FB FF FF 16 09 00 98 F9 FF FF 00 01 98 F9 FF FF 09 00 F0 2C 00 00 00 01 F0 2C 00 00 09 00 92 0F 00 00 00 01 92 0F 00 00 05 00 92 0F 00 00 00 1E C3 F5 A8 3E 16 16 |
new: | 07 CC 01 1B 4F 3E 00 00 00 00 00 00 16 9F 00 98 B4 00 00 1E 71 3D AA 3F 16 0F 00 98 B4 00 00 FA 93 00 98 B4 00 00 1A 2C 04 01 0D 31 00 00 16 2C 01 16 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 00 98 B4 00 00 0B 0B |
Decompiled Code
Original Code
if(IsShredded()) { iDamage += int(float(iDamage) * XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.m_kAbilities.0.330); }
New Code
if(IsShredded()) { iDamage *= 1.330; } iDamage = Max(iDamage - m_aCurrentStats[4], 1);
XGTacticalGameCore.BuildCharacter
Characters have a default stat[4] (Damage Reduction) of 0.
Hex Change
original: | 0F 1A 2C 04 35 CE 0D 00 00 D5 0D 00 00 00 01 00 9B 77 00 00 26 |
new: | 0F 1A 2C 04 35 CE 0D 00 00 D5 0D 00 00 00 01 00 9B 77 00 00 25 |
Decompiled Code
Original Code
kCharacter.aStats[4] = 1;
New Code
kCharacter.aStats[4] = 0;
XGTacticalGameCore.GenerateArmorFragments
Rewrote function to be a helper function to retrieve number of days elapsed.
Hex Change
original: | 01 78 00 00 50 55 00 00 00 00 00 00 E8 77 00 00 00 00 00 00 00 00 00 00 EB 77 00 00 00 00 00 00 FB 05 00 00 6C C1 00 00 EC 01 00 00 5C 01 00 00 0F 00 E9 77 00 00 25 04 00 E9 77 00 00 07 D7 01 19 19 2E 64 2D 00 00 19 12 20 4F FE FF FF 0A 00 D8 F9 FF FF 00 1C F6 FB FF FF 16 09 00 98 F9 FF FF 00 01 98 F9 FF FF 09 00 71 2D 00 00 00 01 71 2D 00 00 0A 00 89 9C 00 00 00 2D 01 89 9C 00 00 05 EB 77 00 00 00 00 EB 77 00 00 0A A7 00 2C 05 0F 00 E9 77 00 00 2C 03 06 4A 01 0A BB 00 2C 06 0F 00 E9 77 00 00 2C 02 06 4A 01 0A CF 00 2C 07 0F 00 E9 77 00 00 2C 05 06 4A 01 0A E3 00 2C 08 0F 00 E9 77 00 00 2C 0A 06 4A 01 0A F7 00 2C 0A 0F 00 E9 77 00 00 2C 06 06 4A 01 0A 0B 01 2C 0B 0F 00 E9 77 00 00 2C 08 06 4A 01 0A 1F 01 2C 0F 0F 00 E9 77 00 00 2C 08 06 4A 01 0A 33 01 2C 10 0F 00 E9 77 00 00 2C 14 06 4A 01 0A 47 01 2C 11 0F 00 E9 77 00 00 2C 02 06 4A 01 0A FF FF 07 5B 01 9A 00 E9 77 00 00 25 16 04 25 A1 00 E9 77 00 00 93 12 20 BC 4D 00 00 33 00 6B 4D 00 00 00 1C 6E 4D 00 00 00 E9 77 00 00 A8 A8 38 57 01 04 FA FF FF 38 57 61 1C 16 16 38 57 1C B5 FC FF FF 16 16 16 91 00 E9 77 00 00 2C 02 16 16 16 07 D7 01 98 00 E9 77 00 00 25 16 0F 00 E9 77 00 00 26 04 00 E9 77 00 00 04 3A EA 77 00 00 53 |
new: | 01 78 00 00 50 55 00 00 00 00 00 00 E8 77 00 00 00 00 00 00 00 00 00 00 EB 77 00 00 00 00 00 00 FB 05 00 00 6C C1 00 00 A8 01 00 00 5C 01 00 00 07 11 00 9A 00 EB 77 00 00 25 16 04 25 07 E2 00 77 19 2E 64 2D 00 00 19 12 20 4F FE FF FF 0A 00 D8 F9 FF FF 00 1C F6 FB FF FF 16 09 00 98 F9 FF FF 00 01 98 F9 FF FF 09 00 71 2D 00 00 00 01 71 2D 00 00 2A 16 07 E2 00 97 19 19 2E 64 2D 00 00 19 12 20 4F FE FF FF 0A 00 D8 F9 FF FF 00 1C F6 FB FF FF 16 09 00 98 F9 FF FF 00 01 98 F9 FF FF 09 00 71 2D 00 00 00 01 71 2D 00 00 0C 00 CF 9D 00 00 00 1B 3E 67 00 00 00 00 00 00 26 16 00 EB 77 00 00 16 04 26 04 25 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 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 |
Decompiled Code
Original Code
simulated function int GenerateArmorFragments(int iCharType) { local int iFragments; iFragments = 0; return iFragments; // End:0x1D7 if(XComTacticalGRI(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kBattle.m_bAllowItemFragments) { switch(iCharType) { // End:0xA7 case 5: iFragments = 3; // End:0x14A break; // End:0xBB case 6: iFragments = 2; // End:0x14A break; // End:0xCF case 7: iFragments = 5; // End:0x14A break; // End:0xE3 case 8: iFragments = 10; // End:0x14A break; // End:0xF7 case 10: iFragments = 6; // End:0x14A break; // End:0x10B case 11: iFragments = 8; // End:0x14A break; // End:0x11F case 15: iFragments = 8; // End:0x14A break; // End:0x133 case 16: iFragments = 20; // End:0x14A break; // End:0x147 case 17: iFragments = 2; // End:0x14A break; // End:0xFFFF default: // End:0x15B if(iFragments == 0) { return 0; } iFragments += (class'XComEngine'.static.SyncRand(iFragments, (string(Name) @ string(GetStateName())) @ string(GetFuncName())) - (iFragments / 2)); // End:0x1D7 if(iFragments <= 0) { iFragments = 1; } } return iFragments; //return ReturnValue; }
New Code
simulated function int GenerateArmorFragments(int iCharType) { local int iFragments; // End:0x11 if(iCharType == 0) { return 0; } // End:0xE2 if(XComTacticalGRI(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kBattle != none) { // End:0xE2 if(XComTacticalGRI(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kBattle.STAT_GetStat(1) > iCharType) { return 1; } } return 0; //return; }
XGTacticalGameCore.ModifyStatsByDifficulty
Changes function so that it loads additional stats, as well as stat bumps based on days elapsed.
Hex Change
original: | D1 77 00 00 50 55 00 00 00 00 00 00 BA 77 00 00 00 00 00 00 00 00 00 00 BB 77 00 00 00 00 00 00 27 05 00 00 A7 A6 00 00 07 0A 00 00 0F 06 00 00 05 66 76 00 00 00 01 66 76 00 00 0A 8E 02 25 A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 0D 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 06 04 0A 0A 0A 05 2C 02 A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 0D 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 06 04 0A 0A 86 07 2C 03 A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 0D 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 06 04 0A 0A 8A 07 26 0A FF FF A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 0D 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 06 04 0A 04 0B 53 |
new: | D1 77 00 00 50 55 00 00 00 00 00 00 BA 77 00 00 00 00 00 00 00 00 00 00 BB 77 00 00 00 00 00 00 27 05 00 00 A7 A6 00 00 EB 09 00 00 0F 06 00 00 0F 1A 2C 04 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 0F 1A 2C 05 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 07 36 03 9A 01 66 76 00 00 2C 03 16 A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 0D 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 84 0F 00 00 16 07 4D 06 97 1B C1 30 00 00 00 00 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 25 16 A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 87 0F 00 00 16 A1 1A 2C 04 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 05 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 07 64 09 97 1B C1 30 00 00 00 00 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 25 16 A1 1A 26 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 76 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 02 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 75 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 03 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 73 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 07 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 0C 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 78 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 86 0F 00 00 16 A1 1A 2C 04 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 74 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 A1 1A 2C 05 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 35 72 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 07 CE 09 97 1B C1 30 00 00 00 00 00 00 35 77 0E 00 00 7A 0E 00 00 00 00 10 35 D3 0D 00 00 D5 0D 00 00 00 00 48 BB 77 00 00 01 85 0F 00 00 16 25 16 A1 1A 25 35 CE 0D 00 00 D5 0D 00 00 00 01 48 BB 77 00 00 26 16 0B 0B 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 |
Decompiled Code
Original Code
simulated function ModifyStatsByDifficulty(out TCharacter kCharacter) { switch(m_iDifficulty) { // End:0x28E case 0: kCharacter.aStats[1] += BalanceMods_Easy[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Easy[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Easy[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Easy[kCharacter.iType].iWill; kCharacter.aStats[13] += BalanceMods_Easy[kCharacter.iType].iCritHit; kCharacter.aStats[0] += BalanceMods_Easy[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Easy[kCharacter.iType].iDamage; // End:0xA04 break; // End:0x50A case 2: kCharacter.aStats[1] += BalanceMods_Hard[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Hard[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Hard[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Hard[kCharacter.iType].iWill; kCharacter.aStats[13] += BalanceMods_Hard[kCharacter.iType].iCritHit; kCharacter.aStats[0] += BalanceMods_Hard[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Hard[kCharacter.iType].iDamage; // End:0xA04 break; // End:0x786 case 3: kCharacter.aStats[1] += BalanceMods_Classic[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Classic[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Classic[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Classic[kCharacter.iType].iWill; kCharacter.aStats[13] += BalanceMods_Classic[kCharacter.iType].iCritHit; kCharacter.aStats[0] += BalanceMods_Classic[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Classic[kCharacter.iType].iDamage; // End:0xA04 break; // End:0x78A case 1: // End:0xFFFF default: kCharacter.aStats[1] += BalanceMods_Normal[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Normal[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Normal[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Normal[kCharacter.iType].iWill; kCharacter.aStats[13] += BalanceMods_Normal[kCharacter.iType].iCritHit; kCharacter.aStats[0] += BalanceMods_Normal[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Normal[kCharacter.iType].iDamage; // End:0xA04 break; } //return; }
New Code
simulated function ModifyStatsByDifficulty(out TCharacter kCharacter) { kCharacter.aStats[4] = BalanceMods_Hard[kCharacter.iType].iDamage; kCharacter.aStats[5] = BalanceMods_Hard[kCharacter.iType].iAim; // End:0x336 if(m_iDifficulty == 3) { kCharacter.aStats[1] += BalanceMods_Classic[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Classic[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Classic[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Classic[kCharacter.iType].iWill; kCharacter.aStats[13] += BalanceMods_Classic[kCharacter.iType].iCritHit; kCharacter.aStats[0] += BalanceMods_Classic[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Classic[kCharacter.iType].iDamage; } // End:0x64D if((GenerateArmorFragments(BalanceMods_Easy[kCharacter.iType].iCritHit)) > 0) { kCharacter.aStats[1] += BalanceMods_Easy[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Easy[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Easy[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Easy[kCharacter.iType].iWill; kCharacter.aStats[0] += BalanceMods_Easy[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Easy[kCharacter.iType].iDamage; kCharacter.aStats[4] += BalanceMods_Hard[kCharacter.iType].iDefense; kCharacter.aStats[5] += BalanceMods_Hard[kCharacter.iType].iMobility; } // End:0x964 if((GenerateArmorFragments(BalanceMods_Normal[kCharacter.iType].iCritHit)) > 0) { kCharacter.aStats[1] += BalanceMods_Normal[kCharacter.iType].iAim; kCharacter.aStats[2] += BalanceMods_Normal[kCharacter.iType].iDefense; kCharacter.aStats[3] += BalanceMods_Normal[kCharacter.iType].iMobility; kCharacter.aStats[7] += BalanceMods_Normal[kCharacter.iType].iWill; kCharacter.aStats[0] += BalanceMods_Normal[kCharacter.iType].iHP; kCharacter.aStats[12] += BalanceMods_Normal[kCharacter.iType].iDamage; kCharacter.aStats[4] += BalanceMods_Hard[kCharacter.iType].iHP; kCharacter.aStats[5] += BalanceMods_Hard[kCharacter.iType].iWill; } // End:0x9CE if((GenerateArmorFragments(BalanceMods_Hard[kCharacter.iType].iCritHit)) > 0) { kCharacter.aStats[0] += 1; } //return; }
Localization Changes
No localization changes are required with this mod.
References
Referred to by this article:
- Original forum post : [1]
- DefaultGameCore.ini_settings_-_XCOM:EU_2012
- XComGame.exe
- Modding_Tools_-_XCOM:EU_2012
- XGUnit.OnTakeDamage function
- XGUnit.BeginTurn function
- XGUnit.UpdateEquipment function
- HealBy function
- XComStrategyGame.upk
- XGMission.GenerateOpName function
- XComGame.upk
- XGTacticalGameCore.BuildCharacter function
- XGTacticalGameCore.GenerateArmorFragments function
- XGTacticalGameCore.ModfiyStatsByDifficulty function
- Alien_Upgrades_Mod_ToolBoks_CM_-_XCOM:EU_2012
That refer to this article: