public bool WarpInAlmostOffCooldown(int frame, float framesPerSecond, SharkyUnitData sharkyUnitData) { foreach (var warpIn in sharkyUnitData.WarpInCooldownTimes) { if (AbilityOrderTimes.ContainsKey(warpIn.Key)) { if ((frame - AbilityOrderTimes[warpIn.Key] - 10) / framesPerSecond < sharkyUnitData.WarpInCooldownTimes[warpIn.Key]) { return(false); } } } return(true); }
public UnitDataService(SharkyUnitData sharkyUnitData) { SharkyUnitData = sharkyUnitData; }
public bool AbilityOffCooldown(Abilities ability, int frame, float framesPerSecond, SharkyUnitData sharkyUnitData) { if (AbilityOrderTimes.ContainsKey(ability)) { return((frame - AbilityOrderTimes[ability]) / framesPerSecond > sharkyUnitData.AbilityCooldownTimes[ability]); } return(true); }
public TargetPriorityService(SharkyUnitData sharkyUnitData) { SharkyUnitData = sharkyUnitData; }
public UnitCountService(ActiveUnitData activeUnitData, SharkyUnitData sharkyUnitData) { ActiveUnitData = activeUnitData; SharkyUnitData = sharkyUnitData; }
public UnitCalculation(Unit unit, int repairers, SharkyUnitData sharkyUnitData, SharkyOptions sharkyOptions, UnitDataService unitDataService, int frame) { TargetPriorityCalculation = new TargetPriorityCalculation(); oneSecondInFrames = sharkyOptions.FramesPerSecond; //PreviousUnits = new Dictionary<int, Unit>(); //PreviousUnits[frame] = unit; PreviousUnit = unit; Unit = unit; UnitTypeData = sharkyUnitData.UnitData[(UnitTypes)unit.UnitType]; Velocity = 0; AverageVelocity = 0; Vector = Vector2.Zero; AverageVector = Vector2.Zero; Position = new Vector2(unit.Pos.X, unit.Pos.Y); FrameLastSeen = frame; var unitRange = unitDataService.GetRange(unit); if (unitRange == 0) { Range = 0; } else { Range = unitRange + unit.Radius; } Start = new Vector2(unit.Pos.X, unit.Pos.Y); if (unit.UnitType == (uint)UnitTypes.PROTOSS_COLOSSUS || unit.UnitType == (uint)UnitTypes.PROTOSS_IMMORTAL || unit.UnitType == (uint)UnitTypes.PROTOSS_PHOTONCANNON || unit.UnitType == (uint)UnitTypes.PROTOSS_MOTHERSHIP || unit.UnitType == (uint)UnitTypes.TERRAN_MISSILETURRET || unit.UnitType == (uint)UnitTypes.ZERG_SPORECRAWLER || unit.UnitType == (uint)UnitTypes.ZERG_SPINECRAWLER) { End = Start; // facing is always 0 for these units, can't calculate where they're aiming } else { var endX = (float)(Range * Math.Sin(unit.Facing + (Math.PI / 2))); var endY = (float)(Range * Math.Cos(unit.Facing + (Math.PI / 2))); End = new Vector2(endX + unit.Pos.X, unit.Pos.Y - endY); } DamageRadius = 1; // TODO: get damage radius EstimatedCooldown = 0; // TODO: get estimated cooldown DamageAir = false; if (unitDataService.CanAttackAir((UnitTypes)unit.UnitType)) { DamageAir = true; } DamageGround = false; if (unitDataService.CanAttackGround((UnitTypes)unit.UnitType)) { DamageGround = true; } Damage = unitDataService.GetDamage(unit); Dps = unitDataService.GetDps(unit); Weapon = unitDataService.GetWeapon(unit); Weapons = UnitTypeData.Weapons.ToList(); if (Weapons == null || Weapons.Count() == 0) { Weapons = new List <Weapon>(); if (Weapon != null) { Weapons.Add(Weapon); } } SimulatedHitpoints = Unit.Health + Unit.Shield; if (Unit.BuffIds.Contains((uint)Buffs.IMMORTALOVERLOAD)) { SimulatedHitpoints += 100; } if (unit.UnitType == (uint)UnitTypes.PROTOSS_WARPPRISM) { SimulatedHitpoints += 500; } if (sharkyUnitData.ZergTypes.Contains((UnitTypes)Unit.UnitType)) { SimulatedHealPerSecond = 0.38f; } else if (repairers > 0 && UnitTypeData.Attributes.Contains(SC2APIProtocol.Attribute.Mechanical)) { SimulatedHealPerSecond = (float)(unit.HealthMax / (UnitTypeData.BuildTime / sharkyOptions.FramesPerSecond)) * repairers; } else if (Unit.UnitType == (uint)UnitTypes.TERRAN_MEDIVAC && Unit.Energy > 10) { SimulatedHealPerSecond = 12.6f; } else if (Unit.UnitType == (uint)UnitTypes.ZERG_QUEEN && Unit.Energy >= 50) { SimulatedHealPerSecond = 20; } else { SimulatedHealPerSecond = 0; } if (Unit.UnitType == (uint)UnitTypes.TERRAN_BUNKER && Unit.BuildProgress == 1) // assume 4 marines { Range = 6; DamageAir = true; DamageGround = true; Damage = 6; Dps = Damage * 4 / 0.61f; } Attributes = UnitTypeData.Attributes; UnitClassifications = new List <UnitClassification>(); if (UnitTypeData.Attributes.Contains(SC2APIProtocol.Attribute.Structure)) { if (sharkyUnitData.ResourceCenterTypes.Contains((UnitTypes)unit.UnitType)) { UnitClassifications.Add(UnitClassification.ResourceCenter); UnitClassifications.Add(UnitClassification.ProductionStructure); } if (sharkyUnitData.DefensiveStructureTypes.Contains((UnitTypes)unit.UnitType)) { UnitClassifications.Add(UnitClassification.DefensiveStructure); } } else if (unit.UnitType == (uint)UnitTypes.TERRAN_SCV || unit.UnitType == (uint)UnitTypes.PROTOSS_PROBE || unit.UnitType == (uint)UnitTypes.ZERG_DRONE) { UnitClassifications.Add(UnitClassification.Worker); } else if (unit.UnitType == (uint)UnitTypes.ZERG_QUEEN || unit.UnitType == (uint)UnitTypes.TERRAN_MULE || unit.UnitType == (uint)UnitTypes.ZERG_OVERLORD || unit.UnitType == (uint)UnitTypes.ZERG_LARVA || unit.UnitType == (uint)UnitTypes.ZERG_EGG) { } else { UnitClassifications.Add(UnitClassification.ArmyUnit); } if (sharkyUnitData.DetectionTypes.Contains((UnitTypes)unit.UnitType)) { UnitClassifications.Add(UnitClassification.Detector); } if (sharkyUnitData.AbilityDetectionTypes.Contains((UnitTypes)unit.UnitType)) { UnitClassifications.Add(UnitClassification.DetectionCaster); } if (sharkyUnitData.CloakableAttackers.Contains((UnitTypes)unit.UnitType)) { UnitClassifications.Add(UnitClassification.Cloakable); } EnemiesInRange = new List <UnitCalculation>(); EnemiesInRangeOf = new List <UnitCalculation>(); NearbyAllies = new List <UnitCalculation>(); NearbyEnemies = new List <UnitCalculation>(); Attackers = new List <UnitCalculation>(); IncomingDamage = 0; }