cosmonarchy-bw-prerelease/mpq/lua/melee/zerg/build/openers.lua
2026-09-09 10:52:21 -04:00

299 lines
9.0 KiB
Lua

---@class ZergOpeners
local Openers = {}
-- Shared opener still used unmodified by a personality whose own build order
-- never repositions an attack/expand trigger within this phase.
---@param melee_ai MeleeAI
---@param town Town
function Openers.quazeth_pool_check_then_expand(melee_ai, town)
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergQuazethPool, 110, true)
town:wait_build(1, UnitId.ZergQuazethPool, false)
melee_ai:start_expanding()
end
-- Assault
---@param melee_ai MeleeAI
---@param town Town
function Openers.three_base_hydrith(melee_ai, town)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(5))
town:build(1, UnitId.ZergHydrithDen, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.two_base_zorkiz(melee_ai, town)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(5))
town:build(1, UnitId.ZergHydrithDen, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.two_base_hydrith_quazeth(melee_ai, town)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(5))
town:build(1, UnitId.ZergHydrithDen, 90, true)
melee_ai:dynamic_wait(secs(30))
melee_ai:start_attacking()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.two_base_alkag(melee_ai, town)
melee_ai:dynamic_wait(secs(25))
town:multirun(function()
town:wait_build(1, UnitId.ZergHydrithDen)
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergSkibactScab, 90, true)
melee_ai:dynamic_wait(mins(1) + secs(40))
town:build(1, UnitId.ZergTethvithSwamp, 90, true)
town:wait_build(1, UnitId.ZergIrolIris)
melee_ai:dynamic_wait(secs(15))
town:build(1, UnitId.ZergAlkagIteth, 90, true)
town:build(1, UnitId.ZergOthstolOviform, 90, true)
end)
town:build(1, UnitId.ZergHydrithDen, 90, true)
melee_ai:dynamic_wait(secs(30))
melee_ai:start_expanding()
end
--- Shared by Potency and Earthen Tides (identical build up to this point).
---@param melee_ai MeleeAI
---@param town Town
function Openers.hydrith_den_start(melee_ai, town)
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergHydrithDen, 110, true)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_attacking()
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
end
-- Swarm
---@param melee_ai MeleeAI
---@param town Town
function Openers.three_base_flood(melee_ai, town)
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergQuazethPool, 110, true)
melee_ai:dynamic_wait(secs(50))
melee_ai:start_attacking()
melee_ai:dynamic_wait(secs(15))
melee_ai:start_expanding()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.three_base_ultrav(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(50))
town:build(1, UnitId.ZergQuazethPool, 90, true)
melee_ai:dynamic_wait(mins(1) + secs(15))
town:build(2, UnitId.ZergHachirosk, 115)
town:build(1, UnitId.ZergVornathPond, 90, true)
melee_ai:dynamic_wait(secs(50))
melee_ai:start_attacking()
melee_ai:dynamic_wait(secs(40))
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.instant_quazeth(melee_ai, town)
melee_ai:dynamic_wait(secs(15))
town:build(1, UnitId.ZergQuazethPool, 110, true)
melee_ai:dynamic_wait(secs(5))
town:wait_build(1, UnitId.ZergQuazethPool, false)
melee_ai:dynamic_wait(secs(5))
town:build(2, UnitId.ZergHachirosk, 115)
town:wait_build(1, UnitId.ZergQuazethPool)
melee_ai:start_attacking()
wait(secs(4))
town:build(4, UnitId.ZergHachirosk, 115)
melee_ai:dynamic_wait(mins(1) + secs(20))
melee_ai:start_expanding()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.three_base_othstol(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(mins(1) + secs(55))
town:build(1, UnitId.ZergQuazethPool, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.gates_of_hell(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(mins(1) + secs(55))
town:build(1, UnitId.ZergQuazethPool, 90, true)
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergZorkizShroud, 90, true)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_attacking()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.primitive_pressure(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(50))
town:build(1, UnitId.ZergQuazethPool, 90, true)
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergHydrithDen, 90, true)
melee_ai:dynamic_wait(secs(40))
melee_ai:start_attacking()
end
-- Sunblot
---@param melee_ai MeleeAI
---@param town Town
function Openers.big_and_little(melee_ai, town)
melee_ai:dynamic_wait(secs(30))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergQuazethPool, 90, true)
melee_ai:dynamic_wait(secs(15))
town:build(2, UnitId.ZergHachirosk, 115)
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergVornathPond, 90, true)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_attacking()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.the_triad(melee_ai, town)
melee_ai:dynamic_wait(secs(30))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(25))
town:build(1, UnitId.ZergQuazethPool, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.skittering_duo(melee_ai, town)
melee_ai:dynamic_wait(secs(30))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergHydrithDen, 90, true)
melee_ai:dynamic_wait(mins(1))
town:build(1, UnitId.ZergQuazethPool, 90, true)
melee_ai:dynamic_wait(secs(50))
melee_ai:start_attacking()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.early_birds(melee_ai, town)
melee_ai:dynamic_wait(secs(30))
melee_ai:start_expanding()
melee_ai:dynamic_wait(mins(1) + secs(25))
town:build(1, UnitId.ZergQuazethPool, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.flying_feint(melee_ai, town)
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergQuazethPool, 110, true)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_attacking()
melee_ai:dynamic_wait(secs(30))
melee_ai:start_expanding()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.descending_horizon(melee_ai, town)
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergQuazethPool, 110, true)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_expanding()
melee_ai:dynamic_wait(mins(1) + secs(50))
town:build(2, UnitId.ZergHachirosk, 115)
melee_ai:dynamic_wait(secs(20))
town:build(1, UnitId.ZergVornathPond, 90, true)
melee_ai:dynamic_wait(secs(25))
town:build(1, UnitId.ZergHydrithDen, 90, true)
melee_ai:dynamic_wait(secs(25))
melee_ai:start_attacking()
melee_ai:dynamic_wait(mins(1))
end
-- General
---@param melee_ai MeleeAI
---@param town Town
function Openers.sleeping_giant(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(30))
town:build(1, UnitId.ZergQuazethPool, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.shrieking_swarm(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(25))
town:build(1, UnitId.ZergQuazethPool, 90, true)
melee_ai:dynamic_wait(secs(40))
melee_ai:start_attacking()
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.subjugation(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(30))
town:build(1, UnitId.ZergDroleth, 100)
melee_ai:dynamic_wait(secs(5))
town:build(1, UnitId.ZergHydrithDen, 90, true)
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.before_the_storm(melee_ai, town)
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergQuazethPool, 110, true)
town:wait_build(1, UnitId.ZergQuazethPool, false)
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(25))
town:build(1, UnitId.ZergDroleth, 100)
melee_ai:dynamic_wait(secs(50))
town:build(2, UnitId.ZergHachirosk, 115)
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergZorkizShroud, 90, true)
melee_ai:dynamic_wait(secs(15))
melee_ai:start_attacking()
melee_ai:dynamic_wait(mins(2) + secs(30))
end
---@param melee_ai MeleeAI
---@param town Town
function Openers.time_after_time(melee_ai, town)
melee_ai:dynamic_wait(secs(45))
melee_ai:start_expanding()
melee_ai:dynamic_wait(secs(40))
town:build(1, UnitId.ZergHydrithDen, 90, true)
melee_ai:dynamic_wait(secs(40))
melee_ai:start_attacking()
end
return Openers