Hands-On Usage
has_tactic is commonly used in mods to determine whether a country has unlocked a specific tactic, and then conditionally enable a decision, display special event options, or activate an advisor. For example, when designing an "Elite Armor" technology tree, you can use it to ensure that only nations that have truly unlocked the Blitzkrieg tactic can trigger the associated reward events.
# Only allow this decision to be available if the country has unlocked tactic_masterful_blitz
available = {
has_tactic = tactic_masterful_blitz
}
Synergy
[has_doctrine](/wiki/trigger/has_doctrine): Tactics are typically unlocked through doctrine research. Using both together allows precise distinction between the boundary case of "doctrine researched but tactic not yet activated by default" and "tactic fully available".
[has_completed_focus](/wiki/trigger/has_completed_focus): Some tactics are unlocked through focuses rather than technologies. Combined with this trigger, you can construct a complete logic chain of "focus completed → tactic available → decision unlocked".
[can_research](/wiki/trigger/can_research): Used to determine whether there are still tactic-related technologies pending research. It complements has_tactic—one checks "already has", the other checks "can research"—avoiding duplicate prompts.
[add_tech_bonus](/wiki/effect/add_tech_bonus): After confirming that a country possesses a certain tactic, use this effect to grant subsequent technology acceleration, creating an incentive design of "unlock tactic → enjoy research bonuses".
Common Pitfalls
- Confusing tactic keys with technology keys: The parameter for
has_tactic is the identifier of the tactic itself (such as tactic_masterful_blitz), not the technology token that unlocks it. Directly entering a technology name will cause the trigger to always return false without error, making it difficult to debug.
- Overlooking "default-activated" tactics: The official description explicitly states that default-activated tactics also return true. Therefore, if your logic wants to distinguish between "actively researched unlock" and "initial default", this trigger alone cannot achieve it—you need secondary filtering using
[has_doctrine](/wiki/trigger/has_doctrine) or focus completion status.