Skip to content

Commit f45c2e3

Browse files
committed
Chemical - Add real-world gas variants with CBRN protection, M8 paper, decontamination and ATNAA antidote
1 parent 5f19b8c commit f45c2e3

54 files changed

Lines changed: 2187 additions & 169 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Custom wound + damage type for chemical-warfare blister agents (mustard,
2+
// future lewisite-class agents)
3+
//
4+
// ACE's parseConfigForInjuries (medical_damage/functions) walks
5+
// configFile >> "ACE_Medical_Injuries" at preInit and merges all addon
6+
// contributions automatically, so no further wiring is needed.
7+
8+
class ACE_Medical_Injuries {
9+
class wounds {
10+
class ChemicalBurn {
11+
bleeding = 0.005; // mustard blisters weep — slow but persistent
12+
pain = 0.6;
13+
minDamage = 0;
14+
};
15+
};
16+
17+
class damageTypes {
18+
class chemicalBurn {
19+
thresholds[] = {{0, 1}};
20+
selectionSpecific = 0;
21+
class ChemicalBurn {
22+
weighting[] = {{0, 1}};
23+
};
24+
};
25+
};
26+
};

addons/chemical/ACE_Medical_Treatment_Actions.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,15 @@ class ACE_Medical_Treatment_Actions {
99
condition = QUOTE([ARR_2(_player,_patient)] call FUNC(canPutGasMask));
1010
icon = QPATHTOF(ui\Gasmask_icon.paa);
1111
};
12+
class Decontaminate: Diagnose {
13+
displayName = CSTRING(UseDecon);
14+
displayNameProgress = CSTRING(UseDecon_Progress);
15+
allowedSelections[] = {"Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"};
16+
allowSelfTreatment = 1;
17+
items[] = {"kat_decon_kit"};
18+
treatmentTime = 8;
19+
callbackSuccess = QFUNC(clearContamination);
20+
condition = QUOTE((_patient getVariable [ARR_2(QQGVAR(chemicalContamination),'')]) != '');
21+
icon = QPATHTOF(ui\icon_deconkit.paa);
22+
};
1223
};

addons/chemical/CfgAmmo.hpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,34 @@ class CfgAmmo {
2828
KAT_toxicLvL = 0; //cs
2929
};
3030

31+
class Sh_82mm_AMOS_Type2: Sh_82mm_AMOS_Type0 {
32+
KAT_projectile = 1;
33+
KAT_lifetime = 90;
34+
KAT_radius = 10;
35+
KAT_toxicLvL = 2; //phosgene
36+
};
37+
38+
class Sh_82mm_AMOS_Type3: Sh_82mm_AMOS_Type0 {
39+
KAT_projectile = 1;
40+
KAT_lifetime = 120;
41+
KAT_radius = 10;
42+
KAT_toxicLvL = 3; //mustard
43+
};
44+
45+
class Sh_82mm_AMOS_Type4: Sh_82mm_AMOS_Type0 {
46+
KAT_projectile = 1;
47+
KAT_lifetime = 90;
48+
KAT_radius = 10;
49+
KAT_toxicLvL = 4; //sarin
50+
};
51+
52+
class Sh_82mm_AMOS_Type5: Sh_82mm_AMOS_Type0 {
53+
KAT_projectile = 1;
54+
KAT_lifetime = 600;
55+
KAT_radius = 10;
56+
KAT_toxicLvL = 5; //vx — persistent
57+
};
58+
3159
class SmokeShell;
3260
class KAT_G_M7A3: SmokeShell {
3361
KAT_csGas = 1;

addons/chemical/CfgCloudlets.hpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,86 @@ class CfgCloudlets {
134134
};
135135
};
136136

137+
// Phosgene — pale grey-white, faint
138+
class GVAR(Phosgene_Gas_Particles): GVAR(Toxic_Gas_Particles) {
139+
color[] = {
140+
{0.7, 0.7, 0.7, 0},
141+
{0.78, 0.78, 0.76, 0.20},
142+
{0.82, 0.82, 0.80, 0.30},
143+
{0.85, 0.85, 0.82, 0.25},
144+
{0.85, 0.85, 0.82, 0.15},
145+
{0.85, 0.85, 0.82, 0}
146+
};
147+
};
148+
class GVAR(Phosgene_Gas_Wisps): GVAR(Toxic_Gas_Wisps) {
149+
color[] = {
150+
{0.78, 0.78, 0.76, 0},
151+
{0.85, 0.85, 0.82, 0.10},
152+
{0.88, 0.88, 0.85, 0.08},
153+
{0.88, 0.88, 0.85, 0}
154+
};
155+
};
156+
157+
// Mustard — yellowish-brown, garlic-thick
158+
class GVAR(Mustard_Gas_Particles): GVAR(Toxic_Gas_Particles) {
159+
color[] = {
160+
{0.45, 0.35, 0.10, 0},
161+
{0.55, 0.42, 0.12, 0.30},
162+
{0.62, 0.48, 0.15, 0.45},
163+
{0.65, 0.50, 0.16, 0.40},
164+
{0.65, 0.50, 0.16, 0.20},
165+
{0.65, 0.50, 0.16, 0}
166+
};
167+
};
168+
class GVAR(Mustard_Gas_Wisps): GVAR(Toxic_Gas_Wisps) {
169+
color[] = {
170+
{0.55, 0.42, 0.12, 0},
171+
{0.62, 0.48, 0.15, 0.18},
172+
{0.65, 0.50, 0.16, 0.13},
173+
{0.65, 0.50, 0.16, 0}
174+
};
175+
};
176+
177+
// Sarin — almost invisible, very faint warm tint
178+
class GVAR(Sarin_Gas_Particles): GVAR(Toxic_Gas_Particles) {
179+
color[] = {
180+
{0.75, 0.72, 0.65, 0},
181+
{0.80, 0.77, 0.70, 0.06},
182+
{0.82, 0.79, 0.72, 0.10},
183+
{0.82, 0.79, 0.72, 0.08},
184+
{0.82, 0.79, 0.72, 0.04},
185+
{0.82, 0.79, 0.72, 0}
186+
};
187+
};
188+
class GVAR(Sarin_Gas_Wisps): GVAR(Toxic_Gas_Wisps) {
189+
color[] = {
190+
{0.80, 0.77, 0.70, 0},
191+
{0.82, 0.79, 0.72, 0.04},
192+
{0.82, 0.79, 0.72, 0.03},
193+
{0.82, 0.79, 0.72, 0}
194+
};
195+
};
196+
197+
// VX — oily amber, persistent and visible
198+
class GVAR(VX_Gas_Particles): GVAR(Toxic_Gas_Particles) {
199+
color[] = {
200+
{0.50, 0.38, 0.05, 0},
201+
{0.60, 0.45, 0.08, 0.25},
202+
{0.70, 0.52, 0.10, 0.40},
203+
{0.72, 0.55, 0.12, 0.35},
204+
{0.72, 0.55, 0.12, 0.18},
205+
{0.72, 0.55, 0.12, 0}
206+
};
207+
};
208+
class GVAR(VX_Gas_Wisps): GVAR(Toxic_Gas_Wisps) {
209+
color[] = {
210+
{0.60, 0.45, 0.08, 0},
211+
{0.70, 0.52, 0.10, 0.18},
212+
{0.72, 0.55, 0.12, 0.13},
213+
{0.72, 0.55, 0.12, 0}
214+
};
215+
};
216+
137217
class KAT_CAS_GAS_FX: Default {
138218
interval = 0.03;
139219
circleRadius = 0;

addons/chemical/CfgMagazineGroups.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,20 @@ class ace_csw_groups {
88
KAT_1Rnd_82mm_Mo_TypeCS = 1;
99
KAT_3Rnd_82mm_Mo_TypeCS_AI = 1;
1010
};
11+
class KAT_1Rnd_82mm_Mo_Type2 {
12+
KAT_1Rnd_82mm_Mo_Type2 = 1;
13+
KAT_5Rnd_82mm_Mo_Type2_AI = 1;
14+
};
15+
class KAT_1Rnd_82mm_Mo_Type3 {
16+
KAT_1Rnd_82mm_Mo_Type3 = 1;
17+
KAT_5Rnd_82mm_Mo_Type3_AI = 1;
18+
};
19+
class KAT_1Rnd_82mm_Mo_Type4 {
20+
KAT_1Rnd_82mm_Mo_Type4 = 1;
21+
KAT_5Rnd_82mm_Mo_Type4_AI = 1;
22+
};
23+
class KAT_1Rnd_82mm_Mo_Type5 {
24+
KAT_1Rnd_82mm_Mo_Type5 = 1;
25+
KAT_5Rnd_82mm_Mo_Type5_AI = 1;
26+
};
1127
};

addons/chemical/CfgMagazines.hpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,54 @@ class CfgMagazines {
2323
count = 3;
2424
};
2525

26+
class KAT_1Rnd_82mm_Mo_Type2: ACE_1Rnd_82mm_Mo_HE {
27+
author="DiGii";
28+
ammo="Sh_82mm_AMOS_Type2";
29+
displayNameMFDFormat= CSTRING(Phosgene_MFDNAME);
30+
displayNameShort= CSTRING(Phosgene_MFDNAME);
31+
displayName= CSTRING(Phosgene_DisplayName);
32+
};
33+
class KAT_5Rnd_82mm_Mo_Type2_AI: KAT_1Rnd_82mm_Mo_Type2 {
34+
scope = 1;
35+
count = 5;
36+
};
37+
38+
class KAT_1Rnd_82mm_Mo_Type3: ACE_1Rnd_82mm_Mo_HE {
39+
author="DiGii";
40+
ammo="Sh_82mm_AMOS_Type3";
41+
displayNameMFDFormat= CSTRING(Mustard_MFDNAME);
42+
displayNameShort= CSTRING(Mustard_MFDNAME);
43+
displayName= CSTRING(Mustard_DisplayName);
44+
};
45+
class KAT_5Rnd_82mm_Mo_Type3_AI: KAT_1Rnd_82mm_Mo_Type3 {
46+
scope = 1;
47+
count = 5;
48+
};
49+
50+
class KAT_1Rnd_82mm_Mo_Type4: ACE_1Rnd_82mm_Mo_HE {
51+
author="DiGii";
52+
ammo="Sh_82mm_AMOS_Type4";
53+
displayNameMFDFormat= CSTRING(Sarin_MFDNAME);
54+
displayNameShort= CSTRING(Sarin_MFDNAME);
55+
displayName= CSTRING(Sarin_DisplayName);
56+
};
57+
class KAT_5Rnd_82mm_Mo_Type4_AI: KAT_1Rnd_82mm_Mo_Type4 {
58+
scope = 1;
59+
count = 5;
60+
};
61+
62+
class KAT_1Rnd_82mm_Mo_Type5: ACE_1Rnd_82mm_Mo_HE {
63+
author="DiGii";
64+
ammo="Sh_82mm_AMOS_Type5";
65+
displayNameMFDFormat= CSTRING(VX_MFDNAME);
66+
displayNameShort= CSTRING(VX_MFDNAME);
67+
displayName= CSTRING(VX_DisplayName);
68+
};
69+
class KAT_5Rnd_82mm_Mo_Type5_AI: KAT_1Rnd_82mm_Mo_Type5 {
70+
scope = 1;
71+
count = 5;
72+
};
73+
2674
class HandGrenade;
2775
class KAT_M7A3: HandGrenade {
2876
author = "DiGi";

addons/chemical/CfgVehicles.hpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ class CfgVehicles {
3636
icon = QPATHTOF(ui\Gasmask_icon.paa);
3737
};
3838

39+
class KAT_UseM8Paper {
40+
displayName = CSTRING(UseM8Paper);
41+
condition = QUOTE('kat_m8paper' in (items _player));
42+
exceptions[] = {"isNotSwimming", "isNotInside"};
43+
statement = QUOTE([_player] call FUNC(useM8Paper));
44+
showDisabled = 0;
45+
icon = QPATHTOF(ui\icon_m8paper.paa);
46+
};
47+
48+
class KAT_UseDecon {
49+
displayName = CSTRING(UseDecon);
50+
condition = QUOTE('kat_decon_kit' in (items _player) && {(_player getVariable [ARR_2(QQGVAR(chemicalContamination),'')]) != ''});
51+
exceptions[] = {"isNotSwimming", "isNotInside"};
52+
statement = QUOTE([ARR_2(_player,_player)] call FUNC(decontaminate));
53+
showDisabled = 0;
54+
icon = QPATHTOF(ui\icon_deconkit.paa);
55+
};
56+
3957
class KAT_ChemicalDetector {
4058
displayName = CSTRING(ChemicalDetector_Menu);
4159
icon = QPATHTOF(ui\kat_chemicalDet_icon.paa);
@@ -104,6 +122,38 @@ class CfgVehicles {
104122
};
105123
};
106124

125+
class kat_m8paper_Item: Item_Base_F {
126+
scope = 2;
127+
scopeCurator = 2;
128+
displayName = CSTRING(m8paperItem);
129+
author = "AtrixZockt";
130+
vehicleClass = "Items";
131+
editorCategory = "EdCat_Equipment";
132+
editorSubcategory = "EdSubcat_InventoryItems";
133+
class TransportItems {
134+
class _xx_kat_m8paper {
135+
name = "kat_m8paper";
136+
count = 1;
137+
};
138+
};
139+
};
140+
141+
class kat_decon_kit_Item: Item_Base_F {
142+
scope = 2;
143+
scopeCurator = 2;
144+
displayName = CSTRING(deconKitItem);
145+
author = "AtrixZockt";
146+
vehicleClass = "Items";
147+
editorCategory = "EdCat_Equipment";
148+
editorSubcategory = "EdSubcat_InventoryItems";
149+
class TransportItems {
150+
class _xx_kat_decon_kit {
151+
name = "kat_decon_kit";
152+
count = 1;
153+
};
154+
};
155+
};
156+
107157
class Logic;
108158
class Module_F: Logic
109159
{
@@ -145,6 +195,22 @@ class CfgVehicles {
145195
value = 1;
146196
default = 1;
147197
};
198+
class Phosgene {
199+
name = CSTRING(Lvl2_Gas);
200+
value = 2;
201+
};
202+
class Mustard {
203+
name = CSTRING(Lvl3_Gas);
204+
value = 3;
205+
};
206+
class Sarin {
207+
name = CSTRING(Lvl4_Gas);
208+
value = 4;
209+
};
210+
class VX {
211+
name = CSTRING(Lvl5_Gas);
212+
value = 5;
213+
};
148214
};
149215
};
150216
class IsSealable
@@ -221,6 +287,10 @@ class CfgVehicles {
221287
class TransportMagazines {
222288
MACRO_ADDMAGAZINE(KAT_1Rnd_82mm_Mo_Type0,8);
223289
MACRO_ADDMAGAZINE(KAT_1Rnd_82mm_Mo_TypeCS,8);
290+
MACRO_ADDMAGAZINE(KAT_1Rnd_82mm_Mo_Type2,4);
291+
MACRO_ADDMAGAZINE(KAT_1Rnd_82mm_Mo_Type3,4);
292+
MACRO_ADDMAGAZINE(KAT_1Rnd_82mm_Mo_Type4,4);
293+
MACRO_ADDMAGAZINE(KAT_1Rnd_82mm_Mo_Type5,4);
224294
};
225295
};
226296

addons/chemical/CfgWeapons.hpp

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class CfgWeapons {
1919
scope = 2;
2020
author = "DiGii";
2121
displayName = CSTRING(sealantItem);
22-
model = "\A3\Weapons_F\DummyItem.p3d";
22+
model = "\A3\weapons_F\ammo\mag_univ.p3d";
2323
picture = QPATHTOF(ui\Sealant.paa);
2424
descriptionShort = CSTRING(sealantItem_desc);
2525
descriptionUse = CSTRING(sealantItem_desc);
@@ -28,6 +28,32 @@ class CfgWeapons {
2828
};
2929
};
3030

31+
class kat_m8paper : ACE_ItemCore {
32+
scope = 2;
33+
author = "DiGii";
34+
displayName = CSTRING(m8paperItem);
35+
model = "\A3\weapons_F\ammo\mag_univ.p3d";
36+
picture = QPATHTOF(ui\icon_m8paper.paa);
37+
descriptionShort = CSTRING(m8paperItem_desc);
38+
descriptionUse = CSTRING(m8paperItem_desc);
39+
class ItemInfo: CBA_MiscItem_ItemInfo {
40+
mass = 0.1;
41+
};
42+
};
43+
44+
class kat_decon_kit : ACE_ItemCore {
45+
scope = 2;
46+
author = "DiGii";
47+
displayName = CSTRING(deconKitItem);
48+
model = "\A3\weapons_F\ammo\mag_univ.p3d";
49+
picture = QPATHTOF(ui\icon_deconkit.paa);
50+
descriptionShort = CSTRING(deconKitItem_desc);
51+
descriptionUse = CSTRING(deconKitItem_desc);
52+
class ItemInfo: CBA_MiscItem_ItemInfo {
53+
mass = 4;
54+
};
55+
};
56+
3157
class ItemWatch;
3258
class KAT_ChemicalDetector: ItemWatch {
3359
ACE_hideItemType = "Watch";
@@ -40,14 +66,17 @@ class CfgWeapons {
4066

4167
class CannonCore;
4268
class mortar_82mm: CannonCore {
69+
// AI-driven mortars get only choking agents (chlorine, phosgene, CS).
70+
// Nerve / blister agents are restricted to deliberate placement.
4371
magazines[] += {
4472
"KAT_5Rnd_82mm_Mo_Type0_AI",
73+
"KAT_5Rnd_82mm_Mo_Type2_AI",
4574
"KAT_3Rnd_82mm_Mo_TypeCS_AI"
4675
};
4776
};
4877

4978
class ACE_mortar_82mm: mortar_82mm {
50-
magazines[] = {"ACE_1Rnd_82mm_Mo_HE","ACE_1Rnd_82mm_Mo_Smoke","ACE_1Rnd_82mm_Mo_Illum","ACE_1Rnd_82mm_Mo_HE_Guided","ACE_1Rnd_82mm_Mo_HE_LaserGuided", "KAT_1Rnd_82mm_Mo_Type0", "KAT_1Rnd_82mm_Mo_TypeCS"};
79+
magazines[] = {"ACE_1Rnd_82mm_Mo_HE","ACE_1Rnd_82mm_Mo_Smoke","ACE_1Rnd_82mm_Mo_Illum","ACE_1Rnd_82mm_Mo_HE_Guided","ACE_1Rnd_82mm_Mo_HE_LaserGuided", "KAT_1Rnd_82mm_Mo_Type0", "KAT_1Rnd_82mm_Mo_TypeCS", "KAT_1Rnd_82mm_Mo_Type2", "KAT_1Rnd_82mm_Mo_Type3", "KAT_1Rnd_82mm_Mo_Type4", "KAT_1Rnd_82mm_Mo_Type5"};
5180
};
5281

5382
class GrenadeLauncher;

0 commit comments

Comments
 (0)