public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { GetPlayerInfo(gameInfo, playerId, opponentId); if (EnemyPlayerService.Tournament.Enabled) { foreach (var buildSequence in EnemyPlayerService.Tournament.BuildSequences) { BuildChoices[ActualRace].BuildSequences[buildSequence.Key] = buildSequence.Value; } } var buildSequences = BuildChoices[ActualRace].BuildSequences[EnemyRace.ToString()]; if (!string.IsNullOrWhiteSpace(EnemyPlayer.Name) && BuildChoices[ActualRace].BuildSequences.ContainsKey(EnemyPlayer.Name)) { buildSequences = BuildChoices[ActualRace].BuildSequences[EnemyPlayer.Name]; } MapName = gameInfo.MapName; BuildSequence = BuildDecisionService.GetBestBuild(EnemyPlayer, buildSequences, MapName, EnemyPlayerService.Enemies, EnemyRace); BuildHistory = new Dictionary <int, string>(); SwitchBuild(BuildSequence.First(), 0); }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { var placementGrid = gameInfo.StartRaw.PlacementGrid; var heightGrid = gameInfo.StartRaw.TerrainHeight; var pathingGrid = gameInfo.StartRaw.PathingGrid; MapData.MapWidth = pathingGrid.Size.X; MapData.MapHeight = pathingGrid.Size.Y; MapData.Map = new Dictionary <int, Dictionary <int, MapCell> >(); for (var x = 0; x < pathingGrid.Size.X; x++) { var row = new Dictionary <int, MapCell>(); for (var y = 0; y < pathingGrid.Size.Y; y++) { var walkable = GetDataValueBit(pathingGrid, x, y); var height = GetDataValueByte(heightGrid, x, y); var placeable = GetDataValueBit(placementGrid, x, y); row[y] = new MapCell { X = x, Y = y, Walkable = walkable, TerrainHeight = height, Buildable = placeable, HasCreep = false, CurrentlyBuildable = placeable, EnemyAirDpsInRange = 0, EnemyGroundDpsInRange = 0, InEnemyVision = false, InSelfVision = false, InEnemyDetection = false, Visibility = 0, LastFrameVisibility = 0, NumberOfAllies = 0, NumberOfEnemies = 0, PoweredBySelfPylon = false, SelfAirDpsInRange = 0, SelfGroundDpsInRange = 0, LastFrameAlliesTouched = 0, PathBlocked = false }; } MapData.Map[x] = row; } MapData.PartialWallData = WallDataService.GetPartialWallData(gameInfo.MapName); MapData.BlockWallData = WallDataService.GetBlockWallData(gameInfo.MapName); MapData.MapName = gameInfo.MapName; }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { foreach (var location in gameInfo.StartRaw.StartLocations) { TargetingData.AttackPoint = location; TargetingData.EnemyMainBasePoint = location; } foreach (var unit in observation.Observation.RawData.Units.Where(u => u.Alliance == Alliance.Self && SharkyUnitData.UnitData[(UnitTypes)u.UnitType].Attributes.Contains(SC2APIProtocol.Attribute.Structure))) { TargetingData.MainDefensePoint = new Point2D { X = unit.Pos.X, Y = unit.Pos.Y }; var chokePoint = ChokePointService.FindDefensiveChokePoint(new Point2D { X = unit.Pos.X + 4, Y = unit.Pos.Y + 4 }, TargetingData.AttackPoint, 0); if (chokePoint != null) { TargetingData.ForwardDefensePoint = chokePoint; var chokePoints = ChokePointService.GetEntireChokePoint(chokePoint); if (chokePoints != null) { var wallPoints = ChokePointService.GetWallOffPoints(chokePoints); if (wallPoints != null) { TargetingData.ForwardDefenseWallOffPoints = wallPoints; } } } else { TargetingData.ForwardDefensePoint = new Point2D { X = unit.Pos.X, Y = unit.Pos.Y }; } if (MapData.PartialWallData != null) { var wallData = MapData.PartialWallData.FirstOrDefault(b => b.BasePosition.X == unit.Pos.X && b.BasePosition.Y == unit.Pos.Y); if (wallData != null && wallData.Door != null) { TargetingData.ForwardDefensePoint = wallData.Door; } } TargetingData.SelfMainBasePoint = new Point2D { X = unit.Pos.X, Y = unit.Pos.Y }; var naturalBaseLocation = BaseData.BaseLocations.Skip(1).Take(1).FirstOrDefault(); if (naturalBaseLocation != null) { TargetingData.NaturalBasePoint = naturalBaseLocation.Location; } return; } }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { foreach (var playerInfo in gameInfo.PlayerInfo) { if (playerInfo.PlayerId != playerId) { EnemyData.EnemyRace = playerInfo.RaceRequested; } } }
public void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentID) { Observation = observation; GameInfo = gameInfo; PlayerId = playerId; Data = data; UnitTypes.LoadData(data); GameVersion = pingResponse.GameVersion; OldMapData = SC2Util.IsVersionBefore("4.9.3"); DebugUtil.WriteLine("Game version: " + pingResponse.GameVersion); OpponentID = opponentID; MyRace = GameInfo.PlayerInfo[(int)Observation.Observation.PlayerCommon.PlayerId - 1].RaceActual; EnemyRace = GameInfo.PlayerInfo[2 - (int)Observation.Observation.PlayerCommon.PlayerId].RaceActual; DebugUtil.WriteLine("MyRace: " + MyRace); DebugUtil.WriteLine("EnemyRace: " + EnemyRace); DebugUtil.WriteLine("Game started on map: " + GameInfo.MapName); FileUtil.Log("Game started on map: " + GameInfo.MapName); FileUtil.Log("Enemy race: " + EnemyRace); MapAnalyzer.Analyze(this); TargetManager.OnStart(this); BaseManager.OnStart(this); Build = DetermineBuild(); Build.InitializeTasks(); Build.OnStart(this); FileUtil.Register("started " + EnemyRace + " " + Build.Name()); Managers.Add(UnitManager); Managers.Add(EnemyManager); Managers.Add(BaseManager); Managers.Add(TargetManager); Managers.Add(TaskManager); Managers.Add(EffectManager); Managers.Add(EnemyMineManager); Managers.Add(EnemyTankManager); Managers.Add(EnemyCycloneManager); Managers.Add(EnemyBansheesManager); if (GameInfo.PlayerInfo[(int)Observation.Observation.PlayerCommon.PlayerId - 1].RaceActual == Race.Protoss) { Managers.Add(NexusAbilityManager); } if (GameInfo.PlayerInfo[(int)Observation.Observation.PlayerCommon.PlayerId - 1].RaceActual == Race.Terran) { Managers.Add(OrbitalAbilityManager); } }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { foreach (UnitTypeData unitType in data.Units) { SharkyUnitData.UnitData.Add((UnitTypes)unitType.UnitId, unitType); if (unitType.AbilityId != 0) { SharkyUnitData.UnitAbilities.Add((Abilities)unitType.AbilityId, (UnitTypes)unitType.UnitId); } } }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { foreach (var playerInfo in gameInfo.PlayerInfo) { if (playerInfo.PlayerId == playerId) { MacroData.Race = playerInfo.RaceActual; } } MacroSetup.SetupMacro(MacroData); }
public void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentID) { GameTime = Stopwatch.StartNew(); GameInfo = gameInfo; CustomActionList.Add(new BotActin(true, new Action { ActionChat = new ActionChat { Message = "good luck have fun and... not enouph minerals" } }, 5)); //CustomActionList.Add(new BotActin(true, new Action { ActionRaw = new ActionRaw() }
// Ping private void MessagePing(MessageInfo messageInfo) { RequestPing requestPing = ProtoTransfer.DeserializeProtoBuf3 <RequestPing>(messageInfo.Buffer); User user = UserManager.Instance.GetUserByToken(requestPing.Token); if (user != null) { ResponsePing responsePing = new ResponsePing() { Uid = user.Id, Token = user.Token }; MessageBuffer _message = new MessageBuffer((int)MessageID.ScResponsePing, ProtoTransfer.SerializeProtoBuf3(responsePing), user.Id); Send(new MessageInfo(_message, messageInfo.Session)); } }
public void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { Console.WriteLine($"Game Version: {pingResponse.GameVersion}"); var stopwatch = new Stopwatch(); stopwatch.Start(); foreach (var manager in Managers) { manager.OnStart(gameInfo, data, pingResponse, observation, playerId, opponentId); } stopwatch.Stop(); Console.WriteLine($"OnStart: {stopwatch.ElapsedMilliseconds} ms"); TotalFrameTime = 0; }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { ActiveChatData.TimeModulation = 1; LastFrameTime = 0; RuntimeFrameRate = SharkyOptions.FramesPerSecond; GreetingSent = false; ActiveChatData.ChatActions = new List <Action>(); Self = gameInfo.PlayerInfo[(int)observation.Observation.PlayerCommon.PlayerId - 1]; Enemy = gameInfo.PlayerInfo[2 - (int)observation.Observation.PlayerCommon.PlayerId]; ConversationName = $"starcraft-{Enemy.PlayerId}-{DateTimeOffset.Now.ToUnixTimeMilliseconds()}"; ActiveChatData.EnemyName = EnemyNameService.GetEnemyNameFromId(opponentId, EnemyPlayerManager.Enemies); ChatHistory.EnemyChatHistory = new Dictionary <int, string>(); ChatHistory.MyChatHistory = new Dictionary <int, string>(); }
public virtual void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { }
public void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentID) { ArchonMode = Settings.ArchonMode(); Observation = observation; GameInfo = gameInfo; foreach (MapEnum map in System.Enum.GetValues(typeof(MapEnum))) { if (MapNameMatches(map)) { System.Console.WriteLine("Setting map name to: " + map.ToString()); GameInfo.MapName = map.ToString(); Map = map; break; } } PlayerId = playerId; Data = data; if (!Settings.MapAllowed(GameInfo.MapName)) { DebugUtil.WriteLine("Tyr does not support the map " + GameInfo.MapName + ". If Tyr should accept this map as well, you can add the line 'map " + GameInfo.MapName + "' to the settings.txt file."); FileUtil.Log("Tyr does not support the map " + GameInfo.MapName + ". If Tyr should accept this map as well, you can add the line 'map " + GameInfo.MapName + "' to the settings.txt file."); System.Console.ReadLine(); throw new System.Exception("Tyr does not support the map " + GameInfo.MapName + ". If Tyr should accept this map as well, you can add the line 'map " + GameInfo.MapName + "' to the settings.txt file."); } GameVersion = pingResponse.GameVersion; OldMapData = SC2Util.IsVersionBefore("4.9.3"); DebugUtil.WriteLine("Game version: " + pingResponse.GameVersion); UnitTypes.LoadData(data); OpponentID = opponentID; MyRace = GameInfo.PlayerInfo[(int)Observation.Observation.PlayerCommon.PlayerId - 1].RaceActual; if (GameInfo.PlayerInfo[2 - (int)Observation.Observation.PlayerCommon.PlayerId].RaceActual == Race.NoRace) { EnemyRace = GameInfo.PlayerInfo[2 - (int)Observation.Observation.PlayerCommon.PlayerId].RaceRequested; } else { EnemyRace = GameInfo.PlayerInfo[2 - (int)Observation.Observation.PlayerCommon.PlayerId].RaceActual; } DebugUtil.WriteLine("MyRace: " + MyRace); DebugUtil.WriteLine("EnemyRace: " + EnemyRace); DebugUtil.WriteLine("Game started on map: " + GameInfo.MapName); FileUtil.Log("Game started on map: " + GameInfo.MapName); FileUtil.Log("Enemy race: " + EnemyRace); MapAnalyzer.Analyze(this); TargetManager.OnStart(this); BaseManager.OnStart(this); foreach (Plugin plugin in Plugins) { plugin.OnStart(); } Build = DetermineBuild(); Build.InitializeTasks(); Build.OnStart(this); FileUtil.Register("started " + EnemyRace + " " + Build.Name()); Managers.Add(UnitManager); Managers.Add(EnemyManager); Managers.Add(BaseManager); Managers.Add(TargetManager); Managers.Add(TaskManager); Managers.Add(EffectManager); Managers.Add(EnemyMineManager); Managers.Add(EnemyTankManager); Managers.Add(EnemyCycloneManager); Managers.Add(EnemyBansheesManager); if (GameInfo.PlayerInfo[(int)Observation.Observation.PlayerCommon.PlayerId - 1].RaceActual == Race.Protoss) { Managers.Add(NexusAbilityManager); } if (GameInfo.PlayerInfo[(int)Observation.Observation.PlayerCommon.PlayerId - 1].RaceActual == Race.Terran) { Managers.Add(OrbitalAbilityManager); } }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { AttackData.CustomAttackFunction = true; AttackData.Attacking = false; }
public void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentID) { GameTime = Stopwatch.StartNew(); }
public async Task Run(Bot bot, uint playerId, string opponentID) { Request gameInfoReq = new Request(); gameInfoReq.GameInfo = new RequestGameInfo(); Response gameInfoResponse = await proxy.SendRequest(gameInfoReq); Request gameDataRequest = new Request(); gameDataRequest.Data = new RequestData(); gameDataRequest.Data.UnitTypeId = true; gameDataRequest.Data.AbilityId = true; gameDataRequest.Data.BuffId = true; gameDataRequest.Data.EffectId = true; gameDataRequest.Data.UpgradeId = true; Response dataResponse = await proxy.SendRequest(gameDataRequest); ResponsePing pingResponse = await Ping(); bool start = true; while (true) { Request observationRequest = new Request(); observationRequest.Observation = new RequestObservation(); Response response = await proxy.SendRequest(observationRequest); ResponseObservation observation = response.Observation; if (observation == null) { bot.OnEnd(observation, Result.Unset); break; } if (response.Status == Status.Ended || response.Status == Status.Quit) { bot.OnEnd(observation, observation.PlayerResult[(int)playerId - 1].Result); break; } if (start) { start = false; bot.OnStart(gameInfoResponse.GameInfo, dataResponse.Data, pingResponse, observation, playerId, opponentID); } IEnumerable <SC2APIProtocol.Action> actions = bot.OnFrame(observation); Request actionRequest = new Request(); actionRequest.Action = new RequestAction(); actionRequest.Action.Actions.AddRange(actions); if (actionRequest.Action.Actions.Count > 0) { await proxy.SendRequest(actionRequest); } Request stepRequest = new Request(); stepRequest.Step = new RequestStep(); stepRequest.Step.Count = 1; await proxy.SendRequest(stepRequest); } }
public override void OnStart(ResponseGameInfo gameInfo, ResponseData data, ResponsePing pingResponse, ResponseObservation observation, uint playerId, string opponentId) { PlacementGrid = gameInfo.StartRaw.PlacementGrid; var mineralFields = new List <Unit>(); foreach (var unit in observation.Observation.RawData.Units) { if (SharkyUnitData.MineralFieldTypes.Contains((UnitTypes)unit.UnitType)) { mineralFields.Add(unit); } } mineralFields = mineralFields.OrderBy(m => m.Pos.X).ThenBy(m => m.Pos.Y).ToList(); var mineralGroups = new Dictionary <ulong, int>(); int currentSet = 0; foreach (var mineralField in mineralFields) { if (!mineralGroups.ContainsKey(mineralField.Tag)) { var baseLocation = new BaseLocation(); BaseData.BaseLocations.Add(baseLocation); mineralGroups.Add(mineralField.Tag, currentSet); baseLocation.MineralFields.Add(mineralField); for (int i = 0; i < baseLocation.MineralFields.Count; i++) { var mineralFieldA = baseLocation.MineralFields[i]; foreach (var closeMineralField in mineralFields) { if (mineralGroups.ContainsKey(closeMineralField.Tag)) { continue; } if (Vector2.DistanceSquared(new Vector2(mineralFieldA.Pos.X, mineralFieldA.Pos.Y), new Vector2(closeMineralField.Pos.X, closeMineralField.Pos.Y)) <= 16) { mineralGroups.Add(closeMineralField.Tag, currentSet); baseLocation.MineralFields.Add(closeMineralField); } } } currentSet++; } } var gasses = new List <Unit>(); foreach (var unit in observation.Observation.RawData.Units) { if (SharkyUnitData.GasGeyserTypes.Contains((UnitTypes)unit.UnitType)) { gasses.Add(unit); } } gasses = gasses.OrderBy(g => g.Pos.X).ThenBy(g => g.Pos.Y).ToList(); foreach (var location in BaseData.BaseLocations) { DetermineFinalLocation(location, gasses); SetMineralLineLocation(location); } var startingUnit = observation.Observation.RawData.Units.FirstOrDefault(u => u.Alliance == Alliance.Self && SharkyUnitData.ResourceCenterTypes.Contains((UnitTypes)u.UnitType)); BaseData.BaseLocations = BaseData.BaseLocations.OrderBy(b => PathFinder.GetGroundPath(startingUnit.Pos.X + 4, startingUnit.Pos.Y + 4, b.Location.X, b.Location.Y, 0).Count()).ToList(); BaseData.MainBase = BaseData.BaseLocations.FirstOrDefault(); BaseData.MainBase.ResourceCenter = startingUnit; BaseData.SelfBases = new List <BaseLocation> { BaseData.MainBase }; SetupMiningInfo(); var enemystartingLocation = gameInfo.StartRaw.StartLocations.Last(); BaseData.EnemyBaseLocations = BaseData.BaseLocations.OrderBy(b => PathFinder.GetGroundPath(enemystartingLocation.X + 4, enemystartingLocation.Y + 4, b.Location.X, b.Location.Y, 0).Count()).ToList(); BaseData.EnemyBases = new List <BaseLocation> { BaseData.EnemyBaseLocations.FirstOrDefault() }; }