// Thread: Main
        public override void OnRefreshMilestones()
        {
            if (Singleton <SimulationManager> .instance.m_metaData.m_updateMode == SimulationManager.UpdateMode.NewGame)
            {
                // only do once
                if (!unlockedAreas)
                {
                    IAreas AreasManager = Managers.areas;

                    // calculate original cash
                    long originalCash = EconomyManager.instance.InternalCashAmount;

                    // causes rendering issue in new areas
                    Singleton <UnlockManager> .instance.UnlockAllProgressionMilestones();

                    // unlock all tiles
                    int rows = (int)Math.Sqrt(AreasManager.maxAreaCount);

                    for (int x = 0; x < rows; x++)
                    {
                        for (int y = 0; y < rows; y++)
                        {
                            int column = x;
                            int row    = y;

                            if (rows.Equals(3))
                            {
                                column = x + 1;
                                row    = y + 1;
                            }

                            if (!AreasManager.IsAreaUnlocked(column, row) && AreasManager.CanUnlockArea(column, row))
                            {
                                AreasManager.UnlockArea(column, row, false);
                            }
                        }
                    }

                    // copy milestone info so we can reset it to default
                    MilestoneInfo[] MilestoneInfos = new MilestoneInfo[UnlockManager.instance.m_allMilestones.Count];
                    UnlockManager.instance.m_allMilestones.Values.CopyTo(MilestoneInfos, 0);

                    UnlockManager.ResetMilestones(MilestoneInfos, false);

                    // calculated added cash
                    long finalCash      = EconomyManager.instance.InternalCashAmount;
                    int  cashDifference = Convert.ToInt32(originalCash - finalCash);

                    // remove cash difference
                    EconomyManager.instance.AddResource(EconomyManager.Resource.LoanAmount, cashDifference, ItemClass.Service.None, ItemClass.SubService.None, ItemClass.Level.None);
                }
            }

            unlockedAreas = true;
        }