static void Postfix(SimGameState __instance, int timeLapse, SimGameInterruptManager ___interruptQueue,
                            SimGameEventTracker ___companyEventTracker, SimGameEventTracker ___mechWarriorEventTracker,
                            SimGameEventTracker ___deadEventTracker, SimGameEventTracker ___moraleEventTracker)
        {
            Mod.Log.Debug?.Write($"OnDayPassed called with timeLapse: {timeLapse}");

            // Only check for events if another event isn't firing, and we're in orbit around a system
            if (!___interruptQueue.IsOpen && __instance.TravelState == SimGameTravelStatus.IN_SYSTEM)
            {
                foreach (Pilot pilot in __instance.PilotRoster)
                {
                    CrewDetails details = ModState.GetCrewDetails(pilot.pilotDef);
                    if (details.ExpirationDay <= __instance.DaysPassed)
                    {
                        Mod.Log.Debug?.Write($"CONTRACT FOR PILOT: {pilot.Name} HAS ELAPSED, FIRING EVENT");
                        ModState.ExpiredContracts.Enqueue((pilot, details));
                    }
                }

                if (ModState.ExpiredContracts.Count > 0)
                {
                    // Fire the first event, if there are more they will be fired from OnEventDismissed{
                    Mod.Log.Info?.Write($"Contract expiration event fired.");
                    (Pilot Pilot, CrewDetails Details)expired = ModState.ExpiredContracts.Peek();
                    SimGameEventDef newEvent = EventHelper.ModifyContractExpirationEventForPilot(expired.Pilot, expired.Details);
                    ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, ___mechWarriorEventTracker);
                }
                else if (Mod.Config.HeadHunting.Enabled && __instance.TravelState == SimGameTravelStatus.IN_SYSTEM)
                {
                    // TODO: Only do check if not at planet with blacklisted tags
                    if (HeadHuntingHelper.ShouldCheckHeadHunting())
                    {
                        Pilot headHuntedCrew = HeadHuntingHelper.TestAllCrews();

                        if (headHuntedCrew != null)
                        {
                            CrewDetails     cd       = ModState.GetCrewDetails(headHuntedCrew.pilotDef);
                            SimGameEventDef newEvent = EventHelper.CreateHeadHuntingEvent(headHuntedCrew, cd, cd.HiringBonus, cd.HiringBonus);
                            ModState.HeadHuntedPilot = headHuntedCrew;
                            ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, ___mechWarriorEventTracker);

                            HeadHuntingHelper.UpdateNextDayOnSuccess();
                        }
                        else
                        {
                            HeadHuntingHelper.UpdateNextDayOnFailure();
                        }
                    }
                }
            }
        }
        static bool Prefix(string button)
        {
            Mod.Log.Info?.Write($"RBP invoked for button: {button}");
            if ("Hiring".Equals(button, StringComparison.InvariantCultureIgnoreCase))
            {
                if (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))
                {
                    Mod.Log.Info?.Write("-- Regenerating pilots in system.");
                    ModState.SimGameState.CurSystem.AvailablePilots.Clear();
                    ModState.SimGameState.CurSystem.GeneratePilots(ModState.SimGameState.Constants.Story.DefaultPilotsPerSystem);
                }
                else if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl) &&
                         Mod.Config.HeadHunting.Enabled && ModState.SimGameState.TravelState == SimGameTravelStatus.IN_SYSTEM)
                {
                    Mod.Log.Info?.Write("-- Forcing poaching on random crew.");

                    // Randomize pilots instead of sorting by skill?
                    List <Pilot> pilots = ModState.SimGameState.PilotRoster.ToList();
                    pilots.Sort((p1, p2) =>
                    {
                        CrewDetails p1cd = ModState.GetCrewDetails(p1.pilotDef);
                        CrewDetails p2cd = ModState.GetCrewDetails(p2.pilotDef);
                        return(CrewDetails.CompareByValue(p1cd, p2cd));
                    });

                    int   idx    = Mod.Random.Next(0, pilots.Count - 1);
                    Pilot random = pilots[idx];
                    Mod.Log.Info?.Write($"--  Headhunted pilot: {random.Name}");
                    CrewDetails     cd       = ModState.GetCrewDetails(random.pilotDef);
                    SimGameEventDef newEvent = EventHelper.CreateHeadHuntingEvent(random, cd, cd.HiringBonus, cd.HiringBonus);

                    Traverse            mechWarriorEventTrackerT = Traverse.Create(ModState.SimGameState).Field("mechWarriorEventTracker");
                    SimGameEventTracker mechWarriorEventTracker  = mechWarriorEventTrackerT.GetValue <SimGameEventTracker>();

                    ModState.HeadHuntedPilot = random;
                    Mod.Log.Info?.Write($"--  Firing debug event");
                    ModState.SimGameState.Context.SetObject(GameContextObjectTagEnum.TargetMechWarrior, random);
                    ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, mechWarriorEventTracker);

                    return(false);
                }
                else if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) &&
                         ModState.SimGameState.TravelState == SimGameTravelStatus.IN_SYSTEM)
                {
                    Mod.Log.Info?.Write("-- Forcing contract expiration on random crew.");

                    // Randomize pilots instead of sorting by skill?
                    List <Pilot> pilots = ModState.SimGameState.PilotRoster.ToList();
                    pilots.Sort((p1, p2) =>
                    {
                        CrewDetails p1cd = ModState.GetCrewDetails(p1.pilotDef);
                        CrewDetails p2cd = ModState.GetCrewDetails(p2.pilotDef);
                        return(CrewDetails.CompareByValue(p1cd, p2cd));
                    });

                    int   idx    = Mod.Random.Next(0, pilots.Count - 1);
                    Pilot random = pilots[idx];
                    Mod.Log.Info?.Write($"--  Expired pilot: {random.Name}");
                    CrewDetails cd = ModState.GetCrewDetails(random.pilotDef);

                    ModState.ExpiredContracts.Enqueue((random, cd));
                    SimGameEventDef newEvent = EventHelper.ModifyContractExpirationEventForPilot(random, cd);

                    Traverse            mechWarriorEventTrackerT = Traverse.Create(ModState.SimGameState).Field("mechWarriorEventTracker");
                    SimGameEventTracker mechWarriorEventTracker  = mechWarriorEventTrackerT.GetValue <SimGameEventTracker>();

                    ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, mechWarriorEventTracker);

                    return(false);
                }
            }

            return(true);
        }