public void init()
 {
     t1 = new Tile(0,0);
     t2 = new Tile(1, 1, Globals.TerrainTypes.Slow);
     p = new Player();
     u1 = new Unit(p, Vector2.Zero);
     u2 = new Unit(p, Vector2.Zero);
     u3 = new Unit(p, Vector2.Zero);
     b1 = new BaseBuilding("test", 0, 0, new Player(), new LinkedList<Tile>());
     b2 = new BarrierBuilding("TestBuilding1", 1, 1, p, b1, new LinkedList<Tile>());
 }
 public void RemoveUnit(Unit u)
 {
     lock (units)
     {
         this.units.Remove(u);
     }
 }
 public void AddUnit(Unit u)
 {
     lock (units)
     {
         units.Add(u);
     }
 }
        /// <summary>
        /// Quite possibly a horribly slow way of adding units.
        /// </summary>
        public void ProduceUnits()
        {
            Random randomer = new Random();

            uint totalUnits = owner.CountUnits();

            foreach (Graph g in owner.GetGraphs())
            {
                if (totalUnits >= POP_CAP_PER_PLAYER)
                    break;

                List<Unit> res = new List<Unit>();

                //TODO Remove when middle point position is implemented.

                BaseBuilding b = g.baseBuilding;
                if (b == null)
                {
                    continue;
                }
                int unitsToProduce = b.RateOfProduction;
                if (b.RateOfProduction + totalUnits > POP_CAP_PER_PLAYER)
                {
                    unitsToProduce = (int) (POP_CAP_PER_PLAYER - totalUnits);
                }
                logger.Debug("Producing " + unitsToProduce + " units!");
                if (unitsToProduce > 0)
                {
                    totalUnits += (uint)unitsToProduce;
                }
                for (int i = 0; i < unitsToProduce; i++)
                {
                    // Places them randomly around the fromBuilding. - John
                    // No, it does not. - Martin

                    Unit temp = new Unit(b.owner, b.position, b);

                    res.Add(temp);
                }
                b.owner.AddUnits(res);
                b.AddUnits(res);

                //This should not be needed but does not hurt i hope.
                res.Clear();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="u"></param>
        public void RemoveUnit(Unit u)
        {
            lock (units)
            {
                lock (allUnits)
                {
                    this.units[u.GetOwner()].Remove(u);
                    this.allUnits.Remove(u);

                    if (unitsChanged != null)
                    {
                        //I'm sorry for this ugly hax - John
                        List<Unit> temp = new List<Unit>();
                        temp.Add(u);
                        unitsChanged(this, new Event<IEnumerable<Unit>>(temp, EventType.REMOVE));
                    }
                }
            }
        }
        public void AddUnit(Unit u)
        {
            lock (units)
            {
                lock (allUnits)
                {
                    HashSet<Unit> nits;
                    if (!this.units.TryGetValue(u.GetOwner(), out nits))
                    {
                        nits = new HashSet<Unit>();
                    }

                    nits.Add(u);

                    this.units[u.GetOwner()] = nits;
                    this.allUnits.Add(u);

                    if (unitsChanged != null)
                    {
                        //I'm sorry for this ugly hax - John
                        List<Unit> temp = new List<Unit>();
                        temp.Add(u);
                        unitsChanged(this, new Event<IEnumerable<Unit>>(temp, EventType.ADD));
                    }
                }
            }
        }
        /// <summary>
        /// Add a unit to this Tile.
        /// </summary>
        /// <param name="units">Units to be added to this Tile.</param>
        public void AddUnit(Player p, Unit u)
        {
            lock (units)
            {
                lock (allUnits)
                {
                    if (!this.units.ContainsKey(p))
                    {
                        this.units.Add(p, new HashSet<Unit>());
                    }
                    this.units[p].Add(u);
                    this.allUnits.Add(u);

                    if (unitsChanged != null)
                    {
                        //I'm sorry for this ugly hax - John
                        List<Unit> temp = new List<Unit>();
                        temp.Add(u);
                        unitsChanged(this, new Event<IEnumerable<Unit>>(temp, EventType.ADD));
                    }
                }
            }
        }
 /// <summary>
 /// Removes one unit from the Unit list
 /// </summary>
 /// <param name="unit">The Unit to remove</param>
 public void RemoveUnit(Unit unit)
 {
     this.units.Remove(unit);
     if (unitsChanged != null)
     {
         //I'm sorry for this ugly hax - John
         List<Unit> temp = new List<Unit>();
         temp.Add(unit);
         unitsChanged(this, new BuildingEvent(this, temp,
                 EventType.REMOVE));
     }
 }
        //public abstract Texture2D GetSprite();
        /// <summary>
        /// Add one unit to the unit list if the fromBuilding is alive
        /// </summary>
        /// <param name="unit">The Unit to add to the list</param>
        /// <exception cref="ArgumentNullException">The Unit to add was null
        /// </exception>
        /// <exception cref="BuildingNotAliveException">
        /// The fromBuilding is dead</exception>
        public void AddUnit(Unit unit)
        {
            if(unit == null)
            {
                throw new ArgumentNullException("unit",
                    "The given parameter unit was null");
            }

            if (IsAlive())
            {
                units.Add(unit);
                if (unitsChanged != null)
                {
                    //I'm sorry for this ugly hax - John
                    List<Unit> temp = new List<Unit>();
                    temp.Add(unit);
                    unitsChanged(this, new BuildingEvent(this, temp,
                        EventType.ADD));
                }
            }
            else
            {
                throw new BuildingNotAliveException();
            }
        }
 public void init()
 {
     p = new Player();
     u1 = new Unit(p);
     u2 = new Unit(p);
 }
 public static void MarkUnitAsDead(Unit u)
 {
     toBeKilled.Add(u);
 }
        private static void FindEnemy(Unit u, World.Map worldMap)
        {
            if (! u.IsAggressive)
            {
                return;
            }

            Tile t = worldMap.GetTile((int)u.position.X, (int)u.position.Y);

            // Search for units
            lock (t.GetUnits())
            {
                foreach (Unit ou in t.GetUnits(u.owner.Enemy))
                {
                    // Is he dead already?
                    if (ou.isDead)
                        continue;

                    // FIGHT TO THE DEATH!
                    u.TargetEntity = ou;
                    return;
                }
            }

            // Is there a building to kill?
            if (t.GetBuilding() != null && t.GetBuilding().owner != u.owner)
            {
                u.TargetEntity = t.GetBuilding();
                return;
            }
        }