Hi,
I have a system of triggers that for some reason are not behaving for a specific instance. Perhaps I am near sighted but I cannot diagnose the problem. I will first describe the system and then give the offending triggers.
I use a counting system to count each player's buildings and then do some action for each building. Here is a case of counting a single building type.
for each player 1 to i do:
for each instance of building of type T:
Give instance to P9
//do some action
endfor
Give all instances back to Pi
endfor
At a more lower level, the triggers basically count all buildings sequentially for each player. This is because I only use P9 as the counting player and so first it counts P1, then P2, then P3, etc. Otherwise there is no way to maintain identity when giving back the buildings. Each player is assigned a "lock" that essentially prevents them from being counted until all previous players have been counted. Thus PN can only start counting once P1 - PN-1 have finished counting. In the case a player is missing, I have a series of triggers that detects this and automatically releases the lock for that player. Thus if the only players are P3, P4, and P8,the locks for P1, P2 and P5, P6, P7 will always be released.
The system has been working fine and dandy except for one case, where I count Terran Academies. For whatever reason, the system breaks at counting these and they don't get counted at all. In this case, as far as I can tell, P9 stops taking buildings from anyone so they no longer get counted. And he does not hold onto any buildings, e.g. a cycle completes but then never starts again. The break occurs usually around the 2nd or 3rd cycle of counting the Terran Academies. What I would want to believe is somehow a lock is not being released, or the conditions for starting counting are not being satisfied.
However, it doesn't make much sense to me that the system would break on this instance. This is because I use it for 7 other buildings, and none of them have ever broken. More peculiar is that the Terran Academy triggers are simply made from a single text macro as all of the correctly working cases. Thus I am stumped as to what the problem really is--it most likely is particular to the Terran Academy and how I handle the DCs for doing that counting.
I use two DCs for Terran Academy counting: Terran Academy DC, which serves as the timer (how long between each cycle), held by P8, and Cantina, held by each player, which serves as the lock. When Terran Academy DC is at 0, a player's Cantina is at 1, and all players before them have Cantinas of 0 (all locks released), then they begin to count. But I searched the entire trigger text for other uses of Cantina and Terran Academy deaths and could not find any trigger which might fumble these values. I post the relevant triggers now in hopes someone can point out a potential source of error in my expected behavior.
Counting Timer for Terran Academy
Trigger("Player 8"){
Conditions:
Deaths("Current Player", "Terran Academy", At most, 0);
Deaths("Magisters", "Cantina", At most, 0);
Switch("Switch11", set);
Actions:
Set Deaths("Current Player", "Terran Academy", Set To, 60);
Set Deaths("Magisters", "Cantina", Set To, 1);
Comment("Spawn Timer Start\r\nUnit: Terran Ghost\r\nPlayer DC Switch: Cantina\r\nBuilding / DC: Terran Academy\r\nCount: 25");
Preserve Trigger();
}
//-----------------------------------------------------------------//
Trigger("Player 8"){
Conditions:
Deaths("Current Player", "Terran Academy", At least, 1);
Actions:
Set Deaths("Current Player", "Terran Academy", Subtract, 1);
Comment("Spawn Timer Counter\r\nBuilding / DC: Terran Academy");
Preserve Trigger();
}
//-----------------------------------------------------------------//
Counting for P1
Trigger("Player 1"){
Conditions:
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "Anywhere", At least, 1);
Accumulate("Current Player", At least, 70, ore);
Command("Current Player", "Men", At most, 150);
Command("Current Player", "Terran Ghost", At most, 60);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Preserve Trigger();
Comment("Spawn - Terran Academy - Terran Ghost - Center");
}
//-----------------------------------------------------------------//
Trigger("Player 1"){
Conditions:
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "PSpawn2", Exactly, 0);
Accumulate("Current Player", At least, 70, ore);
Command("Current Player", "Men", At most, 150);
Command("Current Player", "Terran Ghost", At most, 60);
Switch("Switch11", set);
Actions:
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("Spawn - Terran Academy - Terran Ghost - Incomplete");
}
//-----------------------------------------------------------------//
Trigger("Player 1"){
Conditions:
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "PSpawn2", Exactly, 1);
Accumulate("Current Player", At least, 70, ore);
Command("Current Player", "Men", At most, 150);
Command("Current Player", "Terran Ghost", At most, 60);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Create Unit with Properties("Current Player", "Terran Ghost", 2, "PSpawn2", 1);
Minimap Ping("PSpawn2");
Set Resources("Current Player", Subtract, 70, ore);
Preserve Trigger();
Comment("Spawn - Terran Academy - Terran Ghost\r\nCount: 3, \r\nCost: 70, ore per Terran Academy");
}
//-----------------------------------------------------------------//
Trigger("Player 1"){
Conditions:
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Command("Current Player", "Terran Academy", At least, 1);
Accumulate("Current Player", At most, 69, ore);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("No Spawn - Terran Academy - Terran Ghost\r\nReason: Not enough minerals, requires 70, ore.");
}
//-----------------------------------------------------------------//
Trigger("Player 1"){
Conditions:
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Command("Current Player", "Terran Academy", At least, 1);
Command("Current Player", "Men", At least, 151);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("No Spawn - Terran Academy - Terran Ghost\r\nReason: Player has too many units, limit: 150)");
}
//-----------------------------------------------------------------//
Trigger("Player 1"){
Conditions:
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Command("Current Player", "Terran Academy", At least, 1);
Command("Current Player", "Terran Ghost", At least, 61);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("No Spawn - Terran Academy - Terran Ghost\r\nReason: Limit 60) Terran Ghost");
}
//-----------------------------------------------------------------//
Trigger("Player 1"){
Conditions:
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "Anywhere", Exactly, 0);
Switch("Switch11", set);
Actions:
Give Units to Player("Player 9", "Current Player", "Terran Academy", All, "Anywhere");
Set Deaths("Current Player", "Cantina", Set To, 0);
Preserve Trigger();
Comment("Finish Spawn - Terran Academy - Terran Ghost");
}
//-----------------------------------------------------------------//
Counting for P2
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "Anywhere", At least, 1);
Accumulate("Current Player", At least, 70, ore);
Command("Current Player", "Men", At most, 150);
Command("Current Player", "Terran Ghost", At most, 60);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Preserve Trigger();
Comment("Spawn - Terran Academy - Terran Ghost - Center");
}
//-----------------------------------------------------------------//
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "PSpawn2", Exactly, 0);
Accumulate("Current Player", At least, 70, ore);
Command("Current Player", "Men", At most, 150);
Command("Current Player", "Terran Ghost", At most, 60);
Switch("Switch11", set);
Actions:
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("Spawn - Terran Academy - Terran Ghost - Incomplete");
}
//-----------------------------------------------------------------//
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "PSpawn2", Exactly, 1);
Accumulate("Current Player", At least, 70, ore);
Command("Current Player", "Men", At most, 150);
Command("Current Player", "Terran Ghost", At most, 60);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Create Unit with Properties("Current Player", "Terran Ghost", 2, "PSpawn2", 1);
Minimap Ping("PSpawn2");
Set Resources("Current Player", Subtract, 70, ore);
Preserve Trigger();
Comment("Spawn - Terran Academy - Terran Ghost\r\nCount: 3, \r\nCost: 70, ore per Terran Academy");
}
//-----------------------------------------------------------------//
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Command("Current Player", "Terran Academy", At least, 1);
Accumulate("Current Player", At most, 69, ore);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("No Spawn - Terran Academy - Terran Ghost\r\nReason: Not enough minerals, requires 70, ore.");
}
//-----------------------------------------------------------------//
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Command("Current Player", "Terran Academy", At least, 1);
Command("Current Player", "Men", At least, 151);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("No Spawn - Terran Academy - Terran Ghost\r\nReason: Player has too many units, limit: 150)");
}
//-----------------------------------------------------------------//
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Player 8", "Terran Academy", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Command("Current Player", "Terran Academy", At least, 1);
Command("Current Player", "Terran Ghost", At least, 61);
Switch("Switch11", set);
Actions:
Move Location("Current Player", "Terran Academy", "Anywhere", "PSpawn2");
Give Units to Player("Current Player", "Player 9", "Terran Academy", 1, "PSpawn2");
Preserve Trigger();
Comment("No Spawn - Terran Academy - Terran Ghost\r\nReason: Limit 60) Terran Ghost");
}
//-----------------------------------------------------------------//
Trigger("Player 2"){
Conditions:
Deaths("Player 1", "Cantina", At most, 0);
Deaths("Current Player", "Cantina", At least, 1);
Bring("Current Player", "Terran Academy", "Anywhere", Exactly, 0);
Switch("Switch11", set);
Actions:
Give Units to Player("Player 9", "Current Player", "Terran Academy", All, "Anywhere");
Set Deaths("Current Player", "Cantina", Set To, 0);
Preserve Trigger();
Comment("Finish Spawn - Terran Academy - Terran Ghost");
}
//-----------------------------------------------------------------//
Releasing locks of missing players
Trigger("All players"){
Conditions:
Switch("P1", set);
Actions:
Set Deaths("Player 1", "Zerg Marker", Set To, 0);
Set Deaths("Player 1", "Alan Turret", Set To, 0);
Set Deaths("Player 1", "Cantina", Set To, 0);
Set Deaths("Player 1", "Cave", Set To, 0);
Set Deaths("Player 1", "Cave-in", Set To, 0);
Set Deaths("Player 1", "Disruption Field", Set To, 0);
Set Deaths("Player 1", "Duke Turret type 1", Set To, 0);
Set Deaths("Player 1", "Duke Turret type 2", Set To, 0);
Comment("Skip Turn");
Preserve Trigger();
}
//-----------------------------------------------------------------//
Trigger("All players"){
Conditions:
Switch("P2", set);
Actions:
Set Deaths("Player 2", "Zerg Marker", Set To, 0);
Set Deaths("Player 2", "Alan Turret", Set To, 0);
Set Deaths("Player 2", "Cantina", Set To, 0);
Set Deaths("Player 2", "Cave", Set To, 0);
Set Deaths("Player 2", "Cave-in", Set To, 0);
Set Deaths("Player 2", "Disruption Field", Set To, 0);
Set Deaths("Player 2", "Duke Turret type 1", Set To, 0);
Set Deaths("Player 2", "Duke Turret type 2", Set To, 0);
Comment("Skip Turn");
Preserve Trigger();
}
//-----------------------------------------------------------------//
None.