class CfgVehicles {
    class Man;
    class CAManBase: Man {
        class ACE_Actions {
            class ACE_ApplyHandcuffs {
                displayName = CSTRING(SetCaptive);
                selection = "righthand";
                distance = 2;
                condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs));
                statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs));
                exceptions[] = {"isNotSwimming", "isNotInside"};
                icon = QPATHTOF(UI\handcuff_ca.paa);
            };

            class ACE_MainActions {
                class ACE_RemoveHandcuffs {
                    displayName = CSTRING(ReleaseCaptive);
                    selection = "righthand";
                    distance = 2;
                    condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs));
                    statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs));
                    exceptions[] = {"isNotSwimming", "isNotInside"};
                    icon = QPATHTOF(UI\handcuff_ca.paa);
                };
                class ACE_EscortCaptive {
                    displayName = CSTRING(EscortCaptive);
                    distance = 4;
                    condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive));
                    statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive));
                    exceptions[] = {"isNotSwimming"};
                    showDisabled = 0;
                    icon = QPATHTOF(UI\captive_ca.paa);
                };
                class ACE_StopEscorting {
                    displayName = CSTRING(StopEscorting);
                    distance = 4;
                    condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting));
                    statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive));
                    exceptions[] = {"isNotEscorting", "isNotSwimming"};
                    showDisabled = 0;
                    icon = QPATHTOF(UI\captive_ca.paa);
                };
                class ACE_LoadCaptive {
                    displayName = CSTRING(LoadCaptive);
                    distance = 4;
                    condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive));
                    statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive));
                    exceptions[] = {"isNotEscorting", "isNotSwimming"};
                    showDisabled = 0;
                    icon = QPATHTOF(UI\captive_ca.paa);
                    insertChildren = QUOTE(call DFUNC(addLoadCaptiveActions));
                };
                class GVAR(UnloadCaptive) {
                    displayName = CSTRING(UnloadCaptive);
                    distance = 4;
                    condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive));
                    statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive));
                    exceptions[] = {"isNotSwimming"};
                };
            };
        };

        class ACE_SelfActions {
            class ACE_StopEscortingSelf {
                displayName = CSTRING(StopEscorting);
                condition = QUOTE([ARR_2(_player, objNull)] call FUNC(canStopEscorting));
                statement = QUOTE([ARR_3(_player,objNull, false)] call FUNC(doEscortCaptive));
                exceptions[] = {"isNotEscorting", "isNotSwimming"};
                showDisabled = 0;
            };
            class ACE_StartSurrenderingSelf {
                displayName = CSTRING(StartSurrendering);
                condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender));
                statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered));
                exceptions[] = {"isNotSwimming"};
                showDisabled = 0;
                icon = QPATHTOF(UI\Surrender_ca.paa);
            };
            class ACE_StopSurrenderingSelf {
                displayName = CSTRING(StopSurrendering);
                condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender));
                statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrendered));
                exceptions[] = {"isNotSurrendering", "isNotSwimming"};
                showDisabled = 0;
                icon = QPATHTOF(UI\Surrender_ca.paa);
            };
        };
    };

#define MACRO_LOADCAPTIVE \
        class ACE_Actions { \
            class ACE_MainActions { \
                class GVAR(LoadCaptive) { \
                    displayName = CSTRING(LoadCaptive); \
                    distance = 4; \
                    condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \
                    statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \
                    exceptions[] = {"isNotEscorting", "isNotSwimming"}; \
                }; \
            }; \
        };

    class LandVehicle;
    class Car: LandVehicle {
        MACRO_LOADCAPTIVE
    };
    class Tank: LandVehicle {
        MACRO_LOADCAPTIVE
    };

    class Air;
    class Helicopter: Air {
        MACRO_LOADCAPTIVE
    };
    class Plane: Air {
        MACRO_LOADCAPTIVE
    };

    class Ship;
    class Ship_F: Ship {
        MACRO_LOADCAPTIVE
    };

    class StaticWeapon: LandVehicle {
        MACRO_LOADCAPTIVE
    };

    class Box_NATO_Support_F;
    class ACE_Box_Misc: Box_NATO_Support_F {
        class TransportItems {
            MACRO_ADDITEM(ACE_CableTie,12);
        };
    };


    class Logic;
    class Module_F: Logic {
        class ArgumentsBaseUnits {};
        class ModuleDescription {};
    };

    class GVAR(ModuleSurrender): Module_F {
        author = ECSTRING(common,ACETeam);
        category = "ACE";
        displayName = CSTRING(ModuleSurrender_DisplayName);
        function = QFUNC(moduleSurrender);
        scope = 1;  //show in editor
        isGlobal = 0; //run on server
        isTriggerActivated  = 1; //Wait for triggers
        icon = QPATHTOF(UI\Icon_Module_Make_Unit_Surrender_ca.paa);
        functionPriority = 0;
        class Arguments {};
        class ModuleDescription: ModuleDescription {
            description = CSTRING(ModuleSurrender_Description);
            sync[] = {"AnyAI"};
        };
    };
    class GVAR(ModuleHandcuffed): Module_F {
        author = ECSTRING(common,ACETeam);
        category = "ACE";
        displayName = CSTRING(ModuleHandcuffed_DisplayName);
        function = QFUNC(moduleHandcuffed);
        scope = 1;  //show in editor
        isGlobal = 0; //run on server
        isTriggerActivated  = 1; //Wait for triggers
        icon = QPATHTOF(UI\Icon_Module_Make_Unit_Handcuffed_ca.paa);
        functionPriority = 0;
        class Arguments {};
        class ModuleDescription: ModuleDescription {
            description = CSTRING(ModuleHandcuffed_Description);
            sync[] = {"AnyAI"};
        };
    };

    class ACE_Module: Module_F {};
    class GVAR(moduleSettings): ACE_Module {
        author = ECSTRING(common,ACETeam);
        category = "ACE";
        displayName = CSTRING(ModuleSettings_DisplayName);
        function = QFUNC(moduleSettings);
        scope = 1;
        icon = QPATHTOF(UI\Icon_Module_settings_ca.paa);
        isGlobal = 1;
        isSingular = 1;
        class Arguments {
            class allowHandcuffOwnSide {
                displayName = CSTRING(ModuleSettings_handcuffSide_name);
                description = CSTRING(ModuleSettings_handcuffSide_description);
                typeName = "BOOL";
                defaultValue = 1;
            };
            class allowSurrender {
                displayName = CSTRING(ModuleSettings_allowSurrender_name);
                description = CSTRING(ModuleSettings_allowSurrender_description);
                typeName = "BOOL";
                defaultValue = 1;
            };
            class requireSurrender {
                displayName = CSTRING(ModuleSettings_requireSurrender_name);
                description = CSTRING(ModuleSettings_requireSurrender_description);
                typeName = "NUMBER";
                class values {
                    class disable {
                        name = ECSTRING(common,No);
                        value = 0;
                    };
                    class Surrender  {
                        name = CSTRING(SurrenderOnly);
                        value = 1;
                        default = 1;
                    };
                    class SurrenderOrNoWeapon  {
                        name = CSTRING(SurrenderOrNoWeapon);
                        value = 2;
                    };
                };
            };
            class requireSurrenderAi {
                displayName = CSTRING(ModuleSettings_requireSurrenderAi_name);
                description = CSTRING(ModuleSettings_requireSurrenderAi_description);
                typeName = "BOOL";
                defaultValue = 0;
            };
        };
        class ModuleDescription: ModuleDescription {
            description = CSTRING(ModuleSettings_Description);
            sync[] = {};
        };
    };
};