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(); } }
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); }
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); }