# Tactical AI Filter Range

Grammar — Tactical AI Filter - limit search radius in filter to radius around aroundUnit
FlagsNative | Action

Sets the specified AI Filter to only include units within the specified range of the specified unit. Use this and the other “Tactical AI Filter” actions to set up an AI Filter, which can then be used in a “Tactical AI Filter - Run” function to filter a unit group.

# Arguments

  • aifilter — Filter
  • unit — AroundUnit
  • fixed — Radius

Returns — void

native void AISetFilterRange(
	aifilter filter,
	unit center,
	fixed radius,
);

Category: AI Advanced / Filters / Actions

# Examples

campaigns/liberty.sc2campaignbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:561

    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_ConsumeDNA, c_fieldFilters)));
    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_ConsumeDNA, c_fieldRange0));
    AISetFilterLifeSortReference(filter, damage, damage*c_distanceFromDamage);

campaigns/liberty.sc2campaignbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:662

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr("Structure;Construction,Missile,Self,Stasis,Dead,Hidden,Invulnerable"));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_PlasmaBlast, c_fieldRange0));
    
    //  Prefer buildings that attack us on hard/insane.

campaigns/liberty.sc2campaignbase.sc2maps/maps/campaign/ttosh03a.sc2map/MapScript.galaxy:467

    AISetFilterAlliance(lv_snipeFilter, c_playerGroupEnemy);
    AISetFilterBits(lv_snipeFilter, libNtve_gf_ConvertTargetFilterStringToUnitFilter(CatalogFieldValueGet(c_gameCatalogAbil, "Snipe", "TargetFilters[" + IntToString(0) + "]", lp_owner)));
    AISetFilterRange(lv_snipeFilter, lp_ghost, (StringToFixed(CatalogFieldValueGet(c_gameCatalogAbil, "Snipe", "Range[" + IntToString(0) + "]", lp_owner)) + 1.0));
    AISetFilterLifePerMarker(lv_snipeFilter, StringToFixed(CatalogFieldValueGet(c_gameCatalogEffect, "SnipeDamage", "Amount", lp_owner)), lv_snipeMarker);
    lp_candidates = AIGetFilterGroup(lv_snipeFilter, lp_candidates);

campaigns/liberty.sc2campaign/base.sc2maps/maps/campaign/ttosh03a.sc2mapMapScript.galaxy:467

    AISetFilterAlliance(lv_snipeFilter, c_playerGroupEnemy);
    AISetFilterBits(lv_snipeFilter, libNtve_gf_ConvertTargetFilterStringToUnitFilter(CatalogFieldValueGet(c_gameCatalogAbil, "Snipe", "TargetFilters[" + IntToString(0) + "]", lp_owner)));
    AISetFilterRange(lv_snipeFilter, lp_ghost, (StringToFixed(CatalogFieldValueGet(c_gameCatalogAbil, "Snipe", "Range[" + IntToString(0) + "]", lp_owner)) + 1.0));
    AISetFilterLifePerMarker(lv_snipeFilter, StringToFixed(CatalogFieldValueGet(c_gameCatalogEffect, "SnipeDamage", "Amount", lp_owner)), lv_snipeMarker);
    lp_candidates = AIGetFilterGroup(lv_snipeFilter, lp_candidates);

campaigns/swarm.sc2campaignbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:561

    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_ConsumeDNA, c_fieldFilters)));
    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_ConsumeDNA, c_fieldRange0));
    AISetFilterLifeSortReference(filter, damage, damage*c_distanceFromDamage);

campaigns/swarm.sc2campaignbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:662

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr("Structure;Construction,Missile,Self,Stasis,Dead,Hidden,Invulnerable"));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_PlasmaBlast, c_fieldRange0));
    
    //  Prefer buildings that attack us on hard/insane.

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactProtAI.galaxy:513

        filter = AIFilter(player);
        AISetFilterInCombat(filter, c_onlyInCombat);
        AISetFilterRange(filter, unitToCheck, nearbyRange);
        nearbyEnemies = AIGetFilterGroup(filter, scanGroup);
        numEnemies = UnitGroupCount(nearbyEnemies, c_unitCountAll);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactProtAI.galaxy:812

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_Feedback, c_fieldTargetFiltersAB)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_Feedback, c_fieldRange0) + 1);
    AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);
    AISetFilterEnergy(filter, minEnergy, c_noMax);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:50

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_250mmStrikeCannons, c_fieldTargetFiltersAB)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_250mmStrikeCannons, c_fieldRange0));
    AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);
    AISetFilterLife(filter, c_minCannonDamage, c_noMax);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:216

    AISetFilterAlliance(filterAI, c_playerGroupEnemy);
    AISetFilterBits(filterAI, UnitFilterStr(AIAbilityStr(player, c_AB_Snipe, c_fieldTargetFiltersAB)));
    AISetFilterRange(filterAI, aiUnit, AIAbilityFixed(player, c_AB_Snipe, c_fieldRange0) + 1);
    AISetFilterLifePerMarker(filterAI, damage, mark);
    AISetFilterLifeSortReference(filterAI, damage, damage*c_distanceFromDamage);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:276

    AISetFilterAlliance(filterAI, c_playerGroupEnemy);
    AISetFilterBits(filterAI, UnitFilterStr(AIAbilityStr(player, c_AB_SteadyTargeting, c_fieldTargetFiltersAB)));
    AISetFilterRange(filterAI, aiUnit, AIAbilityFixed(player, c_AB_SteadyTargeting, c_fieldRange0) + 1);
    AISetFilterLifePerMarker(filterAI, damage, mark);
    AISetFilterLifeSortReference(filterAI, damage, damage*c_distanceFromDamage);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:1644

    // Look for a new target
    filter = AIFilter(player);
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_LockOn, c_fieldRange0));
    if (airOnly == true) {
        AISetFilterPlane(filter, c_planeAir);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactZergAI.galaxy:491

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_NeuralParasite, c_fieldTargetFiltersAB)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_NeuralParasite, c_fieldRange0) + 1);
    AISetFilterLife(filter, c_neuralParasiteMinVitality, c_noMax);
    AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);

mods/core.sc2modbase.sc2data/TriggerLibs/Tactical/TactZergAI.galaxy:597

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIWeaponStr(player, c_WE_InfestedTerran, c_fieldTargetFilters)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_InfestedTerrans, c_fieldRange0) + 1);
    AISetFilterLife(filter, c_noMin, c_noMax);
    targetGroup = AIGetFilterGroup(filter, scanGroup);

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:2040

        AISetFilterAlliance(lv_canidatesFilter, c_playerGroupEnemy);
        AISetFilterBits(lv_canidatesFilter, UnitFilter((1 << c_targetFilterVisible), 0, (1 << c_targetFilterStructure) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterHallucination - 32)) | (1 << (c_targetFilterInvulnerable - 32)) | (1 << (c_targetFilterSummoned - 32))));
        AISetFilterRange(lv_canidatesFilter, lp_aIUnit, lv_abilityRange);
        AISetFilterLifeSortReference(lv_canidatesFilter, 100.0, 50);
        lv_canidates = AIGetFilterGroup(lv_canidatesFilter, lp_nearByUnits);

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:2136

        AISetFilterAlliance(lv_targetFilter2, c_playerGroupEnemy);
        AISetFilterBits(lv_targetFilter2, UnitFilter((1 << c_targetFilterVisible), 0, (1 << c_targetFilterStructure) | (1 << c_targetFilterMissile) | (1 << c_targetFilterBuried), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterHallucination - 32)) | (1 << (c_targetFilterInvulnerable - 32))));
        AISetFilterRange(lv_targetFilter2, lp_aIUnit, lv_abilityRange);
        AISetFilterLifeSortReference(lv_targetFilter2, lv_abilityDamage, (lv_abilityDamage * 0.2));
        lv_canidates = AIGetFilterGroup(lv_targetFilter2, lp_nearByUnits);

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:2187

        AISetFilterPlane(lv_targetFilter2, c_planeGround);
        AISetFilterBits(lv_targetFilter2, UnitFilter((1 << c_targetFilterVisible), 0, (1 << c_targetFilterStructure) | (1 << c_targetFilterMissile) | (1 << c_targetFilterBuried), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterHallucination - 32)) | (1 << (c_targetFilterInvulnerable - 32))));
        AISetFilterRange(lv_targetFilter2, lp_aIUnit, 10.0);
        AISetFilterLifeSortReference(lv_targetFilter2, 160.0, 40);
        lv_canidates = AIGetFilterGroup(lv_targetFilter2, lp_nearByUnits);

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:2332

    AISetFilterLifeSortReference(lv_canidatesFilter, lv_slashDamage, (lv_slashDamage * 0.2));
    if ((UnitAbilityGetCooldown(lp_aIUnit, "MutatorAmonZeratulBlink", "Abil/MutatorAmonZeratulBlink") <= 0.0)) {
        AISetFilterRange(lv_canidatesFilter, lp_aIUnit, lv_blinkDistance);
        lv_canidates = AIGetFilterGroup(lv_canidatesFilter, lv_enemyUnitsNearby);
        if ((UnitGroupCount(lv_canidates, c_unitCountAlive) > 0)) {

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:2342


    if ((UnitOrderHasAbil(lp_aIUnit, "MutatorAmonShadowBlade") == false) && (UnitAbilityGetCooldown(lp_aIUnit, "MutatorAmonShadowBlade", "Abil/MutatorAmonShadowBlade") <= 0.0)) {
        AISetFilterRange(lv_canidatesFilter, lp_aIUnit, 1.0);
        lv_canidates = AIGetFilterGroup(lv_canidatesFilter, lv_enemyUnitsNearby);
        if ((UnitGroupCount(lv_canidates, c_unitCountAlive) > 0)) {

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:2428

        AISetFilterLife(lv_primalSlashTargetFilter, lv_abilityDamage, 524287.0);
        AISetFilterPlane(lv_primalSlashTargetFilter, c_planeGround);
        AISetFilterRange(lv_primalSlashTargetFilter, lp_aIUnit, lv_abilityRadius);
        lv_canidates = AIGetFilterGroup(lv_primalSlashTargetFilter, lv_enemiesNearby);
        if ((UnitGroupCount(lv_canidates, c_unitCountAlive) > 0)) {

mods/starcoop/starcoop.sc2modbase.sc2data/LibCOMU.galaxy:4518

    AISetFilterAlliance(lv_enemyNearbyFilter, c_playerGroupEnemy);
    AISetFilterBits(lv_enemyNearbyFilter, UnitFilter((1 << c_targetFilterVisible), 0, (1 << c_targetFilterMissile) | (1 << c_targetFilterUncommandable), (1 << (c_targetFilterStasis - 32)) | (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterHallucination - 32)) | (1 << (c_targetFilterInvulnerable - 32))));
    AISetFilterRange(lv_enemyNearbyFilter, lp_aIUnit, (UnitGetPropertyFixed(lp_aIUnit, c_unitPropRadius, c_unitPropNormal) + 1.0));
    lv_enemyUnitsNearby = AIGetFilterGroup(lv_enemyNearbyFilter, lp_nearByUnits);
    if ((UnitGroupCount(lv_enemyUnitsNearby, c_unitCountAlive) <= 0)) {

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:917

    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_ConsumeDNA, c_fieldFilters)));
    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_ConsumeDNA, c_fieldRange0));
    AISetFilterLifeSortReference(filter, damage, damage*c_distanceFromDamage);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:992

    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_ConsumeDNA, c_fieldTargetFiltersAB)));
    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterRange(filter, aiUnit, (AIAbilityFixed(player, c_AB_ConsumeDNA, c_fieldRange0))-1);
    AISetFilterLifeSortReference(filter, damage, damage*c_distanceFromDamage);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:1106

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr("-;Construction,Missile,Self,Stasis,Dead,Hidden,Invulnerable"));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, "HybridDominatorVoidPlasmaBlast", c_fieldRange0));
    
    damage = AIEffectFixed(player, c_EF_PlasmaBlastDamage, c_fieldAmount);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactCampAI.galaxy:1386

	AISetFilterAlliance(filter, c_playerGroupEnemy);
	AISetFilterBits(filter, UnitFilterStr("Structure;Construction,Missile,Self,Stasis,Dead,Hidden,Invulnerable"));
	AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_HybridPhaseShift, c_fieldRange0));
	
	//  Prefer buildings that attack us on hard/insane.

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:55

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_250mmStrikeCannons, c_fieldTargetFiltersAB)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_250mmStrikeCannons, c_fieldRange0));
    AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);
    AISetFilterLife(filter, c_minCannonDamage, c_noMax);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:218

    AISetFilterAlliance(filterAI, c_playerGroupEnemy);
    AISetFilterBits(filterAI, UnitFilterStr("Biological,Visible;Heroic,Self,Structure,Destructible,Stasis,Dead,Hidden,Invulnerable"));
    AISetFilterRange(filterAI, aiUnit, AIAbilityFixed(player, c_AB_Snipe, c_fieldRange0) + 1);
    AISetFilterLifePerMarker(filterAI, damage, mark);
    AISetFilterLifeSortReference(filterAI, damage, damage*c_distanceFromDamage);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:268

    AISetFilterAlliance(filterAI, c_playerGroupEnemy);
    AISetFilterBits(filterAI, UnitFilterStr(AIAbilityStr(player, c_AB_SteadyTargeting, c_fieldTargetFiltersAB)));
    AISetFilterRange(filterAI, aiUnit, AIAbilityFixed(player, c_AB_SteadyTargeting, c_fieldRange0) + 1);
    AISetFilterLifePerMarker(filterAI, damage, mark);
    AISetFilterLifeSortReference(filterAI, damage, damage*c_distanceFromDamage);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactTerrAI.galaxy:1591

    // Look for a new target
    filter = AIFilter(player);
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_LockOn, c_fieldRange0));
    if (airOnly == true) {
        AISetFilterPlane(filter, c_planeAir);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactZergAI.galaxy:702

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_NeuralParasite, c_fieldTargetFiltersAB)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_NeuralParasite, c_fieldRange0) + 1);
    AISetFilterLife(filter, c_neuralParasiteMinVitality, c_noMax);
    AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactZergAI.galaxy:808

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIWeaponStr(player, c_WE_InfestedTerran, c_fieldTargetFilters)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_InfestedTerrans, c_fieldRange0) + 1);
    AISetFilterLife(filter, c_noMin, c_noMax);
    targetGroup = AIGetFilterGroup(filter, scanGroup);

mods/starcoop/starcoop.sc2modbase.sc2data/TriggerLibs/Tactical/TactZergAI.galaxy:1618

    AISetFilterPlane(filter, c_planeGround);
    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterRange(filter, aiUnit, AIWeaponFixed(player, c_WE_LurkerMP, c_fieldRange0) - 1);    
    validTargets = AIGetFilterGroup(filter, scanGroup);
    

mods/warcoop/warclassicsystem.sc2modbase.sc2data/TriggerLibs/Tactical/TacticalAIWar3.galaxy:142

    //AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, UnitFilterStr(AIAbilityStr(player, c_AB_LightningShield, c_fieldTargetFiltersAB)));
    AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_LightningShield, c_fieldRange0));
    AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);
    targetGroup = AIGetFilterGroup(filter, scanGroup);

mods/warcoop/warclassicsystem.sc2modbase.sc2data/TriggerLibs/Tactical/TacticalAIWar3.galaxy:156

    AISetFilterAlliance(filter, c_playerGroupEnemy);
    AISetFilterBits(filter, uf);
    AISetFilterRange(filter, aiUnit, range+3);
    AISetFilterLife(filter, 0, maxlife);
    AISetFilterLifeMod(filter, c_unitAttributeHeroic,damage*C_spellScaleHeroic-damage);

mods/warcoop/warclassicsystem.sc2modbase.sc2data/TriggerLibs/Tactical/TacticalAIWar3.galaxy:440


	if(chaos){
		AISetFilterRange(filter, aiUnit, range);
		AISetFilterLife(filter, c_noMin, c_noMax);
		AISetFilterLifeMod(filter, c_unitAttributeHeroic,-100);

mods/warcoop/warclassicsystem.sc2modbase.sc2data/TriggerLibs/Tactical/TacticalAIWar3.galaxy:445

	}else{
		AISetFilterBits(filter, UnitFilterStr("Summoned;Player,Ally,Neutral"));
		AISetFilterRange(filter, aiUnit, range);
	}
    targetGroup = AIGetFilterGroup(filter, scanGroup);

mods/warcoop/warclassicsystem.sc2modbase.sc2data/TriggerLibs/WarClassicTactical.galaxy:350

    lv_radius = libNtve_gf_CatalogFieldValueGetAsReal(c_gameCatalogEffect, (((lp_abil) + "@Search")), "AreaArray[" + IntToString(0) + "].Radius", lp_owner);
    lv_radius += UnitGetPropertyFixed(lp_aIUnit, c_unitPropRadius, c_unitPropCurrent);
    AISetFilterRange(lv_rangeFilter, lp_aIUnit, lv_radius);
    lv_unitsInRange = AIGetFilterGroup(lv_rangeFilter, lp_nearByUnits);
    AISetFilterAlliance(lv_enemyNearbyFilter, c_playerGroupEnemy);

mods/warcoop/warclassicsystem.sc2modbase.sc2data/TriggerLibs/WarClassicTactical.galaxy:552

    lv_range = libGAwT_gf_AIEffectAbilRange(lp_owner, lp_aIUnit, lp_abil, lv_level, true);
    lv_heal = libGAwT_gf_AIAbilAccumlatedAmount(lp_owner, lp_aIUnit, lp_abil, lv_level, "Heal");
    AISetFilterRange(lv_rangeUnitFilter, lp_aIUnit, lv_range);
    AISetFilterSelf(lv_rangeUnitFilter, lv_itUnit);
    AISetFilterBits(lv_rangeUnitFilter, libGAwT_gf_AIEffectAbilTargetUnitFilter(lp_owner, lp_aIUnit, lp_abil, lv_level));