/// <summary>
 /// Allow the specified district or park to be serviced by the specified building
 /// </summary>
 /// <param name="buildingId"></param>
 /// <param name="districtPark"></param>
 public static void AddOutputDistrictParkServiced(int buildingId, DistrictPark districtPark)
 {
     if (AddDistrictParkServiced(m_outputBuildingToDistrictParkServiced, buildingId, districtPark))
     {
         var buildingName = TransferManagerInfo.GetBuildingName(buildingId);
         Logger.Log($"Constraints::AddOutputDistrictParkServiced: {buildingName} ({buildingId}) => {districtPark.Name} ...");
     }
 }
        /// <summary>
        /// Called when a district or park is removed.
        /// </summary>
        /// <param name="districtPark"></param>
        public static void ReleaseDistrictPark(DistrictPark districtPark)
        {
            Logger.Log($"Constraints::ReleaseDistrictPark: {districtPark.Name}");

            for (int buildingId = 0; buildingId < BuildingManager.MAX_BUILDING_COUNT; buildingId++)
            {
                RemoveInputDistrictParkServiced(buildingId, districtPark);
                RemoveOutputDistrictParkServiced(buildingId, districtPark);
            }
        }
Beispiel #3
0
        public static bool Prefix(byte park, ref DistrictPark data)
        {
            var districtPark = DistrictPark.FromPark(park);

            if (districtPark.Name != string.Empty)
            {
                Constraints.ReleaseDistrictPark(districtPark);
            }

            return(true);
        }
Beispiel #4
0
 /// <summary>
 /// Returns the district and/or park of the building.
 /// Should return 0 if the building is not in a district and/or park.
 /// </summary>
 /// <returns></returns>
 public static DistrictPark GetDistrictPark(int building)
 {
     if (building != 0)
     {
         var position = BuildingManager.instance.m_buildings.m_buffer[building].m_position;
         return(DistrictPark.FromPosition(position));
     }
     else
     {
         return(new DistrictPark());
     }
 }
Beispiel #5
0
 /// <summary>
 /// Returns the district of the offer's home building or segment.
 /// Should return 0 if the offer does not originate from a district.
 /// </summary>
 /// <returns></returns>
 public static DistrictPark GetDistrictPark(TransferManager.TransferReason material, ref TransferManager.TransferOffer offer)
 {
     if (offer.NetSegment != 0)
     {
         var position = NetManager.instance.m_segments.m_buffer[offer.NetSegment].m_middlePosition;
         return(DistrictPark.FromPosition(position));
     }
     else if ((material == TransferManager.TransferReason.Sick || material == TransferManager.TransferReason.Taxi) && offer.Citizen != 0)
     {
         return(DistrictPark.FromPosition(offer.Position));
     }
     else
     {
         return(GetDistrictPark(GetHomeBuilding(ref offer)));
     }
 }
        /// <summary>
        /// Called when a building is first created.  If situated in a district or park, then automatically restricts that
        /// building to serve its home district only.
        /// </summary>
        /// <param name="buildingId"></param>
        public static void CreateBuilding(ushort buildingId)
        {
            if (!TransferManagerInfo.IsDistrictServicesBuilding(buildingId))
            {
                return;
            }

            var buildingInfo = BuildingManager.instance.m_buildings.m_buffer[buildingId].Info;
            var service      = buildingInfo.GetService();
            var subService   = buildingInfo.GetSubService();
            var ai           = buildingInfo.GetAI();

            // Do not pack the homeDistrict and homePark into a single DistrictPark struct.  Otherwise, it will make
            // removing districts/parks a lot harder!!
            var position     = BuildingManager.instance.m_buildings.m_buffer[buildingId].m_position;
            var homeDistrict = DistrictManager.instance.GetDistrict(position);
            var homePark     = DistrictManager.instance.GetPark(position);

            Logger.Log($"Constraints::CreateBuilding: buildingId={buildingId}, homeDistrict={homeDistrict}, homePark={homePark}, service={service}, subService={subService}, ai={ai}");

            // Set default input settings.
            SetAllInputLocalAreas(buildingId, true);
            SetAllInputOutsideConnections(buildingId, true);
            m_inputBuildingToDistrictParkServiced[buildingId] = null;

            // Do not set the home district for these types of buildings.
            if (ai is ChildcareAI || ai is EldercareAI)
            {
                homeDistrict = 0;
                homePark     = 0;
            }

            // Serve all areas if the building doesn't belong to any district or park.
            SetAllOutputLocalAreas(buildingId, homeDistrict == 0 && homePark == 0);
            SetAllOutputOutsideConnections(buildingId, homeDistrict == 0 && homePark == 0);
            m_outputBuildingToDistrictParkServiced[buildingId] = null;

            if (homeDistrict != 0)
            {
                AddOutputDistrictParkServiced(buildingId, DistrictPark.FromDistrict(homeDistrict));
            }

            if (homePark != 0)
            {
                AddOutputDistrictParkServiced(buildingId, DistrictPark.FromPark(homePark));
            }
        }
Beispiel #7
0
        public static bool CanUseTaxis(Vector3 startPosition, Vector3 endPosition)
        {
            var startDistrictPark = DistrictPark.FromPosition(startPosition);
            var endDistrictPark   = DistrictPark.FromPosition(endPosition);

            // Now see whether any taxi buildings serve this position.
            for (int i = 0; i < m_taxiBuildings.Count; i++)
            {
                var buildingId = m_taxiBuildings[i];
                if (BuildingManager.instance.m_buildings.m_buffer[buildingId].Info?.GetSubService() == ItemClass.SubService.PublicTransportTaxi)
                {
                    var districtParkServed = Constraints.OutputDistrictParkServiced((ushort)buildingId);
                    if (startDistrictPark.IsServedBy(districtParkServed) && endDistrictPark.IsServedBy(districtParkServed))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// Load data from given object.
        /// </summary>
        /// <param name="data"></param>
        public static void LoadData(Serialization.Datav4 data)
        {
            Logger.Log($"Constraints::LoadData: version {data.Id}");
            Clear();

            var buildings = Utils.GetSupportedServiceBuildings();

            foreach (var building in buildings)
            {
                var name         = TransferManagerInfo.GetBuildingName(building);
                var buildingInfo = BuildingManager.instance.m_buildings.m_buffer[building].Info;
                var service      = buildingInfo.GetService();
                var subService   = buildingInfo.GetSubService();
                var ai           = buildingInfo.GetAI();

                Logger.Log($"Constraints::LoadData: buildingName={name}, buildingId={building}, service={service}, subService={subService}, ai={ai}");

                var restrictions1 = data.InputBuildingToAllLocalAreas[building];
                SetAllInputLocalAreas(building, restrictions1);

                var restrictions2 = data.InputBuildingToOutsideConnections[building];
                SetAllInputOutsideConnections(building, restrictions2);

                var restrictions3 = data.InputBuildingToDistrictServiced[building];
                if (restrictions3 != null)
                {
                    foreach (var districtPark in restrictions3)
                    {
                        AddInputDistrictParkServiced(building, DistrictPark.FromSerializedInt(districtPark));
                    }
                }

                var restrictions4 = data.OutputBuildingToAllLocalAreas[building];
                SetAllOutputLocalAreas(building, restrictions4);

                var restrictions5 = data.OutputBuildingToOutsideConnections[building];
                SetAllOutputOutsideConnections(building, restrictions5);

                var restrictions6 = data.OutputBuildingToDistrictServiced[building];
                if (restrictions6 != null)
                {
                    foreach (var districtPark in restrictions6)
                    {
                        AddOutputDistrictParkServiced(building, DistrictPark.FromSerializedInt(districtPark));
                    }
                }

                if (data.BuildingToInternalSupplyBuffer != null)
                {
                    var restrictions7 = data.BuildingToInternalSupplyBuffer[building];
                    SetInternalSupplyReserve(building, restrictions7);
                }

                if (data.BuildingToBuildingServiced != null)
                {
                    var restrictions8 = data.BuildingToBuildingServiced[building];
                    if (restrictions8 != null)
                    {
                        foreach (var destination in restrictions8)
                        {
                            AddSupplyChainConnection(building, (ushort)destination);
                        }
                    }
                }

                m_globalOutsideConnectionIntensity = data.GlobalOutsideConnectionIntensity;
                m_globalOutsideToOutsideMaxPerc    = data.GlobalOutsideToOutsideMaxPerc;

                Logger.Log("");
            }
        }
        private static void RemoveDistrictParkServiced(List <DistrictPark>[] array, int buildingId, DistrictPark districtPark)
        {
            if (array[buildingId] == null)
            {
                return;
            }

            for (int i = 0; i < array[buildingId].Count;)
            {
                if (array[buildingId][i].IsServedBy(districtPark))
                {
                    array[buildingId].RemoveAt(i);
                }
                else
                {
                    i++;
                }
            }

            if (array[buildingId].Count == 0)
            {
                array[buildingId] = null;
            }
        }
 /// <summary>
 /// Disallow the specified district or park from being serviced by the specified building
 /// </summary>
 /// <param name="buildingId"></param>
 /// <param name="districtPark"></param>
 public static void RemoveOutputDistrictParkServiced(int buildingId, DistrictPark districtPark)
 {
     RemoveDistrictParkServiced(m_outputBuildingToDistrictParkServiced, buildingId, districtPark);
 }
        private static bool AddDistrictParkServiced(List <DistrictPark>[] array, int buildingId, DistrictPark districtPark)
        {
            if (!TransferManagerInfo.IsDistrictServicesBuilding(buildingId))
            {
                var buildingName = TransferManagerInfo.GetBuildingName(buildingId);
                Logger.LogWarning($"Constraints::AddDistrictParkServiced: Ignoring {districtPark.Name} restriction because {buildingName} ({buildingId}) is not a district services building.");
                return(false);
            }

            if (!districtPark.Exists)
            {
                Logger.LogWarning($"Constraints::AddDistrictParkServiced: Ignoring {districtPark.Name} restriction because this district/park does not exist.");
                return(false);
            }

            if (array[buildingId] == null)
            {
                array[buildingId] = new List <DistrictPark>();
            }

            if (!array[buildingId].Contains(districtPark))
            {
                array[buildingId].Add(districtPark);
            }

            return(true);
        }