diff --git a/.github/docs/scb.md b/.github/docs/scb.md
new file mode 100644
index 000000000..607569c61
--- /dev/null
+++ b/.github/docs/scb.md
@@ -0,0 +1,68 @@
+
+
+ Added an option to skip intro
+
+ Added an option to disable negative mouse acceleration
+
+ Added an option to enable ultrawide support
+
+ Added an option to change FOV
+
+ Added an option to change Screen Cull Bias, for better draw distance
+
+ Added an option to unlock DLC content that's unavailable after servers shut down
+
+ Added an option to unlock all missions from the start
+
+ Added an option to load packed files from disk
+
+ Added an option to enable [Logitech G LIGHTSYNC RGB Lighting](https://www.logitechg.com/innovation/lightsync-rgb.html)
+
+ Difficulty tweaks: **Mark and Execute** enabled on **Perfectionist**, unlimited ammo disabled on **Rookie**. To go back to original behavior, delete `update/difficultyconfiguration.ini`
+
+# Extraction Mode
+
+Plugin adds an ability to modify the number of enemies for the Extraction game mode with `ExtractionWaveEnemyMultiplier` option.
+
+New config for the Extraction game mode: Random, which randomizes the number and type of enemies in each wave using minimum and maximum values defined in the INI file.
+
+To load custom configs for the Extraction game mode, create a folder inside `Splinter Cell Blacklist\src\SYSTEM\update\Data\ExtractionWaveConfigs\`, copy all XMLs into it, then set the name of the new folder in `ExtractionWaveConfigs` option in the INI file.
+
+E.g.:
+
+```
+Splinter Cell Blacklist\src\SYSTEM\update\Data\ExtractionWaveConfigs\
+NewConfig\
+ DefaultWaveConfig.xml
+ D_Amman.xml
+ D_Bratislava.xml
+ D_Kigali.xml
+ D_Sanaa.xml
+```
+
+```
+[EXTRACTION]
+ExtractionWaveConfigs = NewConfig // Default | Random
+ExtractionWaveEnemyMultiplier = 2 // Multiplies the number of enemies in each wave, with Random config, acts as a range [1;ExtractionWaveEnemyMultiplier]
+```
+
+# Hunter Mode
+
+Plugin adds an ability to modify the number of reinforcements for the Hunter game mode with `ReinforcementsEnemyMultiplier` option.
+
+New config for the Hunter game mode: Random, which randomizes the total number of reinforcements between minimum and maximum values defined in the INI file.
+
+# Ghost Mode
+
+Plugin adds an ability to disable mission failure on detection in Ghost mode.
+
+# Ultrawide Screenshot
+
+
+
+ Installation:
+ Download and extract the archive to the game directory, where the exe is located.
+
+[Website](https://thirteenag.github.io/wfp#scb) | [Source](https://github.com/ThirteenAG/WidescreenFixesPack/blob/master/source/SplinterCellBlacklist.FusionMod/dllmain.cpp) | [Default INI File](https://github.com/ThirteenAG/WidescreenFixesPack/blob/master/data/SplinterCellBlacklist.FusionMod/src/system/scripts/SplinterCellBlacklist.FusionMod.ini)
+
+



\ No newline at end of file
diff --git a/.github/docs/scc.md b/.github/docs/scc.md
index c6362fa05..edc95e9b2 100644
--- a/.github/docs/scc.md
+++ b/.github/docs/scc.md
@@ -12,6 +12,8 @@
 Added an option to disable character lighting
+ Added an option to enable [Logitech G LIGHTSYNC RGB Lighting](https://www.logitechg.com/innovation/lightsync-rgb.html)
+
https://user-images.githubusercontent.com/4904157/192846910-6ddfb3fb-3089-4553-ba94-b8d031855fc7.mp4
Installation:
diff --git a/.github/workflows/all.yml b/.github/workflows/all.yml
index 125ab85f0..71f9c12be 100644
--- a/.github/workflows/all.yml
+++ b/.github/workflows/all.yml
@@ -678,6 +678,14 @@ jobs:
tag: scc
artifacts: data/Archives/SplinterCellConviction.FusionMod.zip
+ - name: Splinter Cell Blacklist Fusion Mod
+ uses: ./.github/workflows/release_tag
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ tag_list: ${{ format('{0},{1}', github.event.inputs.tag_list, inputs.tag_list) }}
+ tag: scb
+ artifacts: data/Archives/SplinterCellBlacklist.FusionMod.zip
+
- name: Splinter Cell Pandora Tomorrow Widescreen Fix
uses: ./.github/workflows/release_tag
with:
diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml
index 4e383d97d..e3ee45c7a 100644
--- a/.github/workflows/tag.yml
+++ b/.github/workflows/tag.yml
@@ -70,6 +70,7 @@ on:
- sc
- scarface
- scc
+ - scb
- scct
- scda
- scdaps2
@@ -164,6 +165,7 @@ env:
sc: "/t:Win32\\SplinterCell\\SplinterCell_WidescreenFix"
scarface: "/t:Win32\\Scarface_FusionFix"
scc: "/t:Win32\\SplinterCell\\SplinterCellConviction_FusionMod"
+ scb: "/t:Win32\\SplinterCell\\SplinterCellBlacklist_FusionMod"
scct: "/t:Win32\\SplinterCell\\SplinterCellChaosTheory_WidescreenFix"
scda: "/t:Win32\\SplinterCell\\SplinterCellDoubleAgent_WidescreenFix"
scdaps2: "/t:PCSX2F\\SplinterCellDoubleAgent_PCSX2F_WidescreenFix"
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/scripts/SplinterCellBlacklist.FusionMod.ini b/data/SplinterCellBlacklist.FusionMod/src/system/scripts/SplinterCellBlacklist.FusionMod.ini
new file mode 100644
index 000000000..91f47eb8f
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/scripts/SplinterCellBlacklist.FusionMod.ini
@@ -0,0 +1,32 @@
+[MAIN]
+SkipIntro = 1
+DisableNegativeMouseAcceleration = 1
+UltraWideSupport = 1 // Damage overlay and fading will be disabled in ultrawide
+FOVFactor = 1.0 // [0.5, 2.5]
+ScreenCullBias = 0.0 // 0.0 achieves the best draw distance, game default value is 1.0, but it makes distant objects disappear
+
+[UNLOCKS]
+UnlockDLC = 1 // Unlocks all DLC content that is not possible to obtain after server shutdown
+UnlockAllNonCampaignMissions = 1 // Unlocks all 4th Echelon missions from the start
+UnlockAllCampaignMissions = 0 // Unlocks all campaign missions from the start
+
+[EXTRACTION] // Charlie Missions
+ExtractionWaveConfigs = Default // Default | Random
+ExtractionWaveEnemyMultiplier = 1 // Multiplies the number of enemies in each wave with the Default config
+ExtractionWaveEnemyRandomRangeMin = 0 // With the Random config, each enemy defined in the XML will have its quantity multiplied by
+ExtractionWaveEnemyRandomRangeMax = 4 // a random number between Min and Max for each spawn
+
+[HUNTER] // Kobin Missions
+ReinforcementsNumber = Default // Default | Random
+ReinforcementsEnemyMultiplier = 1 // Multiplies the number of reinforcements with the Default config
+ReinforcementsEnemyRandomRangeMin = 1 // With the Random config, specifies the total number of
+ReinforcementsEnemyRandomRangeMax = 100 // reinforcements between Min and Max
+
+[GHOST] // Grim Missions
+DisableMissionFailOnDetection = 1 // If set to 1, the mission will not fail when the player is detected
+
+[LOGITECH]
+LightSyncRGB = 1 // Mouse and keyboard will have selected suit indicators color. Only Logitech hardware is supported, requires Logitech G HUB app
+
+[STARTUP] // https://github.com/unixoide/5th-echelon
+DedicatedServerExePath =
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Amman.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Amman.xml
new file mode 100644
index 000000000..d99e6d945
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Amman.xml
@@ -0,0 +1,1805 @@
+
+
+
+
+
+
+ AI_Dog
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Pistol_F40
+
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+ AI_Coop_Shotgun
+
+ AI_Coop_Rifle_AK47
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Rifle_Goblin
+
+ AI_Coop_ShieldedHeavy
+ AI_Coop_Heavy
+ AI_Coop_Tech
+
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+
+ AI_Coop_Helmet_Tactical_Pistol_Makarov
+ AI_Coop_Helmet_Tactical_Pistol_F40
+ AI_Coop_Helmet_Tactical_Rifle_AK47
+ AI_Coop_Helmet_Tactical_Rifle_AKS74U
+ AI_Coop_Helmet_Tactical_Rifle_Goblin
+
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+
+ AI_Coop_Helmet_Tactical_SMG_MAC11
+ AI_Coop_Helmet_Tactical_SMG_PP2000
+ AI_Coop_Helmet_Tactical_SMG_Scorpion
+ AI_Coop_Helmet_Tactical_Shotgun
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+ 33
+
+
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+ 33
+
+
+
+
+
+
+ 36
+
+
+
+
+
+
+ 43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+ 35
+
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+
+ 43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+ 33
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Bratislava.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Bratislava.xml
new file mode 100644
index 000000000..69d0d6f89
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Bratislava.xml
@@ -0,0 +1,1854 @@
+
+
+
+
+
+
+ AI_Dog
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Rifle_AK47
+ AI_Coop_Shotgun
+ AI_ShieldedHeavy_Default
+ AI_Coop_Heavy
+ AI_Coop_Elite
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+ AI_Coop_Helmet_Elite
+ AI_Coop_Tech
+ AI_Coop_Sniper_60m
+ AI_Coop_Helmet_Russian_Pistol_F40
+ AI_Coop_Helmet_Russian_Shotgun
+ AI_Coop_Helmet_Russian_Rifle_AK47
+ AI_Coop_Pistol_F40
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Rifle_Goblin
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 60
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 45
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 60
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+ 41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+ 55
+
+
+
+
+
+
+
+ 75
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 45
+
+
+
+
+
+
+ 110
+
+
+
+
+
+
+ 130
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+ 35
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+ 40
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+ 44
+
+
+
+
+
+
+ 47
+
+
+
+
+
+
+
+
+ 49
+
+
+
+
+
+
+
+ 51
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+
+
+ 41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Kigali.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Kigali.xml
new file mode 100644
index 000000000..77a7f99f0
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Kigali.xml
@@ -0,0 +1,1850 @@
+
+
+
+
+
+ AI_Dog
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Pistol_F40
+
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+ AI_Coop_Shotgun
+
+ AI_Coop_Rifle_AK47
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Rifle_Goblin
+
+ AI_Coop_ShieldedHeavy
+ AI_Coop_Heavy_Voron
+ AI_Coop_Tech
+ AI_Coop_Sniper_60m
+
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+
+ AI_Coop_Helmet_Russian_Pistol_F40
+ AI_Coop_Helmet_Russian_Rifle_Goblin
+ AI_Coop_Helmet_Russian_SMG_PP2000
+
+
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+ 36
+
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+ 41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+ 35
+
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+ 36
+
+
+
+
+
+
+
+ 43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Sanaa.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Sanaa.xml
new file mode 100644
index 000000000..6fe8fb49f
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/D_Sanaa.xml
@@ -0,0 +1,1781 @@
+
+
+
+
+
+
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Pistol_F40
+ AI_Coop_Helmet_Russian_Pistol_Makarov
+ AI_Coop_Helmet_Russian_Pistol_F40
+
+
+ AI_Coop_Rifle_AK47
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Helmet_Russian_Rifle_AK47
+ AI_Coop_Helmet_Russian_Rifle_AKS74U
+
+
+ AI_Coop_Shotgun
+ AI_Coop_Helmet_Russian_Shotgun
+
+
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+ AI_Coop_Helmet_Russian_SMG_MAC11
+ AI_Coop_Helmet_Russian_SMG_PP2000
+ AI_Coop_Helmet_Russian_SMG_Scorpion
+
+
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+
+
+ AI_Coop_Sniper_60m
+
+
+ AI_Dog
+ AI_Coop_Tech
+ AI_Coop_Heavy
+ AI_Coop_ShieldedHeavy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 4
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+ 40
+
+
+
+
+
+
+
+
+ 45
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+ 2
+
+
+
+
+
+ 3
+
+
+
+
+
+ 4
+
+
+
+
+
+ 5
+
+
+
+
+
+ 6
+
+
+
+
+
+ 7
+
+
+
+
+
+ 8
+
+
+
+
+
+ 9
+
+
+
+
+
+ 10
+
+
+
+
+
+ 11
+
+
+
+
+
+ 12
+
+
+
+
+
+ 13
+
+
+
+
+
+ 14
+
+
+
+
+
+ 15
+
+
+
+
+
+ 16
+
+
+
+
+
+ 17
+
+
+
+
+
+ 18
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+ 2
+
+
+
+
+
+ 3
+
+
+
+
+
+ 4
+
+
+
+
+
+ 5
+
+
+
+
+
+ 6
+
+
+
+
+
+ 7
+
+
+
+
+
+ 8
+
+
+
+
+
+ 9
+
+
+
+
+
+ 10
+
+
+
+
+
+ 11
+
+
+
+
+
+ 12
+
+
+
+
+
+ 13
+
+
+
+
+
+ 14
+
+
+
+
+
+ 15
+
+
+
+
+
+ 16
+
+
+
+
+
+ 17
+
+
+
+
+
+ 18
+
+
+
+
+
+ 20
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/DefaultWaveConfig.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/DefaultWaveConfig.xml
new file mode 100644
index 000000000..70c3481ff
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/DefaultWaveConfig.xml
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+ AI_Dog
+ AI_Generic_Pistol_Grenade
+ AI_Generic_Rifle_Flashbang
+ AI_Heavy_Default
+ AI_MachineGunner_Default
+ AI_ShieldedHeavy_Default
+ AI_Tech_Default
+ AI_Sniper_Default
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 60
+
+
+
+
+
+
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Amman.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Amman.xml
new file mode 100644
index 000000000..a6d58605e
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Amman.xml
@@ -0,0 +1,2477 @@
+
+
+
+
+
+
+ AI_Dog
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Pistol_F40
+
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+ AI_Coop_Shotgun
+
+ AI_Coop_Rifle_AK47
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Rifle_Goblin
+
+ AI_Coop_ShieldedHeavy
+ AI_Coop_Heavy
+ AI_Coop_Tech
+
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+
+ AI_Coop_Helmet_Tactical_Pistol_Makarov
+ AI_Coop_Helmet_Tactical_Pistol_F40
+ AI_Coop_Helmet_Tactical_Rifle_AK47
+ AI_Coop_Helmet_Tactical_Rifle_AKS74U
+ AI_Coop_Helmet_Tactical_Rifle_Goblin
+
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+
+ AI_Coop_Helmet_Tactical_SMG_MAC11
+ AI_Coop_Helmet_Tactical_SMG_PP2000
+ AI_Coop_Helmet_Tactical_SMG_Scorpion
+ AI_Coop_Helmet_Tactical_Shotgun
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+ 33
+
+
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+ 33
+
+
+
+
+
+
+
+
+
+ 36
+
+
+
+
+
+
+
+
+
+ 43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+ 35
+
+
+
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+
+
+ 43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+ 33
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Bratislava.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Bratislava.xml
new file mode 100644
index 000000000..0946de8a8
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Bratislava.xml
@@ -0,0 +1,3073 @@
+
+
+
+
+
+
+ AI_Dog
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Rifle_AK47
+ AI_Coop_Shotgun
+ AI_ShieldedHeavy_Default
+ AI_Coop_Heavy
+ AI_Coop_Elite
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+ AI_Coop_Helmet_Elite
+ AI_Coop_Tech
+ AI_Coop_Sniper_60m
+ AI_Coop_Helmet_Russian_Pistol_F40
+ AI_Coop_Helmet_Russian_Shotgun
+ AI_Coop_Helmet_Russian_Rifle_AK47
+ AI_Coop_Pistol_F40
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Rifle_Goblin
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 45
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 55
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 75
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 45
+
+
+
+
+
+
+ 110
+
+
+
+
+
+
+ 130
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 35
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 44
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 47
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 49
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 51
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Kigali.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Kigali.xml
new file mode 100644
index 000000000..ec06f6799
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Kigali.xml
@@ -0,0 +1,2460 @@
+
+
+
+
+
+ AI_Dog
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Pistol_F40
+
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+ AI_Coop_Shotgun
+
+ AI_Coop_Rifle_AK47
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Rifle_Goblin
+
+ AI_Coop_ShieldedHeavy
+ AI_Coop_Heavy_Voron
+ AI_Coop_Tech
+ AI_Coop_Sniper_60m
+
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+
+ AI_Coop_Helmet_Russian_Pistol_F40
+ AI_Coop_Helmet_Russian_Rifle_Goblin
+ AI_Coop_Helmet_Russian_SMG_PP2000
+
+
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+ 36
+
+
+
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+ 37
+
+
+
+
+
+
+
+
+
+ 41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+
+
+ 35
+
+
+
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+
+
+ 42
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+ 36
+
+
+
+
+
+
+
+
+
+ 43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+ 31
+
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Sanaa.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Sanaa.xml
new file mode 100644
index 000000000..cc03af204
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/D_Sanaa.xml
@@ -0,0 +1,2721 @@
+
+
+
+
+
+
+ AI_Coop_Pistol_Makarov
+ AI_Coop_Pistol_F40
+ AI_Coop_Helmet_Russian_Pistol_Makarov
+ AI_Coop_Helmet_Russian_Pistol_F40
+
+
+ AI_Coop_Rifle_AK47
+ AI_Coop_Rifle_AKS74U
+ AI_Coop_Helmet_Russian_Rifle_AK47
+ AI_Coop_Helmet_Russian_Rifle_AKS74U
+
+
+ AI_Coop_Shotgun
+ AI_Coop_Helmet_Russian_Shotgun
+
+
+ AI_Coop_SMG_MAC11
+ AI_Coop_SMG_PP2000
+ AI_Coop_SMG_Scorpion
+ AI_Coop_Helmet_Russian_SMG_MAC11
+ AI_Coop_Helmet_Russian_SMG_PP2000
+ AI_Coop_Helmet_Russian_SMG_Scorpion
+
+
+ AI_Coop_Elite_MAC11
+ AI_Coop_Elite_PP2000
+ AI_Coop_Elite_Scorpion
+ AI_Coop_Helmet_Elite_MAC11
+ AI_Coop_Helmet_Elite_PP2000
+ AI_Coop_Helmet_Elite_Scorpion
+
+
+ AI_Coop_Sniper_60m
+
+
+ AI_Dog
+ AI_Coop_Tech
+ AI_Coop_Heavy
+ AI_Coop_ShieldedHeavy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+
+ 28
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+
+
+
+
+
+
+ 27
+
+
+
+
+
+
+
+
+
+
+ 32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+ 24
+
+
+
+
+
+
+
+
+
+
+ 29
+
+
+
+
+
+
+
+
+
+
+ 34
+
+
+
+
+
+
+
+
+
+
+ 40
+
+
+
+
+
+
+
+
+
+
+ 45
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+ 13
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 30
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+ 21
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+
+
+ 11
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+ 13
+
+
+
+
+
+
+
+
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+
+
+
+
+
+
+
+ 18
+
+
+
+
+
+
+
+
+
+
+ 19
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/DefaultWaveConfig.xml b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/DefaultWaveConfig.xml
new file mode 100644
index 000000000..70c3481ff
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/Data/ExtractionWaveConfigs/Random/DefaultWaveConfig.xml
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+ AI_Dog
+ AI_Generic_Pistol_Grenade
+ AI_Generic_Rifle_Flashbang
+ AI_Heavy_Default
+ AI_MachineGunner_Default
+ AI_ShieldedHeavy_Default
+ AI_Tech_Default
+ AI_Sniper_Default
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ 60
+
+
+
+
+
+
+ 120
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/update/difficultyconfiguration.ini b/data/SplinterCellBlacklist.FusionMod/src/system/update/difficultyconfiguration.ini
new file mode 100644
index 000000000..8f28a8ef4
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/update/difficultyconfiguration.ini
@@ -0,0 +1,125 @@
+
+[Echelon.EchelonDifficultyManager]
+
+//-------------------------------------------------------------------------------------------------
+// Difficulty settings
+// 0 - Rookie
+// 1 - Normal
+// 2 - Realistic
+// 3 - Perfectionist
+//-------------------------------------------------------------------------------------------------
+
+//-------------------------------------------------------------------------------------------------
+// Mark and execute
+//-------------------------------------------------------------------------------------------------
+MarkAndExecuteSettings[0]=(m_bGaugeEnabled = true, m_bExecuteEnabled = true, m_fGaugeEventMultiplier = 1.0f, m_bOverrideGaugeValues = false);
+MarkAndExecuteSettings[1]=(m_bGaugeEnabled = true, m_bExecuteEnabled = true, m_fGaugeEventMultiplier = 1.0f, m_bOverrideGaugeValues = false);
+MarkAndExecuteSettings[2]=(m_bGaugeEnabled = true, m_bExecuteEnabled = true, m_fGaugeEventMultiplier = 1.0f, m_bOverrideGaugeValues = true, m_fOverridenH2HGaugeFillPercent=0.5f, m_fOverridenOtherKillGaugeFillPercent=0.25f);
+MarkAndExecuteSettings[3]=(m_bGaugeEnabled = true, m_bExecuteEnabled = true, m_fGaugeEventMultiplier = 1.0f, m_bOverrideGaugeValues = true, m_fOverridenH2HGaugeFillPercent=0.25f, m_fOverridenOtherKillGaugeFillPercent=0.125f);
+
+//-------------------------------------------------------------------------------------------------
+// Player health
+//-------------------------------------------------------------------------------------------------
+PlayerHealthSettings[0]=(m_nPlayerInitialHealth = 1250, m_fRegenerationSpeedMultiplier=3.0f, m_fRegenerationDelayMultiplier=1.0f, m_fRegenerationCombatDelayMultiplier=0.5f);
+PlayerHealthSettings[1]=(m_nPlayerInitialHealth = 450, m_fRegenerationSpeedMultiplier=1.0f, m_fRegenerationDelayMultiplier=1.0f, m_fRegenerationCombatDelayMultiplier=1.0f);
+PlayerHealthSettings[2]=(m_nPlayerInitialHealth = 250, m_fRegenerationSpeedMultiplier=0.7f, m_fRegenerationDelayMultiplier=1.0f, m_fRegenerationCombatDelayMultiplier=1.2f);
+PlayerHealthSettings[3]=(m_nPlayerInitialHealth = 100, m_fRegenerationSpeedMultiplier=0.5f, m_fRegenerationDelayMultiplier=1.0f, m_fRegenerationCombatDelayMultiplier=1.5f);
+
+//-------------------------------------------------------------------------------------------------
+// Player damage
+//-------------------------------------------------------------------------------------------------
+PlayerDamageSettings[0]=(m_fHeadDamageMultiplier = 20.0f, m_fTorsoDamageMultiplier = 1.5f, m_fLimbsDamageMultiplier = 1.0f, m_fRedirectHeadShotsToNeckInBlindFireProbability = 0.8f, m_fRedirectHeadShotsToNeckAfterFalloffRangeProbability = 0.8f, m_fRedirectHeadShotsToNeckAfterShootingRangeProbability = 0.2f, m_fRedirectHeadShotsToNeckAfterPrecisionRangeProbability = 0.0f);
+PlayerDamageSettings[1]=(m_fHeadDamageMultiplier = 20.0f, m_fTorsoDamageMultiplier = 1.25f, m_fLimbsDamageMultiplier = 0.9f, m_fRedirectHeadShotsToNeckInBlindFireProbability = 0.8f, m_fRedirectHeadShotsToNeckAfterFalloffRangeProbability = 0.9f, m_fRedirectHeadShotsToNeckAfterShootingRangeProbability = 0.1f, m_fRedirectHeadShotsToNeckAfterPrecisionRangeProbability = 0.0f);
+PlayerDamageSettings[2]=(m_fHeadDamageMultiplier = 20.0f, m_fTorsoDamageMultiplier = 0.85f, m_fLimbsDamageMultiplier = 0.7f, m_fRedirectHeadShotsToNeckInBlindFireProbability = 0.8f, m_fRedirectHeadShotsToNeckAfterFalloffRangeProbability = 0.9f, m_fRedirectHeadShotsToNeckAfterShootingRangeProbability = 0.1f, m_fRedirectHeadShotsToNeckAfterPrecisionRangeProbability = 0.0f);
+PlayerDamageSettings[3]=(m_fHeadDamageMultiplier = 20.0f, m_fTorsoDamageMultiplier = 0.75f, m_fLimbsDamageMultiplier = 0.55f, m_fRedirectHeadShotsToNeckInBlindFireProbability = 0.8f, m_fRedirectHeadShotsToNeckAfterFalloffRangeProbability = 0.9f, m_fRedirectHeadShotsToNeckAfterShootingRangeProbability = 0.1f, m_fRedirectHeadShotsToNeckAfterPrecisionRangeProbability = 0.0f);
+
+//-------------------------------------------------------------------------------------------------
+// Player weapon settings
+//-------------------------------------------------------------------------------------------------
+PlayerWeaponSettings[0]=(m_bUnlimitedPistolMagazines = false, m_fInitialPrimaryAmmoCountMultiplier = 3.0f, m_fInitialSecondaryAmmoCountMultiplier = 3.0f, m_fAfterAIDroppedPrimaryAmmoCountMultiplier = 1.5f, m_fAfterAIDroppedSecondaryAmmoCountMultiplier = 1.5f, m_bDropCrateUseAllowed = true);
+PlayerWeaponSettings[1]=(m_bUnlimitedPistolMagazines = false, m_fInitialPrimaryAmmoCountMultiplier = 2.0f, m_fInitialSecondaryAmmoCountMultiplier = 2.0f, m_fAfterAIDroppedPrimaryAmmoCountMultiplier = 1.0f, m_fAfterAIDroppedSecondaryAmmoCountMultiplier = 0.67f, m_bDropCrateUseAllowed = true);
+PlayerWeaponSettings[2]=(m_bUnlimitedPistolMagazines = false, m_fInitialPrimaryAmmoCountMultiplier = 1.0f, m_fInitialSecondaryAmmoCountMultiplier = 1.0f, m_fAfterAIDroppedPrimaryAmmoCountMultiplier = 0.67f, m_fAfterAIDroppedSecondaryAmmoCountMultiplier = 0.5f, m_bDropCrateUseAllowed = true);
+PlayerWeaponSettings[3]=(m_bUnlimitedPistolMagazines = false, m_fInitialPrimaryAmmoCountMultiplier = 1.0f, m_fInitialSecondaryAmmoCountMultiplier = 1.0f, m_fAfterAIDroppedPrimaryAmmoCountMultiplier = 0.5f, m_fAfterAIDroppedSecondaryAmmoCountMultiplier = 0.25f, m_bDropCrateUseAllowed = false);
+
+//-------------------------------------------------------------------------------------------------
+// Player gadget settings
+//-------------------------------------------------------------------------------------------------
+PlayerGadgetSettings[0]=(m_bSonarPulseEnabled = true, m_fTechNPCArchetypeVisionModeDisruptionRange=1000.0f);
+PlayerGadgetSettings[1]=(m_bSonarPulseEnabled = true, m_fTechNPCArchetypeVisionModeDisruptionRange=5000.0f);
+PlayerGadgetSettings[2]=(m_bSonarPulseEnabled = true, m_fTechNPCArchetypeVisionModeDisruptionRange=10000.0f);
+PlayerGadgetSettings[3]=(m_bSonarPulseEnabled = false, m_fTechNPCArchetypeVisionModeDisruptionRange=15000.0f);
+
+//-------------------------------------------------------------------------------------------------
+// AI detection settings
+//-------------------------------------------------------------------------------------------------
+AIDetectionSettings[0]=(m_fDetectionSpeedMultiplier = 1.0f, m_bEnableLastKnownPositionShadow = true, m_bEnableDetectionWarnings=true);
+AIDetectionSettings[1]=(m_fDetectionSpeedMultiplier = 1.0f, m_bEnableLastKnownPositionShadow = true, m_bEnableDetectionWarnings=true);
+AIDetectionSettings[2]=(m_fDetectionSpeedMultiplier = 1.0f, m_bEnableLastKnownPositionShadow = true, m_bEnableDetectionWarnings=true);
+AIDetectionSettings[3]=(m_fDetectionSpeedMultiplier = 1.0f, m_bEnableLastKnownPositionShadow = false, m_bEnableDetectionWarnings=true);
+
+//-------------------------------------------------------------------------------------------------
+// Hand to hand settings
+//-------------------------------------------------------------------------------------------------
+HandToHandSettings[0]=(m_fH2HFailProbabilityInitial=0.0f, m_fH2HFailProbabilityIncreasePerKill=0.4f, m_fH2HFailProbabilityCooldownPerSecond=0.085f, m_fH2HFailProbabilityBase_InCover_InCombat_CloseToLKP=0.0f, m_fH2HFailProbabilityBase_EnemyAware_CloseToALKP=0.0f, m_fH2HCloseLKPDistance=250.0f, m_fH2HCloseApproxLKPDistance=150.0f);
+HandToHandSettings[1]=(m_fH2HFailProbabilityInitial=0.0f, m_fH2HFailProbabilityIncreasePerKill=0.50f, m_fH2HFailProbabilityCooldownPerSecond=0.07f, m_fH2HFailProbabilityBase_InCover_InCombat_CloseToLKP=0.5f, m_fH2HFailProbabilityBase_EnemyAware_CloseToALKP=0.5f, m_fH2HCloseLKPDistance=250.0f, m_fH2HCloseApproxLKPDistance=150.0f);
+HandToHandSettings[2]=(m_fH2HFailProbabilityInitial=0.0f, m_fH2HFailProbabilityIncreasePerKill=1.0f, m_fH2HFailProbabilityCooldownPerSecond=0.05f , m_fH2HFailProbabilityBase_InCover_InCombat_CloseToLKP=0.8f, m_fH2HFailProbabilityBase_EnemyAware_CloseToALKP=0.8f, m_fH2HCloseLKPDistance=325.0f, m_fH2HCloseApproxLKPDistance=150.0f);
+HandToHandSettings[3]=(m_fH2HFailProbabilityInitial=1.0f, m_fH2HFailProbabilityIncreasePerKill=0.0f, m_fH2HFailProbabilityCooldownPerSecond=0.0f , m_fH2HFailProbabilityBase_InCover_InCombat_CloseToLKP=1.0f, m_fH2HFailProbabilityBase_EnemyAware_CloseToALKP=1.0f, m_fH2HCloseLKPDistance=450.0f, m_fH2HCloseApproxLKPDistance=150.0f, m_fH2HDenyH2HChainAbductionTimeout=90.0f);
+
+//-------------------------------------------------------------------------------------------------
+// Player noise settings
+//-------------------------------------------------------------------------------------------------
+PlayerNoiseSettings[0]=(m_bSendFootStepEventsWhenCrouchRunning = false, m_bSendFootStepEventsWhenCrouchSprinting=false, m_bSendFootStepEventsWhenCrouchWalking=false);
+PlayerNoiseSettings[1]=(m_bSendFootStepEventsWhenCrouchRunning = true, m_bSendFootStepEventsWhenCrouchSprinting=true, m_bSendFootStepEventsWhenCrouchWalking=false);
+PlayerNoiseSettings[2]=(m_bSendFootStepEventsWhenCrouchRunning = true, m_bSendFootStepEventsWhenCrouchSprinting=true, m_bSendFootStepEventsWhenCrouchWalking=false);
+PlayerNoiseSettings[3]=(m_bSendFootStepEventsWhenCrouchRunning = true, m_bSendFootStepEventsWhenCrouchSprinting=true, m_bSendFootStepEventsWhenCrouchWalking=false);
+
+//-------------------------------------------------------------------------------------------------
+// Player stealth/combat settings
+//-------------------------------------------------------------------------------------------------
+PlayerStealthCombatSettings[0]=(m_fCombatDetectionThresholdTime=3.4f, m_fCombatDetectedToVanishTime=0.0f);
+PlayerStealthCombatSettings[1]=(m_fCombatDetectionThresholdTime=3.4f, m_fCombatDetectedToVanishTime=5.0f);
+PlayerStealthCombatSettings[2]=(m_fCombatDetectionThresholdTime=3.4f, m_fCombatDetectedToVanishTime=15.0f);
+PlayerStealthCombatSettings[3]=(m_fCombatDetectionThresholdTime=3.4f, m_fCombatDetectedToVanishTime=30.0f);
+
+//-------------------------------------------------------------------------------------------------
+// Player stealth/combat settings
+//-------------------------------------------------------------------------------------------------
+PlayerWeaponStashSettings[0]=(m_bDisableWeaponStashUse=false);
+PlayerWeaponStashSettings[1]=(m_bDisableWeaponStashUse=false);
+PlayerWeaponStashSettings[2]=(m_bDisableWeaponStashUse=false);
+PlayerWeaponStashSettings[3]=(m_bDisableWeaponStashUse=true);
+
+//-------------------------------------------------------------------------------------------------
+// Player inventory limit settings
+//-------------------------------------------------------------------------------------------------
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_Handgun , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_SMG , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_LMG , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_AssaultRifle , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_Crossbow , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_SniperRifle , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Rookie, m_eWeaponCategory=eWeaponCategory_Tazer , m_nAmmoLimit=100);
+
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_Handgun , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_SMG , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_LMG , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_AssaultRifle , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_Crossbow , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_SniperRifle , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Normal, m_eWeaponCategory=eWeaponCategory_Tazer , m_nAmmoLimit=100);
+
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_Handgun , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_SMG , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_LMG , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_AssaultRifle , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_Crossbow , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_SniperRifle , m_nAmmoLimit=100);
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Realistic, m_eWeaponCategory=eWeaponCategory_Tazer , m_nAmmoLimit=100);
+
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_Handgun , m_nAmmoLimit=100););
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_SMG , m_nAmmoLimit=100););
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_LMG , m_nAmmoLimit=100););
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_AssaultRifle , m_nAmmoLimit=100););
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_Crossbow , m_nAmmoLimit=100););
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_SniperRifle , m_nAmmoLimit=100););
+PlayerInventoryAmmoLimitSettings=(m_eDifficultyLevel=eDifficultyLevel_Perfectionist, m_eWeaponCategory=eWeaponCategory_Tazer , m_nAmmoLimit=100););
diff --git a/data/SplinterCellBlacklist.FusionMod/src/system/version.ual b/data/SplinterCellBlacklist.FusionMod/src/system/version.ual
new file mode 100644
index 000000000..a36540af3
--- /dev/null
+++ b/data/SplinterCellBlacklist.FusionMod/src/system/version.ual
@@ -0,0 +1 @@
+loadfromscriptsonly
\ No newline at end of file
diff --git a/data/SplinterCellConviction.FusionMod/src/system/scripts/SplinterCellConviction.FusionMod.ini b/data/SplinterCellConviction.FusionMod/src/system/scripts/SplinterCellConviction.FusionMod.ini
index 17cf65031..a4bf4b076 100644
--- a/data/SplinterCellConviction.FusionMod/src/system/scripts/SplinterCellConviction.FusionMod.ini
+++ b/data/SplinterCellConviction.FusionMod/src/system/scripts/SplinterCellConviction.FusionMod.ini
@@ -4,4 +4,8 @@ SkipSystemDetection = 1
DisableDOF = 1
DisableBlackAndWhiteFilter = 0
DisableCharacterLighting = 0
-EnhancedSonarVision = 0 // https://imgur.com/PfDDYG2
\ No newline at end of file
+EnhancedSonarVision = 0 // https://imgur.com/PfDDYG2
+BlacklistIndicators = 0 // Bloom will be enabled only in the darkness
+
+[LOGITECH]
+LightSyncRGB = 1 // Mouse and keyboard will be dimmed in the darkness(and vice versa with BlacklistIndicators). Only Logitech hardware is supported, requires Logitech G HUB app
diff --git a/external/asmjit b/external/asmjit
index ffac9f36f..330aa6438 160000
--- a/external/asmjit
+++ b/external/asmjit
@@ -1 +1 @@
-Subproject commit ffac9f36fb045dd2c6a81e1b5b9ccc115e5ef924
+Subproject commit 330aa64386f394e090eb1062c645f9d021a761bc
diff --git a/external/injector b/external/injector
index 139126791..d8db0115b 160000
--- a/external/injector
+++ b/external/injector
@@ -1 +1 @@
-Subproject commit 139126791f4529ecf0929bbf807de1afa715d7a6
+Subproject commit d8db0115b5369d6fb4233b2651e0466185e73fab
diff --git a/external/spdlog b/external/spdlog
index c3aed4b68..d276069a6 160000
--- a/external/spdlog
+++ b/external/spdlog
@@ -1 +1 @@
-Subproject commit c3aed4b68373955e1cc94307683d44dca1515d2b
+Subproject commit d276069a6e916b1e1fd45885b15b72bd8ee000a7
diff --git a/includes/stdafx.cpp b/includes/stdafx.cpp
index e23118443..eaaa1ba98 100644
--- a/includes/stdafx.cpp
+++ b/includes/stdafx.cpp
@@ -10,9 +10,9 @@ float GetFOV2(float f, float ar)
return 4.0f * f * atan(ar * (3.0f / 4.0f)) / (float)M_PI;
}
-float AdjustFOV(float f, float ar)
+float AdjustFOV(float f, float ar, float base_ar)
{
- return std::round((2.0f * atan(((ar) / (4.0f / 3.0f)) * tan(f / 2.0f * ((float)M_PI / 180.0f)))) * (180.0f / (float)M_PI) * 100.0f) / 100.0f;
+ return std::round((2.0f * atan(((ar) / base_ar) * tan(f / 2.0f * ((float)M_PI / 180.0f)))) * (180.0f / (float)M_PI) * 100.0f) / 100.0f;
}
void CreateThreadAutoClose(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId)
diff --git a/includes/stdafx.h b/includes/stdafx.h
index 0b5da2400..fadf378b4 100644
--- a/includes/stdafx.h
+++ b/includes/stdafx.h
@@ -36,7 +36,7 @@
float GetFOV(float f, float ar);
float GetFOV2(float f, float ar);
-float AdjustFOV(float f, float ar);
+float AdjustFOV(float f, float ar, float base_ar = (4.0f / 3.0f));
bool IsModuleUAL(HMODULE mod);
bool IsUALPresent();
@@ -102,6 +102,14 @@ std::string pattern_str(T t, Rest... rest)
return std::string((std::is_same::value ? format("%c ", t) : format("%02X ", t)) + pattern_str(rest...));
}
+template
+hook::pattern find_pattern(Args... args)
+{
+ hook::pattern pattern;
+ ((pattern = hook::pattern(args), !pattern.count_hint(count).empty()) || ...);
+ return pattern;
+}
+
template
constexpr size_t length(char const (&)[N])
{
@@ -148,7 +156,7 @@ inline bool starts_with(const std::wstring_view str, const std::wstring_view pre
return str.starts_with(prefix);
}
-template
+template
T GetModulePath(HMODULE hModule)
{
static constexpr auto INITIAL_BUFFER_SIZE = MAX_PATH;
@@ -202,7 +210,7 @@ T GetModulePath(HMODULE hModule)
return T();
}
-template
+template
T GetThisModulePath()
{
HMODULE hm = NULL;
@@ -217,7 +225,7 @@ T GetThisModulePath()
return r;
}
-template
+template
T GetThisModuleName()
{
HMODULE hm = NULL;
@@ -232,7 +240,7 @@ T GetThisModuleName()
return moduleFileName.substr(moduleFileName.find_last_of(L"/\\") + 1);
}
-template
+template
T GetExeModulePath()
{
T r = GetModulePath(NULL);
@@ -246,7 +254,7 @@ T GetExeModulePath()
return r;
}
-template
+template
T GetExeModuleName()
{
const T moduleFileName = GetModulePath(NULL);
@@ -258,7 +266,7 @@ T GetExeModuleName()
return moduleFileName.substr(moduleFileName.find_last_of(L"/\\") + 1);
}
-template
+template
T GetCurrentDirectoryW()
{
static constexpr auto INITIAL_BUFFER_SIZE = MAX_PATH;
diff --git a/premake5.lua b/premake5.lua
index 07b889769..f5c992c60 100644
--- a/premake5.lua
+++ b/premake5.lua
@@ -471,6 +471,8 @@ project "SplinterCellChaosTheory.WidescreenFix"
setpaths("Z:/WFP/Games/Splinter Cell/Splintercell Chaos Theory/", "system/splintercell3.exe", "system/scripts/")
project "SplinterCellConviction.FusionMod"
setpaths("Z:/WFP/Games/Splinter Cell/Tom Clancy's Splinter Cell Conviction/", "src/system/conviction_game.exe", "src/system/scripts/")
+project "SplinterCellBlacklist.FusionMod"
+ setpaths("Z:/WFP/Games/Splinter Cell/Splinter Cell Blacklist/", "src/SYSTEM/Blacklist_DX11_game.exe", "src/system/scripts/")
project "SplinterCellDoubleAgent.WidescreenFix"
setpaths("Z:/WFP/Games/Splinter Cell/Splinter Cell - Double Agent/", "SCDA-Offline/System/SplinterCell4.exe", "SCDA-Offline/System/scripts/")
files { "textures/SCDA/icon.rc" }
diff --git a/source/SplinterCellBlacklist.FusionMod/dllmain.cpp b/source/SplinterCellBlacklist.FusionMod/dllmain.cpp
new file mode 100644
index 000000000..ed26a6d56
--- /dev/null
+++ b/source/SplinterCellBlacklist.FusionMod/dllmain.cpp
@@ -0,0 +1,801 @@
+#include "stdafx.h"
+#include
+#include
+
+BOOL CreateProcessInJob(
+ HANDLE hJob,
+ LPCTSTR lpApplicationName,
+ LPTSTR lpCommandLine,
+ LPSECURITY_ATTRIBUTES lpProcessAttributes,
+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ BOOL bInheritHandles,
+ DWORD dwCreationFlags,
+ LPVOID lpEnvironment,
+ LPCTSTR lpCurrentDirectory,
+ LPSTARTUPINFO lpStartupInfo,
+ LPPROCESS_INFORMATION ppi)
+{
+ BOOL fRc = CreateProcess(
+ lpApplicationName,
+ lpCommandLine,
+ lpProcessAttributes,
+ lpThreadAttributes,
+ bInheritHandles,
+ dwCreationFlags | CREATE_SUSPENDED,
+ lpEnvironment,
+ lpCurrentDirectory,
+ lpStartupInfo,
+ ppi);
+ if (fRc) {
+ fRc = AssignProcessToJobObject(hJob, ppi->hProcess);
+ if (fRc && !(dwCreationFlags & CREATE_SUSPENDED)) {
+ fRc = ResumeThread(ppi->hThread) != (DWORD)-1;
+ }
+ if (!fRc) {
+ TerminateProcess(ppi->hProcess, 0);
+ CloseHandle(ppi->hProcess);
+ CloseHandle(ppi->hThread);
+ ppi->hProcess = ppi->hThread = nullptr;
+ }
+ }
+ return fRc;
+}
+
+HWND WindowHandle;
+static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
+{
+ DWORD lpdwProcessId;
+ GetWindowThreadProcessId(hwnd, &lpdwProcessId);
+ if (lpdwProcessId == GetCurrentProcessId())
+ {
+ if (IsWindowVisible(hwnd))
+ {
+ WindowHandle = hwnd;
+ }
+ }
+ return TRUE;
+}
+
+std::string sExtractionWaveConfigs = "Default";
+int nExtractionWaveEnemyMultiplier = 1;
+int nExtractionWaveEnemyRandomRangeMin = 0;
+int nExtractionWaveEnemyRandomRangeMax = 4;
+int GetRandomInt(int range_begin, int range_end)
+{
+ static std::random_device rd;
+ static std::mt19937 gen(rd());
+ std::uniform_int_distribution<> dis(range_begin, range_end);
+ return dis(gen);
+}
+
+namespace ExtractionSubWaveEnemy
+{
+ int curWaveEnemyCount = 0;
+ int curStartConditionType = 0;
+ injector::hook_back hbappAtoi;
+ int __cdecl appAtoi(const char* String)
+ {
+ auto i = hbappAtoi.fun(String);
+ if (iequals(sExtractionWaveConfigs, "Random"))
+ i *= GetRandomInt(nExtractionWaveEnemyRandomRangeMin, nExtractionWaveEnemyRandomRangeMax);
+ else
+ i *= nExtractionWaveEnemyMultiplier;
+ curWaveEnemyCount += i;
+ return i;
+ }
+}
+
+bool (WINAPI* GetOverloadedFilePathA)(const char* lpFilename, char* out, size_t out_size) = nullptr;
+namespace FFileManagerArc
+{
+ SafetyHookInline shLookup{};
+ void* __fastcall Lookup(void* pFFileManagerArc, void* edx, const char* path)
+ {
+ //std::string s(MAX_PATH, '\0');
+ if (GetOverloadedFilePathA(path, nullptr/*s.data()*/, 0/*s.size()*/))
+ return nullptr;
+ return shLookup.fastcall(pFFileManagerArc, edx, path);
+ }
+}
+
+namespace l3d
+{
+ using LeadOptions = float*;
+ LeadOptions* (*GetResource)() = nullptr;
+ LeadOptions Lead_GetOptions(LeadOptions* lead)
+ {
+ return lead[2];
+ }
+}
+
+float fScreenCullBias = 0.0f;
+float fFOVDiff = 1.0f;
+SafetyHookInline shTriggerScreenCullBias{};
+void __cdecl TriggerScreenCullBias(char bStickyCamState)
+{
+ auto options = l3d::Lead_GetOptions(l3d::GetResource());
+
+ // original code
+ //if (bStickyCamState)
+ // options[130] = 0.3f;
+ //else
+ // options[130] = 1.0f;
+
+ if (!fScreenCullBias) // disable culling
+ options[130] = 0.0001f;
+ else
+ options[130] = fScreenCullBias / fFOVDiff;
+}
+
+namespace UI
+{
+ namespace ScenePause
+ {
+ void* pUI = nullptr;
+ void* pUnk = nullptr;
+ SafetyHookInline shOnRadarChanged{};
+ uint8_t __fastcall OnRadarChanged(void* ui, void* edx, void* a2, int value) // uint8_t UI::ScenePause::OnRadarChanged(Slot*, unsigned int)
+ {
+ pUI = ui;
+ pUnk = a2;
+ return shOnRadarChanged.fastcall(ui, edx, a2, value);
+ }
+ }
+}
+
+namespace HudRadar
+{
+ char (*HudRadarEnabled)() = nullptr;
+}
+
+namespace UInputManager
+{
+ injector::hook_back hbThrowAction;
+ injector::hook_back hbClearKey;
+
+ bool bIsInventoryCombo = false;
+
+ enum eInputAction
+ {
+ eCover = 0x6,
+ eInventoryClearKB = 0x18,
+ eInventoryClearPad = 0xE,
+ eInventoryOpenKB = 0x67,
+ eInventoryHeldKB = 0x68,
+ eInventoryOpenPad = 0x3D,
+ eInventoryHeldPad = 0x3F,
+ };
+
+ void __fastcall ThrowActionOnKeyPressed(void* _this, void* edx, int InputAction)
+ {
+ if (InputAction != eInventoryOpenKB && InputAction != eInventoryOpenPad)
+ {
+ if (InputAction == eCover)
+ {
+ if (bIsInventoryCombo)
+ {
+ if (UI::ScenePause::pUI && HudRadar::HudRadarEnabled && UI::ScenePause::pUnk)
+ UI::ScenePause::shOnRadarChanged.fastcall(UI::ScenePause::pUI, (void*)UI::ScenePause::shOnRadarChanged.target(), UI::ScenePause::pUnk, !HudRadar::HudRadarEnabled());
+ }
+ }
+ }
+ return hbThrowAction.fun(_this, edx, InputAction);
+ }
+
+ void __fastcall ThrowActionOnKeyHeld(void* _this, void* edx, int eInputAction)
+ {
+ if (eInputAction == eInventoryHeldKB || eInputAction == eInventoryHeldPad)
+ bIsInventoryCombo = true;
+ return hbThrowAction.fun(_this, edx, eInputAction);
+ }
+
+ void __fastcall ClearKey(void* _this, void* edx, char eButton)
+ {
+ if (eButton == eInventoryClearKB || eButton == eInventoryClearPad)
+ bIsInventoryCombo = false;
+ return hbClearKey.fun(_this, edx, eButton);
+ }
+}
+
+void Init()
+{
+ CIniReader iniReader("");
+ auto bSkipIntro = iniReader.ReadInteger("MAIN", "SkipIntro", 1) != 0;
+ auto bDisableNegativeMouseAcceleration = iniReader.ReadInteger("MAIN", "DisableNegativeMouseAcceleration", 1) != 0;
+ auto bUltraWideSupport = iniReader.ReadInteger("MAIN", "UltraWideSupport", 1) != 0;
+ static auto fFOVFactor = std::clamp(iniReader.ReadFloat("MAIN", "FOVFactor", 1.0f), 0.5f, 2.5f);
+ fScreenCullBias = std::clamp(iniReader.ReadFloat("MAIN", "ScreenCullBias", 0.0f), 0.0f, 1.0f);
+
+ sExtractionWaveConfigs = iniReader.ReadString("EXTRACTION", "ExtractionWaveConfigs", "Default");
+ nExtractionWaveEnemyMultiplier = std::clamp(iniReader.ReadInteger("EXTRACTION", "ExtractionWaveEnemyMultiplier", 1), 1, 9999);
+ nExtractionWaveEnemyRandomRangeMin = std::clamp(iniReader.ReadInteger("EXTRACTION", "ExtractionWaveEnemyRandomRangeMin", 0), 0, 9999);
+ nExtractionWaveEnemyRandomRangeMax = std::clamp(iniReader.ReadInteger("EXTRACTION", "ExtractionWaveEnemyRandomRangeMax", 4), 1, 9999);
+
+ static auto sReinforcementsNumber = iniReader.ReadString("HUNTER", "ReinforcementsNumber", "Default");
+ static auto nReinforcementsEnemyMultiplier = std::clamp(iniReader.ReadInteger("HUNTER", "ReinforcementsEnemyMultiplier", 1), 1, 9999);
+ static auto nReinforcementsEnemyRandomRangeMin = std::clamp(iniReader.ReadInteger("HUNTER", "ReinforcementsEnemyRandomRangeMin", 1), 1, 9999);
+ static auto nReinforcementsEnemyRandomRangeMax = std::clamp(iniReader.ReadInteger("HUNTER", "ReinforcementsEnemyRandomRangeMax", 1), 1, 9999);
+
+ auto bDisableMissionFailOnDetection = iniReader.ReadInteger("GHOST", "DisableMissionFailOnDetection", 1) != 0;
+
+ auto bUnlockDLC = iniReader.ReadInteger("UNLOCKS", "UnlockDLC", 1) != 0;
+ static auto bUnlockAllNonCampaignMissions = iniReader.ReadInteger("UNLOCKS", "UnlockAllNonCampaignMissions", 1) != 0;
+ static auto bUnlockAllCampaignMissions = iniReader.ReadInteger("UNLOCKS", "UnlockAllCampaignMissions", 0) != 0;
+
+ auto bToggleRadarHotkey = iniReader.ReadInteger("RADAR", "ToggleRadarHotkey", 0) != 0;
+
+ auto sDedicatedServerExePath = iniReader.ReadString("STARTUP", "DedicatedServerExePath", "");
+
+ if (!sDedicatedServerExePath.empty())
+ {
+ std::error_code ec;
+ auto dsPath = std::filesystem::path(sDedicatedServerExePath);
+ auto processPath = dsPath.is_absolute() ? dsPath : (GetExeModulePath() / dsPath);
+ auto workingDir = std::filesystem::path(processPath).remove_filename();
+ if (std::filesystem::exists(dsPath, ec))
+ {
+ HANDLE hJob = CreateJobObject(nullptr, nullptr);
+ JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = { };
+ info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
+ SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &info, sizeof(info));
+ STARTUPINFO si = { sizeof(si) };
+ PROCESS_INFORMATION pi;
+ if (CreateProcessInJob(hJob,
+ processPath.c_str(),
+ NULL,
+ nullptr, nullptr, FALSE, CREATE_NO_WINDOW,
+ nullptr, workingDir.c_str(), &si, &pi)) {
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+ }
+ }
+
+ //allow loading unpacked files
+ {
+ ModuleList dlls;
+ dlls.Enumerate(ModuleList::SearchLocation::LocalOnly);
+ for (auto& e : dlls.m_moduleList)
+ {
+ auto m = std::get(e);
+ if (IsModuleUAL(m)) {
+ GetOverloadedFilePathA = (decltype(GetOverloadedFilePathA))GetProcAddress(m, "GetOverloadedFilePathA");
+ break;
+ }
+ }
+
+ if (GetOverloadedFilePathA)
+ {
+ auto pattern = hook::pattern("55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC 1C 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B F1 8B 45 08");
+ FFileManagerArc::shLookup = safetyhook::create_inline(pattern.get_first(), FFileManagerArc::Lookup);
+ }
+ }
+
+ // Resolution
+ auto pattern = hook::pattern("A3 ? ? ? ? 8B 8E ? ? ? ? 89 0D");
+ static int* pViewportResolutionWidth = *pattern.get_first(1);
+ static int* pViewportResolutionHeight = *pattern.get_first(13);
+
+ //UnrealMain
+ pattern = hook::pattern("0F 84 ? ? ? ? 56 56 56 68 ? ? ? ? 68 ? ? ? ? 68 ? ? ? ? E8 ? ? ? ? 83 C4 18 50 8D 8D");
+ injector::WriteMemory(pattern.get_first(), 0xE990, true); //jz -> jmp
+
+ if (bSkipIntro)
+ {
+ //InitBootVideos
+ auto pattern = hook::pattern("E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? 8B E5");
+ injector::MakeNOP(pattern.get_first(5), 5, true);
+
+ static int nOnce = 0;
+ std::thread([]()
+ {
+ while (true)
+ {
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ EnumWindows(EnumWindowsProc, NULL);
+ if (nOnce == 1)
+ {
+ if (WindowHandle == GetForegroundWindow())
+ {
+ if ((GetAsyncKeyState(VK_MENU) & 0xF000) == 0)
+ {
+ keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
+ keybd_event(VK_RETURN, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+ }
+ }
+ }
+ else if (nOnce == 2)
+ break;
+ }
+ }).detach();
+
+ static auto kbd = safetyhook::create_mid(0x164A351, [](SafetyHookContext& regs)
+ {
+ nOnce = 1;
+ });
+
+ static auto kbd2 = safetyhook::create_mid(0x1648E97, [](SafetyHookContext& regs)
+ {
+ nOnce = 2;
+ });
+ }
+
+ if (bDisableNegativeMouseAcceleration)
+ {
+ auto pattern = hook::pattern("0F 28 CA EB 13 0F 57 ED");
+ injector::MakeNOP(pattern.get_first(0), 3, true);
+
+ pattern = hook::pattern("0F 28 C8 F3 0F 10 07");
+ injector::MakeNOP(pattern.get_first(0), 3, true);
+
+ pattern = hook::pattern("0F 28 C2 EB 15 0F 57 D2");
+ injector::MakeNOP(pattern.get_first(0), 3, true);
+
+ pattern = hook::pattern("0F 28 C3 D9 86");
+ injector::MakeNOP(pattern.get_first(0), 3, true);
+ }
+
+ {
+ pattern = hook::pattern("E8 ? ? ? ? 83 C4 04 89 45 E4 85 C0 0F 84"); // quantity in ExtractionWaveConfigXMLParser::LoadSubWaves
+ ExtractionSubWaveEnemy::hbappAtoi.fun = injector::MakeCALL(pattern.get_first(0), ExtractionSubWaveEnemy::appAtoi).get();
+
+ pattern = hook::pattern("E8 ? ? ? ? 83 C4 0C 85 C0 75 0C 8B 45 E8"); // ExtractionWaveConfigXMLParser::LoadSubWaves
+ static auto KillCountSoftlockFix = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ auto type = std::string_view((const char*)regs.esi);
+ int value = regs.edi;
+ if (type == "Kills")
+ {
+ if (ExtractionSubWaveEnemy::curWaveEnemyCount < value)
+ {
+ value = ExtractionSubWaveEnemy::curWaveEnemyCount;
+ regs.edi = value;
+ regs.eax = value;
+ }
+
+ ExtractionSubWaveEnemy::curStartConditionType = value;
+ ExtractionSubWaveEnemy::curWaveEnemyCount = 0;
+ }
+ else
+ {
+ ExtractionSubWaveEnemy::curStartConditionType = 0;
+ ExtractionSubWaveEnemy::curWaveEnemyCount = 0;
+ }
+ });
+ }
+
+ {
+ //AECoopHunterSpawner
+ auto pattern = hook::pattern("85 5E 08 75 29 8B 06 8B 50 0C 6A 04 8D 8F ? ? ? ? 51 8B CE FF D2 85 5E 08 75 12 8B 06 8B 50 0C 6A 04 8D 8F ? ? ? ? 51 8B CE FF D2 F6 46 08 02");
+ static auto FCheckpointPackReaderHook = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ if (iequals(sReinforcementsNumber, "Random"))
+ *(uint32_t*)(regs.edi + 0x370) = GetRandomInt(nReinforcementsEnemyRandomRangeMin, nReinforcementsEnemyRandomRangeMax);
+ });
+
+ pattern = hook::pattern("8B 16 8B 82 ? ? ? ? 8B CE FF D0 8B 16 8B 82 ? ? ? ? 8B CE FF D0 C6 86");
+ static auto AECoopHunterSpawnerHook = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ if (iequals(sReinforcementsNumber, "Random"))
+ *(uint32_t*)(regs.esi + 0x370) = GetRandomInt(nReinforcementsEnemyRandomRangeMin, nReinforcementsEnemyRandomRangeMax);
+ else
+ *(uint32_t*)(regs.esi + 0x370) *= nReinforcementsEnemyMultiplier;
+ });
+ }
+
+ if (bDisableMissionFailOnDetection)
+ {
+ auto pattern = hook::pattern("0F 86 ? ? ? ? 0F B6 8E");
+ injector::WriteMemory(pattern.get_first(), 0xE990, true); // jbe -> jmp
+ }
+
+ if (bUnlockDLC)
+ {
+ //NetOnlineContentRightsManager::GetUnlocksFromSaveGame
+ auto pattern = find_pattern("74 04 C6 40 04 01 56");
+ injector::MakeNOP(pattern.get_first(), 2, true);
+
+ pattern = find_pattern("39 5E 38 74 2C");
+ injector::MakeNOP(pattern.get_first(), 5, true);
+ static auto SPHelmetSuitC = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ *(uint32_t*)(regs.esi + 0x38) = regs.ebx;
+ });
+
+ pattern = find_pattern("39 5E 3C 74 27");
+ injector::MakeNOP(pattern.get_first(), 5, true);
+ static auto SPBootsSuitL = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ *(uint32_t*)(regs.esi + 0x3C) = regs.ebx;
+ });
+
+ pattern = find_pattern("39 5E 40 74 27");
+ injector::MakeNOP(pattern.get_first(), 5, true);
+ static auto SPGlovesSuitL = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ *(uint32_t*)(regs.esi + 0x40) = regs.ebx;
+ });
+ }
+
+ if (bUnlockAllNonCampaignMissions || bUnlockAllCampaignMissions)
+ {
+ auto pattern = find_pattern("89 86 ? ? ? ? 8B 8E ? ? ? ? 6A 00");
+ injector::MakeNOP(pattern.get_first(), 6, true);
+ static auto SC6Mission__SerializeProfile = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ auto& MissionEnum = *(uint8_t*)(regs.esi + 0xA4);
+ auto& MissionStatusEnum = *(uint32_t*)(regs.esi + 0xB4);
+ MissionStatusEnum = regs.eax;
+
+ if (!MissionStatusEnum)
+ {
+ if (bUnlockAllNonCampaignMissions && MissionEnum >= 13 && MissionEnum <= 16) // briggs
+ MissionStatusEnum = 1;
+ if (bUnlockAllNonCampaignMissions && MissionEnum >= 13 && MissionEnum <= 28) // grim
+ MissionStatusEnum = 1;
+
+ if (bUnlockAllCampaignMissions)
+ {
+ if (MissionEnum && MissionEnum <= 12)
+ {
+ MissionStatusEnum = 1;
+ }
+
+ if (MissionEnum == 21 || MissionEnum == 37 || MissionEnum == 38)
+ {
+ MissionStatusEnum = 1;
+ }
+ }
+ }
+ });
+ }
+
+ if (!sExtractionWaveConfigs.empty() && !iequals(sExtractionWaveConfigs, "Default"))
+ {
+ std::error_code ec;
+ std::string prefix = GetOverloadedFilePathA ? "..\\..\\" : ".\\update\\";
+ std::filesystem::path xmlPathDefault = prefix + std::string("Data\\ExtractionWaveConfigs\\") + sExtractionWaveConfigs + "\\DefaultWaveConfig.xml";
+ std::filesystem::path xmlPath = prefix + std::string("Data\\ExtractionWaveConfigs\\") + sExtractionWaveConfigs + "\\%s.xml";
+ auto p = GetExeModulePath() / std::filesystem::path(xmlPath).remove_filename();
+
+ if (std::filesystem::exists(p / "D_Amman.xml", ec) && std::filesystem::exists(p / "D_Bratislava.xml", ec) && std::filesystem::exists(p / "D_Kigali.xml", ec) && std::filesystem::exists(p / "D_Sanaa.xml", ec))
+ {
+ static std::string s = xmlPath.string();
+ auto pattern = find_pattern("68 ? ? ? ? E8 ? ? ? ? 83 C4 08 50 8D 4D D8 E8 ? ? ? ? BB");
+ injector::WriteMemory(pattern.get_first(1), s.data(), true);
+ }
+
+ if (std::filesystem::exists(GetExeModulePath() / xmlPathDefault, ec))
+ {
+ static std::string s = xmlPathDefault.string();
+ auto pattern = find_pattern("68 ? ? ? ? E8 ? ? ? ? 8B F0 83 C4 08 39 75 D8 74 3D 80 3E 00 74 0C 56 E8 ? ? ? ? 83 C4 04 40 EB 02 33 C0 89 45 DC 39 45 E0 7D 10 6A 01 8D 4D D8 89 45 E0 E8 ? ? ? ? 8B 45 DC 85 C0");
+ injector::WriteMemory(pattern.get_first(1), s.data(), true);
+ }
+ }
+
+ static constexpr float fDefaultAspectRatio = 16.0f / 9.0f;
+
+ static auto GetAspectRatio = []() -> float
+ {
+ if (!pViewportResolutionWidth || !pViewportResolutionHeight || *pViewportResolutionWidth == -1 || *pViewportResolutionHeight == -1)
+ return fDefaultAspectRatio;
+ return static_cast(*pViewportResolutionWidth) / static_cast(*pViewportResolutionHeight);
+ };
+
+ if (bUltraWideSupport)
+ {
+ auto pattern = find_pattern("F3 0F 10 45 ? 0F 5A C9 0F 5A C0 F2 0F 5E C1 F2 0F 59 05", "F3 0F 10 45 ? 8B 46 34 0F 5A C9");
+ injector::MakeNOP(pattern.get_first(), 5, true);
+ static auto BootSeqCommon__Render_Bink_textures = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ regs.xmm0.f32[0] = (((*(float*)(regs.ebp + 0x14)) * fDefaultAspectRatio) - regs.xmm1.f32[0]) * (-0.5f);
+ else
+ regs.xmm0.f32[0] = *(float*)(regs.ebp + 0x20);
+ });
+
+ pattern = hook::pattern("F2 0F 10 0D ? ? ? ? F2 0F 10 15 ? ? ? ? 89 47 10");
+ injector::MakeNOP(pattern.get_first(), 8, true);
+ static auto FCanvasUtil__SetViewport = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ regs.xmm1.f64[0] = 2.0 / (GetAspectRatio() / fDefaultAspectRatio);
+ else
+ regs.xmm1.f64[0] = 2.0;
+ });
+
+ //NetOnlineManager::NetOnlineManager
+ pattern = hook::pattern("C7 45 ? ? ? ? ? 8D 64 24 00 53");
+ injector::WriteMemory(pattern.get_first(3), 4372, true);
+
+ //UD3DRenderDevice
+ pattern = hook::pattern("76 23 8B 06");
+ injector::WriteMemory(pattern.get_first(0), 0xEB, true); //jbe -> jmp
+
+ //UD3DRenderDevice Letterbox
+ pattern = hook::pattern("76 10 8B 03 8B 4D 10 89 06 8B 11");
+ struct UD3DRenderDevice__Letterbox
+ {
+ void operator()(injector::reg_pack& regs)
+ {
+ regs.eax = *(uintptr_t*)regs.ebx;
+ regs.ecx = *(uintptr_t*)(regs.ebp + 0x10);
+ *(uintptr_t*)regs.esi = regs.eax; //1920
+ regs.edx = *(uintptr_t*)regs.ecx;
+ *(uintptr_t*)regs.edi = regs.edx; //823
+
+ if (float(regs.eax) / float(regs.edx) > fDefaultAspectRatio)
+ { }
+ else
+ {
+ *(uintptr_t*)regs.esi = regs.eax;
+ *(uintptr_t*)regs.edi = int((float)regs.eax / fDefaultAspectRatio);
+ }
+ }
+ }; injector::MakeInline(pattern.get_first(0), pattern.get_first(13));
+
+ pattern = hook::pattern("F3 0F 11 04 24 50 8B 85 ? ? ? ? 51 52 50 57");
+ if (!pattern.count_hint(1).empty())
+ {
+ static auto D3DRenderer__RenderHUD = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ {
+ auto& a2 = regs.edi;
+ auto& x = *(uint32_t*)(regs.ebp - 0xAC);
+ auto& y = regs.edx;
+ auto& w = regs.ecx;
+ auto& h = regs.eax;
+
+ auto width = (float)h * fDefaultAspectRatio;
+ x = (int)(((float)w - width) * 0.5f);
+ w = (int)width;
+ }
+ });
+ }
+ else
+ {
+ pattern = hook::pattern("F3 0F 11 04 24 52 8B 95");
+ static auto D3DRenderer__RenderHUD = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ {
+ auto& a2 = regs.esi;
+ auto& x = *(uint32_t*)(regs.ebp - 0xB4);
+ auto& y = regs.ecx;
+ auto& w = regs.eax;
+ auto& h = regs.edx;
+
+ auto width = (float)h * fDefaultAspectRatio;
+ x = (int)(((float)w - width) * 0.5f);
+ w = (int)width;
+ }
+ });
+ }
+
+ pattern = hook::pattern("F3 0F 10 0D ? ? ? ? F3 0F 11 4C 24 ? 05 ? ? ? ? 66 0F 5A C0 F3 0F 11 04 24 50 8B 45 08 50 E8 ? ? ? ? 83 C4 10 5D C3");
+ injector::MakeNOP(pattern.count(2).get(0).get(0), 8, true);
+ static auto ScreenFade1 = safetyhook::create_mid(pattern.count(2).get(0).get(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ regs.xmm1.f32[0] = 1.0f / (GetAspectRatio() / fDefaultAspectRatio);
+ else
+ regs.xmm1.f32[0] = 1.0f;
+ });
+
+ static auto ScreenFade2 = safetyhook::create_mid(pattern.count(2).get(1).get(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ regs.xmm1.f32[0] = 1.0f / (GetAspectRatio() / fDefaultAspectRatio);
+ else
+ regs.xmm1.f32[0] = 1.0f;
+ });
+
+ pattern = hook::pattern("F2 0F 59 05 ? ? ? ? 0F 57 C9 F3 0F 2A CF");
+ injector::MakeNOP(pattern.get_first(0), 8, true);
+ static auto UI_Alignment1 = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ regs.xmm0.f64[0] *= GetAspectRatio() * 720.0f;
+ else
+ regs.xmm0.f64[0] *= 1280.0f;
+ });
+
+ pattern = hook::pattern("F3 0F 10 46 ? 0F 5A C0 F2 0F 59 05 ? ? ? ? 0F 57 C9 F3 0F 2A CB");
+ static auto UI_Alignment2 = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ *(float*)regs.eax = (720.0f * GetAspectRatio() - 1280.0f) * -0.5f + *(float*)(regs.eax);
+ else
+ regs.xmm0.f32[0] = *(float*)(regs.esi + 0x40);
+ });
+
+ pattern = find_pattern("F3 0F 10 46 ? F3 0F 11 85 ? ? ? ? 8D 85", "F3 0F 10 05 ? ? ? ? F3 0F 11 44 24 ? 8D 14 24");
+ static auto UI__ScenePause__PerformPauseOption = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ regs.xmm0.f32[0] = GetAspectRatio();
+ else
+ regs.xmm0.f32[0] = *(float*)(regs.esi + 0x50);
+ });
+
+ // Disable Blood Overlay
+ pattern = hook::pattern("F3 0F 11 2C 24 E8 ? ? ? ? 8B 86");
+ injector::MakeNOP(pattern.get_first(0), 5, true);
+ static auto UI__HudHealthFeedback__SceneTick = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ *(float*)(regs.esp) = 0.0f;
+ else
+ *(float*)(regs.esp) = regs.xmm5.f32[0];
+ });
+
+ // Disable Fading
+ pattern = hook::pattern("89 96 ? ? ? ? F3 0F 11 86 ? ? ? ? F3 0F 11 86 ? ? ? ? 5E");
+ injector::MakeNOP(pattern.get_first(0), 6, true);
+ static auto Lead_DoFade = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ {
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ *(uint32_t*)(regs.esi + 0x7FC) = 0;
+ else
+ *(uint32_t*)(regs.esi + 0x7FC) = regs.edx;
+ });
+ }
+
+ // FOV
+ {
+ pattern = hook::pattern("F3 0F 10 46 ? 0F 57 E4 0F 2E C4");
+ struct CameraImpl__UpdateFOV
+ {
+ void operator()(injector::reg_pack& regs)
+ {
+ float val = 0.0f;
+
+ _asm { fstp dword ptr[val] }
+
+ fFOVDiff = val;
+ if (GetAspectRatio() > fDefaultAspectRatio)
+ val = AdjustFOV(val, GetAspectRatio(), fDefaultAspectRatio);
+
+ val *= fFOVFactor;
+
+ if (val > 162.5f)
+ val = 162.5f;
+
+ fFOVDiff = val / fFOVDiff;
+
+ *(float*)(regs.esi + 0x34) = val;
+ regs.xmm0.f32[0] = val;
+
+ _asm { fld dword ptr[val] }
+
+ TriggerScreenCullBias(false);
+ }
+ }; injector::MakeInline(pattern.get_first(0));
+
+ // Cull
+ pattern = hook::pattern("55 8B EC E8 ? ? ? ? 8B C8 E8 ? ? ? ? 80 7D 08 00");
+ l3d::GetResource = (l3d::LeadOptions*(*)())injector::GetBranchDestination(pattern.get_first(3), true).as_int();
+ shTriggerScreenCullBias = safetyhook::create_inline(pattern.get_first(), TriggerScreenCullBias);
+ }
+
+ if (bToggleRadarHotkey)
+ {
+ // leads to crashing
+ auto pattern = hook::pattern("55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC 4C 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B D9 83 7D 0C 00");
+ UI::ScenePause::shOnRadarChanged = safetyhook::create_inline(pattern.get_first(), UI::ScenePause::OnRadarChanged);
+
+ //pattern = hook::pattern("E8 ? ? ? ? 8B 8E ? ? ? ? 51 8B 8E ? ? ? ? E8 ? ? ? ? 8B 8E ? ? ? ? E8");
+ //static auto UI__ScenePause__InitSlots = safetyhook::create_mid(pattern.get_first(0), [](SafetyHookContext& regs)
+ //{
+ // UI::ScenePause::pUI = (void*)regs.ecx;
+ // UI::ScenePause::pUnk = (void*)(regs.ecx + 0x68C);
+ //});
+
+ // this is not ideal
+ pattern = hook::pattern("E8 ? ? ? ? 8B 7F 1C 83 FF 3F");
+ UInputManager::hbThrowAction.fun = injector::MakeCALL(pattern.get_first(0), UInputManager::ThrowActionOnKeyHeld).get();
+ pattern = hook::pattern("E8 ? ? ? ? 8B 4F 1C 83 F9 3F");
+ UInputManager::hbThrowAction.fun = injector::MakeCALL(pattern.get_first(0), UInputManager::ThrowActionOnKeyPressed).get();
+ pattern = hook::pattern("E8 ? ? ? ? 8B 46 28 85 C0 74 52");
+ UInputManager::hbClearKey.fun = injector::MakeCALL(pattern.get_first(0), UInputManager::ClearKey).get();
+ pattern = hook::pattern("55 8B EC 83 EC 14 C6 45 FF 00");
+ HudRadar::HudRadarEnabled = (char (*)())pattern.get_first();
+ }
+}
+
+std::string currentGogglesLight = "LightGreen";
+int __cdecl appStricmpHook(const char* String1, const char* String2)
+{
+ auto ret = _stricmp(String1, String2);
+ if (!ret)
+ currentGogglesLight = String1;
+ else
+ currentGogglesLight = "LightGreen";
+ return ret;
+}
+
+void InitLED()
+{
+ CIniReader iniReader("");
+ auto bLightSyncRGB = iniReader.ReadInteger("LOGITECH", "LightSyncRGB", 1);
+
+ if (bLightSyncRGB)
+ {
+ //LoadoutCommon::FsBaseLoadout::GetSuitLightColor
+ auto pattern = hook::pattern("E8 ? ? ? ? 83 C4 08 85 C0 0F 84 ? ? ? ? 46 83 FE 0A");
+ injector::MakeCALL(pattern.get_first(0), appStricmpHook, true);
+
+ LEDEffects::Inject([]()
+ {
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
+ auto [R, G, B] = LEDEffects::RGBtoPercent(17, 138, 41, 1.0f);
+
+ if (std::string_view(currentGogglesLight) == "LightGreen")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(17, 138, 41, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightPaleOrange")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(158, 118, 29, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightRed")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(163, 18, 15, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightBlue")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(24, 70, 213, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightPink")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(163, 33, 116, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightPurple")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(111, 34, 210, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightWhite")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(162, 182, 208, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightGold")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(145, 172, 30, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightOrange")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(161, 89, 12, 1.0f);
+ }
+ else if (std::string_view(currentGogglesLight) == "LightPaleBlue")
+ {
+ std::tie(R, G, B) = LEDEffects::RGBtoPercent(23, 159, 205, 1.0f);
+ }
+
+ LEDEffects::SetLighting(R, G, B, false, false, false);
+ });
+ }
+}
+
+CEXP void InitializeASI()
+{
+ std::call_once(CallbackHandler::flag, []()
+ {
+ CallbackHandler::RegisterCallbackAtGetSystemTimeAsFileTime(Init, hook::pattern("0F 84 ? ? ? ? 56 56 56 68 ? ? ? ? 68 ? ? ? ? 68 ? ? ? ? E8 ? ? ? ? 83 C4 18 50 8D 8D"));
+ CallbackHandler::RegisterCallbackAtGetSystemTimeAsFileTime(InitLED, hook::pattern("E8 ? ? ? ? 83 C4 08 85 C0 0F 84 ? ? ? ? 46 83 FE 0A"));
+ });
+}
+
+BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
+{
+ if (reason == DLL_PROCESS_ATTACH)
+ {
+ if (!IsUALPresent()) { InitializeASI(); }
+ }
+ else if (reason == DLL_PROCESS_DETACH)
+ {
+
+ }
+ return TRUE;
+}
\ No newline at end of file
diff --git a/source/SplinterCellConviction.FusionMod/dllmain.cpp b/source/SplinterCellConviction.FusionMod/dllmain.cpp
index 49ea5e7c4..5ef3f3731 100644
--- a/source/SplinterCellConviction.FusionMod/dllmain.cpp
+++ b/source/SplinterCellConviction.FusionMod/dllmain.cpp
@@ -1,13 +1,17 @@
#include "stdafx.h"
+#include
float gVisibility = 1.0f;
int32_t gBlacklistIndicators = 0;
+bool bDisableBlackAndWhiteFilter = false;
injector::hook_back hb_8330DB;
void __cdecl sub_8330DB(float a1, float a2, int a3)
{
gVisibility = a1;
- //return hb_8330DB.fun(a1, a2, a3);
+
+ if (!bDisableBlackAndWhiteFilter)
+ return hb_8330DB.fun(a1, a2, a3);
}
injector::hook_back hb_100177B7;
@@ -41,7 +45,7 @@ void Init()
CIniReader iniReader("");
auto bSkipIntro = iniReader.ReadInteger("MAIN", "SkipIntro", 1) != 0;
auto bSkipSystemDetection = iniReader.ReadInteger("MAIN", "SkipSystemDetection", 1) != 0;
- auto bDisableBlackAndWhiteFilter = iniReader.ReadInteger("MAIN", "DisableBlackAndWhiteFilter", 0) != 0;
+ bDisableBlackAndWhiteFilter = iniReader.ReadInteger("MAIN", "DisableBlackAndWhiteFilter", 0) != 0;
auto bDisableCharacterLighting = iniReader.ReadInteger("MAIN", "DisableCharacterLighting", 0) != 0;
if (bSkipIntro)
@@ -57,7 +61,7 @@ void Init()
injector::MakeRET(pattern.get_first(3));
}
- if (bDisableBlackAndWhiteFilter) //light and shadow
+ //if (bDisableBlackAndWhiteFilter) //light and shadow
{
auto pattern = hook::pattern("E8 ? ? ? ? D9 05 ? ? ? ? 83 C4 0C 33 F6 56 51");
hb_8330DB.fun = injector::MakeCALL(pattern.get_first(), sub_8330DB, true).get();
@@ -157,12 +161,43 @@ void InitLeadD3DRender()
}
}
+void InitLED()
+{
+ CIniReader iniReader("");
+ auto bLightSyncRGB = iniReader.ReadInteger("LOGITECH", "LightSyncRGB", 1);
+
+ if (bLightSyncRGB)
+ {
+ LEDEffects::Inject([]()
+ {
+ static auto fPlayerVisibility = gVisibility;
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ auto gVisCmp = static_cast(static_cast(gVisibility * 10.0f)) / 10.0f;
+ auto fPlVisCmp = static_cast(static_cast(fPlayerVisibility * 10.0f)) / 10.0f;
+
+ if (fPlVisCmp > gVisCmp)
+ fPlayerVisibility -= 0.05f;
+ else if (fPlVisCmp < gVisCmp)
+ fPlayerVisibility += 0.05f;
+
+ constexpr auto minBrightness = 0.3f;
+ constexpr auto maxBrightness = 1.0f;
+
+ fPlayerVisibility = std::clamp(fPlayerVisibility, minBrightness, maxBrightness);
+
+ auto [R, G, B] = LEDEffects::RGBtoPercent(255, 39, 26, gBlacklistIndicators ? fPlayerVisibility : ((maxBrightness + minBrightness) - fPlayerVisibility));
+ LEDEffects::SetLighting(R, G, B, false, false, false);
+ });
+ }
+}
+
CEXP void InitializeASI()
{
std::call_once(CallbackHandler::flag, []()
{
- CallbackHandler::RegisterCallback(Init, hook::pattern("D9 1C 24 E8 ? ? ? ? D9 5E 0C"));
+ CallbackHandler::RegisterCallbackAtGetSystemTimeAsFileTime(Init, hook::pattern("D9 1C 24 E8 ? ? ? ? D9 5E 0C"));
CallbackHandler::RegisterCallback(L"LeadD3DRender.dll", InitLeadD3DRender);
+ CallbackHandler::RegisterCallbackAtGetSystemTimeAsFileTime(InitLED, hook::pattern("D9 1C 24 E8 ? ? ? ? D9 5E 0C"));
});
}