示例#1
0
        //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);
        }
示例#3
0
        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);
                }
            }
        }