public static void DispatchActionsIfPresent() { if (IsEnable) { DispatchAction action = dispatchActions.Dequeue(); if (!action.Executed) { action.ExecuteDispatch(); } } }
public static void DispatchActionsIfPresent() { bool isEnable = MainThreadDispatcher.IsEnable; if (isEnable) { DispatchAction dispatchAction = MainThreadDispatcher.dispatchActions.Dequeue(); bool flag = !dispatchAction.Executed; if (flag) { dispatchAction.ExecuteDispatch(); } } }
protected override JobHandle OnAction(DispatchAction da, JobHandle jobHandle) { return(jobHandle); }
protected void TestHandler(DispatchAction da) => dispatchedAction = da;
public List <string> GetMoves() { // Timer.Reset(); Timer.Start(); updateStun(); updateContestedGhosts(); updateExploringBoard(); //Dispatch stunned Dashboard dashboard = Dashboards[Round]; dashboard.Strategies.Add("Strategies for round " + Round); foreach (string busterID in BusterIDs) { int state = Entities[busterID].Positions[Round].State; if (state == StateStunned) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Stunned }; dashboard.DispatchActions[busterID] = action; } } //Dispatch stun - for every non-stunned enemy buster, find the corresponding stun-capable buster if (dashboard.StunTimers.Count(d => d.Value == 0) > 0) //Has available stun quota { int enemyTeamID = 1 - TeamID; List <Entity> roamingEnemies = Entities .Where(d => d.Value.Type == enemyTeamID && d.Value.Positions.ContainsKey(Round)) .Where(d => d.Value.Positions[Round].State != StateStunned) .OrderByDescending(e => e.Value.Positions[Round].State == StateCarrying ? 10 : e.Value.Positions[Round].State) //Stun ghost carrying busters first .Select(d => d.Value).ToList(); foreach (Entity enemyBuster in roamingEnemies) { List <string> nonDispatchedAvailableBusters = BusterIDs .Where(bid => !dashboard.DispatchActions.ContainsKey(bid)) .Where(bid => dashboard.StunTimers[bid] == 0).ToList(); foreach (string busterID in nonDispatchedAvailableBusters) { EntityState es = Entities[busterID].Positions[Round]; EntityState esEnemy = enemyBuster.Positions[Round]; int distance = Distance(es.X, es.Y, esEnemy.X, esEnemy.Y); if (distance < LimStunMax) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Stun, EntityID = enemyBuster.ID }; dashboard.DispatchActions[busterID] = action; addStun(busterID, "" + (1 - TeamID) + "," + enemyBuster.ID); break; } } } } //Release and Return foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { EntityState es = Entities[busterID].Positions[Round]; if (es.State == StateCarrying) { int distance = distanceFromHome(es.X, es.Y); //Release if (distance < LimBaseRange) { DispatchAction releaseAction = new DispatchAction() { Type = DispatchActionType.Release, EntityID = es.Value }; dashboard.DispatchActions[busterID] = releaseAction; string key = "-1" + "," + es.Value; Entities[key].Captured = true; continue; } //Return DispatchAction returnAction = new DispatchAction() { Type = DispatchActionType.Return, Target = Home, EntityID = es.Value }; dashboard.DispatchActions[busterID] = returnAction; } } //Intercept //Bust int LimBustStamina = 16; int limBustStamina = LimBustStamina; if (Round > 32) { limBustStamina = 100; } if (Round > 20 && GhostCount < 10) { limBustStamina = 100; } if (Entities.Count(e => e.Value.Captured) > (GhostCount / 4)) { limBustStamina = 100; } List <Entity> visibleGhosts = Entities .Where(d => !d.Value.Captured && d.Value.Type == GhostTypeID && d.Value.Positions.ContainsKey(Round)) .Where(d => d.Value.Positions[Round].State < limBustStamina) .OrderBy(d => d.Value.Positions[Round].State) .Select(d => d.Value).ToList(); foreach (Entity ghost in visibleGhosts) { foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { EntityState es = Entities[busterID].Positions[Round]; EntityState esGhost = ghost.Positions[Round]; int distance = Distance(es.X, es.Y, esGhost.X, esGhost.Y); if (distance > LimBustMin && distance < LimBustMax) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Bust, EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; if (esGhost.State < 10) { break; } else { continue; } } if (distance > LimBustMax && distance < LimVisibility) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(esGhost.X, esGhost.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } if (distance > LimBustMax && distance < 6000 && esGhost.State > 5) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(esGhost.X, esGhost.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } if (esGhost.State <= 1) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(esGhost.X, esGhost.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } if (distance < LimBustMin) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(es.X, es.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } } } //Contest foreach (int ghostID in dashboard.ContestedGhostsIDs) { //Number of busters EntityState es = Entities.First(e => e.Value.Type == GhostTypeID && e.Value.ID == ghostID).Value.Positions[Round]; int busters = es.Value; //Number of our busters int numOurBusters = Dashboards[Round - 1].DispatchActions.Count(a => (a.Value.Type == DispatchActionType.Bust) && (a.Value.EntityID == ghostID)); int numEnemyBusters = busters - numOurBusters; // if (numEnemyBusters == busters) { continue; } // if (numEnemyBusters >= numOurBusters) { int required = numEnemyBusters - numOurBusters + 1; for (int i = 0; i < required; i++) { foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Contest, Target = new Point(es.X, es.Y), EntityID = ghostID }; dashboard.DispatchActions[busterID] = action; break; } } } } //Find List <Entity> roundGhosts = Entities .Where(d => !d.Value.Captured && d.Value.Type == GhostTypeID && d.Value.Positions.ContainsKey(Round)) .OrderBy(d => d.Value.Positions[Round].State) .Select(d => d.Value).ToList(); List <int> roundGhostIDs = roundGhosts.Select(e => e.ID).ToList(); List <GhostMemory> roundGhostMemories = dashboard.GhostMemories; List <GhostMemory> previousGhostMemories = new List <GhostMemory>(); foreach (Entity e in roundGhosts) { // if (dashboard.DispatchActions.Where(d => d.Value.EntityID == e.ID).Count() > 0) { continue; } // EntityState esGhost = e.Positions[Round]; // string closestBusterID = BusterIDs .OrderBy(bid => Distance(esGhost.X, esGhost.Y, Entities[bid].Positions[Round].X, Entities[bid].Positions[Round].Y)) .First(); EntityState esBuster = Entities[closestBusterID].Positions[Round]; Point p = ProjectGhost(esGhost.X, esGhost.Y, esBuster.X, esBuster.Y); // roundGhostMemories.Add(new GhostMemory() { GhostID = e.ID, Round = Round, X = p.X, Y = p.Y, Stamina = esGhost.State }); } if (Round > 0) { previousGhostMemories = Dashboards[Round - 1].GhostMemories; } foreach (GhostMemory gm in previousGhostMemories) { //Updated this round so do not use the memory if (roundGhostIDs.Contains(gm.GhostID)) { continue; } //Check if the point is within buster range bool found = false; foreach (string busterID in BusterIDs) { EntityState buster = Entities[busterID].Positions[Round]; int distance = Distance(gm.X, gm.Y, buster.X, buster.Y); if (distance < LimVisibility) { found = true; break; } } //Outside of buster visibility, carry over if (!found) { roundGhostMemories.Add(gm); } } foreach (GhostMemory gm in roundGhostMemories.Where(g => g.Stamina < limBustStamina).OrderBy(g => g.Stamina)) { foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Find, Target = new Point(Math.Max(0, gm.X - LimBustMin + 100), Math.Max(0, gm.Y - LimBustMin + 100)), EntityID = gm.GhostID }; dashboard.DispatchActions[busterID] = action; break; } } //Roam foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { Point random = getExplore(busterID); DispatchAction action = new DispatchAction() { Type = DispatchActionType.Roam, Target = random }; dashboard.DispatchActions[busterID] = action; } // MOVE x y | BUST id | RELEASE | STUN List <string> moves = new List <string>(); foreach (string busterID in BusterIDs) { DispatchAction action = dashboard.DispatchActions[busterID]; if (action.Type == DispatchActionType.Stunned) { EntityState stunnedBuster = Entities[busterID].Positions[Round]; moves.Add("MOVE " + stunnedBuster.X + " " + stunnedBuster.Y + " Stunned"); } if (action.Type == DispatchActionType.Stun) { moves.Add("STUN " + action.EntityID + " Stun! " + action.EntityID); } if (action.Type == DispatchActionType.Return) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Return " + action.EntityID); } if (action.Type == DispatchActionType.Release) { moves.Add("RELEASE" + " Release " + action.EntityID); } if (action.Type == DispatchActionType.Intercept) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Intercept! " + action.EntityID); } if (action.Type == DispatchActionType.Bust) { moves.Add("BUST " + action.EntityID + " Bust " + action.EntityID); } if (action.Type == DispatchActionType.Contest) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Contest " + action.EntityID); } if (action.Type == DispatchActionType.Chase) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Chase " + action.EntityID); } if (action.Type == DispatchActionType.Herd) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Herd " + action.EntityID); } if (action.Type == DispatchActionType.Find) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Find " + action.EntityID); } if (action.Type == DispatchActionType.Roam) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Roam"); } } // foreach (string line in dashboard.Predictions) { Console.Error.WriteLine(line); } foreach (string line in dashboard.Updates) { Console.Error.WriteLine(line); } // string stunTimer = ""; foreach (string busterID in BusterIDs) { stunTimer += "(" + busterID + ")->" + dashboard.StunTimers[busterID] + " "; } stunTimer += "|| "; foreach (string busterID in EnemyBusterIDs) { stunTimer += "(" + busterID + ")->" + dashboard.StunTimers[busterID] + " "; } Console.Error.WriteLine("Timers " + stunTimer); // string contestedGhosts = ""; foreach (int ghostID in dashboard.ContestedGhostsIDs) { EntityState es = Entities.First(e => e.Value.Type == GhostTypeID && e.Value.ID == ghostID).Value.Positions[Round]; int busters = es.Value; contestedGhosts += "" + ghostID + "->" + busters + " "; } Console.Error.WriteLine("Contested " + contestedGhosts); // foreach (string line in dashboard.Strategies) { Console.Error.WriteLine(line); } Timer.Stop(); long time = Timer.ElapsedMilliseconds; Console.Error.WriteLine("Timer " + time + "ms"); // foreach (GhostMemory gm in dashboard.GhostMemories) { Console.Error.WriteLine("GM " + gm.GhostID + " " + gm.Round + " (" + gm.X + "," + gm.Y + ") " + gm.Stamina); } // Round++; return(moves); }
public List <string> GetMoves() { // updateStun(); updateContestedGhosts(); updateExploringBoard(); //Dispatch stunned Dashboard dashboard = Dashboards[Round]; dashboard.Strategies.Add("Strategies for round " + Round); foreach (string busterID in BusterIDs) { int state = Entities[busterID].Positions[Round].State; if (state == StateStunned) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Stunned }; dashboard.DispatchActions[busterID] = action; } } //Dispatch stun - for every non-stunned enemy buster, find the corresponding stun-capable buster if (dashboard.StunTimers.Count(d => d.Value == 0) > 0) //Has available stun quota { int enemyTeamID = 1 - TeamID; List <Entity> roamingEnemies = Entities .Where(d => d.Value.Type == enemyTeamID && d.Value.Positions.ContainsKey(Round)) .Where(d => d.Value.Positions[Round].State != StateStunned) .OrderByDescending(e => e.Value.Positions[Round].State == StateCarrying ? 10 : e.Value.Positions[Round].State) //Stun ghost carrying busters first .Select(d => d.Value).ToList(); foreach (Entity enemyBuster in roamingEnemies) { List <string> nonDispatchedAvailableBusters = BusterIDs .Where(bid => !dashboard.DispatchActions.ContainsKey(bid)) .Where(bid => dashboard.StunTimers[bid] == 0).ToList(); foreach (string busterID in nonDispatchedAvailableBusters) { EntityState es = Entities[busterID].Positions[Round]; EntityState esEnemy = enemyBuster.Positions[Round]; int distance = Distance(es.X, es.Y, esEnemy.X, esEnemy.Y); if (distance < LimStunMax) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Stun, EntityID = enemyBuster.ID }; dashboard.DispatchActions[busterID] = action; addStun(busterID, "" + (1 - TeamID) + "," + enemyBuster.ID); break; } } } } //Release and Return foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { EntityState es = Entities[busterID].Positions[Round]; if (es.State == StateCarrying) { int distance = distanceFromHome(es.X, es.Y); //Release if (distance < LimBaseRange) { DispatchAction releaseAction = new DispatchAction() { Type = DispatchActionType.Release, EntityID = es.Value }; dashboard.DispatchActions[busterID] = releaseAction; string key = "-1" + "," + es.Value; Entities[key].Captured = true; continue; } //Return DispatchAction returnAction = new DispatchAction() { Type = DispatchActionType.Return, Target = Home, EntityID = es.Value }; dashboard.DispatchActions[busterID] = returnAction; } } //Intercept //Bust int LimBustStamina = 16; int limBustStamina = LimBustStamina; if (Round > 40) { limBustStamina = 100; } if (Round > 20 && GhostCount < 10) { limBustStamina = 100; } if (Entities.Count(e => e.Value.Captured) > (GhostCount / 4)) { limBustStamina = 100; } List <Entity> visibleGhosts = Entities .Where(d => !d.Value.Captured && d.Value.Type == GhostTypeID && d.Value.Positions.ContainsKey(Round)) .Where(d => d.Value.Positions[Round].State < limBustStamina) .OrderBy(d => d.Value.Positions[Round].State) .Select(d => d.Value).ToList(); foreach (Entity ghost in visibleGhosts) { foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { EntityState es = Entities[busterID].Positions[Round]; EntityState esGhost = ghost.Positions[Round]; int distance = Distance(es.X, es.Y, esGhost.X, esGhost.Y); if (distance > LimBustMin && distance < LimBustMax) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Bust, EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; if (esGhost.State < 10) { break; } else { continue; } } if (distance > LimBustMax && distance < LimVisibility) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(esGhost.X, esGhost.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } if (distance > LimBustMax && distance < 6000 && esGhost.State > 15) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(esGhost.X, esGhost.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } if (esGhost.State <= 1) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(esGhost.X, esGhost.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } if (distance < LimBustMin) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Chase, Target = new Point(es.X, es.Y), EntityID = ghost.ID }; dashboard.DispatchActions[busterID] = action; continue; } } } //Contest foreach (int ghostID in dashboard.ContestedGhostsIDs) { EntityState es = Entities.First(e => e.Value.Type == GhostTypeID && e.Value.ID == ghostID).Value.Positions[Round]; int busters = es.Value; foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { DispatchAction action = new DispatchAction() { Type = DispatchActionType.Contest, Target = new Point(es.X, es.Y), EntityID = ghostID }; dashboard.DispatchActions[busterID] = action; break; } } //Find foreach (string busterID in BusterIDs.Where(bid => !dashboard.DispatchActions.ContainsKey(bid))) { Point random = getExplore(busterID); DispatchAction action = new DispatchAction() { Type = DispatchActionType.Roam, Target = random }; dashboard.DispatchActions[busterID] = action; } // MOVE x y | BUST id | RELEASE | STUN List <string> moves = new List <string>(); foreach (string busterID in BusterIDs) { DispatchAction action = dashboard.DispatchActions[busterID]; if (action.Type == DispatchActionType.Stunned) { EntityState stunnedBuster = Entities[busterID].Positions[Round]; moves.Add("MOVE " + stunnedBuster.X + " " + stunnedBuster.Y + " Stunned"); } if (action.Type == DispatchActionType.Stun) { moves.Add("STUN " + action.EntityID + " Stun! " + action.EntityID); } if (action.Type == DispatchActionType.Return) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Return " + action.EntityID); } if (action.Type == DispatchActionType.Release) { moves.Add("RELEASE" + " Release " + action.EntityID); } if (action.Type == DispatchActionType.Intercept) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Intercept! " + action.EntityID); } if (action.Type == DispatchActionType.Bust) { moves.Add("BUST " + action.EntityID + " Bust " + action.EntityID); } if (action.Type == DispatchActionType.Contest) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Contest " + action.EntityID); } if (action.Type == DispatchActionType.Chase) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Chase " + action.EntityID); } if (action.Type == DispatchActionType.Herd) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Herd " + action.EntityID); } if (action.Type == DispatchActionType.Find) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Find " + action.EntityID); } if (action.Type == DispatchActionType.Roam) { moves.Add("MOVE " + action.Target.X + " " + action.Target.Y + " Roam"); } } // foreach (string line in dashboard.Predictions) { Console.Error.WriteLine(line); } foreach (string line in dashboard.Updates) { Console.Error.WriteLine(line); } // string stunTimer = ""; foreach (string busterID in BusterIDs) { stunTimer += "(" + busterID + ")->" + dashboard.StunTimers[busterID] + " "; } stunTimer += "|| "; foreach (string busterID in EnemyBusterIDs) { stunTimer += "(" + busterID + ")->" + dashboard.StunTimers[busterID] + " "; } Console.Error.WriteLine("Timers " + stunTimer); // string contestedGhosts = ""; foreach (int ghostID in dashboard.ContestedGhostsIDs) { EntityState es = Entities.First(e => e.Value.Type == GhostTypeID && e.Value.ID == ghostID).Value.Positions[Round]; int busters = es.Value; contestedGhosts += "" + ghostID + "->" + busters + " "; } Console.Error.WriteLine("Contested " + contestedGhosts); // foreach (string line in dashboard.Strategies) { Console.Error.WriteLine(line); } // Round++; return(moves); /* * // * Dictionary<int, string> ghostChasedBy = new Dictionary<int, string>(); * Dictionary<int, string> busterStunnedBy = new Dictionary<int, string>(); * * foreach (string busterID in BusterIDs) * { * // * EntityState buster = Entities[busterID].Positions[Round]; * bool carrying = (buster.State == 1); * if (carrying) * { * int distance = distanceFromHome(buster.X, buster.Y); * if (distance < LimBaseRange) * { * moves.Add("RELEASE"); * // * int gid = buster.Value; * string key = "-1" + "," + gid; * Entities[key].Captured = true; * } * else * { * moves.Add("MOVE " + Home.X + " " + Home.Y + " Returning"); * } * continue; * } * * // * int stunBusterID = -1; * if (stunBusterID >= 0) * { * if (!busterStunnedBy.ContainsKey(stunBusterID)) * { * busterStunnedBy[stunBusterID] = busterID; * addStun(busterID, "" + (1 - TeamID) + "," + stunBusterID); * moves.Add("STUN " + stunBusterID); * continue; * } * } * * // * bool inRange = false; * foreach (Entity g in visibleGhosts) * { * int d = Distance(buster.X, buster.Y, g.Positions[Round].X, g.Positions[Round].Y); * if (d > LimBustMin && d < LimBustMax) * { * ghostChasedBy[g.ID] = busterID; * inRange = true; * moves.Add("BUST " + g.ID); * break; * } * } * if (inRange) continue; * foreach (Entity g in visibleGhosts) * { * int d = Distance(buster.X, buster.Y, g.Positions[Round].X, g.Positions[Round].Y); * if (d > LimBustMax) * { * if (!ghostChasedBy.ContainsKey(g.ID)) * { * ghostChasedBy[g.ID] = busterID; * inRange = true; * moves.Add("MOVE " + g.Positions[Round].X + " " + g.Positions[Round].Y + " Chase"); * break; * } * } * } * if (inRange) continue; * foreach (Entity g in visibleGhosts) * { * int d = Distance(buster.X, buster.Y, g.Positions[Round].X, g.Positions[Round].Y); * if (d < LimBustMin) * { * inRange = true; * int ghostID = g.ID; * moves.Add("MOVE " + buster.X + " " + buster.Y + " Wait"); * break; * } * } * if (inRange) continue; * * // * Point random = getExplore(busterID); * moves.Add("MOVE " + random.X + " " + random.Y + " Explore"); * } * // * Round++; * return moves; */ }
public void AddAction(DispatchAction action) { actions.Add(action); }