An AI Script follows a set of rules and essentially goes down a list of things it is required to do. These lists are pre-determined and made by Blizzard
Here is what the Zerg Insane AI script looks like:
Zerg Insane AI
# stat_txt.tbl entry 1227: Zerg Campaign Insane<0>
ZSUP(1227, 001, aiscript):
start_campaign()
wait(1)
start_town()
defaultbuild_off()
default_min(0)
wait(1)
define_max(30, Zerg Drone)
define_max(10, Zerg Queen)
define_max(10, Zerg Defiler)
multirun(ZSUP 0000)
build(1, Zerg Drone, 150)
build(1, Zerg Hatchery, 150)
build(7, Zerg Drone, 80)
wait_build(7, Zerg Drone)
multirun(ZSUP 0001)
build(1, Zerg Spawning Pool, 80)
train(6, Zerg Zergling)
multirun(ZSUP 0002)
build(2, Zerg Hatchery, 80)
train(20, Zerg Zergling)
attack_add(20, Zerg Zergling)
attack_prepare()
wait(500)
attack_do()
attack_clear()
defensebuild_gg(1, Zerg Zergling)
defenseuse_gg(1, Zerg Zergling)
build(1, Zerg Hydralisk Den, 80)
train(1, Zerg Hydralisk)
upgrade(1, Muscular Augments, 30)
tech(Burrowing, 30)
train(6, Zerg Hydralisk)
build(1, Zerg Evolution Chamber, 80)
upgrade(1, Zerg Missile Attacks, 30)
upgrade(1, Grooved Spines, 30)
train(12, Zerg Hydralisk)
build(1, Zerg Lair, 80)
upgrade(1, Pneumatized Carapace, 30)
upgrade(1, Zerg Carapace, 30)
train(20, Zerg Hydralisk)
attack_add(20, Zerg Hydralisk)
attack_prepare()
wait(500)
attack_do()
attack_clear()
defensebuild_gg(1, Zerg Hydralisk)
defenseuse_gg(1, Zerg Hydralisk)
defensebuild_ag(1, Zerg Hydralisk)
defenseuse_ag(1, Zerg Hydralisk)
expand(1, ZSUP 0003)
build(1, Zerg Spire, 80)
build(1, Zerg Queen's Nest, 80)
train(1, Zerg Mutalisk)
upgrade(1, Zerg Flyer Attacks, 30)
build(2, Zerg Spire, 80)
tech(Spawn Broodling, 30)
upgrade(1, Ventral Sacs, 30)
upgrade(1, Zerg Flyer Carapace, 30)
place_guard(Zerg Queen, 0)
place_guard(Zerg Queen, 1)
place_guard(Zerg Queen, 2)
train(5, Zerg Mutalisk)
build(1, Zerg Hive, 80)
train(15, Zerg Mutalisk)
attack_add(15, Zerg Mutalisk)
attack_prepare()
wait(500)
attack_do()
attack_clear()
defensebuild_gg(1, Zerg Mutalisk)
defenseuse_gg(1, Zerg Mutalisk)
defensebuild_ag(1, Zerg Mutalisk)
defenseuse_ag(1, Zerg Mutalisk)
defensebuild_ga(1, Zerg Mutalisk)
defenseuse_ga(1, Zerg Mutalisk)
defensebuild_aa(1, Zerg Mutalisk)
defenseuse_aa(1, Zerg Mutalisk)
defensebuild_ag(1, Zerg Scourge)
defenseuse_ag(1, Zerg Scourge)
defensebuild_aa(1, Zerg Scourge)
defenseuse_aa(1, Zerg Scourge)
expand(2, ZSUP 0003)
build(1, Zerg Defiler Mound, 80)
upgrade(2, Zerg Flyer Attacks, 30)
build(1, Zerg Greater Spire, 80)
build(2, Zerg Evolution Chamber, 80)
upgrade(1, Antennae, 30)
upgrade(2, Zerg Carapace, 30)
tech(Ensnare, 30)
upgrade(1, Zerg Melee Attacks, 30)
upgrade(1, Adrenal Glands, 30)
tech(Plague, 30)
place_guard(Zerg Defiler, 0)
place_guard(Zerg Defiler, 1)
place_guard(Zerg Defiler, 2)
upgrade(2, Zerg Flyer Carapace, 30)
train(20, Zerg Mutalisk)
train(10, Zerg Guardian)
attack_add(10, Zerg Mutalisk)
attack_add(10, Zerg Guardian)
attack_prepare()
wait(500)
attack_do()
attack_clear()
defensebuild_ga(1, Zerg Guardian)
defenseuse_ga(1, Zerg Guardian)
defenseuse_gg(1, Zerg Guardian)
expand(3, ZSUP 0003)
build(1, Zerg Ultralisk Cavern, 80)
upgrade(1, Gamete Meiosis, 30)
upgrade(1, Metasynaptic Node, 30)
upgrade(1, Metabolic Boost, 30)
upgrade(2, Zerg Missile Attacks, 30)
upgrade(2, Zerg Melee Attacks, 30)
upgrade(3, Zerg Flyer Attacks, 30)
upgrade(3, Zerg Flyer Carapace, 30)
train(2, Zerg Ultralisk)
train(5, Zerg Hydralisk)
train(4, Zerg Ultralisk)
train(10, Zerg Hydralisk)
train(6, Zerg Ultralisk)
train(15, Zerg Hydralisk)
attack_add(6, Zerg Ultralisk)
attack_add(15, Zerg Hydralisk)
attack_prepare()
wait(500)
attack_do()
attack_clear()
defensebuild_gg(1, Zerg Ultralisk)
defenseuse_gg(1, Zerg Ultralisk)
expand(4, ZSUP 0003)
upgrade(3, Zerg Carapace, 30)
upgrade(3, Zerg Missile Attacks, 30)
upgrade(3, Zerg Melee Attacks, 30)
--ZSUP 0004--
attack_add(12, Zerg Mutalisk)
attack_add(10, Zerg Guardian)
attack_add(10, Zerg Scourge)
attack_prepare()
wait(500)
attack_do()
attack_clear()
wait(750)
attack_add(20, Zerg Hydralisk)
attack_add(12, Zerg Ultralisk)
attack_prepare()
wait(500)
attack_do()
attack_clear()
wait(750)
attack_add(1, Zerg Defiler)
attack_add(12, Zerg Mutalisk)
attack_add(50, Zerg Zergling)
attack_prepare()
wait(500)
attack_do()
attack_clear()
expand(99, ZSUP 0003)
wait(750)
goto(ZSUP 0004)
--ZSUP 0001--
build(3, Zerg Drone, 80)
wait_build(3, Zerg Drone)
build(6, Zerg Drone, 80)
wait_build(6, Zerg Drone)
build(9, Zerg Drone, 80)
wait_build(9, Zerg Drone)
build(12, Zerg Drone, 80)
wait_build(12, Zerg Drone)
build(15, Zerg Drone, 80)
wait_build(15, Zerg Drone)
build(18, Zerg Drone, 80)
wait_build(18, Zerg Drone)
build(21, Zerg Drone, 80)
wait_build(21, Zerg Drone)
build(24, Zerg Drone, 80)
wait_build(24, Zerg Drone)
stop()
--ZSUP 0002--
creep(3)
build(1, Zerg Creep Colony, 80)
wait_build(1, Zerg Creep Colony)
build(2, Zerg Creep Colony, 80)
wait_build(2, Zerg Creep Colony)
build(3, Zerg Creep Colony, 80)
wait_build(3, Zerg Creep Colony)
build(3, Zerg Sunken Colony, 80)
wait_build(3, Zerg Sunken Colony)
build(4, Zerg Creep Colony, 80)
wait_build(4, Zerg Creep Colony)
build(5, Zerg Creep Colony, 80)
wait_build(5, Zerg Creep Colony)
build(6, Zerg Creep Colony, 80)
wait_build(6, Zerg Creep Colony)
build(6, Zerg Sunken Colony, 80)
wait_build(6, Zerg Sunken Colony)
--ZSUP 0005--
wait(1500)
notowns_jump(Zerg Evolution Chamber, ZSUP 0005)
creep(4)
build(7, Zerg Creep Colony, 80)
wait_build(7, Zerg Creep Colony)
build(8, Zerg Creep Colony, 80)
wait_build(8, Zerg Creep Colony)
build(9, Zerg Creep Colony, 80)
wait_build(9, Zerg Creep Colony)
build(10, Zerg Creep Colony, 80)
wait_build(10, Zerg Creep Colony)
build(11, Zerg Creep Colony, 80)
wait_build(11, Zerg Creep Colony)
build(12, Zerg Creep Colony, 80)
wait_build(12, Zerg Creep Colony)
build(6, Zerg Spore Colony, 80)
wait_build(6, Zerg Spore Colony)
build(13, Zerg Creep Colony, 80)
wait_build(13, Zerg Creep Colony)
build(14, Zerg Creep Colony, 80)
wait_build(14, Zerg Creep Colony)
build(15, Zerg Creep Colony, 80)
wait_build(15, Zerg Creep Colony)
build(16, Zerg Creep Colony, 80)
wait_build(16, Zerg Creep Colony)
build(17, Zerg Creep Colony, 80)
wait_build(17, Zerg Creep Colony)
build(18, Zerg Creep Colony, 80)
wait_build(18, Zerg Creep Colony)
build(12, Zerg Spore Colony, 80)
wait_build(12, Zerg Spore Colony)
stop()
--ZSUP 0003--
start_town()
build(1, Zerg Hatchery, 80)
wait_build(1, Zerg Hatchery)
get_oldpeons(8)
multirun(ZSUP 0001)
wait(4500)
build(1, Zerg Creep Colony, 80)
wait_build(1, Zerg Creep Colony)
build(1, Zerg Sunken Colony, 80)
wait_build(1, Zerg Sunken Colony)
build(2, Zerg Creep Colony, 80)
wait_build(2, Zerg Creep Colony)
build(2, Zerg Sunken Colony, 80)
wait_build(2, Zerg Sunken Colony)
build(3, Zerg Creep Colony, 80)
wait_build(3, Zerg Creep Colony)
build(3, Zerg Sunken Colony, 80)
wait_build(3, Zerg Sunken Colony)
--ZSUP 0006--
wait(1500)
notowns_jump(Zerg Evolution Chamber, ZSUP 0006)
build(4, Zerg Creep Colony, 80)
wait_build(4, Zerg Creep Colony)
build(1, Zerg Spore Colony, 80)
wait_build(1, Zerg Spore Colony)
build(5, Zerg Creep Colony, 80)
wait_build(5, Zerg Creep Colony)
build(2, Zerg Spore Colony, 80)
wait_build(2, Zerg Spore Colony)
build(6, Zerg Creep Colony, 80)
wait_build(6, Zerg Creep Colony)
build(3, Zerg Spore Colony, 80)
wait_build(3, Zerg Spore Colony)
build(7, Zerg Creep Colony, 80)
wait_build(7, Zerg Creep Colony)
build(4, Zerg Spore Colony, 80)
wait_build(4, Zerg Spore Colony)
build(8, Zerg Creep Colony, 80)
wait_build(8, Zerg Creep Colony)
build(5, Zerg Spore Colony, 80)
wait_build(5, Zerg Spore Colony)
build(9, Zerg Creep Colony, 80)
wait_build(9, Zerg Creep Colony)
build(6, Zerg Spore Colony, 80)
wait_build(6, Zerg Spore Colony)
place_guard(Zerg Queen, 0)
place_guard(Zerg Defiler, 0)
stop()
--ZSUP 0000--
give_money()
wait(1500)
goto(ZSUP 0000)
Now, you'll notice that these commands go from top to bottom. I don't know all the advance branches but the main branch (first section) where it does attacks is shown. The issue with disabling certain units is that the AI script will always attempt to execute the line of code before moving on to the next. Important part is always attempt to execute it. This means if it can't execute the code (such as Build a Defiler Mound) then it will just try to execute the code to build a defiler mound again until it works. However, if it is disabled, it will never be able to execute this code and forever get stuck. This helps in situations where the AI can't meet a condition (because of limited resources or tech) as it will constantly check until it CAN meet the condition and finally execute to progress the script.
Insane AI will always essentially do -> Zerglings attack -> Hydralisk Attack -> Mutalisk attack -> Mutalisk+Guardian Attack (gets stuck here indefinitely because can't make guardians but will keep trying to) -> Ultralisk+Hydralisk -> Mutalisk+Ling+Defiler Attack (Loop back to Mutalisk Guardian Attack)
So what are your options?
1) Try using a Custom AI Zerg Script. This AI script is able to make "guards" of certain units and doesn't break as easily as the other AI. You will still run into issues with it not attacking, but you can force another trigger to order said units to attack you. Just beware that this AI has a bad tendency to spam one unit.
2) Create pre-made spawn waves. Majority of UMS holdout maps honestly do this if they are limiting units that can be created.
3) Use EUD Triggers. You can modify the AI Script directly to change it so that it only attacks with Zerglings, Hydralisks, and Mutalisks. You can also order the amount of units (up to 50 of each I believe). This would be by far the most advanced option which would require other tools as well. (I use PyMaster and EUD Editor 3 along with Scmdraft 2 to do that and only learned how to a few weeks ago since thats when I installed those tools).
None.