private static void OnCharacterPortraitPopUpOpened(CharacterObject characterObject)
        {
            if (characterObject == null || LocationComplex.Current == null)
            {
                return;
            }

            Location locationOfCharacter = LocationComplex.Current.GetLocationOfCharacter(characterObject.HeroObject);

            if (!characterObject.HeroObject.IsPrisoner)
            {
                return;
            }

            heroToTalk = characterObject.HeroObject;

            MenuContext menuContext = Campaign.Current.CurrentMenuContext;

            if (menuContext == null)
            {
                return;
            }

            GameOverlays.MenuOverlayType menuOverlayType = Campaign.Current.GameMenuManager.GetMenuOverlayType(menuContext);

            if (menuOverlayType == GameOverlays.MenuOverlayType.SettlementWithCharacters)
            {
                // get menu overlay layer, see GauntletMenuOverlayBase;
                ScreenBase topScreen = ScreenManager.TopScreen;
                if (topScreen == null)
                {
                    return;
                }
                GauntletLayer gauntletLayer = topScreen.FindLayer <ScreenLayer>("BasicLayer") as GauntletLayer;
                if (gauntletLayer == null)
                {
                    return;
                }

                // get _moviesAndDatasources, its public
                // and there will be ViewModel for SettlementMenuOverlayVM;
                var movieAndDatasource = gauntletLayer._moviesAndDatasources.FirstOrDefault(p => p.Item2 is SettlementMenuOverlayVM);
                if (movieAndDatasource == null)
                {
                    return;
                }
                SettlementMenuOverlayVM dataSource = movieAndDatasource.Item2 as SettlementMenuOverlayVM;

                // it has prop ContextList;
                // you should add new items there, example ExecuteOnSetAsActiveContextMenuItem;
                GameMenuOverlayActionVM overlayItem = new GameMenuOverlayActionVM(
                    OnTalkToPrisonerAction,
                    GameTexts.FindText("str_menu_overlay_context_list", "Conversation").ToString(),
                    true,
                    1, // ID for Conversation
                    "");
                dataSource.ContextList.Add(overlayItem);
            }
        }
        private static void OnGameMenuOpened(MenuCallbackArgs menuCallbackArgs)
        {
            MenuContext menuContext = menuCallbackArgs.MenuContext;

            GameOverlays.MenuOverlayType menuOverlayType = Campaign.Current.GameMenuManager.GetMenuOverlayType(menuContext);

            if (menuOverlayType == GameOverlays.MenuOverlayType.SettlementWithCharacters)
            {
                Location lordshall = LocationComplex.Current.GetLocationWithId("lordshall");
                if (lordshall == null)
                {
                    return;
                }

                Settlement settlement = Hero.MainHero.CurrentSettlement;
                if (settlement == null)
                {
                    return;
                }

                IEnumerable <Hero> list = settlement.HeroesWithoutParty.Where(h => h.IsPrisoner);
                if (list == null)
                {
                    return;
                }

                foreach (Hero hero in list)
                {
                    Location current = LocationComplex.Current.GetLocationOfCharacter(hero);
                    if (current == lordshall)
                    {
                        continue;
                    }

                    if (current == null)
                    {
                        Tuple <string, Monster> actionSetAndMonster = new Tuple <string, Monster>("as_human_lady", Campaign.Current.HumanMonsterSettlement);
                        AgentData agentData = new AgentData(
                            new SimpleAgentOrigin(
                                hero.CharacterObject,
                                -1,
                                null,
                                default(UniqueTroopDescriptor))).Monster(actionSetAndMonster.Item2).NoHorses(true);
                        lordshall.AddCharacter(
                            new LocationCharacter(agentData,
                                                  new LocationCharacter.AddBehaviorsDelegate(SandBoxManager.Instance.AgentBehaviorManager.AddFixedCharacterBehaviors),
                                                  null,
                                                  true,
                                                  LocationCharacter.CharacterRelations.Neutral,
                                                  actionSetAndMonster.Item1,
                                                  true,
                                                  true,
                                                  null,
                                                  false,
                                                  false,
                                                  true));
                    }
                    else
                    {
                        LocationComplex.Current.ChangeLocation(LocationComplex.Current.GetLocationCharacterOfHero(hero),
                                                               current, lordshall);
                    }
                }
            }

            if (menuContext.GameMenu.StringId == "town_wait_menus")
            {
                if (ZenDzeeRomanceHelper.GetLover(Hero.MainHero, ZenDzeeRomanceHelper.RomanceLevel_Prisoner) != null)
                {
                    GameMenu.SwitchToMenu("zendzee_town_wait_menus");
                }
            }
        }