private void GetRaw()
        {
            Type[] types = ReflectionHelper.GetAllSubclasses <ModularBehaviour>();
            if (_typeToggles == null)
            {
                _typeToggles = new TypeToggle[0];
            }
            for (int i = 0; i < types.Length; i++)
            {
                TypeToggle newToggle = new TypeToggle(types[i].Name, false);

                bool flag = false;
                foreach (TypeToggle t in _typeToggles)
                {
                    flag = t.Equals(newToggle);
                    if (flag)
                    {
                        break;
                    }
                }
                if (!flag)
                {
                    AddNew(types[i]);
                }
            }

            //_typeToggles.Sort();
        }
Пример #2
0
        public void RemoveFromSelectedBehaviours(TypeToggle typeToggle)
        {
            List <TypeToggle> tempCollection = _selectedBehavs.ToList();

            tempCollection.Remove(typeToggle);
            typeToggle.SetToggle(false);
            _selectedBehavs = tempCollection.ToArray();
        }
Пример #3
0
        public void AddToSelectedBehaviours(TypeToggle typeToggle)
        {
            List <TypeToggle> tempCollection = _selectedBehavs.ToList();

            tempCollection.Add(typeToggle);
            typeToggle.SetToggle(true);
            _selectedBehavs = tempCollection.ToArray();
            typeToggle.GetAllChildTypes();
        }
Пример #4
0
        protected virtual void DisplaySingleToggle(TypeToggle typeToggle)
        {
            string displayName =
                (typeToggle.IsRaw ? RAW_PREFIX : COMPOSED_PREFIX) +
                typeToggle.Name;

            typeToggle.SetToggle(EditorGUILayout.Toggle(displayName,
                                                        typeToggle.Toggle));
        }
Пример #5
0
    public override bool Equals(object obj)
    {
        TypeToggle objAsToggle = (TypeToggle)obj;

        if (obj == default)
        {
            return(false);
        }
        return(Name == objAsToggle.Name);
    }
Пример #6
0
 public bool SelectionContains(TypeToggle toggle)
 {
     for (int i = 0; i < _selectedBehavs.Length; i++)
     {
         if (toggle.Name == _selectedBehavs[i].Name)
         {
             return(true);
         }
     }
     return(false);
 }
Пример #7
0
 /// <summary>
 /// Draws a single Type Toggle
 /// </summary>
 /// <param name="t"></param>
 void DrawTypeFilter(TypeToggle t)
 {
     if (t == null)
     {
         return;
     }
     t.toggled = GUILayout.Toggle(t.toggled, t.type.Name);
     if (t.toggled)
     {
         filterCount++;
     }
 }
Пример #8
0
        private static IEnumerable <Type> GetAllTypesIn(ComposedBehavior composed)
        {
            for (int i = 0; i < composed.SelectedBehaviours.Length; i++)
            {
                TypeToggle toggle       = composed.SelectedBehaviours[i];
                Type[]     profileTypes = toggle.GetAllChildTypes();

                // Go through all the types
                for (int j = 0; j < profileTypes.Length; j++)
                {
                    yield return(profileTypes[j]);
                }
            }
        }
        protected override void DisplaySingleToggle(TypeToggle typeToggle)
        {
            bool   added       = _profile.SelectionContains(typeToggle);
            string displayName =
                (added ? "Remove :" : "Add :") +
                typeToggle.Name;

            if (GUILayout.Button(displayName))
            {
                if (added)
                {
                    _profile.RemoveFromSelectedBehaviours(typeToggle);
                }
                else
                {
                    _profile.AddToSelectedBehaviours(typeToggle);
                }
            }
        }
Пример #10
0
        /// <summary>
        /// Will generate a behaviour tree to the given core using the limbs
        /// and core's behaviours
        /// </summary>
        /// <param name="core">Target core</param>
        public static void GenerateTree(Core core)
        {
            /*
             * The tree works as follows:
             *
             * [X] - Random Selector
             * [>] - Sequential Selector
             *
             *            [>]Main Selector          --> Layer 0
             *             /            \
             *       [X]Attack          Idle        --> Layer 1
             *         Selector         Leaf
             *    /      |     \
             * [X]Shooter  [X]Brawler  [X]Tank             --> Layer 2
             * Selector    Selector    Selector
             |          |         |
             | ...        ...       ...               --> Layer 3...
             |
             | - All the behaviours and composed behaviours will be added to the
             | respective selector.
             |
             | - If a core has all limbs of its type it will be considered an elite
             | and add the type special composed behaviour.
             |
             | - The Layer 2 Selector chances will be determined by taking into
             | account the core type and limbs, the core having an weight of 0.8
             | while limbs have 0.2 (Do not mix weights with influences. Influences
             | were supposed to be the stats influence on the core, having nothing
             | to do with the tree).
             */

            BehaviourTree           tree;
            List <Type>             addedTypes;
            List <ComposedBehavior> composedBehaviors;

            tree              = core.gameObject.AddComponent <BehaviourTree>();
            addedTypes        = new List <Type>();
            composedBehaviors = new List <ComposedBehavior>();

            // Go through all the parts
            foreach (ModulariuPartProfile p in core.GetLimbProfiles())
            {
                // Gather the required types
                for (int i = 0; i < p.TypeToggles.Length; i++)
                {
                    TypeToggle toggle = p.TypeToggles[i];

                    // Is it selected?
                    if (!toggle.Toggle)
                    {
                        continue;
                    }

                    Debug.Log("Adding: " + toggle.Name);

                    Type[] profileTypes = toggle.GetAllChildTypes();

                    // Go through all the types
                    for (int j = 0; j < profileTypes.Length; j++)
                    {
                        Type t = profileTypes[j];
                        // Add it if it was not already added
                        if (!addedTypes.Contains(t))
                        {
                            addedTypes.Add(t);
                            AddTypeToCore(t, core);
                        }
                    }

                    if (!toggle.IsRaw)
                    {
                        if (!composedBehaviors.Contains(toggle.ComposedBehavior))
                        {
                            composedBehaviors.Add(toggle.ComposedBehavior);
                        }
                    }
                }
            }

            //TODO: Put bellow in another method

            float shooterChance;
            float brawlerChance;
            float tankChance;

            TreeSelector shooterSelector;
            TreeSelector brawlerSelector;
            TreeSelector tankSelector;

            TreeSelector   attackSelector;
            ITreeComponent idleBehaviour;

            TreeSelector mainSelector;

            idleBehaviour = core.gameObject.AddComponent <IdleBehaviour>();

            // Get the chances of each selector
            shooterChance =
                core.IsOfType(ModulariuType.Shooter) ?
                0.8f :
                0.1f;
            brawlerChance =
                core.IsOfType(ModulariuType.Brawler) ?
                0.8f :
                0.1f;
            tankChance =
                core.IsOfType(ModulariuType.Tank) ?
                0.8f :
                0.1f;

            if (core.HasShooterLimb)
            {
                shooterChance += 0.2f * core.ShooterLimbs;
            }
            if (core.HasBrawlerLimb)
            {
                brawlerChance += 0.2f * core.BrawlerLimbs;
            }
            if (core.HasTankLimb)
            {
                tankChance += 0.2f * core.TankLimbs;
            }

            // Initialize selectors
            shooterSelector = new TreeSelector(true, shooterChance);
            brawlerSelector = new TreeSelector(true, brawlerChance);
            tankSelector    = new TreeSelector(true, tankChance);
            attackSelector  = new TreeSelector(true, 1,
                                               shooterSelector, brawlerSelector, tankSelector);
            mainSelector = new TreeSelector(false, 1, attackSelector, idleBehaviour);

            // Set defaults and determine special abilities
            //Is Shooter?
            if (core.IsOfType(ModulariuType.Shooter))
            {
                // Is elite shooter
                if (core.ShooterLimbs > 2)
                {
                    shooterSelector
                    .AddNewOption(
                        CreateITreeComponentFromComposed(
                            core, _shooterSpecial));
                }
                shooterSelector
                .AddNewOption(
                    CreateITreeComponentFromComposed(
                        core, _shooterDefault));
            }
            // Is Brawler?
            else if (core.IsOfType(ModulariuType.Brawler))
            {
                // Is elite brawler
                if (core.BrawlerLimbs > 2)
                {
                    brawlerSelector
                    .AddNewOption(
                        CreateITreeComponentFromComposed(
                            core, _brawlerSpecial));
                }
                brawlerSelector
                .AddNewOption(
                    CreateITreeComponentFromComposed(
                        core, _brawlerDefault));
            }
            // Is Tank?
            else if (core.IsOfType(ModulariuType.Tank))
            {
                // Is elite tank
                if (core.TankLimbs > 2)
                {
                    tankSelector
                    .AddNewOption(
                        CreateITreeComponentFromComposed(
                            core, _tankSpecial));
                }
                tankSelector
                .AddNewOption(
                    CreateITreeComponentFromComposed(
                        core, _tankDefault));
            }

            // Run through limb's behaviours and add them
            foreach (ComposedBehavior c in composedBehaviors)
            {
                ITreeComponent component;
                if (c.ComposedType == TreeComponentType.Selector)
                {
                    component = CreateSelectorFromComposed(core, c);
                }
                else
                {
                    component = CreateSequenceFromComposed(core, c);
                }

                switch (c.BehaviourType)
                {
                case ModulariuType.Shooter:
                    shooterSelector.AddNewOption(component);
                    break;

                case ModulariuType.Brawler:
                    brawlerSelector.AddNewOption(component);
                    break;

                case ModulariuType.Tank:
                    tankSelector.AddNewOption(component);
                    break;
                }
            }

            // Initialize the tree with the default selector
            tree.Initialize(mainSelector, true);
            core.TreeCreationFinished();
        }