Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/RealTime/CustomAI/RealTimeBuildingAI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -560,6 +561,10 @@ private bool ShouldSwitchBuildingLightsOff(ushort buildingId, ItemClass.Service
{
return false;
}
else if (buildingManager.IsAreaResidentalBuilding(buildingId))
{
return false;
}
else
{
goto default;
Expand Down
5 changes: 3 additions & 2 deletions src/RealTime/CustomAI/RealTimeTouristAI.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
// <copyright file="RealTimeTouristAI.cs" company="dymanoid">
// <copyright file="RealTimeTouristAI.cs" company="dymanoid">
// Copyright (c) dymanoid. All rights reserved.
// </copyright>

namespace RealTime.CustomAI
{
using System;
using ColossalFramework;
using RealTime.Config;
using RealTime.Events;
using RealTime.GameConnection;
Expand Down Expand Up @@ -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)
Expand Down
33 changes: 31 additions & 2 deletions src/RealTime/GameConnection/BuildingManagerConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace RealTime.GameConnection
{
using System.Collections.Generic;
using System.Linq;
using ColossalFramework;
using UnityEngine;

/// <summary>
Expand Down Expand Up @@ -452,6 +453,32 @@ public bool IsAreaMainBuilding(ushort buildingId)
return buildinAI is MainCampusBuildingAI || buildinAI is MainIndustryBuildingAI;
}

/// <summary>
/// Determines whether the building with specified ID is a residental building of an Industrial or a Campus area.
/// </summary>
/// <param name="buildingId">The building ID to check.</param>
/// <returns>
/// <c>true</c> if the building with the specified ID is a residental building of an Industrial or a Campus area;
/// otherwise, <c>false</c>.
/// </returns>
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;
}

/// <summary>
/// Determines whether the AI class of the building with specified ID is of the specified type <typeparamref name="T"/>.
/// </summary>
Expand Down Expand Up @@ -501,12 +528,14 @@ public bool IsBuildingServiceLevel(ushort buildingId, ItemClass.Service building

private static bool BuildingCanBeVisited(ushort buildingId)
{
var citizenUnitBuffer = Singleton<CitizenManager>.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
Expand All @@ -518,7 +547,7 @@ private static bool BuildingCanBeVisited(ushort buildingId)
}

currentUnitId = currentUnit.m_nextUnit;
if (++counter >= CitizenManager.MAX_UNIT_COUNT)
if (++counter >= unitBufferSize)
{
break;
}
Expand Down
10 changes: 10 additions & 0 deletions src/RealTime/GameConnection/IBuildingManagerConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,16 @@ ushort FindActiveBuilding(
/// </returns>
bool IsAreaMainBuilding(ushort buildingId);

/// <summary>
/// Determines whether the building with specified ID is a residental building of an Industrial or a Campus area.
/// </summary>
/// <param name="buildingId">The building ID to check.</param>
/// <returns>
/// <c>true</c> if the building with the specified ID is a residental building of an Industrial or a Campus area;
/// otherwise, <c>false</c>.
/// </returns>
bool IsAreaResidentalBuilding(ushort buildingId);

/// <summary>
/// Determines whether the AI class of the building with specified ID is of the specified type <typeparamref name="T"/>.
/// </summary>
Expand Down
7 changes: 4 additions & 3 deletions src/RealTime/GameConnection/TouristAIConnection.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// <copyright file="TouristAIConnection.cs" company="dymanoid">
// <copyright file="TouristAIConnection.cs" company="dymanoid">
// Copyright (c) dymanoid. All rights reserved.
// </copyright>

Expand Down Expand Up @@ -52,7 +52,8 @@ public TouristAIConnection(
/// <param name="instance">The AI instance the method is called on.</param>
/// <param name="doNothingProbability">A value that specified a probability that the citizen will do nothing.</param>
/// <returns>A value specifying the citizen's next action: 0 for idle, 1 for leaving the city, 2 for shopping, 3 for entertainment.</returns>
public delegate int GetRandomTargetTypeDelegate(TAI instance, int doNothingProbability);
/// <param name="data">The refernece to the citizen struct for this instance.</param>
public delegate TouristAI.Target GetRandomTargetTypeDelegate(TAI instance, int doNothingProbability, ref TCitizen data);

/// <summary>
/// Represents the method that corresponds to the AI's original <c>GetLeavingReason</c> method.
Expand Down Expand Up @@ -82,4 +83,4 @@ public TouristAIConnection(
/// <summary>Gets a method that calls a <see cref="AddTouristVisitDelegate"/>.</summary>
public AddTouristVisitDelegate AddTouristVisit { get; }
}
}
}
Loading