/// <see cref="IMapEditorService.RemoveEntity"/> public bool ChangeResourceAmount(int objectID, int delta) { if (this.scenarioManager.ActiveScenario == null) { throw new InvalidOperationException("No active scenario!"); } if (objectID < 0) { throw new ArgumentOutOfRangeException("objectID"); } MineralField mineralField = this.scenarioManager.ActiveScenario.GetElement <MineralField>(objectID); VespeneGeyser vespeneGeyser = this.scenarioManager.ActiveScenario.GetElement <VespeneGeyser>(objectID); if (mineralField != null) { int currentResourceAmount = mineralField.ResourceAmount.Read(); mineralField.ResourceAmount.Write(Math.Max(MineralField.MINIMUM_RESOURCE_AMOUNT, currentResourceAmount + delta)); return(true); } else if (vespeneGeyser != null) { int currentResourceAmount = vespeneGeyser.ResourceAmount.Read(); vespeneGeyser.ResourceAmount.Write(Math.Max(VespeneGeyser.MINIMUM_RESOURCE_AMOUNT, currentResourceAmount + delta)); return(true); } return(false); }
/// <see cref="IMapEditorService.PlaceMineralField"/> public bool PlaceMineralField(RCIntVector position) { if (this.scenarioManager.ActiveScenario == null) { throw new InvalidOperationException("No active scenario!"); } if (position == RCIntVector.Undefined) { throw new ArgumentNullException("position"); } RCIntVector navCellCoords = this.mapWindowBC.AttachedWindow.WindowToMapCoords(position).Round(); IQuadTile quadTileAtPos = this.scenarioManager.ActiveScenario.Map.GetCell(navCellCoords).ParentQuadTile; IScenarioElementType objectType = this.scenarioManager.Metadata.GetElementType(MineralField.MINERALFIELD_TYPE_NAME); RCIntVector objQuadSize = this.scenarioManager.ActiveScenario.Map.CellToQuadSize(objectType.Area.Read().Size); RCIntVector topLeftQuadCoords = quadTileAtPos.MapCoords - objQuadSize / 2; if (objectType.CheckPlacementConstraints(this.scenarioManager.ActiveScenario, topLeftQuadCoords, new RCSet <Entity>()).Count != 0) { return(false); } MineralField placedMineralField = new MineralField(); this.scenarioManager.ActiveScenario.AddElementToScenario(placedMineralField); placedMineralField.AttachToMap(this.scenarioManager.ActiveScenario.Map.GetQuadTile(topLeftQuadCoords)); return(true); }
public void ExecuteGatherDefenders(Tyr tyr) { if (mineral == null && tyr.BaseManager.Main.BaseLocation.MineralFields.Count > 0) { mineral = tyr.BaseManager.Main.BaseLocation.MineralFields[0]; } foreach (Agent agent in Units) { agent.Order(Abilities.MOVE, mineral.Tag); } if (tyr.Frame >= GatherDefendersStartFrame + 112) { State = Defend; } }
public override void OnFrame(Tyr tyr) { if (mineral == null && tyr.BaseManager.Main.BaseLocation.MineralFields.Count > 0) { mineral = tyr.BaseManager.Main.BaseLocation.MineralFields[0]; } Unit closestEnemy = null; float distance = 10 * 10; float hp = 1000; foreach (Unit enemy in tyr.Enemies()) { float newDist = SC2Util.DistanceSq(mineral.Pos, enemy.Pos); if (newDist < 2 * 2) { if (enemy.Health < hp) { closestEnemy = enemy; distance = newDist; hp = enemy.Health; } } else if (newDist < distance) { closestEnemy = enemy; distance = newDist; } } foreach (Agent agent in Units) { if (closestEnemy != null && (agent.DistanceSq(closestEnemy) > 2 * 2 || agent.DistanceSq(mineral.Pos) <= 2 * 2)) { agent.Order(Abilities.ATTACK, closestEnemy.Tag); tyr.DrawLine(agent, closestEnemy.Pos); } else { agent.Order(Abilities.MOVE, mineral.Tag); } } }