Beispiel #1
0
        private FactionFile.GuildGroups GetGuildGroup(int factionId)
        {
            PersistentFactionData persistentFactionData = GameManager.Instance.PlayerEntity.FactionData;

            FactionFile.GuildGroups guildGroup = FactionFile.GuildGroups.None;
            FactionFile.FactionData factionData;
            if (persistentFactionData.GetFactionData(factionId, out factionData))
            {
                guildGroup = (FactionFile.GuildGroups)factionData.ggroup;

                // Handle temples nested under deity
                if (guildGroup == FactionFile.GuildGroups.None && factionData.children.Count > 0)
                {
                    FactionFile.FactionData firstChild;
                    if (persistentFactionData.GetFactionData(factionData.children[0], out firstChild))
                    {
                        guildGroup = (FactionFile.GuildGroups)firstChild.ggroup;
                    }
                }
            }

            // Thieves guild is general populace / underworld
            if (guildGroup == FactionFile.GuildGroups.GeneralPopulace && (FactionFile.SocialGroups)factionData.sgroup == FactionFile.SocialGroups.Underworld)
            {
                Debug.Log("Theves Guild.");
            }

            Debug.LogFormat("faction id: {0}, social group: {1}, guild: {2}",
                            factionId, (FactionFile.SocialGroups)factionData.sgroup, guildGroup);

            return(guildGroup);
        }
Beispiel #2
0
        public FactionFile.GuildGroups GetGuildGroup(int factionId)
        {
            if (factionId == 510)   // Shops are marked as FG in faction data, hardcode to none to prevent them acting as FG guildhalls.
            {
                return(FactionFile.GuildGroups.None);
            }

            PersistentFactionData persistentFactionData = GameManager.Instance.PlayerEntity.FactionData;

            FactionFile.GuildGroups guildGroup = FactionFile.GuildGroups.None;
            FactionFile.FactionData factionData;
            if (persistentFactionData.GetFactionData(factionId, out factionData))
            {
                guildGroup = (FactionFile.GuildGroups)factionData.ggroup;

                // Handle temples nested under deity
                if (factionData.children != null && (guildGroup == FactionFile.GuildGroups.None && factionData.children.Count > 0))
                {
                    FactionFile.FactionData firstChild;
                    if (persistentFactionData.GetFactionData(factionData.children[0], out firstChild))
                    {
                        guildGroup = (FactionFile.GuildGroups)firstChild.ggroup;
                    }
                }
            }
            Debug.LogFormat("Got guild for faction id: {0}, social group: {1}, guild: {2}",
                            factionId, (FactionFile.SocialGroups)factionData.sgroup, guildGroup);

            return(guildGroup);
        }
Beispiel #3
0
        /// <summary>
        /// Imports guild membership records from classic save data.
        /// </summary>
        public void ImportMembershipData(List <SaveTreeBaseRecord> guildMembershipRecords, bool vampire = false)
        {
            ClearMembershipData(vampire);
            foreach (GuildMembershipRecord record in guildMembershipRecords)
            {
                FactionFile.GuildGroups guildGroup = GetGuildGroup(record.ParsedData.factionID);
                IGuild guild = CreateGuildObj(guildGroup, record.ParsedData.factionID);
                if (vampire)
                {
                    vampMemberships[guildGroup] = guild;
                }
                else
                {
                    memberships[guildGroup] = guild;
                }

                if (vampire == GameManager.Instance.PlayerEffectManager.HasVampirism())
                {
                    // Player should only join guilds from either his standard or vampire membership lists, not both
                    guild.Join();
                }

                // Set rank and time from parsed data.
                guild.Rank = record.ParsedData.rank;
                guild.ImportLastRankChange(record.ParsedData.timeOfLastRankChange);
            }
        }
        /// <summary>
        /// Get a random quest for a guild from appropriate subset.
        /// </summary>
        public Quest GetGuildQuest(FactionFile.GuildGroups guildGroup, MembershipStatus status, int factionId, int rep)
        {
#if UNITY_EDITOR    // Reload every time when in editor
            LoadQuestLists();
#endif
            List <QuestData> guildQuests;
            if (guilds.TryGetValue(guildGroup, out guildQuests))
            {
                // Modifications for Temple dual membership status
                MembershipStatus tplMemb = (guildGroup == FactionFile.GuildGroups.HolyOrder && status != MembershipStatus.Nonmember) ? MembershipStatus.Member : status;
                // Underworld guilds don't expel and continue to offer std quests below zero reputation
                rep = ((guildGroup == FactionFile.GuildGroups.DarkBrotherHood || guildGroup == FactionFile.GuildGroups.GeneralPopulace) && rep < 0) ? 0 : rep;

                List <QuestData> pool = new List <QuestData>();
                foreach (QuestData quest in guildQuests)
                {
                    if ((status == (MembershipStatus)quest.membership || tplMemb == (MembershipStatus)quest.membership) &&
                        (status == MembershipStatus.Nonmember || (rep >= quest.minRep && (!quest.unitWildC || rep < quest.minRep + 10))))
                    {
                        pool.Add(quest);
                    }
                }
                return(SelectQuest(pool, factionId));
            }
            return(null);
        }
        private IGuild CreateGuildObj(FactionFile.GuildGroups guildGroup, int variant = 0)
        {
            Type guildType;

            if (customGuilds.TryGetValue(guildGroup, out guildType))
            {
                return((IGuild)Activator.CreateInstance(guildType));
            }
            else
            {
                switch (guildGroup)
                {
                case FactionFile.GuildGroups.FightersGuild:
                    return(new FightersGuild());

                case FactionFile.GuildGroups.MagesGuild:
                    return(new MagesGuild());

                case FactionFile.GuildGroups.HolyOrder:
                    return(new Temple(Temple.GetDivine(variant)));

                case FactionFile.GuildGroups.KnightlyOrder:
                    return(new KnightlyOrder(KnightlyOrder.GetOrder(variant)));

                case FactionFile.GuildGroups.GeneralPopulace:
                    return(new ThievesGuild());

                case FactionFile.GuildGroups.DarkBrotherHood:
                    return(new DarkBrotherhood());

                default:
                    return(null);
                }
            }
        }
        /// <summary>
        /// Retrieve the guild object for the given guild group.
        /// </summary>
        /// <param name="guildGroup"></param>
        /// <param name="buildingFactionId">Specify this to ensure only the temple of matching Divine is returned</param>
        /// <returns>IGuild object</returns>
        public IGuild GetGuild(FactionFile.GuildGroups guildGroup, int buildingFactionId = 0)
        {
            IGuild guild;

            memberships.TryGetValue(guildGroup, out guild);

            if (guildGroup == FactionFile.GuildGroups.HolyOrder && buildingFactionId > 0)
            {
                if (guild != null)
                {
                    Temple.Divines deity  = Temple.GetDivine(buildingFactionId);
                    Temple         temple = (Temple)guild;
                    if (temple.Deity == deity)
                    {
                        return(guild);
                    }
                }
                return(templeNotMember);
            }
            else if (guildGroup == FactionFile.GuildGroups.KnightlyOrder && buildingFactionId > 0)
            {
                if (guild != null)
                {
                    KnightlyOrder.Orders order         = KnightlyOrder.GetOrder(buildingFactionId);
                    KnightlyOrder        knightlyOrder = (KnightlyOrder)guild;
                    if (knightlyOrder.Order == order)
                    {
                        return(guild);
                    }
                }
                return(guildNotMember);
            }
            return((guild != null) ? guild : guildNotMember);
        }
        public FactionFile.GuildGroups GetGuildGroup(int factionId)
        {
            PersistentFactionData persistentFactionData = GameManager.Instance.PlayerEntity.FactionData;

            FactionFile.GuildGroups guildGroup = FactionFile.GuildGroups.None;
            FactionFile.FactionData factionData;
            if (persistentFactionData.GetFactionData(factionId, out factionData))
            {
                guildGroup = (FactionFile.GuildGroups)factionData.ggroup;

                // Handle temples nested under deity
                if (factionData.children != null && (guildGroup == FactionFile.GuildGroups.None && factionData.children.Count > 0))
                {
                    FactionFile.FactionData firstChild;
                    if (persistentFactionData.GetFactionData(factionData.children[0], out firstChild))
                    {
                        guildGroup = (FactionFile.GuildGroups)firstChild.ggroup;
                    }
                }
            }
            Debug.LogFormat("Got guild for faction id: {0}, social group: {1}, guild: {2}",
                            factionId, (FactionFile.SocialGroups)factionData.sgroup, guildGroup);

            return(guildGroup);
        }
Beispiel #8
0
        /// <summary>
        /// Gets a pool of elligible quests for a guild to offer.
        /// </summary>
        public List <QuestData> GetGuildQuestPool(FactionFile.GuildGroups guildGroup, MembershipStatus status, int factionId, int rep, int rank)
        {
#if UNITY_EDITOR    // Reload every time when in editor
            LoadQuestLists();
#endif

            // Create one-time quest list if not already created
            if (oneTimeQuestsAccepted == null)
            {
                oneTimeQuestsAccepted = new List <string>();
            }

            List <QuestData> guildQuests;
            if (guilds.TryGetValue(guildGroup, out guildQuests))
            {
                // Modifications for Temple dual membership status
                MembershipStatus tplMemb = (guildGroup == FactionFile.GuildGroups.HolyOrder && status != MembershipStatus.Nonmember) ? MembershipStatus.Member : status;

                List <QuestData> pool = new List <QuestData>();
                foreach (QuestData quest in guildQuests)
                {
                    if ((status == (MembershipStatus)quest.membership || tplMemb == (MembershipStatus)quest.membership) &&
                        (status == MembershipStatus.Nonmember || (quest.minReq < 10 && quest.minReq <= rank) || (quest.minReq >= 10 && quest.minReq <= rep)))
                    {
                        if ((!quest.adult || DaggerfallUnity.Settings.PlayerNudity) && !(quest.oneTime && oneTimeQuestsAccepted.Contains(quest.name)))
                        {
                            pool.Add(quest);
                        }
                    }
                }
                return(pool);
            }
            return(null);
        }
        /// <summary>
        /// Get the faction id for a guild group. (used for non-member quests)
        /// Returns 0 for HolyOrder and KnightlyOrder since they have variants each with different faction ids.
        /// </summary>
        public int GetGuildFactionId(FactionFile.GuildGroups guildGroup)
        {
            switch (guildGroup)
            {
            case FactionFile.GuildGroups.FightersGuild:
                return(FightersGuild.FactionId);

            case FactionFile.GuildGroups.MagesGuild:
                return(MagesGuild.FactionId);

            case FactionFile.GuildGroups.HolyOrder:
            case FactionFile.GuildGroups.KnightlyOrder:
                return(0);

            case FactionFile.GuildGroups.GeneralPopulace:
                return(ThievesGuild.FactionId);

            case FactionFile.GuildGroups.DarkBrotherHood:
                return(DarkBrotherhood.FactionId);

            default:
                Type guildType;
                if (customGuilds.TryGetValue(guildGroup, out guildType))
                {
                    return((int)guildType.GetProperty("FactionId").GetValue(null, null));
                }
                else
                {
                    return(0);
                }
            }
        }
        public bool GetJoinedGuildOfGuildGroup(FactionFile.GuildGroups guildGroup, out IGuild value)
        {
            if (memberships.TryGetValue(guildGroup, out value))
            {
                return(true);
            }

            return(false);
        }
        public IGuild JoinGuild(FactionFile.GuildGroups guildGroup, int buildingFactionId = 0)
        {
            if (memberships.ContainsKey(guildGroup))
            {
                return(memberships[guildGroup]);
            }

            return(CreateGuildObj(guildGroup, buildingFactionId));
        }
Beispiel #12
0
        static ItemCollection merchantItems;    // Temporary

        #endregion

        #region Constructors

        public DaggerfallGuildServicePopupWindow(IUserInterfaceManager uiManager, StaticNPC npc, FactionFile.GuildGroups guild, GuildServices service)
            : base(uiManager)
        {
            serviceNPC   = npc;
            this.guild   = guild;
            this.service = service;
            playerEntity = GameManager.Instance.PlayerEntity;
            // Clear background
            ParentPanel.BackgroundColor = Color.clear;
        }
 public static bool RegisterCustomGuild(FactionFile.GuildGroups guildGroup, Type guildType)
 {
     DaggerfallUnity.LogMessage("RegisterCustomGuild: " + guildGroup, true);
     if (!customGuilds.ContainsKey(guildGroup))
     {
         customGuilds.Add(guildGroup, guildType);
         return(true);
     }
     return(false);
 }
Beispiel #14
0
        /// <summary>
        /// Retrieve the guild object for the given faction id.
        /// </summary>
        public Guild GetGuild(int factionId)
        {
            FactionFile.GuildGroups guildGroup = GetGuildGroup(factionId);
            if (guildGroup == FactionFile.GuildGroups.None)
            {
                throw new Exception("Can't find guild for faction id: " + factionId);
            }

            return(GetGuild(guildGroup, factionId));
        }
        //protected new StaticNPC merchantNPC;
        //protected new PlayerGPS.DiscoveredBuilding buildingData;
        //protected new RoomRental_v1 rentedRoom;
        //protected new int daysToRent = 0;
        //protected new int tradePrice = 0;

        //bool isCloseWindowDeferred = false;
        //bool isTalkWindowDeferred = false;
        //bool isFoodDeferred = false;
        //bool isDrinksDeferred = false;


        #endregion

        #region Constructors

        public FenceWindow(IUserInterfaceManager uiManager, StaticNPC npc, FactionFile.GuildGroups guildGroup)
            : base(uiManager)
        {
            ParentPanel.BackgroundColor = Color.clear;
            guildManager = GameManager.Instance.GuildManager;

            serviceNPC      = npc;
            npcService      = GuildNpcServices.TG_SellMagicItems;
            this.guildGroup = guildGroup;
            guild           = guildManager.GetGuild(guildGroup, buildingFactionId);
            Debug.Log("guild = " + guild.ToString());
        }
        private void ParseQuestList(Table questsTable, string questsPath = "")
        {
            for (int i = 0; i < questsTable.RowCount; i++)
            {
                QuestData questData = new QuestData();
                questData.path = questsPath;
                string minRep = questsTable.GetValue("minRep", i);
                if (minRep.EndsWith("X"))
                {
                    questData.unitWildC = true;
                    minRep = minRep.Replace("X", "0");
                }
                int d = 0;
                if (int.TryParse(minRep, out d))
                {
                    questData.name       = questsTable.GetValue("name", i);
                    questData.group      = questsTable.GetValue("group", i);
                    questData.membership = questsTable.GetValue("membership", i)[0];
                    questData.minRep     = d;

                    // Is the group a guild group?
                    if (Enum.IsDefined(typeof(FactionFile.GuildGroups), questData.group))
                    {
                        FactionFile.GuildGroups guildGroup = (FactionFile.GuildGroups)Enum.Parse(typeof(FactionFile.GuildGroups), questData.group);
                        List <QuestData>        guildQuests;
                        if (!guilds.TryGetValue(guildGroup, out guildQuests))
                        {
                            guildQuests = new List <QuestData>();
                            guilds.Add(guildGroup, guildQuests);
                        }
                        guildQuests.Add(questData);
                    }
                    // Is the group a social group?
                    else if (Enum.IsDefined(typeof(FactionFile.SocialGroups), questData.group))
                    {
                        FactionFile.SocialGroups socialGroup = (FactionFile.SocialGroups)Enum.Parse(typeof(FactionFile.SocialGroups), questData.group);
                        List <QuestData>         socialQuests;
                        if (!social.TryGetValue(socialGroup, out socialQuests))
                        {
                            socialQuests = new List <QuestData>();
                            social.Add(socialGroup, socialQuests);
                        }
                        socialQuests.Add(questData);
                    }
                    // Is this a quest initialised when a new game is started?
                    else if (questData.group == InitAtGameStart)
                    {
                        init.Add(questData);
                    }
                    // else TODO other groups
                }
            }
        }
 /// <summary>
 /// Retrieve the guild object for the given faction id.
 /// </summary>
 public Guild GetGuild(int factionId)
 {
     FactionFile.GuildGroups guildGroup = GetGuildGroup(factionId);
     if (guildGroup == FactionFile.GuildGroups.None)
     {
         return(guildNotMember);
     }
     else
     {
         return(GetGuild(guildGroup, factionId));
     }
 }
        /// <summary>
        /// Imports guild membership records from classic save data.
        /// </summary>
        public void ImportMembershipData(List <SaveTreeBaseRecord> guildMembershipRecords)
        {
            ClearMembershipData();
            foreach (GuildMembershipRecord record in guildMembershipRecords)
            {
                FactionFile.GuildGroups guildGroup = GetGuildGroup(record.ParsedData.factionID);
                IGuild guild = CreateGuildObj(guildGroup, record.ParsedData.factionID);
                AddMembership(guildGroup, guild);

                // Set rank and time from parsed data.
                guild.Rank = record.ParsedData.rank;
                guild.ImportLastRankChange(record.ParsedData.timeOfLastRankChange);
            }
        }
Beispiel #19
0
        public FlynsarmyGuildServicePopupWindow(IUserInterfaceManager uiManager, StaticNPC npc, FactionFile.GuildGroups guildGroup, int buildingFactionId)
            : base(uiManager, npc, guildGroup, buildingFactionId)
        {
            playerEntity = GameManager.Instance.PlayerEntity;
            guildManager = GameManager.Instance.GuildManager;

            serviceNPC     = npc;
            npcService     = (GuildNpcServices)npc.Data.factionID;
            currentService = Services.GetService(npcService);
            Debug.Log("NPC offers guild service: " + currentService.ToString());

            this.guildGroup        = guildGroup;
            this.buildingFactionId = buildingFactionId;

            guild = guildManager.GetGuild(guildGroup, buildingFactionId);
        }
 public void RemoveMembership(Guild guild)
 {
     FactionFile.GuildGroups guildGroup = FactionFile.GuildGroups.None;
     foreach (FactionFile.GuildGroups group in memberships.Keys)
     {
         if (memberships[group] == guild)
         {
             guildGroup = group;
             break;
         }
     }
     if (guildGroup != FactionFile.GuildGroups.None)
     {
         memberships.Remove(guildGroup);
     }
 }
            public static string Execute(params string[] args)
            {
                if (args.Length == 0)
                {
                    return(HelpCommand.Execute(name));
                }
                else
                {
                    GuildManager guildManager = GameManager.Instance.GuildManager;

                    // Is the group a guild group?
                    if (Enum.IsDefined(typeof(FactionFile.GuildGroups), args[0]))
                    {
                        FactionFile.GuildGroups guildGroup = (FactionFile.GuildGroups)Enum.Parse(typeof(FactionFile.GuildGroups), args[0]);

                        if (guildManager.HasJoined(guildGroup))
                        {
                            return("Already a member.");
                        }
                        else if (guildGroup == FactionFile.GuildGroups.HolyOrder || guildGroup == FactionFile.GuildGroups.KnightlyOrder)
                        {
                            if (args.Length > 1)
                            {
                                int    factionId = int.Parse(args[1]);
                                IGuild guild     = guildManager.JoinGuild(guildGroup, factionId);
                                guildManager.AddMembership(guildGroup, guild);
                                return("Guild joined.");
                            }
                            else
                            {
                                return("Need a faction id for temples & knightly orders.");
                            }
                        }
                        else
                        {
                            IGuild guild = guildManager.JoinGuild(guildGroup);
                            guildManager.AddMembership(guildGroup, guild);
                            return("Guild " + guildGroup.ToString() + " joined.");
                        }
                    }
                    else
                    {
                        return("Not a recognised guild group, see FactionFile.GuildGroups enum.");
                    }
                }
            }
 /// <summary>
 /// Retrieve the guild object for the given faction id.
 /// </summary>
 public IGuild GetGuild(int factionId)
 {
     try {
         FactionFile.GuildGroups guildGroup = GetGuildGroup(factionId);
         if (guildGroup == FactionFile.GuildGroups.None)
         {
             return(guildNotMember);
         }
         else
         {
             return(GetGuild(guildGroup, factionId));
         }
         // Catch erroneous faction data entries. (e.g. #91)
     } catch (ArgumentOutOfRangeException e) {
         DaggerfallUnity.LogMessage(e.Message, true);
         return(guildNotMember);
     }
 }
            public static string Execute(params string[] args)
            {
                if (args.Length != 2)
                {
                    return(HelpCommand.Execute(name));
                }
                else
                {
                    GuildManager guildManager = GameManager.Instance.GuildManager;
                    PlayerEntity playerEntity = GameManager.Instance.PlayerEntity;

                    // Is the group a guild group?
                    if (Enum.IsDefined(typeof(FactionFile.GuildGroups), args[0]))
                    {
                        FactionFile.GuildGroups guildGroup = (FactionFile.GuildGroups)Enum.Parse(typeof(FactionFile.GuildGroups), args[0]);

                        if (guildManager.HasJoined(guildGroup))
                        {
                            int newRank = int.Parse(args[1]);
                            if (newRank > 0 && newRank < 10)
                            {
                                IGuild guild  = guildManager.GetGuild(guildGroup);
                                int    rep    = guild.GetReputation(playerEntity);
                                int    newRep = Guild.rankReqReputation[newRank];
                                playerEntity.FactionData.ChangeReputation(guild.GetFactionId(), newRep - rep, true);
                                guild.Rank = newRank;
                                return("Rank & reputation updated.");
                            }
                            else
                            {
                                return("Rank must be between 1 and 9.");
                            }
                        }
                        else
                        {
                            return("Not a member of that guild.");
                        }
                    }
                    else
                    {
                        return("Not a recognised guild group, see FactionFile.GuildGroups enum.");
                    }
                }
            }
        public DaggerfallGuildServicePopupWindow(IUserInterfaceManager uiManager, StaticNPC npc, FactionFile.GuildGroups guildGroup, int buildingFactionId)
            : base(uiManager)
        {
            playerEntity = GameManager.Instance.PlayerEntity;
            guildManager = GameManager.Instance.GuildManager;

            serviceNPC = npc;
            npcService = (GuildNpcServices)npc.Data.factionID;
            service    = Services.GetService(npcService);
            Debug.Log("NPC offers guild service: " + service.ToString());

            this.guildGroup        = guildGroup;
            this.buildingFactionId = buildingFactionId;

            guild = guildManager.GetGuild(guildGroup, buildingFactionId);

            // Clear background
            ParentPanel.BackgroundColor = Color.clear;
        }
        /// <summary>
        /// Get a random quest for a guild from appropriate subset.
        /// </summary>
        public Quest GetGuildQuest(FactionFile.GuildGroups guildGroup, MembershipStatus status, int factionId, int rep)
        {
#if UNITY_EDITOR    // Reload every time when in editor
            LoadQuestLists();
#endif
            List <QuestData> guildQuests;
            if (guilds.TryGetValue(guildGroup, out guildQuests))
            {
                MembershipStatus tplMemb = (guildGroup == FactionFile.GuildGroups.HolyOrder && status != MembershipStatus.Nonmember) ? MembershipStatus.Member : status;
                List <QuestData> pool    = new List <QuestData>();
                foreach (QuestData quest in guildQuests)
                {
                    if ((status == (MembershipStatus)quest.membership || tplMemb == (MembershipStatus)quest.membership) &&
                        (rep >= quest.minRep || status == MembershipStatus.Nonmember) &&
                        (!quest.unitWildC || rep < quest.minRep + 10))
                    {
                        pool.Add(quest);
                    }
                }
                Debug.Log("Quest pool has " + pool.Count);
                // Choose random quest from pool and try to parse it
                if (pool.Count > 0)
                {
                    QuestData questData = pool[UnityEngine.Random.Range(0, pool.Count)];
                    try
                    {
                        return(LoadQuest(questData, factionId));
                    }
                    catch (Exception ex)
                    {   // Log exception
                        DaggerfallUnity.LogMessage("Exception during quest compile: " + ex.Message, true);
                    }
                }
            }
            return(null);
        }
 public void AddMembership(FactionFile.GuildGroups guildGroup, IGuild guild)
 {
     guild.Join();
     memberships[guildGroup] = guild;
 }
Beispiel #27
0
        /// <summary>
        /// Get a random quest for a guild from appropriate subset.
        /// </summary>
        public Quest GetGuildQuest(FactionFile.GuildGroups guildGroup, MembershipStatus status, int factionId, int rep, int rank)
        {
            List <QuestData> pool = GetGuildQuestPool(guildGroup, status, factionId, rep, rank);

            return(SelectQuest(pool, factionId));
        }
        // Player has clicked on a static NPC
        void StaticNPCClick(StaticNPC npc)
        {
            // Do nothing if no NPC passed or fade in progress
            // Quest machine does not tick while fading (to prevent things happening while screen is black)
            // But this can result in player clicking a quest NPC before quest state ticks after load and breaking quest
            if (!npc || DaggerfallUI.Instance.FadeInProgress)
            {
                return;
            }

            // Store the NPC just clicked in quest engine
            QuestMachine.Instance.LastNPCClicked = npc;

            // Check if this NPC is a quest giver and show temp guild quest popup
            // This will be changed later when temp guild system replaced with real thing
            if (QuestorCheck(npc))
            {
                return;
            }

            // Handle quest NPC click and exit if linked to a Person resource
            QuestResourceBehaviour questResourceBehaviour = npc.gameObject.GetComponent <QuestResourceBehaviour>();

            if (questResourceBehaviour)
            {
                if (TriggerQuestResourceBehaviourClick(questResourceBehaviour))
                {
                    return;
                }
            }

            // Do nothing further if a quest is actively listening on this individual NPC
            // This NPC not reserved as a Person resource but has a WhenNpcIsAvailable action listening on it
            // This effectively shuts down several named NPCs during main quest, but not trivial to otherwise determine appropriate access
            // TODO: Try to find a good solution for releasing listeners when the owning action is disabled
            if (QuestMachine.Instance.HasFactionListener(npc.Data.factionID))
            {
                return;
            }

            // Get faction data.
            FactionFile.FactionData factionData;
            if (playerEnterExit.IsPlayerInsideBuilding &&
                GameManager.Instance.PlayerEntity.FactionData.GetFactionData(npc.Data.factionID, out factionData))
            {
                UserInterfaceManager uiManager = DaggerfallUI.Instance.UserInterfaceManager;
                Debug.LogFormat("faction id: {0}, social group: {1}, guild: {2}",
                                npc.Data.factionID, (FactionFile.SocialGroups)factionData.sgroup, (FactionFile.GuildGroups)factionData.ggroup);

                // Check if the NPC offers a guild service.
                if (Enum.IsDefined(typeof(GuildServices), npc.Data.factionID))
                {
                    FactionFile.GuildGroups guild   = (FactionFile.GuildGroups)factionData.ggroup;
                    GuildServices           service = (GuildServices)npc.Data.factionID;
                    Debug.Log("NPC offers guild service: " + service.ToString());
                    uiManager.PushWindow(new DaggerfallGuildServicePopupWindow(uiManager, npc, guild, service));
                }
                // Check if this NPC is a merchant.
                else if ((FactionFile.SocialGroups)factionData.sgroup == FactionFile.SocialGroups.Merchants)
                {
                    // Shop?
                    if (RMBLayout.IsShop(playerEnterExit.BuildingDiscoveryData.buildingType))
                    {
                        if (RMBLayout.IsRepairShop(playerEnterExit.BuildingDiscoveryData.buildingType))
                        {
                            uiManager.PushWindow(new DaggerfallMerchantRepairPopupWindow(uiManager, npc));
                        }
                        else
                        {
                            uiManager.PushWindow(new DaggerfallMerchantServicePopupWindow(uiManager, npc, DaggerfallMerchantServicePopupWindow.Services.Sell));
                        }
                    }
                    // Bank?
                    else if (playerEnterExit.BuildingDiscoveryData.buildingType == DFLocation.BuildingTypes.Bank)
                    {
                        uiManager.PushWindow(new DaggerfallMerchantServicePopupWindow(uiManager, npc, DaggerfallMerchantServicePopupWindow.Services.Banking));
                    }
                    // Tavern?
                    else if (playerEnterExit.BuildingDiscoveryData.buildingType == DFLocation.BuildingTypes.Tavern)
                    {
                        // for now only talk to all npc in taverns - TODO: add tavern option in here
                        GameManager.Instance.TalkManager.TalkToStaticNPC(npc);
                    }
                }
                // TODO - more checks for npc social types?
                else // if no special handling had to be done for npc with social group of type merchant: talk to the static npc
                {
                    GameManager.Instance.TalkManager.TalkToStaticNPC(npc);
                }
            }
            else // if no special handling had to be done (all remaining npcs of the remaining social groups not handled explicitely above): default is talk to the static npc
            {
                // with one exception: guards
                if (npc.Data.billboardArchiveIndex == 183 && npc.Data.billboardRecordIndex == 3) // detect if clicked guard (comment Nystul: didn't find a better mechanism than billboard texture check)
                {
                    return;                                                                      // if guard was clicked don't open talk window
                }
                // otherwise open talk window
                GameManager.Instance.TalkManager.TalkToStaticNPC(npc);
            }
        }
 public bool HasJoined(FactionFile.GuildGroups guildGroup)
 {
     return(memberships.ContainsKey(guildGroup));
 }