Example #1
0
 private void OnClickItem(DialogueAnswersConfig.AnswerItem data = null)
 {
     m_bStartCountTime = false;
     m_dataSource.Clear();
     Hide <Window_AnswerOption>();
     moduleAnswerOption.ClickItem(data);
 }
    public void ClickItem(DialogueAnswersConfig.AnswerItem data)
    {
        int itemId = data == null ? 0 : data.id;

        if (dicClickId.ContainsKey(CurDialogueAnswersData.ID))
        {
            dicClickId[CurDialogueAnswersData.ID] = itemId;
        }
        else
        {
            dicClickId.Add(CurDialogueAnswersData.ID, itemId);
        }

        EnumAnswerType itemType = data == null ? EnumAnswerType.None : data.answerType;

        if (dicClickType.ContainsKey(CurDialogueAnswersData.ID))
        {
            dicClickType[CurDialogueAnswersData.ID] = (int)itemType;
        }
        else
        {
            dicClickType.Add(CurDialogueAnswersData.ID, (int)itemType);
        }

        //只有可以检查的时候才会记录上一次选择的问题选项
        if (CurDialogueAnswersData.needCheckCount == 1)
        {
            Logger.LogDetail("Dating::  在配置表DialogueAnswersConfig id={0} 的配置中,会记录本次选择问题的选项,请知悉", CurDialogueAnswersData.ID);
            lastSelectAnswerId = data == null ? 0 : data.id;
        }

        //把选项发送给服务器
        SendSelectAnswer(CurDialogueAnswersData.ID, data == null ? 0 : data.id);

        //如果图书馆选择检测错误答案,给服务器发送消息
        if (data != null && data.answerType == EnumAnswerType.Library_Wrong)
        {
            SendLibWrongAnswer();
        }

        //占卜屋占卜
        if (data != null && data.answerType == EnumAnswerType.Divination_CrystalBall)
        {
            moduleNPCDating.GetDivinationResult(EnumDivinationType.CrystalDevine, OnChooseAnswerCallBack);
        }
        else if (data != null && data.answerType == EnumAnswerType.Divination_ImperialGuard)
        {
            moduleNPCDating.GetDivinationResult(EnumDivinationType.LotDevine, OnChooseAnswerCallBack);
        }
        else
        {
            OnChooseAnswerCallBack();
        }
    }
    private DialogueAnswersConfig.AnswerItem _GetItemByWeight(List <DialogueAnswersConfig.AnswerItem> items)
    {
        if (items.Count == 1)
        {
            return(items[0]);
        }
        //计算总权重
        float sumWeight = 0;

        for (int i = 0; i < items.Count; i++)
        {
            if (items[i].rate == 0)
            {
                return(items[i]);
            }
            sumWeight += items[i].rate;
        }

        //产生随机数
        float randomNumber = UnityEngine.Random.Range(0, sumWeight);

        float d1 = 0;
        float d2 = 0;

        DialogueAnswersConfig.AnswerItem item = null;
        for (int i = 0; i < items.Count; i++)
        {
            d2 += items[i].rate;
            if (i == 0)
            {
                d1 = 0;
            }
            else
            {
                d1 += items[i - 1].rate;
            }
            if (randomNumber >= d1 && randomNumber <= d2)
            {
                item = items[i];
                break;
            }
        }
        return(item);
    }
    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);
    }
    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);
    }
Example #6
0
 private void OnClickItem(RectTransform node, DialogueAnswersConfig.AnswerItem data)
 {
     OnClickItem(data);
 }
Example #7
0
    private void SetItemData(RectTransform node, DialogueAnswersConfig.AnswerItem data)
    {
        Text t = node.Find("Text").GetComponent <Text>();

        Util.SetText(t, data.nameId);
    }