//Static or Override? /////////////////////////////////////////////////////////// public override void SimulationStep(ushort buildingID, ref Building buildingData, ref Building.Frame frameData) { if (Tracker.GetAccessibilityActive() && !m_logged) //Simply check to see if a log is needed, usage is activated in AI classes { TrafficLog.TryAddBuildingLog(buildingID); m_logged = true; } //base.SimulationStep(buildingID, ref buildingData, ref frameData); DistrictManager instanceG = Singleton <DistrictManager> .instance; //DistrictManagerDetour instanceG = Singleton<DistrictManagerDetour>.instance; //Create a new policy or modify an existing policy DistrictPolicies.Policies policyG = DistrictPolicies.Policies.Recycling; //tra tra = new tra(); //Tracker.Activate(); //tra.serialize(new byte[255]); if (instanceG.IsDistrictPolicySet(policyG, instanceG.GetDistrict(buildingData.m_position))) { //This functiion does implement a district effect. However, Abandonment as a resource //does not induce abandonment itself. //Singleton<ImmaterialResourceManager>.instance.AddResource(ImmaterialResourceManager.Resource.NoisePollution, 1000000, buildingData.m_position, 400); //base.EmptyBuilding(buildingID, ref buildingData); //base.ManualDeactivation(buildingID, ref buildingData); Vector3 m_vector3 = buildingData.m_position; //string m_districtname = instanceG.GetDistrictName(instanceG.GetDistrict(m_vector3), true); string m_districtname = instanceG.GetDistrictName(instanceG.GetDistrict(m_vector3)); byte m_districtbyte = instanceG.GetDistrict(m_vector3); Debug.Log("CommonBuildingAIDetour: " + m_districtname + " X: " + m_vector3.x + " Y: " + m_vector3.y + " Z: " + m_vector3.z); //This function adds gentrification by district. The concept works but //it is implemented in the wrong place and by an arbitrary cause //that requires a temporary slowdown via RNG to avoid overburdening //the chirper ChirperPanel instance. //TRANSFER LATER, GENTRIFICATION TRACKING /* * System.Random rng = new System.Random(); * int r = rng.Next(0, 10); * if (r==5) * { * Tracker.Load(m_districtbyte, 1); * //Tracker.Load(m_districtbyte, 1); * int m_gentrifiedint = Convert.ToInt32(Tracker.Get(m_districtbyte)); * string m_gentrifiedstring = Convert.ToString(m_gentrifiedint); * ChirpPanel chirper = Singleton<ChirpPanel>.instance; * if ((m_gentrifiedint % 100) == 0) * { * //chirper.AddMessage(new ChirpMessage(m_districtname + " Gentrification Status: ", m_gentrifiedstring + " households have been gentrified")); * } * //Debug.Log(m_districtname + " Gentrification Status: "+ m_gentrifiedstring + " (" + Convert.ToString(m_districtbyte) + ") " + "households have been gentrified"); * } */ } if ((buildingData.m_flags & Building.Flags.Abandoned) != Building.Flags.None) { GuideController guideController = Singleton <GuideManager> .instance.m_properties; if (guideController != null) { Singleton <BuildingManager> .instance.m_buildingAbandoned1.Activate(guideController.m_buildingAbandoned1, buildingID); Singleton <BuildingManager> .instance.m_buildingAbandoned2.Activate(guideController.m_buildingAbandoned2, buildingID); } if ((int)buildingData.m_majorProblemTimer < (int)byte.MaxValue) { ++buildingData.m_majorProblemTimer; } float radius = (float)(buildingData.Width + buildingData.Length) * 2.5f; Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.Abandonment, 10, buildingData.m_position, radius); } else if ((buildingData.m_flags & Building.Flags.BurnedDown) != Building.Flags.None) { GuideController guideController = Singleton <GuideManager> .instance.m_properties; if (guideController != null) { Singleton <BuildingManager> .instance.m_buildingBurned.Activate(guideController.m_buildingBurned, buildingID); } float radius = (float)(buildingData.Width + buildingData.Length) * 2.5f; Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.Abandonment, 10, buildingData.m_position, radius); } else if ((buildingData.m_flags & Building.Flags.Completed) == Building.Flags.None) { bool flag = (buildingData.m_flags & Building.Flags.Upgrading) != Building.Flags.None; int constructionTime = this.GetConstructionTime(); frameData.m_constructState = constructionTime != 0 ? (byte)Mathf.Min((int)byte.MaxValue, (int)frameData.m_constructState + 1088 / constructionTime) : byte.MaxValue; if ((int)frameData.m_constructState == (int)byte.MaxValue) { this.BuildingCompleted(buildingID, ref buildingData); if (Singleton <GuideManager> .instance.m_properties != null) { Singleton <BuildingManager> .instance.m_buildingLevelUp.Deactivate(buildingID, true); } } else if (flag) { GuideController guideController = Singleton <GuideManager> .instance.m_properties; if (guideController != null) { Singleton <BuildingManager> .instance.m_buildingLevelUp.Activate(guideController.m_buildingLevelUp, buildingID); } } if (!flag) { return; } this.SimulationStepActive(buildingID, ref buildingData, ref frameData); } else { this.SimulationStepActive(buildingID, ref buildingData, ref frameData); } }
private static bool CalculateLocalResources(int x, int z, ushort[] buffer, int[] global, ushort[] target, int index) { //int num10 = ((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate1, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate3, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate2, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate4, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate5, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate6, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate7, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate8, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate12, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate10, 100, 500, 100, 200) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate17, 60, 100, 0, 50) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate16, 60, 100, 0, 50) - ImmaterialResourceManager.CalculateResourceEffect(100 - resourceRate17, 60, 100, 0, 50) - ImmaterialResourceManager.CalculateResourceEffect(100 - resourceRate16, 60, 100, 0, 50) - ImmaterialResourceManager.CalculateResourceEffect(num9, 50, (int)byte.MaxValue, 50, 100) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate9, 10, 100, 0, 100) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate15, 10, 100, 0, 100) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate14, 50, 100, 10, 50) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate11, 15, 50, 100, 200) + (ImmaterialResourceManager.CalculateResourceEffect(resourceRate13, 33, 67, 300, 0) * Mathf.Max(0, 32 - num9) >> 5)) / 10 : 0; int resourceRate1 = (int)buffer[index] + global[0]; int resourceRate2 = (int)buffer[index + 1] + global[1]; int resourceRate3 = (int)buffer[index + 2] + global[2]; int resourceRate4 = (int)buffer[index + 3] + global[3]; int resourceRate5 = (int)buffer[index + 4] + global[4]; int resourceRate6 = (int)buffer[index + 5] + global[5]; int resourceRate7 = (int)buffer[index + 6] + global[6]; int resourceRate8 = (int)buffer[index + 7] + global[7]; int resourceRate9 = (int)buffer[index + 8] + global[8]; int num1 = (int)buffer[index + 9] + global[9]; int num2 = (int)buffer[index + 10] + global[10]; int num3 = (int)buffer[index + 11] + global[11]; int num4 = (int)buffer[index + 12] + global[12]; int resourceRate10 = (int)buffer[index + 13] + global[13]; int num5 = (int)buffer[index + 14] + global[14]; int num6 = (int)buffer[index + 15] + global[15]; int num7 = (int)buffer[index + 16] + global[16]; int num8 = (int)buffer[index + 17] + global[17]; int resourceRate11 = (int)buffer[index + 18] + global[18]; int resourceRate12 = (int)buffer[index + 19] + global[19]; Rect area = new Rect((float)(((double)x - 128.0 - 1.5) * 38.4000015258789), (float)(((double)z - 128.0 - 1.5) * 38.4000015258789), 153.6f, 153.6f); float groundPollution; float waterProximity; Singleton <NaturalResourceManager> .instance.AveragePollutionAndWater(area, out groundPollution, out waterProximity); int num9 = (int)((double)groundPollution * 100.0); int resourceRate13 = (int)((double)waterProximity * 100.0); if (resourceRate13 > 33 && resourceRate13 < 99) { area = new Rect((float)(((double)x - 128.0 + 0.25) * 38.4000015258789), (float)(((double)z - 128.0 + 0.25) * 38.4000015258789), 19.2f, 19.2f); Singleton <NaturalResourceManager> .instance.AveragePollutionAndWater(area, out groundPollution, out waterProximity); resourceRate13 = Mathf.Max(Mathf.Min(resourceRate13, (int)((double)waterProximity * 100.0)), 33); } int resourceRate14 = num8 * 2 / (resourceRate2 + 50); int resourceRate15; int resourceRate16; int resourceRate17; if (num4 == 0) { resourceRate15 = 0; resourceRate16 = 50; resourceRate17 = 50; } else { resourceRate15 = num1 / num4; resourceRate16 = num2 / num4; resourceRate17 = num3 / num4; num7 += Mathf.Min(num4, 10) * 10; } //Accessibility Grid Test Chamber float[,] grid3; //Now it calls every 256^2 steps //However, there are unexplained errors, and the ratings are never properly reached int num10 = 0; try { if (Tracker.CheckAccessibilityUpdate()) { grid3 = TrafficLog.CollectRatings(); } else { grid3 = TrafficLog.GetLastGrid(); } float accessValue; try { //Debug.Log("Attemping Grid Query. X: " + x + " . Z: " + z + ". + Value: " + grid3[x, z] + "."); accessValue = grid3[x, z]; } catch (IndexOutOfRangeException e) { accessValue = 0; } catch (NullReferenceException e) { accessValue = 0; } //Debug.Log("X: " + x + " Z: " + z + "AccessValue: " + accessValue); num10 = (int)accessValue; } catch (NullReferenceException e) { num10 = 0; } //num10 Notes /* * HealthCare = 0, * Yes * FireDepartment = 1, * Yes * PoliceDepartment = 2, * Yes * EducationElementary = 3, * Yes * EducationHighSchool = 4, * Yes * EducationUniversity = 5, * Yes * DeathCare = 6, * Yes * PublicTransport = 7, * Yes / Imperfect * NoisePollution = 8, * Yes * CrimeRate = 9, * Yes * Health = 10, * Yes * Wellbeing = 11, * Ambiguous * Density = 12, * Ambiguous * Entertainment = 13, * Yes * LandValue = 14, * Ambiguous * Attractiveness = 15, * Global * Coverage = 16, * Ambiguous * FireHazard = 17, * Useless * Abandonment = 18, * X * CargoTransport = 19, * Yes * * Ground Pollution * Yes * Water Proximity * Yes */ ////////////////////num10 Test Chamber/////////////// //Water Proximity - Needs scaling //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(Math.Sqrt(waterProximity))*20) : 0); //Ground Pollution - Needs scaling //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(groundPollution) * 10) : 0); //Wellbeing - Needs scaling //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(num3) * 2) : 0); //Density //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(num4) * 10) : 0); //Land Value??? //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(num5) * 1) : 0); //Attractiveness - Either broken or a totally global variable that provides city-wide bonuses? //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(buffer[index + 15]) * 1) : 0); //Coverage - Unclear but it seems to matter when building become inhabited //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(num7) * 1) : 0); //Fire Hazard - Even water towers set this off. //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(num8) * 1) : 0); //Abandonment //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (Convert.ToInt32(resourceRate11) * 1) : 0); //////////////////////////Num10///////////////////////////// //Original //int num10 = ((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate1, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate3, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate2, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate4, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate5, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate6, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate7, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate8, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate12, 100, 500, 50, 100) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate10, 100, 500, 100, 200) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate17, 60, 100, 0, 50) + ImmaterialResourceManager.CalculateResourceEffect(resourceRate16, 60, 100, 0, 50) - ImmaterialResourceManager.CalculateResourceEffect(100 - resourceRate17, 60, 100, 0, 50) - ImmaterialResourceManager.CalculateResourceEffect(100 - resourceRate16, 60, 100, 0, 50) - ImmaterialResourceManager.CalculateResourceEffect(num9, 50, (int)byte.MaxValue, 50, 100) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate9, 10, 100, 0, 100) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate15, 10, 100, 0, 100) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate14, 50, 100, 10, 50) - ImmaterialResourceManager.CalculateResourceEffect(resourceRate11, 15, 50, 100, 200) + (ImmaterialResourceManager.CalculateResourceEffect(resourceRate13, 33, 67, 300, 0) * Mathf.Max(0, 32 - num9) >> 5)) / 10 : 0; //Add arbirary value if (((x % 2 == 1) & (z % 2 == 1))) { Vector3 m_vector3 = new Vector3((Convert.ToInt32(x * 38.4000015258789)) - 4915, 0, (Convert.ToInt32(z * 38.4000015258789) - 4915)); DistrictManager DM = Singleton <DistrictManager> .instance; byte m_byte = DM.GetDistrict(m_vector3); string m_name = DM.GetDistrictName(m_byte); //Full Name //Solve Single Operator Crash if ((m_name.Length == 1) & ((m_name.EndsWith("+") | m_name.EndsWith("-")) | (m_name.EndsWith("*") | m_name.EndsWith("/")))) { Singleton <ChirpPanel> .instance.AddMessage(new ChirpMessage("System", "Invalid Syntax: Cannot Pass Single Operator Token")); DM.StartCoroutine(DM.SetDistrictName(m_byte, null)); } else { string m_lastvalidname; m_lastvalidname = m_name; string m_realname = m_name; //Real Name string m_operator = Tracker.GetOperator(m_byte); //Operator string m_deltaS = ""; //Value String double m_deltaD = 0; //Value Number string m_currentOperator = Tracker.GetOperator(m_byte); double m_CurrentValue = Convert.ToDouble(Tracker.GetLandValue(m_byte)); //Set current operator num10 = Convert.ToInt32(m_CurrentValue); if ((m_name.EndsWith("+") | m_name.EndsWith("-")) | (m_name.EndsWith("*") | m_name.EndsWith("/"))) { num10 = 0; Tracker.SetOperator(m_byte, m_name.Substring(m_name.Length - 1)); //Set new operator m_operator = Tracker.GetOperator(m_byte); // Get Operator try { m_deltaS = getSubstring(m_name.Substring(0, m_name.Length - 1)); //Get the Value } catch (ArgumentOutOfRangeException e) { m_deltaS = "0"; } try { m_deltaD = Convert.ToDouble(m_deltaS); } catch (FormatException e2) { m_deltaD = 0; } if (!((m_name.Length - (m_deltaS.Length + 1)) < 0)) { m_realname = m_name.Substring(0, (m_name.Length - (m_deltaS.Length + 1))); //Get name without value and operator } while (m_realname.EndsWith(" ")) { m_realname = m_realname.Substring(0, m_realname.Length - 1); //Remove extra spaces from end } while (m_realname.StartsWith(" ")) { m_realname = m_realname.Substring(1, m_realname.Length); //Remove extra spaces from start } while (((m_realname.EndsWith("+") | m_realname.EndsWith("-")) | (m_realname.EndsWith("*") | m_realname.EndsWith("/")))) { if (m_realname.Length > 1) { m_realname = m_realname.Substring(0, m_realname.Length - 1); //Remove extra operators } } if (!((m_realname.EndsWith("+") | m_realname.EndsWith("-")) | (m_realname.EndsWith("*") | m_realname.EndsWith("/")))) { DM.StartCoroutine(DM.SetDistrictName(m_byte, m_realname)); // Rename District } else { if (m_realname.IsNullOrWhiteSpace()) { DM.StartCoroutine(DM.SetDistrictName(m_byte, m_lastvalidname)); } else //Not null but ends in an operator { DM.StartCoroutine(DM.SetDistrictName(m_byte, m_lastvalidname)); } } Tracker.SetLandValue(m_byte, m_deltaS); //Assign number to Array } else { m_operator = " "; } m_currentOperator = Tracker.GetOperator(m_byte); //Reassign operator string landModifier = Tracker.GetLandValue(m_byte); if (m_operator.EndsWith("+")) { num10 = Mathf.Clamp(Convert.ToInt32(num10 + Convert.ToDouble(landModifier)), 0, ushort.MaxValue); // + current or new value to num10 } else if (m_operator.EndsWith("-")) { num10 = Mathf.Clamp(Convert.ToInt32(num10 - Convert.ToDouble(landModifier)), 0, ushort.MaxValue); // - current or new value to num10 } else if (m_operator.EndsWith("*")) { num10 = Mathf.Clamp(Convert.ToInt32(num10 * Convert.ToDouble(landModifier)), 0, ushort.MaxValue); // * current or new value to num10 } else if (m_operator.EndsWith("/")) { try { num10 = Mathf.Clamp(Convert.ToInt32(num10 / Convert.ToDouble(landModifier)), 0, ushort.MaxValue); // / current or new value to num10 } catch (DivideByZeroException e4) { } } Tracker.SetLandValue(m_byte, Convert.ToString(num10)); } } //ResourceRate1 = Medicine //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate1, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate2 = Fire Protection //num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate2, 1, 1000, 1, 3000) >> 5) / 1 : 0); //ResourceRate3 = Police Protection //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate3, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate4 = Elementary //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate4, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate5 = High School //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate5, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate6 = College //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate6, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate7 = Deathcare //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate7, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate8 = Public Transport //num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate8, 1, 1000, 1, 3000) >> 5) / 1 : 0); //ResourceRate9 = NoisePollition //num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate9, 1, 2, 1, 1000) >> 5) / 1 : 0); //ResourceRate10 = Entertainment //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate10, 1, 500, 1, 3000) >> 5) / 10 : 0); //ResourceRate11 = -? (Abandonment (R)) //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate11, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate12 = Cargo Transport //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate12, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate13 = Proximity to Water and Pollution //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate13, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate14 = FireHazard over Fire Protection? (R) - Water and shoreline confirmed add value. //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate14, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate15 = If Density=0 then 0, otherwise its Crime Rate divided by density? (R) //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate15, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate16 = Starts at a positive value, reduced by public buildings. If Density = 0 then 50, otherwise its health divided by density? (R) //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate16, 1, 2, 1, 1000) >> 5) / 10 : 0); //ResourceRate17 = If Density= 0 then 50, otherwise Wellbeing deivided by density? (R) //int num10 = (((Singleton<GameAreaManager>.instance.PointOutOfArea(VectorUtils.X_Y(area.center)) ? 1 : 0) | (x <= 1 || x >= 254 || z <= 1 ? 1 : (z >= 254 ? 1 : 0))) == 0 ? (num5 + ImmaterialResourceManager.CalculateResourceEffect(resourceRate17, 1, 2, 1, 1000) >> 5) / 10 : 0); /* 1. Yes * 2. Yes * 3. Yes * 4. Yes * 5. Yes * 6. Yes * 7. Yes * 8. Yes but imperfect * 9. Yes * 10. Yes * 11. Unproven * 12. Yes * 13. Yes * 14. Inconsistent * 15. Yes but uncertain * 16. Yes but weird * 17. Various buildings have effect, weird */ //End int num11 = Mathf.Clamp(resourceRate1, 0, (int)ushort.MaxValue); int num12 = Mathf.Clamp(resourceRate2, 0, (int)ushort.MaxValue); int num13 = Mathf.Clamp(resourceRate3, 0, (int)ushort.MaxValue); int num14 = Mathf.Clamp(resourceRate4, 0, (int)ushort.MaxValue); int num15 = Mathf.Clamp(resourceRate5, 0, (int)ushort.MaxValue); int num16 = Mathf.Clamp(resourceRate6, 0, (int)ushort.MaxValue); int num17 = Mathf.Clamp(resourceRate7, 0, (int)ushort.MaxValue); int num18 = Mathf.Clamp(resourceRate8, 0, (int)ushort.MaxValue); int num19 = Mathf.Clamp(resourceRate9, 0, (int)ushort.MaxValue); int num20 = Mathf.Clamp(resourceRate15, 0, (int)ushort.MaxValue); int num21 = Mathf.Clamp(resourceRate16, 0, (int)ushort.MaxValue); int num22 = Mathf.Clamp(resourceRate17, 0, (int)ushort.MaxValue); int num23 = Mathf.Clamp(num4, 0, (int)ushort.MaxValue); int num24 = Mathf.Clamp(resourceRate10, 0, (int)ushort.MaxValue); /////////////////////////////////Clamp Land Value////////////////////////////// //Landvalue comes from num10 //Original //int landvalue = Mathf.Clamp(num10, 0, (int)ushort.MaxValue); //Test int landvalue = Mathf.Clamp(num10, 0, (int)ushort.MaxValue); int num25 = Mathf.Clamp(num6, 0, (int)ushort.MaxValue); int coverage = Mathf.Clamp(num7, 0, (int)ushort.MaxValue); int num26 = Mathf.Clamp(resourceRate14, 0, (int)ushort.MaxValue); int num27 = Mathf.Clamp(resourceRate11, 0, (int)ushort.MaxValue); int num28 = Mathf.Clamp(resourceRate12, 0, (int)ushort.MaxValue); DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(x * 2, z * 2); /////////////////////////////////Apply to District////////////////////////////// //Districts have landvalue, pollution and coverage. num9 refers to ground pollution, coverage //has something to do with num7. The method assigns templandvalue, temppollution and tempcoverage. //The first two are the inputs * coverage, tempcoverage is simply coverage. instance.m_districts.m_buffer[(int)district].AddGroundData(landvalue, num9, coverage); bool flag = false; if (num11 != (int)target[index]) { target[index] = (ushort)num11; flag = true; } if (num12 != (int)target[index + 1]) { target[index + 1] = (ushort)num12; flag = true; } if (num13 != (int)target[index + 2]) { target[index + 2] = (ushort)num13; flag = true; } if (num14 != (int)target[index + 3]) { target[index + 3] = (ushort)num14; flag = true; } if (num15 != (int)target[index + 4]) { target[index + 4] = (ushort)num15; flag = true; } if (num16 != (int)target[index + 5]) { target[index + 5] = (ushort)num16; flag = true; } if (num17 != (int)target[index + 6]) { target[index + 6] = (ushort)num17; flag = true; } if (num18 != (int)target[index + 7]) { target[index + 7] = (ushort)num18; flag = true; } if (num19 != (int)target[index + 8]) { target[index + 8] = (ushort)num19; flag = true; } if (num20 != (int)target[index + 9]) { target[index + 9] = (ushort)num20; flag = true; } if (num21 != (int)target[index + 10]) { target[index + 10] = (ushort)num21; flag = true; } if (num22 != (int)target[index + 11]) { target[index + 11] = (ushort)num22; flag = true; } if (num23 != (int)target[index + 12]) { target[index + 12] = (ushort)num23; flag = true; } if (num24 != (int)target[index + 13]) { target[index + 13] = (ushort)num24; flag = true; } ///////////////////////////////Flag/////////////////////// //What this means is unceertain, flag is a bool returned. If a condition is met //then it is true, otherwise false. This probably does not matter. if (landvalue != (int)target[index + 14]) { target[index + 14] = (ushort)landvalue; flag = true; } if (num25 != (int)target[index + 15]) { target[index + 15] = (ushort)num25; flag = true; } if (coverage != (int)target[index + 16]) { target[index + 16] = (ushort)coverage; flag = true; } if (num26 != (int)target[index + 17]) { target[index + 17] = (ushort)num26; flag = true; } if (num27 != (int)target[index + 18]) { target[index + 18] = (ushort)num27; flag = true; } if (num28 != (int)target[index + 19]) { target[index + 19] = (ushort)num28; flag = true; } return(flag); }
public override void SimulationStep(ushort instanceID, ref CitizenInstance citizenData, ref CitizenInstance.Frame frameData, bool lodPhysics) { //Debug.Log(CitizenManager.instance.GetDefaultCitizenName(citizenData.m_citizen) + ", leaving from " + BuildingManager.instance.GetBuildingName(citizenData.m_sourceBuilding, new InstanceID { Building = citizenData.m_sourceBuilding }) + ", is headed to target " + BuildingManager.instance.GetBuildingName(citizenData.m_targetBuilding, new InstanceID { Building = citizenData.m_targetBuilding }) + "."); //Debug.Log(CitizenManager.instance.GetDefaultCitizenName(citizenData.m_citizen) + ", leaving from " + BuildingManager.instance.m_buildings.m_buffer[(int)citizenData.m_sourceBuilding].m_position.x + "/" + BuildingManager.instance.m_buildings.m_buffer[(int)citizenData.m_sourceBuilding].m_position.z + " is traveling to " + BuildingManager.instance.m_buildings.m_buffer[(int)citizenData.m_targetBuilding].m_position.x + "/" + BuildingManager.instance.m_buildings.m_buffer[(int)citizenData.m_targetBuilding].m_position.z + "."); //Debug.Log(CitizenManager.instance.GetDefaultCitizenName(citizenData.m_citizen) + ", is traveling to " + citizenData.m_targetPos.x + "/" + citizenData.m_targetPos.z + ". and is at " + frameData.m_position.x + "/" + frameData.m_position.z + "."); /* * citizenData.m_path * citizenData.m_targetDir * citizenData.m_targetPos * PathManager.instance.m_properties * frameData.m_insideBuilding * frameData.m_position * frameData.m_velocity */ uint num1 = Singleton <SimulationManager> .instance.m_currentFrameIndex; //num1 = current frame Vector3 vector3_1 = (Vector3)citizenData.m_targetPos - frameData.m_position; //vector3_1 = targetpos - citizen's frame location float f = lodPhysics || (double)citizenData.m_targetPos.w <= 1.0 / 1000.0 ? vector3_1.sqrMagnitude : VectorUtils.LengthSqrXZ(vector3_1); //set physics float sqrMagnitude1 = frameData.m_velocity.sqrMagnitude; //sqrMagnitude1 = square lendth of the frame vector float minSqrDistance = Mathf.Max(sqrMagnitude1 * 3f, 3f); //minSqrDistance = max (sqrMagnitude1 * 3 , 3) if (lodPhysics && (long)(num1 >> 4 & 3U) == (long)((int)instanceID & 3)) //if physics and if ??? { minSqrDistance *= 4f; //multiply minSqrDistance by 4 } bool flag1 = false; //flag1 = false if ((citizenData.m_flags & CitizenInstance.Flags.TryingSpawnVehicle) != CitizenInstance.Flags.None) //if the citizen is trying to spawn a vehicle { bool flag2 = true; //flag2 is true if ((int)++citizenData.m_waitCounter == (int)byte.MaxValue || (int)citizenData.m_path == 0) //if the citizen has no path or if their wait counter is approaching max { flag2 = false; //flag2 is false } if (flag2) //if flag is true { PathUnit.Position position; flag2 = Singleton <PathManager> .instance.m_pathUnits.m_buffer[(long)citizenData.m_path].GetPosition((int)citizenData.m_pathPositionIndex >> 1, out position); //flag2 (bool) set to validity of citizen's location if (flag2) //if flag2 is still true { flag2 = this.SpawnVehicle(instanceID, ref citizenData, position); //flag2 is set to the success of spawning a vehicle } } if (!flag2) //if flag2 is false { citizenData.m_flags &= ~CitizenInstance.Flags.TryingSpawnVehicle; //set flag TryingSpawnVehicle is false citizenData.m_flags &= ~CitizenInstance.Flags.BoredOfWaiting; //set flag Bored of Waiting to false citizenData.m_waitCounter = (byte)0; //reset Wait counter this.InvalidPath(instanceID, ref citizenData); //report an invalid path } } else if ((citizenData.m_flags & CitizenInstance.Flags.WaitingTransport) != CitizenInstance.Flags.None) //else if flag WaitingTransport is true { bool flag2 = true; //flag2 is true if ((int)citizenData.m_waitCounter < (int)byte.MaxValue) //if wait counter is less than 255 { if (Singleton <SimulationManager> .instance.m_randomizer.Int32(2U) == 0) //have a 33%-50% chance of in { ++citizenData.m_waitCounter; } } else if ((citizenData.m_flags & CitizenInstance.Flags.BoredOfWaiting) == CitizenInstance.Flags.None) //else if flag BoredofWaiting is false { citizenData.m_flags |= CitizenInstance.Flags.BoredOfWaiting; //set flag BoredOfWaiting to true citizenData.m_waitCounter = (byte)0; //reset wait counter } //else (wait counter exceeded AND bored of waiting is true) else { citizenData.m_flags &= ~CitizenInstance.Flags.WaitingTransport; //flag WaitingTransport is false citizenData.m_flags &= ~CitizenInstance.Flags.BoredOfWaiting; //flag BoredOfWaiting is false citizenData.m_flags |= CitizenInstance.Flags.CannotUseTransport; //flag CannotUseTransport is true citizenData.m_waitCounter = (byte)0; //reset wait counter flag2 = false; //flag2 is false this.InvalidPath(instanceID, ref citizenData); //report invalid path } if (flag2 && (double)f < (double)minSqrDistance) //if flag2 is true and f (physics) < minSqrDistance { if ((long)(num1 >> 4 & 7U) == (long)((int)instanceID & 7)) //if num1 (currentframeindex) is equal to the instanceID ??? { citizenData.m_targetPos = this.GetTransportWaitPosition(instanceID, ref citizenData, ref frameData, minSqrDistance); //set the target position to GetTransportWaitPosition ** } vector3_1 = (Vector3)citizenData.m_targetPos - frameData.m_position; //vector3_1 = target position - frame position (current position?) f = lodPhysics || (double)citizenData.m_targetPos.w <= 1.0 / 1000.0 ? vector3_1.sqrMagnitude : VectorUtils.LengthSqrXZ(vector3_1); //something with physics } } else if ((citizenData.m_flags & CitizenInstance.Flags.WaitingTaxi) != CitizenInstance.Flags.None) //else if flag WaitingTaxi is true { bool flag2 = false; //flag2 is false if ((int)citizenData.m_citizen != 0) //if citizen is valid { flag2 = (int)Singleton <CitizenManager> .instance.m_citizens.m_buffer[(long)citizenData.m_citizen].m_vehicle != 0; //flag2 is the validity of the citizen's vehicle if (!flag2 && (long)(num1 >> 4 & 15U) == (long)((int)instanceID & 15)) //if vehicle is valid and if frame instance is equal to the citizen instance { Singleton <TransferManager> .instance.AddIncomingOffer(TransferManager.TransferReason.Taxi, new TransferManager.TransferOffer() //AddIncomingOFfer(reason: taxi) { Priority = 7, //Sets attributes of transfer offer Citizen = citizenData.m_citizen, Position = frameData.m_position, Amount = 1, Active = false }); } } if ((int)citizenData.m_waitCounter < (int)byte.MaxValue) //if wait counter isn't exceeded { if (Singleton <SimulationManager> .instance.m_randomizer.Int32(2U) == 0) //33%-50% chance of incrementing counter { ++citizenData.m_waitCounter; } } else if ((citizenData.m_flags & CitizenInstance.Flags.BoredOfWaiting) == CitizenInstance.Flags.None) //else if flag BoredOfWaiting is false { citizenData.m_flags |= CitizenInstance.Flags.BoredOfWaiting; //flag BoredOfWaiting is true citizenData.m_waitCounter = (byte)0; //reset wait counter } else if (!flag2) //else if flag2 is false { citizenData.m_flags &= ~CitizenInstance.Flags.WaitingTaxi; //flag WaitingTaxi is false citizenData.m_flags &= ~CitizenInstance.Flags.BoredOfWaiting; //flag BoredOfWaiting is false citizenData.m_flags |= CitizenInstance.Flags.CannotUseTaxi; //flag CannotUseTaxi is true citizenData.m_waitCounter = (byte)0; //reset wait counter this.InvalidPath(instanceID, ref citizenData); //report invalid path } } else if ((citizenData.m_flags & CitizenInstance.Flags.EnteringVehicle) != CitizenInstance.Flags.None) //else if flag EnteringVehicle is true { if ((double)f < (double)minSqrDistance) //if f (physics) is less than minSqrDistance { citizenData.m_targetPos = this.GetVehicleEnterPosition(instanceID, ref citizenData, minSqrDistance); //set target position to GetVechileEnterPosition (citizen instance, minSqrDistance vector3_1 = (Vector3)citizenData.m_targetPos - frameData.m_position; //vector3_1 is target position - frame (instance?) position f = lodPhysics || (double)citizenData.m_targetPos.w <= 1.0 / 1000.0 ? vector3_1.sqrMagnitude : VectorUtils.LengthSqrXZ(vector3_1); //something with physics } } else if ((double)f < (double)minSqrDistance) //else if f (physics) is less than minSqrDistance { if ((int)citizenData.m_path != 0) //if citizen has a path { if ((citizenData.m_flags & CitizenInstance.Flags.WaitingPath) == CitizenInstance.Flags.None) //if flag WaitingPathis false { citizenData.m_targetPos = this.GetPathTargetPosition(instanceID, ref citizenData, ref frameData, minSqrDistance); //target position = GetPathTargetPosition (ID, citizen instance, minSqrDistance if ((citizenData.m_flags & CitizenInstance.Flags.OnPath) == CitizenInstance.Flags.None) //if flag OnPath is false { citizenData.m_targetPos.w = 1f; //target position's w = 1 } } } else { //else (if citizen lacks a path) if ((citizenData.m_flags & CitizenInstance.Flags.RidingBicycle) != CitizenInstance.Flags.None) //if flag RidingBicycle is true { if ((int)citizenData.m_citizen != 0) //if citizen is valid { Singleton <CitizenManager> .instance.m_citizens.m_buffer[(long)citizenData.m_citizen].SetVehicle(citizenData.m_citizen, (ushort)0, 0U); //set this citizen's vehicle to 0 } citizenData.m_flags &= ~CitizenInstance.Flags.RidingBicycle; //flag RidingBicycle is false } citizenData.m_flags &= ~(CitizenInstance.Flags.OnPath | CitizenInstance.Flags.OnBikeLane); //??? probably means that both flags OnPath and OnBikeLane are set to false? if ((int)citizenData.m_targetBuilding != 0 && ((citizenData.m_flags & CitizenInstance.Flags.AtTarget) == CitizenInstance.Flags.None || (long)(num1 >> 4 & 15U) == (long)((int)instanceID & 15))) { //if target building is valid and if (flag AtTarget is false or if some condition comparing frame instance and citizen ID is met) this.GetBuildingTargetPosition(instanceID, ref citizenData, minSqrDistance); //GetBuildingTargetPosition (iD, citizen instanec and minSqrDistance) } if ((citizenData.m_flags & CitizenInstance.Flags.Panicking) == CitizenInstance.Flags.None) //if flag Panicking is false { flag1 = true; //flag1 is true } } vector3_1 = (Vector3)citizenData.m_targetPos - frameData.m_position; //Vector3_1 = tgarget position - frame (instance?) position f = lodPhysics || (double)citizenData.m_targetPos.w <= 1.0 / 1000.0 ? vector3_1.sqrMagnitude : VectorUtils.LengthSqrXZ(vector3_1); //physics command } float num2 = this.m_info.m_walkSpeed; //num2 = walk speed float b = 2f; //b = 2 if ((citizenData.m_flags & CitizenInstance.Flags.HangAround) != CitizenInstance.Flags.None) //if flag HangAround is true { num2 = Mathf.Max(num2 * 0.5f, 1f); //num2 = max(num2 / 2 , 1) } else if ((citizenData.m_flags & CitizenInstance.Flags.RidingBicycle) != CitizenInstance.Flags.None) //else if flag RidingBicycle is true (meaning that flag HangAround is false) { if ((citizenData.m_flags & CitizenInstance.Flags.OnBikeLane) != CitizenInstance.Flags.None) //if flag OnBikeLane is true { num2 *= 2f; //num2 *= } else { num2 *= 1.5f; } //else //num2 *= 1.5 } if ((double)sqrMagnitude1 > 0.00999999977648258) //if sqrMagnitude1 > 0.999999 (could mean >= 1 or a loss of precision (>1) { frameData.m_position += frameData.m_velocity * 0.5f; //position += velocity / 2 } Vector3 vector3_2; if ((double)f < 1.0) // { vector3_2 = Vector3.zero; if ((citizenData.m_flags & CitizenInstance.Flags.EnteringVehicle) != CitizenInstance.Flags.None) { if (this.EnterVehicle(instanceID, ref citizenData)) { return; } } else if (flag1) { if (this.ArriveAtTarget(instanceID, ref citizenData)) { return; } citizenData.m_flags |= CitizenInstance.Flags.AtTarget; if (Singleton <SimulationManager> .instance.m_randomizer.Int32(256U) == 0) { citizenData.m_targetSeed = (byte)Singleton <SimulationManager> .instance.m_randomizer.Int32(256U); } } else { citizenData.m_flags &= ~CitizenInstance.Flags.AtTarget; } } else { float num3 = Mathf.Sqrt(f); float num4 = Mathf.Sqrt(sqrMagnitude1); float num5 = Mathf.Max(0.0f, Vector3.Dot(vector3_1, frameData.m_velocity) / Mathf.Max(1f, num4 * num3)); float num6 = Mathf.Max(0.5f, num2 * num5 * num5 * num5); vector3_2 = vector3_1 * Mathf.Min(0.577f, num6 / num3); citizenData.m_flags &= ~CitizenInstance.Flags.AtTarget; if ((citizenData.m_flags & CitizenInstance.Flags.RequireSlowStart) != CitizenInstance.Flags.None && (int)citizenData.m_waitCounter < 8) { ++citizenData.m_waitCounter; frameData.m_velocity = Vector3.zero; return; } } frameData.m_underground = (citizenData.m_flags & CitizenInstance.Flags.Underground) != CitizenInstance.Flags.None; frameData.m_insideBuilding = (citizenData.m_flags & CitizenInstance.Flags.InsideBuilding) != CitizenInstance.Flags.None; frameData.m_transition = (citizenData.m_flags & CitizenInstance.Flags.Transition) != CitizenInstance.Flags.None; if ((double)f < 1.0 && flag1 && (citizenData.m_flags & CitizenInstance.Flags.SittingDown) != CitizenInstance.Flags.None) { citizenData.m_flags |= CitizenInstance.Flags.RequireSlowStart; citizenData.m_waitCounter = (byte)0; frameData.m_velocity = ((Vector3)citizenData.m_targetPos - frameData.m_position) * 0.5f; frameData.m_position += frameData.m_velocity * 0.5f; if ((double)citizenData.m_targetDir.sqrMagnitude <= 0.00999999977648258) { return; } frameData.m_rotation = Quaternion.LookRotation(VectorUtils.X_Y(citizenData.m_targetDir)); } else { citizenData.m_flags &= ~CitizenInstance.Flags.RequireSlowStart; Vector3 vector3_3 = vector3_2 - frameData.m_velocity; float magnitude = vector3_3.magnitude; vector3_3 *= b / Mathf.Max(magnitude, b); frameData.m_velocity += vector3_3; frameData.m_velocity -= Mathf.Max(0.0f, Vector3.Dot(frameData.m_position + frameData.m_velocity - (Vector3)citizenData.m_targetPos, frameData.m_velocity)) / Mathf.Max(0.01f, frameData.m_velocity.sqrMagnitude) * frameData.m_velocity; float sqrMagnitude2 = frameData.m_velocity.sqrMagnitude; bool flag2 = !lodPhysics && (double)citizenData.m_targetPos.w > 1.0 / 1000.0 && ((double)sqrMagnitude2 > 0.00999999977648258 || (double)sqrMagnitude1 > 0.00999999977648258); ushort buildingID = !flag2 ? (ushort)0 : Singleton <BuildingManager> .instance.GetWalkingBuilding(frameData.m_position + frameData.m_velocity * 0.5f); if ((double)sqrMagnitude2 > 0.00999999977648258) { if (!lodPhysics) { Vector3 zero = Vector3.zero; float pushDivider = 0.0f; this.CheckCollisions(instanceID, ref citizenData, frameData.m_position, frameData.m_position + frameData.m_velocity, buildingID, ref zero, ref pushDivider); if ((double)pushDivider > 0.00999999977648258) { Vector3 vector3_4 = Vector3.ClampMagnitude(zero * (1f / pushDivider), Mathf.Sqrt(sqrMagnitude2) * 0.9f); frameData.m_velocity += vector3_4; } } frameData.m_position += frameData.m_velocity * 0.5f; Vector3 forward = frameData.m_velocity; if ((citizenData.m_flags & CitizenInstance.Flags.RidingBicycle) == CitizenInstance.Flags.None) { forward.y = 0.0f; } if ((double)forward.sqrMagnitude > 0.00999999977648258) { frameData.m_rotation = Quaternion.LookRotation(forward); } } if (!flag2) { return; } Vector3 worldPos = frameData.m_position; float terrainHeight = Singleton <TerrainManager> .instance.SampleDetailHeight(worldPos); if ((int)buildingID != 0) { float num3 = Singleton <BuildingManager> .instance.m_buildings.m_buffer[(int)buildingID].SampleWalkingHeight(worldPos, terrainHeight); worldPos.y = worldPos.y + (num3 - worldPos.y) * Mathf.Min(1f, citizenData.m_targetPos.w * 4f); frameData.m_position.y = worldPos.y; } else { if ((double)Mathf.Abs(terrainHeight - worldPos.y) >= 2.0) { return; } worldPos.y = worldPos.y + (terrainHeight - worldPos.y) * Mathf.Min(1f, citizenData.m_targetPos.w * 4f); frameData.m_position.y = worldPos.y; } } if ((int)citizenData.m_citizen != 0) { if (Tracker.AccessibilitySourceActive()) { TrafficLog.CitizenStepBroadcastedSource(citizenData.m_citizen); } if (Tracker.AccessibilityTargetActive()) { TrafficLog.CitizenStepBroadcastedTarget(citizenData.m_citizen); } } }