void gf_AIRoach (int lp_owner, unit lp_roach, unitgroup lp_nearbyUnits) { // Variable Declarations unitgroup lv_enemyGroup; point lv_point; // Variable Initialization lv_enemyGroup = UnitGroupEmpty(); // Implementation lv_enemyGroup = libVCMI_gf_AITacticalEnemiesWithinRange(lp_roach, 8.0, UnitFilter(0, 0, (1 << c_targetFilterStructure) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterInvulnerable - 32)))); Wait(1.0, c_timeAI); if ((TechTreeUpgradeCount(UnitGetOwner(lp_roach), "Burrow", c_techCountCompleteOnly) == 1) && (UnitGetPropertyFixed(lp_roach, c_unitPropLifePercent, c_unitPropCurrent) < 50.0)) { libNtve_gf_AICast(lp_roach, Order(AbilityCommand("BurrowRoachDown", 0))); Wait(2.0, c_timeAI); if ((TechTreeUpgradeCount(UnitGetOwner(lp_roach), "TunnelingClaws", c_techCountCompleteOnly) == 1)) { lv_point = PointWithOffsetPolar(UnitGetPosition(lp_roach), -2.0, UnitGetFacing(lp_roach)); libNtve_gf_AICast(lp_roach, OrderTargetingPoint(AbilityCommand("move", 0), lv_point)); } Wait(RandomFixed(5.0, 10.0), c_timeAI); while (!(((UnitGetPropertyFixed(lp_roach, c_unitPropLifePercent, c_unitPropCurrent) >= 80.0) || (UnitCountAlliance(UnitGetOwner(lp_roach), c_unitAllianceEnemy, RegionCircle(UnitGetPosition(lp_roach), 0.8), UnitFilter(0, 0, (1 << c_targetFilterPlayer) | (1 << c_targetFilterAlly) | (1 << c_targetFilterNeutral) | (1 << c_targetFilterStructure) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterInvulnerable - 32))), 0) >= 1) || (UnitGroupCount(UnitGroupFilterAlliance(lv_enemyGroup, UnitGetOwner(lp_roach), c_unitAllianceEnemy, 0), c_unitCountAlive) <= 1)))) { Wait(1.0, c_timeGame); } libNtve_gf_AICast(lp_roach, Order(AbilityCommand("BurrowRoachUp", 0))); Wait(35.0, c_timeAI); }