Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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);
                }
            }
        }