Esempio n. 1
0
    /// <summary>
    /// 将任务id push到队列中
    /// </summary>
    /// <param name="source"></param>
    /// <param name="targetTaskIDs"></param>
    /// <param name="targetTaskPoints"></param>
    private void PushDialoguePointTask(DialoguePoint source, Queue <int> targetTaskIDs = null, Queue <DialoguePoint> targetTaskPoints = null)
    {
        DialogueValue dialogueValue = dialogueStructData.SearchDialogueValueByID(source.dialogueID);

        if (targetTaskPoints != null && !targetTaskPoints.Contains(source))
        {
            targetTaskPoints.Enqueue(source);
        }
        int taskID;

        if (!string.IsNullOrEmpty(dialogueValue.otherValue) && int.TryParse(dialogueValue.otherValue, out taskID))
        {
            if (targetTaskIDs != null && !targetTaskIDs.Contains(taskID))
            {
                targetTaskIDs.Enqueue(taskID);
            }
        }
        if (source.childDialoguePoints != null && source.childDialoguePoints.Length > 0)//如果存在子节点
        {
            foreach (DialoguePoint childPoint in source.childDialoguePoints)
            {
                PushDialoguePointTask(childPoint, targetTaskIDs, targetTaskPoints);
            }
        }
    }
Esempio n. 2
0
    /// <summary>
    /// 判断指定的节点是否存在指定的任务
    /// </summary>
    /// <param name="target">查找的顶层节点</param>
    /// <param name="taskID">查找任务id</param>
    /// <param name="taskPoint">查找到的节点</param>
    /// <returns></returns>
    private bool DialoguePointHasThisTask(DialoguePoint target, string taskID, out DialoguePoint taskPoint)
    {
        taskPoint = null;
        if (string.IsNullOrEmpty(taskID))
        {
            return(false);
        }
        DialogueValue dialogueValue = dialogueStructData.SearchDialogueValueByID(target.dialogueID);

        if (!string.IsNullOrEmpty(dialogueValue.otherValue) && string.Equals(dialogueValue.otherValue.Trim(), taskID.Trim()))
        {
            taskPoint = target;
            return(true);
        }
        else
        {
            if (target.childDialoguePoints != null && target.childDialoguePoints.Length > 0)//如果存在子节点
            {
                foreach (DialoguePoint child in target.childDialoguePoints)
                {
                    bool result = DialoguePointHasThisTask(child, taskID, out taskPoint);
                    if (result)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
    }
 /// <summary>
 /// 初始化对话
 /// 展示如下对话
 /// </summary>
 /// <param name="dialogueCodition">对话数据</param>
 private void InitTalk(DialogueCondition dialogueCodition)
 {
     this.dialogueCodition = dialogueCodition;
     this.nowDialoguePoint = this.dialogueCodition.topPoint;
     showLeftOrRight       = true;
     ShowTalk();
 }
Esempio n. 4
0
    /// <summary>
    /// 初始化不显示的节点
    /// </summary>
    private void InitDontShowTalk(DialogueCondition dialogueCodition)
    {
        dontShowDialoguePointList = new List <DialoguePoint>();
        //查找所有的存在任务id的节点
        Queue <int>           taskIDQueue    = new Queue <int>();
        Queue <DialoguePoint> taskPointQueue = new Queue <DialoguePoint>();

        PushDialoguePointTask(dialogueCodition.topPoint, taskIDQueue, taskPointQueue);
        //判断可以接取的任务
        TaskMap.RunTimeTaskInfo[] runTimeTaskInfos = iNowTaskState.GetWaitTask(null);
        var waitTaskIDs     = runTimeTaskInfos.Select(temp => temp.ID);
        var waitTaskIDArray = waitTaskIDs.Intersect(taskIDQueue).ToArray();

        foreach (DialoguePoint dialoguePoint in taskPointQueue)
        {
            DialoguePoint tempDP = null;
            foreach (int taskID in waitTaskIDArray)
            {
                if (DialoguePointHasThisTask(dialoguePoint, taskID.ToString(), out tempDP))//如果找到了则直接返回
                {
                    break;
                }
            }
            //如果没有找到,则表示节点下没有任务或者只存在过期的任务,放入不显示节点中
            if (tempDP == null)
            {
                dontShowDialoguePointList.Add(dialoguePoint);
            }
        }
    }
Esempio n. 5
0
            public GameObject cinematic;                         // only applicable to the cinematic camera type

            // execute the camera action
            public override void Execute()
            {
                Interaction currentInteraction = Dialogue.GetActiveInteraction();

                if (null != currentInteraction)
                {
                    DialoguePoint currentDialoguePoint = currentInteraction.GetCurrentDialoguePoint();
                    Interaction.SetUpNewCamera(this, (null != currentDialoguePoint) ? currentDialoguePoint.caller : null, currentInteraction.GetAllDialoguePoints());
                }
            }
 /// <summary>
 /// 设置父节点
 /// </summary>
 /// <param name="parent"></param>
 public void SetParent(DialoguePoint parent)
 {
     this.parentDialoguePoint = parent;
     if (childDialoguePoints != null && childDialoguePoints.Length > 0)
     {
         foreach (DialoguePoint child in childDialoguePoints)
         {
             child.SetParent(this);
         }
     }
 }
 /// <summary>
 /// 下一个任务或结束任务
 /// </summary>
 void NextTalkOrEnd()
 {
     if (nowDialoguePoint.childDialoguePoints != null && nowDialoguePoint.childDialoguePoints.Length > 0)
     {
         nowDialoguePoint = nowDialoguePoint.childDialoguePoints[0];
         ShowTalk();
     }
     else
     {
         gameObject.SetActive(false);
         //接受任务
         //iNowTaskState.StartTask = runTimeTaskInfo.ID;
     }
 }
 /// <summary>
 /// 根据现有数据创建控件
 /// </summary>
 private void CreateControlByData()
 {
     int[] dialogueConditionIDs = dialogueAnalysisData.GetDialogueConditionAllID;
     foreach (int dialogueConditionID in dialogueConditionIDs)
     {
         DialogueCondition dialogueCondition = dialogueAnalysisData.GetDialogueConditionIDByID(dialogueConditionID);
         if (dialogueCondition == null)
         {
             continue;
         }
         DialogueConditionControl dialogueConditionControl = CreateNewTopNode(dialogueCondition, false);
         DialoguePoint            dialoguePoint            = dialogueCondition.topPoint;
         CreateControlByData(dialogueConditionControl, dialoguePoint);
         ResetControlRect(dialogueConditionControl.Parent);
         dialogueConditionControl.Parent.Refresh();
     }
     ResetBackRect();
 }
Esempio n. 9
0
    /// <summary>
    /// 初始化对话
    /// </summary>
    private void InitTalk()
    {
        fisrtKeyUP = false;
        int touchNPCID = iInteractiveState.ClickInteractiveNPCID;

        TaskMap.RunTimeTaskInfo[] runTimeTaskInfos = runtimeTasksData.GetAllToDoList()
                                                     .Where(temp => temp.TaskInfoStruct.ReceiveTaskNpcId == touchNPCID && temp.IsOver == false && temp.IsStart == false)
                                                     .ToArray();
        //首先选择
        TaskMap.RunTimeTaskInfo runTimeTaskInfo = runTimeTaskInfos.Where(temp => temp.TaskInfoStruct.TaskType == TaskMap.Enums.EnumTaskType.Spur).FirstOrDefault();
        if (runTimeTaskInfo == null)
        {
            runTimeTaskInfo = runTimeTaskInfos.Where(temp => temp.TaskInfoStruct.TaskType == TaskMap.Enums.EnumTaskType.Repeat).FirstOrDefault();
        }

        if (runTimeTaskInfo != null)
        {
            this.runTimeTaskInfo = runTimeTaskInfo;//这个表示当前的任务
            DialogueCondition[] dialogueConditions = dialogueStructData.SearchDialogueConditionsByNPCID(runTimeTaskInfo.TaskInfoStruct.ReceiveTaskNpcId,
                                                                                                        temp => temp.enumDialogueType == EnumDialogueType.Ask).ToArray();
            DialoguePoint taskPoint;
            dialogueCodition = dialogueConditions.Where(temp => DialoguePointHasThisTask(temp.topPoint, this.runTimeTaskInfo.ID.ToString(), out taskPoint)).FirstOrDefault();
            if (dialogueCodition != null)//如果存在该任务
            {
                this.nowDialoguePoint = this.dialogueCodition.topPoint;
                InitDontShowTalk(dialogueCodition);
                ShowTalk();
            }
            else
            {
                gameObject.SetActive(false);
            }
        }
        else
        {
            gameObject.SetActive(false);
        }
    }
        /// <summary>
        /// 设置(重建)对话节点的子节点数据
        /// </summary>
        /// <param name="parent">对话节点对象</param>
        /// <param name="childControls">子控件</param>
        private void SetDialoguePointData_Child(DialoguePoint parent, params Control[] childControls)
        {
            List <DialoguePoint> tempDialoguePointList = new List <DialoguePoint>();

            foreach (Control childControl in childControls)
            {
                DialoguePointControl pointControl = childControl as DialoguePointControl;
                if (pointControl == null)
                {
                    continue;
                }
                DialoguePoint childPoint = new DialoguePoint();
                childPoint.dialogueID = pointControl.GetDialogueValue().dialogueID;
                tempDialoguePointList.Add(childPoint);
                if (childControl.Tag != null &&
                    childControl.Tag.GetType().Equals(typeof(List <Control>)) &&
                    (childControl.Tag as List <Control>).Count > 0)
                {
                    SetDialoguePointData_Child(childPoint, (childControl.Tag as List <Control>).ToArray());
                }
            }
            parent.childDialoguePoints = tempDialoguePointList.ToArray();
        }
 /// <summary>
 /// 设置数据
 /// 传入ToString函数返回的字符串
 /// </summary>
 /// <param name="data">数据字符串</param>
 public void SetData(string data)
 {
     if (data.Length > 2)
     {
         data = data.Trim().Remove(0, 1);
         data = data.Remove(data.Length - 1, 1);
         int splitIndex = data.IndexOf(idSplits);
         if (splitIndex > 0)
         {
             bool canSetID = int.TryParse(data.Substring(0, splitIndex), out dialogueID);
             if (canSetID)
             {
                 string  nextStr    = data.Substring(splitIndex + 1, data.Length - (splitIndex + 1));
                 int[][] splitArray = GetNextStringSplit(nextStr);
                 childDialoguePoints = new DialoguePoint[splitArray.GetLength(0)];
                 for (int i = 0; i < childDialoguePoints.Length; i++)
                 {
                     childDialoguePoints[i] = new DialoguePoint();
                     childDialoguePoints[i].SetData(nextStr.Substring(splitArray[i][0], splitArray[i][1]));
                 }
             }
         }
     }
 }
Esempio n. 12
0
    /// <summary>
    /// 展示对话
    /// </summary>
    private void ShowTalk()
    {
        DialogueValue dialogueValue = dialogueStructData.SearchDialogueValueByID(nowDialoguePoint.dialogueID);

        titleText.text = dialogueValue.showValue;
        int childCount = selectItemBackTrans.childCount;

        Transform[] childTransfroms = new Transform[childCount];
        for (int i = 0; i < childCount; i++)
        {
            childTransfroms[i] = selectItemBackTrans.GetChild(i);
        }
        for (int i = 0; i < childCount; i++)
        {
            if (!Transform.Equals(childTransfroms[i], exampleItemObj.transform))//如果不是例子对象则销毁
            {
                GameObject.DestroyImmediate(childTransfroms[i].gameObject);
            }
        }
        showItemList.Clear();
        //添加
        Action <string, Action <Transform> > AddItemAction = (showValue, ClickCallback) =>
        {
            GameObject createItemObj = GameObject.Instantiate <GameObject>(exampleItemObj);
            createItemObj.transform.SetParent(selectItemBackTrans);
            createItemObj.SetActive(true);
            Transform itemTextTrans = createItemObj.transform.GetChild(0);
            Text      itemText      = itemTextTrans.GetComponent <Text>();
            itemText.text = showValue;
            showItemList.Add(createItemObj.transform);
            //添加事件
            EventTrigger eventTrigger = createItemObj.AddComponent <EventTrigger>();
            eventTrigger.triggers = new List <EventTrigger.Entry>();
            //点击事件
            EventTrigger.Entry entry_Click = new EventTrigger.Entry();
            entry_Click.eventID  = EventTriggerType.PointerClick;
            entry_Click.callback = new EventTrigger.TriggerEvent();
            entry_Click.callback.AddListener(temp => ClickCallback(createItemObj.transform));
            eventTrigger.triggers.Add(entry_Click);
            //鼠标进入事件
            EventTrigger.Entry entry_Enter = new EventTrigger.Entry();
            entry_Enter.eventID  = EventTriggerType.PointerEnter;
            entry_Enter.callback = new EventTrigger.TriggerEvent();
            entry_Enter.callback.AddListener(temp =>
            {
                createItemObj.GetComponent <Image>().color = new Color(1, 1, 1, 0.4f);
                selectItemIndex = showItemList.IndexOf(createItemObj.transform);
            });
            eventTrigger.triggers.Add(entry_Enter);
            //鼠标离开事件
            EventTrigger.Entry entry_Leave = new EventTrigger.Entry();
            entry_Leave.eventID  = EventTriggerType.PointerExit;
            entry_Leave.callback = new EventTrigger.TriggerEvent();
            entry_Leave.callback.AddListener(temp => createItemObj.GetComponent <Image>().color = new Color(1, 1, 1, 0));
            eventTrigger.triggers.Add(entry_Leave);
        };

        DialoguePoint[] childPoints = nowDialoguePoint.childDialoguePoints;
        foreach (DialoguePoint dialoguePoint in childPoints)       //便利添加子选项
        {
            if (dontShowDialoguePointList.Contains(dialoguePoint)) //不显示的不添加
            {
                continue;
            }
            DialogueValue childDialogueValue = dialogueStructData.SearchDialogueValueByID(dialoguePoint.dialogueID);
            AddItemAction(childDialogueValue.titleValue, temp =>
            {
                int index = showItemList.IndexOf(temp);
                DialoguePoint[] nowShowChildsPoints = nowDialoguePoint.childDialoguePoints.Where(point => !dontShowDialoguePointList.Contains(point)).ToArray();
                if (index < 0 || index >= nowShowChildsPoints.Length)
                {
                    return;
                }

                DialoguePoint clickPoint = nowShowChildsPoints[index];
                if (clickPoint.childDialoguePoints == null || clickPoint.childDialoguePoints.Length == 0) //如果有任务则接取,如果没有则不做处理
                {
                    DialogueValue clickValue = dialogueStructData.SearchDialogueValueByID(clickPoint.dialogueID);
                    if (!string.IsNullOrEmpty(clickValue.otherValue))
                    {
                        int taskID = -1;
                        if (int.TryParse(clickValue.otherValue, out taskID))
                        {
                            TaskMap.RunTimeTaskInfo runTimeTaskInfo = runtimeTasksData.GetTasksWithID(taskID);
                            if (runTimeTaskInfo != null && runTimeTaskInfo.IsOver == false && runTimeTaskInfo.IsStart == false)
                            {
                                iNowTaskState.StartTask = runTimeTaskInfo.ID;
                                gameObject.SetActive(false);
                            }
                        }
                    }
                }
                else //继续进入下面节点
                {
                    nowDialoguePoint = clickPoint;
                    ShowTalk();
                }
            });
        }
        //最后添加一个返回选项
        AddItemAction("返回", temp =>
        {
            if (nowDialoguePoint.parentDialoguePoint != null)
            {
                nowDialoguePoint = nowDialoguePoint.parentDialoguePoint;
                ShowTalk();
            }
            else
            {
                gameObject.SetActive(false);
            }
        });
        StartCoroutine(UpdateContentSizeFitter(panelContentSizeFitter));
        //选择第一个下标
        selectItemIndex = 0;
        SetSelectItemIndex();
    }
    /// <summary>
    /// 设置数据
    /// 传入ToString函数返回的字符串
    /// </summary>
    /// <param name="data">数据字符串</param>
    public void SetData(string data)
    {
        if (string.IsNullOrEmpty(data))
        {
            return;
        }
        string[]   lines       = data.Split(relationLineSplit, StringSplitOptions.RemoveEmptyEntries);
        string[][] valuesArray = lines.Select(temp => temp.Split(relationValueSplit, StringSplitOptions.RemoveEmptyEntries))
                                 .Where(temp => temp.Length == 2).ToArray();
        foreach (string[] values in valuesArray)
        {
            switch (values[0])
            {
            case "topPoint":
                if (!string.IsNullOrEmpty(values[1]))
                {
                    topPoint = new DialoguePoint();
                    topPoint.SetData(values[1].Trim());
                }
                break;

            case "text":
                text = values[1].Trim();
                break;

            case "touchNPCID":
                int.TryParse(values[1].Trim(), out touchNPCID);
                break;

            case "enumDialogueType":
                try { enumDialogueType = (EnumDialogueType)Enum.Parse(typeof(EnumDialogueType), values[1].Trim()); } catch { }
                break;

            case "maxLevel":
                int.TryParse(values[1].Trim(), out maxLevel);
                break;

            case "minLevel":
                int.TryParse(values[1].Trim(), out minLevel);
                break;

            case "overTask":
                int.TryParse(values[1].Trim(), out overTask);
                break;

            case "thisTask":
                int.TryParse(values[1].Trim(), out thisTask);
                break;

            case "minGoodAndEvil":
                int.TryParse(values[1].Trim(), out minGoodAndEvil);
                break;

            case "maxGoodAndEvil":
                int.TryParse(values[1].Trim(), out maxGoodAndEvil);
                break;

            case "race":
                try { race = (RoleOfRace)Enum.Parse(typeof(RoleOfRace), values[1].Trim()); } catch { }
                break;
            }
        }

        //递归设置父节点
        if (topPoint != null)
        {
            topPoint.SetParent(null);
        }
    }
        /// <summary>
        /// 保存方案
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 保存方案ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //重建对话关系数据集合以及对话数据字典
            List <DialogueCondition>        dialogueConditionList = new List <DialogueCondition>();
            Dictionary <int, DialogueValue> dialogueValueDic      = new Dictionary <int, DialogueValue>();

            foreach (Panel panel in FlowLayoutPanel_Main.Controls.OfType <Panel>())
            {
                DialogueConditionControl dialogueConditionContorl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault();
                if (dialogueConditionContorl == null)
                {
                    continue;
                }
                //对话条件
                DialogueCondition dialogueCondition = dialogueConditionContorl.GetDialogueCondition();
                //对话关系
                if (dialogueConditionContorl.Tag != null &&
                    dialogueConditionContorl.Tag.GetType().Equals(typeof(List <Control>)) &&
                    (dialogueConditionContorl.Tag as List <Control>).Count > 0)
                {
                    List <Control>       childControlList = dialogueConditionContorl.Tag as List <Control>;
                    DialoguePointControl topPointControl  = childControlList[0] as DialoguePointControl;
                    if (topPointControl != null)
                    {
                        DialoguePoint topPoint = new DialoguePoint();
                        topPoint.dialogueID = topPointControl.GetDialogueValue().dialogueID;
                        if (childControlList[0].Tag != null &&
                            childControlList[0].Tag.GetType().Equals(typeof(List <Control>)) &&
                            (childControlList[0].Tag as List <Control>).Count > 0)
                        {
                            SetDialoguePointData_Child(topPoint, (childControlList[0].Tag as List <Control>).ToArray());
                        }
                        dialogueCondition.topPoint = topPoint;
                    }
                }
                else
                {
                    dialogueCondition.topPoint = null;
                }
                dialogueConditionList.Add(dialogueCondition);
                //对话数据
                foreach (DialoguePointControl dialoguePointControl in panel.Controls.OfType <DialoguePointControl>())
                {
                    DialoguePointControl topPointControl = dialoguePointControl as DialoguePointControl;
                    if (topPointControl != null)
                    {
                        if (!dialogueValueDic.ContainsKey(topPointControl.GetDialogueValue().dialogueID))
                        {
                            dialogueValueDic.Add(topPointControl.GetDialogueValue().dialogueID, topPointControl.GetDialogueValue());
                        }
                    }
                }
            }
            dialogueAnalysisData.ResetData(dialogueConditionList, dialogueValueDic);
            string dialogueConditionStr, dialogueValueStr;

            dialogueAnalysisData.GetData(out dialogueConditionStr, out dialogueValueStr);
            //保存
            string folderPath = Path.GetDirectoryName(projectPath);

            File.WriteAllText(folderPath + "\\" + dialogueConditionFileName + ".txt", dialogueConditionStr, Encoding.UTF8);
            File.WriteAllText(folderPath + "\\" + dialogueValueFileName + ".txt", dialogueValueStr, Encoding.UTF8);
        }