XCOM Squadsight Aim Penalty UIUnitGermanMode ShotSummary Notes
Overview
This contains the development notes for the changes to the function UIUnitGermanMode_ShotInfo in XComGame.upk.
This change supports the additional of an aim penalty when using Squadsight.
XCOM_Squadsight_Aim_Penalty_Mod
Development Notes
Now for the simpler change to UIUnitGermanMode_ShotInfo.UpdateDisplay need to change : iHitChance = kFireAction.m_kShot.GetHitChance(); to something like: iHitChance = kAbilityTarget.AdjustToHit(kFireAction.m_kShot.GetHitChance()); This will require about 22 extra bytes. Changing: iHitChance = kFireAction.m_kShot.GetHitChance(); iCriticalChance = kFireAction.m_kShot.GetCriticalChance(); to: iHitChance = kAbility.m_iHitChance; iCriticalChance = kAbility.m_iCriticalChance; might free enough bytes. From previous messing with this function: Original broken down hex code: iHitChance = kFireAction.m_kShot.GetHitChance(); (42 bytes) 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 iCriticalChance = kFireAction.m_kShot.GetCriticalChance(); (42 bytes) 0F 00 C3 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 Reworked broken down hex code: iHitChance = kAbilityTarget.AdjustToHit(kAbility.m_iHitChance); (47 bytes) 0F 00 C4 29 00 00 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 9B 02 00 00 00 00 00 00 19 00 C7 29 00 00 09 00 19 BC 00 00 00 01 19 BC 00 00 16 kAbility.iType : 19 00 C7 29 00 00 09 00 E2 7B 00 00 00 01 E2 7B 00 00 iCriticalChance = kAbility.m_iCriticalChance; (24 bytes) 0F 00 C3 29 00 00 19 00 C7 29 00 00 09 00 18 BC 00 00 00 01 18 BC 00 00 01 18 BC 00 00 -- m_iCriticalChance null ops (13 bytes) 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B These two changes will free up 26 bytes. kAbilityTarget.AdjustToHit(...) 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 9B 02 00 00 00 00 00 00 ... 16 kAbilityTarget.GetPrimaryTarget() 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 38 34 00 00 00 00 00 00 16 iUIHitChance = m_kShot.AdjustToHit(m_kShot.GetHitChance()); 0F 48 63 85 00 00 19 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B 9B 02 00 00 00 00 00 00 19 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 16 consolidated hex: original:(virtual 0x71A) 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 0F 00 C3 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 new:(virtual 0x71A) 0F 00 C4 29 00 00 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 9B 02 00 00 00 00 00 00 19 00 C7 29 00 00 09 00 19 BC 00 00 00 01 19 BC 00 00 16 0F 00 C3 29 00 00 19 00 C7 29 00 00 09 00 18 BC 00 00 00 01 18 BC 00 00 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B
Original Development Notes
These notes are from a prior, abandoned alteration.
The changes worked, but were much more complicated, and so would be harder to maintain upon a new patch release.
2) UIUnitGermanMode_ShotInfo.UpdateDisplay The overall hit % is not calcuted based upon the modifiers supplied in the data structure, but is instead directly retrieved. iHitChance = kFireAction.m_kShot.GetHitChance(); Also, kAbilityTarget.GetShotSummary(kResult, kInfo) is called after iHitChance = kFireAction.m_kShot.GetHitChance() is called. But, GetShotSummmary is called before the iHitChance is displayed, via: if(iHitChance > -1 && (kFireAction.m_kShot.ShouldShowPercentage())) { AS_SetShotInfo(Caps(shotName), hitChance, m_sShotChanceLabel, critChance, m_sCriticalLabel); } hitChance is the string version of iHitChance: hitChance = string(iHitChance) $ "%"; This means that XGAbility_Targeted.m_iHitChance could be set in GetShotSummary. However, the original value would have to be restored before the function exits. Might be able to use the m_iPrimaryMultiShotTarget class variable in XGAbility_Targeted. It is only utilized for CyberDiscs DeathBlossom attack. Steps: 1) In UpdateDisplay, assign iNoCriticalChance = kAbility.m_iPrimaryMultiShotTarget 2) Set kAbility.m_iPrimaryMultiShotTarget = 0; 3) In GetShotSummary, when the squadsight penalty is checked for, assign m_iPrimaryMultiShotTarget to be either zero or the Squadsight hit chance adjustment. 4) After GetShotSummary is called in UpdateDisplay, create the hitchance string hitChance = string(iHitChance-kAbility.m_iPrimaryMultiShotTarget) $ "%"; 5) Before exiting UpdateDisplay restore kAbility.m_iPrimaryMultiShotTarget = iNoCriticalChance What space can be freed up? 1) AS_SetShotInfo("", "", "", "", ""); if (kAbility == none || (kAbilityTarget == none)) (20 bytes) 2) AS_SetShotInfo("", "", "", "", ""); in final else (20 bytes) 3) Can re-use iNoCriticalChance as a variable. (7 bytes) 4) Can substitute kAbility. for kFireAction.m_kShot. everywhere in the code kAbility : 00 C7 29 00 00 kFireAction.m_kShot : 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 4) Can simplify the following code segment: if(iCriticalChance > 0 && (kFireAction.m_kShot.ShouldShowCritPercentage())) { critChance = string(iCriticalChance) $ "%"; } // End:0x578 else { // End:0x578 Loop:False if(kFireAction.m_kShot.ShouldShowCritPercentage()) { critChance = string(iNoCriticalChance) $ "%"; } } to: if(kFireAction.m_kShot.ShouldShowCritPercentage()) { if(iCriticalChance > 0) { critChance = string(iCriticalChance) $ "%"; } else { critChance = "0%"; } } 5) Can simplify: if(XComPresentationLayer(controllerRef.m_Pres).GetTacticalHUD().m_kAbilityHUD.CheckForAvailability(kAbility)) { // End:0x652 Loop:False if(iHitChance > -1 && (kFireAction.m_kShot.ShouldShowPercentage())) { hitChance = string(iHitChance) $ "%"; } shotName = kAbility.GetName(); } // End:0x703 Loop:False if(iHitChance > -1 && (kFireAction.m_kShot.ShouldShowPercentage())) { AS_SetShotInfo(Caps(shotName), hitChance, m_sShotChanceLabel, critChance, m_sCriticalLabel); } // End:0x717 else { AS_SetShotInfo("", "", "", "", ""); } to: if(iHitChance > -1 && (kFireAction.m_kShot.ShouldShowPercentage())) { if(XComPresentationLayer(controllerRef.m_Pres).GetTacticalHUD().m_kAbilityHUD.CheckForAvailability(kAbility)) { hitChance = string(iHitChance) $ "%"; shotName = kAbility.GetName(); } AS_SetShotInfo(Caps(shotName), hitChance, m_sShotChanceLabel, critChance, m_sCriticalLabel); } ------------------------------------------------- 2) UIUnitGermanMode_ShotInfo.UpdateDisplay hex code: original: header: C8 29 00 00 50 55 00 00 00 00 00 00 BB 29 00 00 00 00 00 00 00 00 00 00 C8 29 00 00 00 00 00 00 2D 00 00 00 E9 05 00 00 1A 07 00 00 E2 04 00 00 body: 0F 00 BC 29 00 00 1F 00 0F 00 BD 29 00 00 1F 00 0F 00 BE 29 00 00 1F 00 0F 00 C8 29 00 00 19 2E 8A 5A 00 00 01 6D 02 00 00 0A 00 B6 58 00 00 00 1B EB 30 00 00 00 00 00 00 16 0F 00 C1 29 00 00 2E 65 85 00 00 19 00 C8 29 00 00 0A 00 B9 B5 00 00 00 1B E4 30 00 00 00 00 00 00 16 07 99 00 72 00 C1 29 00 00 2A 16 04 0B 0F 00 C7 29 00 00 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0F 00 C6 29 00 00 2E 66 7D 00 00 00 C7 29 00 00 0F 00 C4 29 00 00 1D FF FF FF FF 0F 00 C3 29 00 00 1D FF FF FF FF 0F 00 C2 29 00 00 25 07 4E 03 82 77 00 C1 29 00 00 2A 16 18 22 00 77 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 2A 16 16 07 F7 01 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 20 16 07 93 01 9A 19 00 C7 29 00 00 09 00 E2 7B 00 00 00 01 E2 7B 00 00 2C 4B 16 0F 00 C5 29 00 00 1D E2 FF FF FF 0F 00 C4 29 00 00 19 00 C8 29 00 00 37 00 A4 33 00 00 00 1B B5 71 00 00 00 00 00 00 25 00 C5 29 00 00 27 27 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 38 34 00 00 00 00 00 00 16 4A 4A 16 0F 00 C3 29 00 00 25 06 4E 03 07 D2 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 2D 16 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 75 00 C9 7C 00 00 00 1B 8A 34 00 00 00 00 00 00 E1 D8 19 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 09 00 E6 7B 00 00 00 01 E6 7B 00 00 09 00 DE F8 FF FF 00 01 DE F8 FF FF 19 00 C1 29 00 00 0A 00 B3 83 00 00 00 1B E9 34 00 00 00 00 00 00 16 16 16 16 0F 00 C3 29 00 00 25 06 4E 03 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 0F 00 C3 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 07 85 03 84 72 00 C7 29 00 00 2A 16 18 0D 00 72 00 C6 29 00 00 2A 16 16 1B A9 05 00 00 00 00 00 00 1F 00 1F 00 1F 00 1F 00 1F 00 16 06 17 07 19 00 C6 29 00 00 1C 00 00 00 00 00 00 1B A1 34 00 00 00 00 00 00 00 C0 29 00 00 00 BF 29 00 00 16 1C D5 29 00 00 35 D6 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D5 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 1C D5 29 00 00 35 D4 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D3 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 1C D5 29 00 00 35 D2 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D1 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 1C D5 29 00 00 35 D0 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 CF 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 07 27 05 82 97 00 C3 29 00 00 25 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 16 0F 00 BC 29 00 00 70 38 53 00 C3 29 00 00 1F 25 00 16 06 78 05 07 78 05 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 0F 00 BC 29 00 00 70 38 53 00 C2 29 00 00 1F 25 00 16 07 7B 06 19 19 19 2E D8 69 00 00 19 01 6D 02 00 00 09 00 A5 55 00 00 00 01 A5 55 00 00 0A 00 0A 69 00 00 00 1B E3 34 00 00 00 00 00 00 16 09 00 5D 24 00 00 00 01 5D 24 00 00 13 00 29 25 00 00 00 1B 41 10 00 00 00 00 00 00 00 C7 29 00 00 16 07 52 06 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 0F 00 BD 29 00 00 70 38 53 00 C4 29 00 00 1F 25 00 16 0F 00 BE 29 00 00 19 00 C7 29 00 00 0A 00 20 7C 00 00 00 1B 6E 33 00 00 00 00 00 00 16 07 03 07 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 1B A9 05 00 00 00 00 00 00 EB 00 BE 29 00 00 16 00 BD 29 00 00 01 B5 29 00 00 00 BC 29 00 00 01 B6 29 00 00 16 06 17 07 1B A9 05 00 00 00 00 00 00 1F 00 1F 00 1F 00 1F 00 1F 00 16 04 0B 53 00 00 00 02 01 82 00 0A 6E 00 00 00 00 00 00 original, broken down: header: C8 29 00 00 50 55 00 00 00 00 00 00 BB 29 00 00 00 00 00 00 00 00 00 00 C8 29 00 00 00 00 00 00 2D 00 00 00 E9 05 00 00 1A 07 00 00 E2 04 00 00 body: critChance = ""; 0F 00 BC 29 00 00 1F 00 hitChance = ""; 0F 00 BD 29 00 00 1F 00 shotName = ""; 0F 00 BE 29 00 00 1F 00 kUnit = XComTacticalController(controllerRef).GetActiveUnit(); 0F 00 C8 29 00 00 19 2E 8A 5A 00 00 01 6D 02 00 00 0A 00 B6 58 00 00 00 1B EB 30 00 00 00 00 00 00 16 kFireAction = XGAction_Fire(kUnit.GetAction()); 0F 00 C1 29 00 00 2E 65 85 00 00 19 00 C8 29 00 00 0A 00 B9 B5 00 00 00 1B E4 30 00 00 00 00 00 00 16 if(kFireAction == none) {return;} 07 99 00 72 00 C1 29 00 00 2A 16 04 0B kAbility = kFireAction.m_kShot; 0F 00 C7 29 00 00 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 kAbilityTarget = XGAbility_Targeted(kAbility); 0F 00 C6 29 00 00 2E 66 7D 00 00 00 C7 29 00 00 iHitChance = -1; 0F 00 C4 29 00 00 1D FF FF FF FF iCriticalChance = -1; 0F 00 C3 29 00 00 1D FF FF FF FF iNoCriticalChance = 0; 0F 00 C2 29 00 00 25 if((kFireAction != none) && kFireAction.m_kShot != none) 07 4E 03 82 77 00 C1 29 00 00 2A 16 18 22 00 77 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 2A 16 16 if(kAbility.HasProperty(32)) 07 F7 01 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 20 16 if(kAbility.iType == 75) 07 93 01 9A 19 00 C7 29 00 00 09 00 E2 7B 00 00 00 01 E2 7B 00 00 2C 4B 16 iBonus = -30; 0F 00 C5 29 00 00 1D E2 FF FF FF iHitChance = kUnit.WillTestChance(0, iBonus, true, true, kAbilityTarget.GetPrimaryTarget()); 0F 00 C4 29 00 00 19 00 C8 29 00 00 37 00 A4 33 00 00 00 1B B5 71 00 00 00 00 00 00 25 00 C5 29 00 00 27 27 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 38 34 00 00 00 00 00 00 16 4A 4A 16 iCriticalChance = 0; 0F 00 C3 29 00 00 25 else 06 4E 03 if(kAbility.HasProperty(45)) 07 D2 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 2D 16 iHitChance = kFireAction.m_kShot.GetScatterChance(VSize(kFireAction.m_kShot.m_kUnit.Location - kFireAction.GetTargetLoc())); 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 75 00 C9 7C 00 00 00 1B 8A 34 00 00 00 00 00 00 E1 D8 19 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 09 00 E6 7B 00 00 00 01 E6 7B 00 00 09 00 DE F8 FF FF 00 01 DE F8 FF FF 19 00 C1 29 00 00 0A 00 B3 83 00 00 00 1B E9 34 00 00 00 00 00 00 16 16 16 16 iCriticalChance = 0; 0F 00 C3 29 00 00 25 else 06 4E 03 iHitChance = kFireAction.m_kShot.GetHitChance(); 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 iCriticalChance = kFireAction.m_kShot.GetCriticalChance(); 0F 00 C3 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 if((kAbility == none) || kAbilityTarget == none) 07 85 03 84 72 00 C7 29 00 00 2A 16 18 0D 00 72 00 C6 29 00 00 2A 16 16 AS_SetShotInfo("", "", "", "", ""); 1B A9 05 00 00 00 00 00 00 1F 00 1F 00 1F 00 1F 00 1F 00 16 else 06 17 07 kAbilityTarget.GetShotSummary(kResult, kInfo); 19 00 C6 29 00 00 1C 00 00 00 00 00 00 1B A1 34 00 00 00 00 00 00 00 C0 29 00 00 00 BF 29 00 00 16 ProcessModifiers(kInfo.arrHitBonusStrings, kInfo.arrHitBonusValues, false); 1C D5 29 00 00 35 D6 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D5 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 ProcessModifiers(kInfo.arrHitPenaltyStrings, kInfo.arrHitPenaltyValues, false); 1C D5 29 00 00 35 D4 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D3 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 ProcessModifiers(kInfo.arrCritBonusStrings, kInfo.arrCritBonusValues, true); 1C D5 29 00 00 35 D2 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D1 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 ProcessModifiers(kInfo.arrCritPenaltyStrings, kInfo.arrCritPenaltyValues, true); 1C D5 29 00 00 35 D0 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 CF 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 if((iCriticalChance > 0) && kFireAction.m_kShot.ShouldShowCritPercentage()) 07 27 05 82 97 00 C3 29 00 00 25 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 16 critChance = string(iCriticalChance) $ "%"; 0F 00 BC 29 00 00 70 38 53 00 C3 29 00 00 1F 25 00 16 else 06 78 05 if(kFireAction.m_kShot.ShouldShowCritPercentage()) 07 78 05 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 critChance = string(iNoCriticalChance) $ "%"; 0F 00 BC 29 00 00 70 38 53 00 C2 29 00 00 1F 25 00 16 if(XComPresentationLayer(controllerRef.m_Pres).GetTacticalHUD().m_kAbilityHUD.CheckForAvailability(kAbility)) 07 7B 06 19 19 19 2E D8 69 00 00 19 01 6D 02 00 00 09 00 A5 55 00 00 00 01 A5 55 00 00 0A 00 0A 69 00 00 00 1B E3 34 00 00 00 00 00 00 16 09 00 5D 24 00 00 00 01 5D 24 00 00 13 00 29 25 00 00 00 1B 41 10 00 00 00 00 00 00 00 C7 29 00 00 16 if((iHitChance > -1) && kFireAction.m_kShot.ShouldShowPercentage()) 07 52 06 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 hitChance = string(iHitChance) $ "%"; 0F 00 BD 29 00 00 70 38 53 00 C4 29 00 00 1F 25 00 16 shotName = kAbility.GetName(); 0F 00 BE 29 00 00 19 00 C7 29 00 00 0A 00 20 7C 00 00 00 1B 6E 33 00 00 00 00 00 00 16 if((iHitChance > -1) && kFireAction.m_kShot.ShouldShowPercentage()) 07 03 07 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 AS_SetShotInfo(Caps(shotName), hitChance, m_sShotChanceLabel, critChance, m_sCriticalLabel); 1B A9 05 00 00 00 00 00 00 EB 00 BE 29 00 00 16 00 BD 29 00 00 01 B5 29 00 00 00 BC 29 00 00 01 B6 29 00 00 16 else 06 17 07 AS_SetShotInfo("", "", "", "", ""); 1B A9 05 00 00 00 00 00 00 1F 00 1F 00 1F 00 1F 00 1F 00 16 return nothing, endofscript 04 0B 53 ------------------------------------------------- New hex code, broken down: header: C8 29 00 00 50 55 00 00 00 00 00 00 BB 29 00 00 00 00 00 00 00 00 00 00 C8 29 00 00 00 00 00 00 2D 00 00 00 E9 05 00 00 1A 07 00 00 E2 04 00 00 body: critChance = ""; 0F 00 BC 29 00 00 1F 00 hitChance = ""; 0F 00 BD 29 00 00 1F 00 shotName = ""; 0F 00 BE 29 00 00 1F 00 kUnit = XComTacticalController(controllerRef).GetActiveUnit(); 0F 00 C8 29 00 00 19 2E 8A 5A 00 00 01 6D 02 00 00 0A 00 B6 58 00 00 00 1B EB 30 00 00 00 00 00 00 16 kFireAction = XGAction_Fire(kUnit.GetAction()); 0F 00 C1 29 00 00 2E 65 85 00 00 19 00 C8 29 00 00 0A 00 B9 B5 00 00 00 1B E4 30 00 00 00 00 00 00 16 if(kFireAction == none) {return;} // jump offset needs no adjustment 07 99 00 72 00 C1 29 00 00 2A 16 04 0B kAbility = kFireAction.m_kShot; 0F 00 C7 29 00 00 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 kAbilityTarget = XGAbility_Targeted(kAbility); 0F 00 C6 29 00 00 2E 66 7D 00 00 00 C7 29 00 00 iHitChance = -1; 0F 00 C4 29 00 00 1D FF FF FF FF iCriticalChance = -1; 0F 00 C3 29 00 00 1D FF FF FF FF iNoCriticalChance = kAbility.m_iPrimaryMultiShotTarget; 0F 00 C2 29 00 00 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 kAbility.m_iPrimaryMultiShotTarget = 0; 0F 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 25 if((kFireAction != none) && kAbility != none) // jump offset corrected to 0x337 07 37 03 82 77 00 C1 29 00 00 2A 16 18 22 00 77 00 C7 29 00 00 2A 16 16 if(kAbility.HasProperty(32)) // jump offset corrected to 0x21F 07 1F 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 20 16 if(kAbility.iType == 75) // jump offset corrected to 0x1BB 07 BB 01 9A 19 00 C7 29 00 00 09 00 E2 7B 00 00 00 01 E2 7B 00 00 2C 4B 16 iBonus = -30; 0F 00 C5 29 00 00 1D E2 FF FF FF iHitChance = kUnit.WillTestChance(0, iBonus, true, true, kAbilityTarget.GetPrimaryTarget()); 0F 00 C4 29 00 00 19 00 C8 29 00 00 37 00 A4 33 00 00 00 1B B5 71 00 00 00 00 00 00 25 00 C5 29 00 00 27 27 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 38 34 00 00 00 00 00 00 16 4A 4A 16 iCriticalChance = 0; 0F 00 C3 29 00 00 25 else // jump offset corrected to 0x337 06 37 03 if(kAbility.HasProperty(45)) // jump offset corrected to 0x2E5 07 E5 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 2D 16 iHitChance = kAbility.GetScatterChance(VSize(kFireAction.m_kShot.m_kUnit.Location - kFireAction.GetTargetLoc())); 0F 00 C4 29 00 00 19 00 C7 29 00 00 75 00 C9 7C 00 00 00 1B 8A 34 00 00 00 00 00 00 E1 D8 19 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 09 00 E6 7B 00 00 00 01 E6 7B 00 00 09 00 DE F8 FF FF 00 01 DE F8 FF FF 19 00 C1 29 00 00 0A 00 B3 83 00 00 00 1B E9 34 00 00 00 00 00 00 16 16 16 16 iCriticalChance = 0; 0F 00 C3 29 00 00 25 else // jump offset corrected to 0x337 06 37 03 iHitChance = kAbility.GetHitChance(); 0F 00 C4 29 00 00 19 00 C7 29 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 iCriticalChance = kAbility.GetCriticalChance(); 0F 00 C3 29 00 00 19 00 C7 29 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 if((kAbility == none) || kAbilityTarget == none) // jump offset corrected to 0x35A 07 5A 03 84 72 00 C7 29 00 00 2A 16 18 0D 00 72 00 C6 29 00 00 2A 16 16 else // jump offset corrected to 0x674 06 74 06 kAbilityTarget.GetShotSummary(kResult, kInfo); 19 00 C6 29 00 00 1C 00 00 00 00 00 00 1B A1 34 00 00 00 00 00 00 00 C0 29 00 00 00 BF 29 00 00 16 ProcessModifiers(kInfo.arrHitBonusStrings, kInfo.arrHitBonusValues, false); 1C D5 29 00 00 35 D6 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D5 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 ProcessModifiers(kInfo.arrHitPenaltyStrings, kInfo.arrHitPenaltyValues, false); 1C D5 29 00 00 35 D4 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D3 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 ProcessModifiers(kInfo.arrCritBonusStrings, kInfo.arrCritBonusValues, true); 1C D5 29 00 00 35 D2 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D1 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 ProcessModifiers(kInfo.arrCritPenaltyStrings, kInfo.arrCritPenaltyValues, true); 1C D5 29 00 00 35 D0 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 CF 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 if(kAbility.ShouldShowCritPercentage()) // jump offset corrected to 0x4F3 07 F3 04 19 00 C7 29 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 if(iCriticalChance > 0) // jump offset corrected to 0x4E5 07 E5 04 97 00 C3 29 00 00 25 16 critChance = string(iCriticalChance) $ "%"; 0F 00 BC 29 00 00 70 38 53 00 C3 29 00 00 1F 25 00 16 else // jump offset corrected to 0x 4F3 06 F3 04 critChance = "0%"; 0F 00 BC 29 00 00 1F 30 25 00 if(XComPresentationLayer(controllerRef.m_Pres).GetTacticalHUD().m_kAbilityHUD.CheckForAvailability(kAbility)) // jump offset corrected to 0x604 07 04 06 19 19 19 2E D8 69 00 00 19 01 6D 02 00 00 09 00 A5 55 00 00 00 01 A5 55 00 00 0A 00 0A 69 00 00 00 1B E3 34 00 00 00 00 00 00 16 09 00 5D 24 00 00 00 01 5D 24 00 00 13 00 29 25 00 00 00 1B 41 10 00 00 00 00 00 00 00 C7 29 00 00 16 if((iHitChance > -1) && kAbility.ShouldShowPercentage()) // jump offset corrected to 0x5DB 07 DB 05 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 00 C7 29 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 hitChance = string(Max(iHitChance+kAbility.m_iPrimaryMultiShotTarget,1)) $ "%"; 0F 00 BD 29 00 00 70 38 53 FA 92 00 C4 29 00 00 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 16 26 16 1F 25 00 16 0F 00 BD 29 00 00 -- hitChance = 70 -- "$" string concat operator 38 53 -- cast to string FA -- "Max" operator 92 -- "+" operator (int) 00 C4 29 00 00 -- iHitChance 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 -- kAbility.m_iPrimaryMultiShotTarget 16 -- execute "+" 26 -- int constant 1 16 -- execute "Max" 1F 25 00 -- string const "%" 16 -- execute "$" shotName = kAbility.GetName(); 0F 00 BE 29 00 00 19 00 C7 29 00 00 0A 00 20 7C 00 00 00 1B 6E 33 00 00 00 00 00 00 16 if((iHitChance > -1) && kAbility.ShouldShowPercentage()) // jump offset corrected to 0x674 07 74 06 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 00 C7 29 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 AS_SetShotInfo(Caps(shotName), hitChance, m_sShotChanceLabel, critChance, m_sCriticalLabel); 1B A9 05 00 00 00 00 00 00 EB 00 BE 29 00 00 16 00 BD 29 00 00 01 B5 29 00 00 00 BC 29 00 00 01 B6 29 00 00 16 kAbility.m_iPrimaryMultiShotTarget = NoCriticalChance 0F 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 00 C2 29 00 00 null ops (99 bytes) 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B return nothing, endofscript 04 0B 53 ------------------------------------------------ 2) UIUnitGermanMode_ShotInfo.UpdateDisplay hex code, consolidated: original: header: C8 29 00 00 50 55 00 00 00 00 00 00 BB 29 00 00 00 00 00 00 00 00 00 00 C8 29 00 00 00 00 00 00 2D 00 00 00 E9 05 00 00 1A 07 00 00 E2 04 00 00 body: (original virtual size = 0x71A) 0F 00 BC 29 00 00 1F 00 0F 00 BD 29 00 00 1F 00 0F 00 BE 29 00 00 1F 00 0F 00 C8 29 00 00 19 2E 8A 5A 00 00 01 6D 02 00 00 0A 00 B6 58 00 00 00 1B EB 30 00 00 00 00 00 00 16 0F 00 C1 29 00 00 2E 65 85 00 00 19 00 C8 29 00 00 0A 00 B9 B5 00 00 00 1B E4 30 00 00 00 00 00 00 16 07 99 00 72 00 C1 29 00 00 2A 16 04 0B 0F 00 C7 29 00 00 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0F 00 C6 29 00 00 2E 66 7D 00 00 00 C7 29 00 00 0F 00 C4 29 00 00 1D FF FF FF FF 0F 00 C3 29 00 00 1D FF FF FF FF 0F 00 C2 29 00 00 25 07 4E 03 82 77 00 C1 29 00 00 2A 16 18 22 00 77 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 2A 16 16 07 F7 01 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 20 16 07 93 01 9A 19 00 C7 29 00 00 09 00 E2 7B 00 00 00 01 E2 7B 00 00 2C 4B 16 0F 00 C5 29 00 00 1D E2 FF FF FF 0F 00 C4 29 00 00 19 00 C8 29 00 00 37 00 A4 33 00 00 00 1B B5 71 00 00 00 00 00 00 25 00 C5 29 00 00 27 27 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 38 34 00 00 00 00 00 00 16 4A 4A 16 0F 00 C3 29 00 00 25 06 4E 03 07 D2 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 2D 16 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 75 00 C9 7C 00 00 00 1B 8A 34 00 00 00 00 00 00 E1 D8 19 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 09 00 E6 7B 00 00 00 01 E6 7B 00 00 09 00 DE F8 FF FF 00 01 DE F8 FF FF 19 00 C1 29 00 00 0A 00 B3 83 00 00 00 1B E9 34 00 00 00 00 00 00 16 16 16 16 0F 00 C3 29 00 00 25 06 4E 03 0F 00 C4 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 0F 00 C3 29 00 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 07 85 03 84 72 00 C7 29 00 00 2A 16 18 0D 00 72 00 C6 29 00 00 2A 16 16 1B A9 05 00 00 00 00 00 00 1F 00 1F 00 1F 00 1F 00 1F 00 16 06 17 07 19 00 C6 29 00 00 1C 00 00 00 00 00 00 1B A1 34 00 00 00 00 00 00 00 C0 29 00 00 00 BF 29 00 00 16 1C D5 29 00 00 35 D6 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D5 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 1C D5 29 00 00 35 D4 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D3 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 1C D5 29 00 00 35 D2 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D1 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 1C D5 29 00 00 35 D0 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 CF 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 07 27 05 82 97 00 C3 29 00 00 25 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 16 0F 00 BC 29 00 00 70 38 53 00 C3 29 00 00 1F 25 00 16 06 78 05 07 78 05 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 0F 00 BC 29 00 00 70 38 53 00 C2 29 00 00 1F 25 00 16 07 7B 06 19 19 19 2E D8 69 00 00 19 01 6D 02 00 00 09 00 A5 55 00 00 00 01 A5 55 00 00 0A 00 0A 69 00 00 00 1B E3 34 00 00 00 00 00 00 16 09 00 5D 24 00 00 00 01 5D 24 00 00 13 00 29 25 00 00 00 1B 41 10 00 00 00 00 00 00 00 C7 29 00 00 16 07 52 06 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 0F 00 BD 29 00 00 70 38 53 00 C4 29 00 00 1F 25 00 16 0F 00 BE 29 00 00 19 00 C7 29 00 00 0A 00 20 7C 00 00 00 1B 6E 33 00 00 00 00 00 00 16 07 03 07 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 1B A9 05 00 00 00 00 00 00 EB 00 BE 29 00 00 16 00 BD 29 00 00 01 B5 29 00 00 00 BC 29 00 00 01 B6 29 00 00 16 06 17 07 1B A9 05 00 00 00 00 00 00 1F 00 1F 00 1F 00 1F 00 1F 00 16 04 0B 53 new hex: header: C8 29 00 00 50 55 00 00 00 00 00 00 BB 29 00 00 00 00 00 00 00 00 00 00 C8 29 00 00 00 00 00 00 2D 00 00 00 E9 05 00 00 02 07 00 00 E2 04 00 00 body: (virtual size = 0x702) 0F 00 BC 29 00 00 1F 00 0F 00 BD 29 00 00 1F 00 0F 00 BE 29 00 00 1F 00 0F 00 C8 29 00 00 19 2E 8A 5A 00 00 01 6D 02 00 00 0A 00 B6 58 00 00 00 1B EB 30 00 00 00 00 00 00 16 0F 00 C1 29 00 00 2E 65 85 00 00 19 00 C8 29 00 00 0A 00 B9 B5 00 00 00 1B E4 30 00 00 00 00 00 00 16 07 99 00 72 00 C1 29 00 00 2A 16 04 0B 0F 00 C7 29 00 00 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 0F 00 C6 29 00 00 2E 66 7D 00 00 00 C7 29 00 00 0F 00 C4 29 00 00 1D FF FF FF FF 0F 00 C3 29 00 00 1D FF FF FF FF 0F 00 C2 29 00 00 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 0F 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 25 07 37 03 82 77 00 C1 29 00 00 2A 16 18 22 00 77 00 C7 29 00 00 2A 16 16 07 1F 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 20 16 07 BB 01 9A 19 00 C7 29 00 00 09 00 E2 7B 00 00 00 01 E2 7B 00 00 2C 4B 16 0F 00 C5 29 00 00 1D E2 FF FF FF 0F 00 C4 29 00 00 19 00 C8 29 00 00 37 00 A4 33 00 00 00 1B B5 71 00 00 00 00 00 00 25 00 C5 29 00 00 27 27 19 00 C6 29 00 00 0A 00 88 7C 00 00 00 1B 38 34 00 00 00 00 00 00 16 4A 4A 16 0F 00 C3 29 00 00 25 06 37 03 07 E5 02 19 00 C7 29 00 00 0C 00 44 7C 00 00 00 1B 9A 36 00 00 00 00 00 00 24 2D 16 0F 00 C4 29 00 00 19 00 C7 29 00 00 75 00 C9 7C 00 00 00 1B 8A 34 00 00 00 00 00 00 E1 D8 19 19 19 00 C1 29 00 00 09 00 DD 82 00 00 00 01 DD 82 00 00 09 00 E6 7B 00 00 00 01 E6 7B 00 00 09 00 DE F8 FF FF 00 01 DE F8 FF FF 19 00 C1 29 00 00 0A 00 B3 83 00 00 00 1B E9 34 00 00 00 00 00 00 16 16 16 16 0F 00 C3 29 00 00 25 06 37 03 0F 00 C4 29 00 00 19 00 C7 29 00 00 0A 00 B1 7C 00 00 00 1B A6 32 00 00 00 00 00 00 16 0F 00 C3 29 00 00 19 00 C7 29 00 00 0A 00 B3 7C 00 00 00 1B D9 31 00 00 00 00 00 00 16 07 5A 03 84 72 00 C7 29 00 00 2A 16 18 0D 00 72 00 C6 29 00 00 2A 16 16 06 74 06 19 00 C6 29 00 00 1C 00 00 00 00 00 00 1B A1 34 00 00 00 00 00 00 00 C0 29 00 00 00 BF 29 00 00 16 1C D5 29 00 00 35 D6 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D5 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 1C D5 29 00 00 35 D4 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D3 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 28 16 1C D5 29 00 00 35 D2 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 D1 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 1C D5 29 00 00 35 D0 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 35 CF 25 00 00 D8 25 00 00 00 00 00 BF 29 00 00 27 16 07 F3 04 19 00 C7 29 00 00 0A 00 E7 7C 00 00 00 1B 13 64 00 00 00 00 00 00 16 07 E5 04 97 00 C3 29 00 00 25 16 0F 00 BC 29 00 00 70 38 53 00 C3 29 00 00 1F 25 00 16 06 F3 04 0F 00 BC 29 00 00 1F 30 25 00 07 04 06 19 19 19 2E D8 69 00 00 19 01 6D 02 00 00 09 00 A5 55 00 00 00 01 A5 55 00 00 0A 00 0A 69 00 00 00 1B E3 34 00 00 00 00 00 00 16 09 00 5D 24 00 00 00 01 5D 24 00 00 13 00 29 25 00 00 00 1B 41 10 00 00 00 00 00 00 00 C7 29 00 00 16 07 DB 05 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 00 C7 29 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 0F 00 BD 29 00 00 70 38 53 FA 92 00 C4 29 00 00 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 16 26 16 1F 25 00 16 0F 00 BE 29 00 00 19 00 C7 29 00 00 0A 00 20 7C 00 00 00 1B 6E 33 00 00 00 00 00 00 16 07 74 06 82 97 00 C4 29 00 00 1D FF FF FF FF 16 18 35 00 19 00 C7 29 00 00 0A 00 E3 7C 00 00 00 1B 15 64 00 00 00 00 00 00 16 16 1B A9 05 00 00 00 00 00 00 EB 00 BE 29 00 00 16 00 BD 29 00 00 01 B5 29 00 00 00 BC 29 00 00 01 B6 29 00 00 16 0F 19 00 C7 29 00 00 09 00 11 BC 00 00 00 01 11 BC 00 00 00 C2 29 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 04 0B 53
References
Referred to by this article:
That refer to this article:
- <none>