Пример #1
0
    public void OpenAnswerWindow(int answerId, Action callBack)
    {
        DialogueAnswersConfig dac = ConfigManager.Get <DialogueAnswersConfig>(answerId);

        if (dac == null)
        {
            Logger.LogError("Dating::  在DialogueAnswersConfig表中,找不到 id={0} 的配置,请检查配置", answerId);
            return;
        }
        CurDialogueAnswersData = dac;
        m_OnCompleteCallBack   = callBack;
        var listAllAnswerItems = new List <DialogueAnswersConfig.AnswerItem>();
        //检查有无问题选项
        bool bHaveAnswerItem = CheckAnserItems(dac.answerItems);

        if (bHaveAnswerItem)
        {
            Module_Npc.NpcMessage npc = null;
            if (moduleNpc.curNpc == null)
            {
                npc = moduleNpc.GetTargetNpc((NpcTypeID)moduleNPCDating.curDatingNpc?.npcId);
            }
            else
            {
                npc = moduleNpc.curNpc;
            }

            //有问题选项,判断每个问题是否符合限制条件
            for (int i = 0; i < dac.answerItems.Length; i++)
            {
                bool bGoodFeeling = CheckGoodFeelingLimit(npc.nowFetterValue, dac.answerItems[i].goodFeelingLimits);
                bool bMotion      = CheckMotionLimit(npc.mood, dac.answerItems[i].motionLimit);
                if (bGoodFeeling && bMotion)
                {
                    listAllAnswerItems.Add(dac.answerItems[i]);
                }
            }

            //如果有符合条件的选项,进一步筛选
            if (listAllAnswerItems.Count > 0)
            {
                AllAnswerItemDataList = GetFinalAnswerItemsList(listAllAnswerItems, dac);
                if (AllAnswerItemDataList.Count > 0)
                {
                    OpenAnswerWindow();
                }
            }
            else
            {
                Logger.LogError("Dating::  answerId={0} 的配置中,符合条件的问题选项为空,请检查配置条件", answerId);
            }
        }
        else
        {
            OnChooseAnswerCallBack();
        }
    }
Пример #2
0
    private List <DialogueAnswersConfig.AnswerItem> GetItemByWeight(List <DialogueAnswersConfig.AnswerItem> items, DialogueAnswersConfig dac)
    {
        if (items == null || items.Count <= 0)
        {
            return(null);
        }

        if (dac.randAnswerCount == 0)
        {
            Logger.LogError("Dating::  在DialogueAnswersConfig id={0}的配置中,需要计算权重的问题数量为0,请检查配置", dac.ID);
            return(null);
        }

        if (dac.randAnswerCount > items.Count)
        {
            Logger.LogError("Dating::  在DialogueAnswersConfig id={0}的配置中,需要计算权重的问题数量超过配置的问题数量,请检查配置", CurDialogueAnswersData.ID);
            return(null);
        }

        List <DialogueAnswersConfig.AnswerItem> sourceItems = items;
        List <DialogueAnswersConfig.AnswerItem> listItems   = new List <DialogueAnswersConfig.AnswerItem>();

        DialogueAnswersConfig.AnswerItem lastItem = null;
        int answerCount = 0;//用于计数

        while (answerCount < dac.randAnswerCount)
        {
            DialogueAnswersConfig.AnswerItem item = _GetItemByWeight(sourceItems);
            if (lastItem != null && lastItem.id != item.id)
            {
                listItems.Add(item);
                sourceItems.Remove(item);
                answerCount++;
            }
            lastItem = item;
        }

        return(listItems);
    }
Пример #3
0
    private List <DialogueAnswersConfig.AnswerItem> GetFinalAnswerItemsList(List <DialogueAnswersConfig.AnswerItem> allListItems, DialogueAnswersConfig dac)
    {
        List <DialogueAnswersConfig.AnswerItem> listFinalAnswerItem = new List <DialogueAnswersConfig.AnswerItem>();
        //需要计算权重的Item
        List <DialogueAnswersConfig.AnswerItem> listNeedCalWeightAnswerItem = new List <DialogueAnswersConfig.AnswerItem>();

        for (int i = 0; i < allListItems.Count; i++)
        {
            if (allListItems[i].rate == 0)
            {
                listFinalAnswerItem.Add(allListItems[i]);
            }
            else
            {
                listNeedCalWeightAnswerItem.Add(allListItems[i]);
            }
        }

        //如果需要执行出现次数检查,如果上次有出现的选项,这次不再出现
        if (dac.needCheckCount == 1)
        {
            Logger.LogDetail("Dating::  Answer表 id={0} 中needCheckCount = 1,这里会筛选掉上一次出现的问题选项,请留意", dac.ID);
            DialogueAnswersConfig.AnswerItem d = listNeedCalWeightAnswerItem.Find((item) => item.id == lastSelectAnswerId);
            if (d != null)
            {
                listNeedCalWeightAnswerItem.Remove(d);
                lastSelectAnswerId = 0;
            }
        }

        //通过权重筛选出符合数量的item集合
        List <DialogueAnswersConfig.AnswerItem> weightItems = GetItemByWeight(listNeedCalWeightAnswerItem, dac);

        if (weightItems != null && weightItems.Count > 0)
        {
            listFinalAnswerItem.AddRange(weightItems);
        }

        return(listFinalAnswerItem);
    }