From 76a05f21d4966249b4b0b1d6315721b7a11022c8 Mon Sep 17 00:00:00 2001 From: nktae Date: Sat, 24 Sep 2022 23:23:07 +0300 Subject: [PATCH 1/2] Update to 1.20.5 --- src/RealTime/CustomAI/RealTimeBuildingAI.cs | 5 +++ .../BuildingManagerConnection.cs | 33 +++++++++++++++++-- .../IBuildingManagerConnection.cs | 10 ++++++ src/RealTime/RealTime.csproj | 10 +++--- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/RealTime/CustomAI/RealTimeBuildingAI.cs b/src/RealTime/CustomAI/RealTimeBuildingAI.cs index aea16975..335c3eab 100644 --- a/src/RealTime/CustomAI/RealTimeBuildingAI.cs +++ b/src/RealTime/CustomAI/RealTimeBuildingAI.cs @@ -552,6 +552,7 @@ private bool ShouldSwitchBuildingLightsOff(ushort buildingId, ItemClass.Service case ItemClass.Service.Monument: case ItemClass.Service.VarsitySports: case ItemClass.Service.Museums: + case ItemClass.Service.ServicePoint: return false; case ItemClass.Service.PlayerEducation: @@ -560,6 +561,10 @@ private bool ShouldSwitchBuildingLightsOff(ushort buildingId, ItemClass.Service { return false; } + else if (buildingManager.IsAreaResidentalBuilding(buildingId)) + { + return false; + } else { goto default; diff --git a/src/RealTime/GameConnection/BuildingManagerConnection.cs b/src/RealTime/GameConnection/BuildingManagerConnection.cs index 02c76fc2..17f35c28 100644 --- a/src/RealTime/GameConnection/BuildingManagerConnection.cs +++ b/src/RealTime/GameConnection/BuildingManagerConnection.cs @@ -6,6 +6,7 @@ namespace RealTime.GameConnection { using System.Collections.Generic; using System.Linq; + using ColossalFramework; using UnityEngine; /// @@ -452,6 +453,32 @@ public bool IsAreaMainBuilding(ushort buildingId) return buildinAI is MainCampusBuildingAI || buildinAI is MainIndustryBuildingAI; } + /// + /// Determines whether the building with specified ID is a residental building of an Industrial or a Campus area. + /// + /// The building ID to check. + /// + /// true if the building with the specified ID is a residental building of an Industrial or a Campus area; + /// otherwise, false. + /// + public bool IsAreaResidentalBuilding(ushort buildingId) + { + if (buildingId == 0) + { + return false; + } + + // Here we need to check if the mod is active + var buildingInfo = BuildingManager.instance.m_buildings.m_buffer[buildingId].Info; + var buildinAI = buildingInfo?.m_buildingAI; + if (buildinAI is AuxiliaryBuildingAI && buildinAI.GetType().Name.Equals("BarracksAI") || buildinAI is CampusBuildingAI && buildinAI.GetType().Name.Equals("DormsAI")) + { + return true; + } + + return false; + } + /// /// Determines whether the AI class of the building with specified ID is of the specified type . /// @@ -501,12 +528,14 @@ public bool IsBuildingServiceLevel(ushort buildingId, ItemClass.Service building private static bool BuildingCanBeVisited(ushort buildingId) { + var citizenUnitBuffer = Singleton.instance.m_units.m_buffer; uint currentUnitId = BuildingManager.instance.m_buildings.m_buffer[buildingId].m_citizenUnits; + int unitBufferSize = citizenUnitBuffer.Length; uint counter = 0; while (currentUnitId != 0) { - ref CitizenUnit currentUnit = ref CitizenManager.instance.m_units.m_buffer[currentUnitId]; + ref CitizenUnit currentUnit = ref citizenUnitBuffer[currentUnitId]; if ((currentUnit.m_flags & CitizenUnit.Flags.Visit) != 0 && (currentUnit.m_citizen0 == 0 || currentUnit.m_citizen1 == 0 @@ -518,7 +547,7 @@ private static bool BuildingCanBeVisited(ushort buildingId) } currentUnitId = currentUnit.m_nextUnit; - if (++counter >= CitizenManager.MAX_UNIT_COUNT) + if (++counter >= unitBufferSize) { break; } diff --git a/src/RealTime/GameConnection/IBuildingManagerConnection.cs b/src/RealTime/GameConnection/IBuildingManagerConnection.cs index b03ba8d6..5f94c3e4 100644 --- a/src/RealTime/GameConnection/IBuildingManagerConnection.cs +++ b/src/RealTime/GameConnection/IBuildingManagerConnection.cs @@ -207,6 +207,16 @@ ushort FindActiveBuilding( /// bool IsAreaMainBuilding(ushort buildingId); + /// + /// Determines whether the building with specified ID is a residental building of an Industrial or a Campus area. + /// + /// The building ID to check. + /// + /// true if the building with the specified ID is a residental building of an Industrial or a Campus area; + /// otherwise, false. + /// + bool IsAreaResidentalBuilding(ushort buildingId); + /// /// Determines whether the AI class of the building with specified ID is of the specified type . /// diff --git a/src/RealTime/RealTime.csproj b/src/RealTime/RealTime.csproj index 4975cd37..cc7667f6 100644 --- a/src/RealTime/RealTime.csproj +++ b/src/RealTime/RealTime.csproj @@ -29,20 +29,20 @@ - Assembly-CSharp.dll + C:\CitiesSkylines\Cities_Data\Managed\Assembly-CSharp.dll - $(CitiesSkylinesBinaries)ColossalManaged.dll + C:\CitiesSkylines\Cities_Data\Managed\ColossalManaged.dll - $(CitiesSkylinesBinaries)ICities.dll + C:\CitiesSkylines\Cities_Data\Managed\ICities.dll - $(CitiesSkylinesBinaries)UnityEngine.dll + C:\CitiesSkylines\Cities_Data\Managed\UnityEngine.dll - e:\Documents\Coding\C#\RealTimeOffline\ + D:\RealTimeOffline-m\ $(SolutionDirectory)Mod Release\ $(SolutionDirectory)Mod Release.zip From cf61d6c06762a85f5a0c3e292e3cb85433aadaa2 Mon Sep 17 00:00:00 2001 From: nktae Date: Sat, 1 Jul 2023 16:19:27 +0300 Subject: [PATCH 2/2] Update to 1.20.7 --- src/RealTime/CustomAI/RealTimeTouristAI.cs | 5 +- .../GameConnection/TouristAIConnection.cs | 7 +- src/RealTime/Localization/Translations/bg.xml | 242 ++++++++++++++++++ src/RealTime/RealTime.csproj | 26 +- 4 files changed, 265 insertions(+), 15 deletions(-) create mode 100644 src/RealTime/Localization/Translations/bg.xml diff --git a/src/RealTime/CustomAI/RealTimeTouristAI.cs b/src/RealTime/CustomAI/RealTimeTouristAI.cs index d527245f..5a9f59bb 100644 --- a/src/RealTime/CustomAI/RealTimeTouristAI.cs +++ b/src/RealTime/CustomAI/RealTimeTouristAI.cs @@ -1,10 +1,11 @@ -// +// // Copyright (c) dymanoid. All rights reserved. // namespace RealTime.CustomAI { using System; + using ColossalFramework; using RealTime.Config; using RealTime.Events; using RealTime.GameConnection; @@ -254,7 +255,7 @@ when BuildingMgr.GetBuildingSubService(visitBuilding) == ItemClass.SubService.Co private void FindRandomVisitPlace(TAI instance, uint citizenId, ref TCitizen citizen, int doNothingProbability, ushort currentBuilding) { - var target = (TouristTarget)touristAI.GetRandomTargetType(instance, doNothingProbability); + var target = (TouristTarget)touristAI.GetRandomTargetType(instance, doNothingProbability, ref citizen); target = AdjustTargetToTimeAndWeather(ref citizen, target); switch (target) diff --git a/src/RealTime/GameConnection/TouristAIConnection.cs b/src/RealTime/GameConnection/TouristAIConnection.cs index cc2c1025..70ee6218 100644 --- a/src/RealTime/GameConnection/TouristAIConnection.cs +++ b/src/RealTime/GameConnection/TouristAIConnection.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) dymanoid. All rights reserved. // @@ -52,7 +52,8 @@ public TouristAIConnection( /// The AI instance the method is called on. /// A value that specified a probability that the citizen will do nothing. /// A value specifying the citizen's next action: 0 for idle, 1 for leaving the city, 2 for shopping, 3 for entertainment. - public delegate int GetRandomTargetTypeDelegate(TAI instance, int doNothingProbability); + /// The refernece to the citizen struct for this instance. + public delegate TouristAI.Target GetRandomTargetTypeDelegate(TAI instance, int doNothingProbability, ref TCitizen data); /// /// Represents the method that corresponds to the AI's original GetLeavingReason method. @@ -82,4 +83,4 @@ public TouristAIConnection( /// Gets a method that calls a . public AddTouristVisitDelegate AddTouristVisit { get; } } -} \ No newline at end of file +} diff --git a/src/RealTime/Localization/Translations/bg.xml b/src/RealTime/Localization/Translations/bg.xml new file mode 100644 index 00000000..6f081b25 --- /dev/null +++ b/src/RealTime/Localization/Translations/bg.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/RealTime/RealTime.csproj b/src/RealTime/RealTime.csproj index cc7667f6..c962b7eb 100644 --- a/src/RealTime/RealTime.csproj +++ b/src/RealTime/RealTime.csproj @@ -20,29 +20,35 @@ BENCHMARK + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - - - - - + + + - C:\CitiesSkylines\Cities_Data\Managed\Assembly-CSharp.dll + C:\Games\CitiesSkylines\Cities_Data\Managed\Assembly-CSharp.dll - C:\CitiesSkylines\Cities_Data\Managed\ColossalManaged.dll + C:\Games\CitiesSkylines\Cities_Data\Managed\ColossalManaged.dll - C:\CitiesSkylines\Cities_Data\Managed\ICities.dll + C:\Games\CitiesSkylines\Cities_Data\Managed\ICities.dll - C:\CitiesSkylines\Cities_Data\Managed\UnityEngine.dll + C:\Games\CitiesSkylines\Cities_Data\Managed\UnityEngine.dll - D:\RealTimeOffline-m\ + D:\Realtime2\ $(SolutionDirectory)Mod Release\ $(SolutionDirectory)Mod Release.zip