Beispiel #1
0
        /// <summary>
        /// Gets a new unit from the save game unit xml node.
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="isAIUnit"></param>
        /// <returns></returns>
        internal static Unit FromSaveGameUnitNode(XmlReader reader, bool isAIUnit)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            UnitBase clone      = null;
            Unit     reHydrated = null;

            string unitName = reader.ReadElementString("Name");

            GameRoot root = GameRoot.Instance;

            clone = root.Ruleset.Units[unitName];

            if (clone == null)
            {
                return(null);
            }

            if (isAIUnit && clone.CanSettle)
            {
                //ai settler
                reHydrated = new AISettler();
            }
            else if (isAIUnit && clone.CanWork)
            {
                //ai worker
                reHydrated = new AIWorker();
            }
            else if (clone.CanSettle)
            {
                //settler
                reHydrated = new Settler();
            }
            else if (clone.CanWork)
            {
                //worker
                reHydrated = new Worker();
            }
            else
            {
                //moveable unit
                reHydrated = new Unit();
            }

            reHydrated.Load(reader);
            return(reHydrated);
        }
Beispiel #2
0
        /// <summary>
        /// Creates and returns units from cities and base units.
        /// </summary>
        /// <param name="city"></param>
        /// <param name="baseUnit"></param>
        /// <returns></returns>
        internal static Unit CreateUnit(City city, Unit baseUnit)
        {
            if (city == null)
            {
                throw new ArgumentNullException("city");
            }
            if (baseUnit == null)
            {
                throw new ArgumentNullException("baseUnit");
            }

            Unit newUnit = null;

            if (city.ParentCountry.GetType() == typeof(AICountry))
            {
                if (baseUnit.CanSettle)
                {
                    newUnit = new AISettler(city.Coordinates, baseUnit);
                }
                else if (baseUnit.CanWork)
                {
                    newUnit = new AIWorker(city.Coordinates, baseUnit);
                }
                else
                {
                    newUnit = new AIUnit(city.Coordinates, baseUnit);
                }
            }
            else
            {
                if (baseUnit.CanSettle)
                {
                    newUnit = new Settler(city.Coordinates, baseUnit);
                }
                else if (baseUnit.CanWork)
                {
                    newUnit = new Worker(city.Coordinates, baseUnit);
                }
                else
                {
                    newUnit = new Unit(city.Coordinates, baseUnit);
                }
            }

            return(newUnit);
        }
Beispiel #3
0
        /// <summary>
        /// Creates a new <see cref="Worker"/> object.
        /// </summary>
        /// <param name="parentCity">The <see cref="City"/> creating the <see cref="Worker"/>.</param>
        /// <returns></returns>
        public static Worker CreateWorker(City parentCity)
        {
            Worker   worker = null;
            GameRoot root   = GameRoot.Instance;

            foreach (Unit unit in root.Ruleset.Units)
            {
                if (unit.CanWork)
                {
                    if (parentCity is AICity)
                    {
                        worker = new AIWorker(unit);
                    }
                    else
                    {
                        worker = new Worker(unit);
                    }
                    break;
                }
            }
            return(worker);
        }
Beispiel #4
0
        /// <summary>
        /// Event handler for the <i>ImprovementBuilt</i> event of a city using this strategy.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected override void OnImprovementBuilt(object sender, ImprovementBuiltEventArgs e)
        {
            AICity city = e.City as AICity;

            BuildableItem nextImprovement = null;
            GameRoot      root            = GameRoot.Instance;

            //what to do with what we just built?
            if (e.Improvement.GetType() == typeof(AIUnit))
            {
                AIUnit unit = e.Improvement as AIUnit;

                switch (city.PrimaryNeed)
                {
                case AICityNeed.Commerce:

                    break;

                case AICityNeed.Culture:

                    break;

                case AICityNeed.Food:

                    break;

                case AICityNeed.UnitDefense:
                    unit.Fortified = true;
                    break;
                }
            }
            else if (e.Improvement.GetType() == typeof(AISettler))
            {
            }
            else if (e.Improvement.GetType() == typeof(AIWorker))
            {
                AIWorker worker = e.Improvement as AIWorker;
                worker.ParentCity = e.City;
                worker.Automated  = true;
            }


            //next item to build
            switch (city.PrimaryNeed)
            {
            case AICityNeed.Commerce:
                if (!city.HasWorkerInFields())
                {
                    nextImprovement = UnitFactory.CreateWorker(city);
                }
                else
                {
                    nextImprovement =
                        city.GetBuildableItemForNeed(city.PrimaryNeed,
                                                     typeof(Improvement));
                }
                break;

            case AICityNeed.Culture:
                nextImprovement =
                    city.GetBuildableItemForNeed(city.PrimaryNeed, typeof(Improvement));
                break;

            case AICityNeed.Food:
                if (!city.HasWorkerInFields())
                {
                    nextImprovement = UnitFactory.CreateWorker(city);
                }
                else
                {
                    nextImprovement =
                        city.GetBuildableItemForNeed(city.PrimaryNeed,
                                                     typeof(Improvement));
                }
                break;

            case AICityNeed.UnitDefense:
                nextImprovement =
                    city.GetBuildableItemForNeed(city.PrimaryNeed,
                                                 typeof(Unit));
                break;
            }

            city.NextImprovement = nextImprovement;
        }