Ejemplo n.º 1
0
    void AddRule_ChooseReaction(int windowId)
    {
        GUILayout.Label("Choose Reaction " + (currentSelectedReactionTypeIndex + 1));

        GUILayout.FlexibleSpace();

        GUILayout.BeginHorizontal();

        // if adding to an existing event
        if (addRule_selectedEventId > -1 && addRule_selectedEventId < eventData.Count)
        {
            // get index of event type name, set the right event type int
            addRule_selectedEventType = eventTypes.FindIndex(item => item == eventData[addRule_selectedEventId].type);
        }

        int curSelReactionIndex = currentSelectedReactionTypeIndex;
        addRule_selectedReactionTypes[curSelReactionIndex] = GUILayout.SelectionGrid(addRule_selectedReactionTypes[curSelReactionIndex],
            reactionNames, 3, selectionGridStyle);

        GUILayout.EndHorizontal();

        GUILayout.FlexibleSpace();

        GUILayout.BeginHorizontal();

        if (GUILayout.Button("Cancel", GUILayout.Height(70), GUILayout.Width(100)))
        {
            GuiState = RuleGUIState.RULES;
            currentSelectedReactionTypeIndex = 0;
            addRule_selectedReactionTypes.Clear();
            addRule_selectedEventType = 0;
            addRule_selectedEventId = -1;
        }

        GUILayout.Space(10);

        if ((addRule_selectedEventId == -1 || currentSelectedReactionTypeIndex > 0) && GUILayout.Button("Back", GUILayout.Width(100), GUILayout.Height(70)))
        {
            if (currentSelectedReactionTypeIndex > 0) currentSelectedReactionTypeIndex--;
            else GuiState = RuleGUIState.ADDRULE_1;
        }

        GUILayout.FlexibleSpace();

        if (addRule_selectedEventId > -1 && currentSelectedReactionTypeIndex < addRule_selectedReactionTypes.Count - 1)
        {
            if (GUILayout.Button("Next", GUILayout.Height(70), GUILayout.Width(100)))
                currentSelectedReactionTypeIndex++;
        }
        else if (GUILayout.Button("Add another reaction", GUILayout.Height(70)))
        {
            currentSelectedReactionTypeIndex++;
            addRule_selectedReactionTypes.Add(0);
        }

        GUILayout.Space(10);

        string finishButtonText = "Add " + (addRule_selectedReactionTypes.Count) + " reaction(s)";
        if (GUILayout.Button(finishButtonText, GUILayout.Width(100), GUILayout.Height(70)))
        {
            RuleGenerator generator = GetComponent<RuleGenerator>();

            BaseRuleElement.EventData newEvent;
            if (addRule_selectedEventId == -1)
            {
                newEvent = new BaseRuleElement.EventData()
                {
                    type = RuleParserLinq.ReflectOverSeveralNamespaces(eventNames[addRule_selectedEventType], RuleParserLinq.ExtraNamespaces),
                    id = generator.GetEventId(),
                    actorId = -1
                };

                newEvent.label = newEvent.type.ToString();
                newEvent.parameters = new List<BaseRuleElement.Param>();

                eventData.Add(newEvent);

                // sort evetn data
                eventData.Sort(new BaseRuleElement.OrderComparer<BaseRuleElement.EventData>());

                generator.AddEventToScene(newEvent);

                // add to lookup dict
                if (actorEventDict.ContainsKey(newEvent.actorId))
                {
                    actorEventDict[newEvent.actorId].Add(newEvent.id);
                }
                else
                {
                    actorEventDict.Add(newEvent.actorId, new List<int>() { newEvent.id });
                }

                Analytics.LogEvent(Analytics.ruleEvent, Analytics.add_event, newEvent.label);
            }
            else
            {
                // only adding new reaction, no event
                newEvent = eventData.Find(item => item.id == addRule_selectedEventId);
            }

            // add all new reactions
            for (int i = 0; i < addRule_selectedReactionTypes.Count; i++)
            {
                BaseRuleElement.ReactionData newReaction = new BaseRuleElement.ReactionData()
                {
                    type = RuleParserLinq.ReflectOverSeveralNamespaces(reactionNames[addRule_selectedReactionTypes[i]], RuleParserLinq.ExtraNamespaces),
                    id = generator.GetReactionId(),
                    actorId = 0, // HACK should be a global actor, not just actor 0
                    eventId = newEvent.id
                };
                newReaction.label = newReaction.type.ToString();
                newReaction.parameters = new List<BaseRuleElement.Param>();

                reactionData.Add(newReaction);

                generator.AddReactionToScene(newReaction);

                // add to lookup dicts
                if (eventReactionDict.ContainsKey(newReaction.eventId))
                {
                    eventReactionDict[newReaction.eventId].Add(newReaction.id);
                }
                else
                {
                    eventReactionDict.Add(newReaction.eventId, new List<int>() { newReaction.id });
                }

                if (actorReactionDict.ContainsKey(newReaction.actorId))
                {
                    actorReactionDict[newReaction.actorId].Add(newReaction.id);
                }
                else
                {
                    actorReactionDict.Add(newReaction.actorId, new List<int>() { newReaction.id });
                }

                Analytics.LogEvent(Analytics.ruleEvent, Analytics.add_reaction, newReaction.label);
            }

            GuiState = RuleGUIState.RULES;
            currentSelectedReactionTypeIndex = 0;
            addRule_selectedReactionTypes.Clear();
            addRule_selectedEventType = 0;
            addRule_selectedEventId = -1;
        }

        GUILayout.EndHorizontal();
    }
    private void ParseReactions(RuleGenerator generator, XElement xReactions)
    {
        BaseRuleElement.ReactionData currentReaction = new BaseRuleElement.ReactionData();
        foreach (XElement xReaction in xReactions.Elements("reaction"))
        {
            currentReaction.id = int.Parse(xReaction.Element("id").Value);
            currentReaction.label = xReaction.Element("label").Value;

        #if DEBUG
            Debug.Log("Processing reaction " + currentReaction.label + ".");
        #endif

            currentReaction.eventId = int.Parse(xReaction.Element("listenedEventId").Value);
            currentReaction.actorId = int.Parse(xReaction.Element("actorId").Value);

            currentReaction.type = ReflectOverSeveralNamespaces(xReaction.Element("type").Value, ExtraNamespaces);

            currentReaction.parameters = ParseParameters(xReaction);

            generator.AddRuleData(currentReaction);
        }
    }