public void AddConstructJob(ConstructMode mode, IntGrid2Z area, IItemFilter userItemFilter)
        {
            var locations = area.Range().Where(p => m_environment.Contains(p));

            ITerrainFilter filter;
            IItemFilter    coreItemFilter;

            switch (mode)
            {
            case ConstructMode.Floor:
                filter         = WorkHelpers.ConstructFloorTerrainFilter;
                coreItemFilter = WorkHelpers.ConstructFloorItemFilter;
                break;

            case ConstructMode.Pavement:
                filter         = WorkHelpers.ConstructPavementTerrainFilter;
                coreItemFilter = WorkHelpers.ConstructPavementItemFilter;
                break;

            case ConstructMode.Wall:
                filter         = WorkHelpers.ConstructWallTerrainFilter;
                coreItemFilter = WorkHelpers.ConstructWallItemFilter;
                break;

            default:
                throw new Exception();
            }

            IItemFilter itemFilter;

            if (userItemFilter != null)
            {
                itemFilter = new AndItemFilter(coreItemFilter, userItemFilter);
            }
            else
            {
                itemFilter = coreItemFilter;
            }

            locations = locations.Where(p => filter.Match(m_environment.GetTileData(p)));

            foreach (var l in locations)
            {
                var data = new ConstructJobData()
                {
                    Mode       = mode,
                    Location   = l,
                    ItemFilter = itemFilter,
                };

                m_jobDataList.Add(data);
            }
        }
示例#2
0
        public void AddConstructJob(ConstructMode mode, IntGrid2Z area, IItemFilter userItemFilter)
        {
            var locations = area.Range().Where(p => m_environment.Contains(p));

            ITerrainFilter filter;
            IItemFilter coreItemFilter;

            switch (mode)
            {
                case ConstructMode.Floor:
                    filter = WorkHelpers.ConstructFloorTerrainFilter;
                    coreItemFilter = WorkHelpers.ConstructFloorItemFilter;
                    break;

                case ConstructMode.Pavement:
                    filter = WorkHelpers.ConstructPavementTerrainFilter;
                    coreItemFilter = WorkHelpers.ConstructPavementItemFilter;
                    break;

                case ConstructMode.Wall:
                    filter = WorkHelpers.ConstructWallTerrainFilter;
                    coreItemFilter = WorkHelpers.ConstructWallItemFilter;
                    break;

                default:
                    throw new Exception();
            }

            IItemFilter itemFilter;

            if (userItemFilter != null)
                itemFilter = new AndItemFilter(coreItemFilter, userItemFilter);
            else
                itemFilter = coreItemFilter;

            locations = locations.Where(p => filter.Match(m_environment.GetTileData(p)));

            foreach (var l in locations)
            {
                var data = new ConstructJobData()
                {
                    Mode = mode,
                    Location = l,
                    ItemFilter = itemFilter,
                };

                m_jobDataList.Add(data);
            }
        }
示例#3
0
		bool FindMaterials(BuildOrder order)
		{
			var buildableItem = order.BuildableItem;

			var numItems = buildableItem.FixedBuildMaterials.Count;

			int numFound = 0;

			for (int i = 0; i < buildableItem.FixedBuildMaterials.Count; ++i)
			{
				var bimi = buildableItem.FixedBuildMaterials[i];
				var biis = order.UserItemFilters[i];

				var filter = new AndItemFilter(bimi, biis);

				var ob = this.Environment.ItemTracker.GetReachableItemByDistance(this.Workbench.Location, filter, m_unreachables);

				if (ob == null)
					break;

				ob.ReservedBy = this;

				order.SourceItems[i] = ob;
				numFound++;
			}

			if (numFound < numItems)
			{
				trace.TraceInformation("Failed to find materials");
				for (int i = 0; i < numFound; ++i)
				{
					order.SourceItems[i].ReservedBy = null;
					order.SourceItems[i] = null;
				}
				return false;
			}
			else
			{
				return true;
			}
		}
示例#4
0
        bool FindMaterials(BuildOrder order)
        {
            var buildableItem = order.BuildableItem;

            var numItems = buildableItem.FixedBuildMaterials.Count;

            int numFound = 0;

            for (int i = 0; i < buildableItem.FixedBuildMaterials.Count; ++i)
            {
                var bimi = buildableItem.FixedBuildMaterials[i];
                var biis = order.UserItemFilters[i];

                var filter = new AndItemFilter(bimi, biis);

                var ob = this.Environment.ItemTracker.GetReachableItemByDistance(this.Workbench.Location, filter, m_unreachables);

                if (ob == null)
                    break;

                ob.ReservedBy = this;

                order.SourceItems[i] = ob;
                numFound++;
            }

            if (numFound < numItems)
            {
                trace.TraceInformation("Failed to find materials");
                for (int i = 0; i < numFound; ++i)
                {
                    order.SourceItems[i].ReservedBy = null;
                    order.SourceItems[i] = null;
                }
                return false;
            }
            else
            {
                return true;
            }
        }