public void ResearchPerformed(float amount, Pawn researcher)
        {
            // get research manager instance
            ResearchManager manager = Find.ResearchManager;

            if (manager.currentProj == null)
            {
                Log.Error("Researched without having an active project.");
                return;
            }

            amount *= GlobalProgressFactor;
            if (researcher != null && researcher.Faction != null)
            {
                amount /= manager.currentProj.CostFactor(researcher.Faction.def.techLevel);
            }
            if (DebugSettings.fastResearch)
            {
                amount *= 500f;
            }
            researcher?.records.AddTo(RecordDefOf.ResearchPointsResearched, amount);

            Dictionary <ResearchProjectDef, float> progress = Progress;

            progress[manager.currentProj] = manager.GetProgress(manager.currentProj) + amount;

            // if not finished we're done
            if (!manager.currentProj.IsFinished)
            {
                return;
            }

            // otherwise, do some additional stuff;
            manager.ReapplyAllMods();

            // remove current from queue
            ResearchNode completed = Queue.Pop;

            if (researcher != null)
            {
                TaleRecorder.RecordTale(TaleDefOf.FinishedResearchProject, researcher, completed.Research);
            }

            // message
            string label = "ResearchFinished".Translate(completed.Research.LabelCap);
            string text  = "ResearchFinished".Translate(completed.Research.LabelCap) + "\n\n" + completed.Research.DescriptionDiscovered;

            // if there's something on the queue start it, and push an appropriate message
            ResearchNode next;

            if (Queue.TryStartNext(out next))
            {
                text += "\n\n" + "NextInQueue".Translate(next.Research.LabelCap);
                Find.LetterStack.ReceiveLetter(label, text, LetterType.Good);
            }
            else
            {
                text += "\n\n" + "NextInQueue".Translate("none".Translate());
                Find.LetterStack.ReceiveLetter(label, text, LetterType.BadNonUrgent);
            }
        }