Exemplo n.º 1
0
        internal static SubInstanceLink CreateInstance(int id)
        {
            SubInstanceLink link = CreateInstance <SubInstanceLink>();

            link.id = id;
            return(link);
        }
Exemplo n.º 2
0
        private bool IsDead()
        {
            bool somethingAlive = false;

            for (int s = 0; s < subInstanceLinks.Length; s++)
            {
                SubInstanceLink link = subInstanceLinks[s];

                // Test if any particle system is running and alive
                if (link.particleSystem != null)
                {
                    if (link.particleSystem.isPlaying)
                    {
                        link.particleSystem.Stop();
                    }
                    if (subInstanceLinks[s].particleSystem.IsAlive())
                    {
                        somethingAlive = true;
                    }
                }

                // Hide mesh renderer
                if (link.meshRenderer != null)
                {
                    link.meshRenderer.enabled = false;
                }
                for (int r = 0; r < link.meshRendererAll.Length; r++)
                {
                    if (link.meshRendererAll[r] != null)
                    {
                        link.meshRendererAll[r].enabled = false;
                    }
                }
            }

            return(!somethingAlive);
        }
Exemplo n.º 3
0
        public GameObject CreateRuntimeInstance()
        {
            GameObject      gameObject = new GameObject(title + " Runtime Instance");
            AbilityInstance instance   = gameObject.AddComponent <AbilityInstance>();

            m_Unlocked = m_DefaultLock;

            // Clone all phases to the ability instance for runtime use
            instance.phaseLists = new PhaseList[phaseLists.Length];
            for (int p = 0; p < phaseLists.Length; p++)
            {
                instance.phaseLists[p] = phaseLists[p].Clone();
            }

            // Copy all sub instance links to the ability instance
            instance.subInstanceLinks = new SubInstanceLink[subInstanceLinks.Length];
            for (int s = 0; s < subInstanceLinks.Length; s++)
            {
                SubInstanceLink newLink = Instantiate(subInstanceLinks[s]);

                // Create subinstance obj
                GameObject linkObj;
                if (subInstanceLinks[s].obj == null)
                {
                    // Create an empty game object
                    linkObj = new GameObject(title + " (Sub Instance: " + subInstanceLinks[s].title + ")");
                }
                else
                {
                    // Instantiate the prefab given
                    linkObj      = Instantiate(subInstanceLinks[s].obj);
                    linkObj.name = title + " (Sub Instance: " + subInstanceLinks[s].title + ")";
                }

                // Set the parent to the ability instance
                linkObj.transform.SetParent(gameObject.transform);
                linkObj.transform.localPosition = Vector3.zero;

                // Give the generated object to the sub instance link
                newLink.obj = linkObj;
                newLink.CacheComponents();

                // Push the sub instance link into the list of the instance
                instance.subInstanceLinks[s] = newLink;
            }

            // Clone all shared variables for the ability instance
            instance.sharedVariables = new SharedVariable[sharedVariables.Length];
            for (int s = 0; s < sharedVariables.Length; s++)
            {
                instance.sharedVariables[s] = Instantiate(sharedVariables[s]);
            }

            List <SubInstanceLink> subInstanceLinksList = new List <SubInstanceLink>(subInstanceLinks);
            List <SharedVariable>  sharedVariablesList  = new List <SharedVariable>(sharedVariables);

            for (int l = 0; l < phaseLists.Length; l++)
            {
                for (int p = 0; p < phaseLists[l].phases.Length; p++)
                {
                    // Redirecting sub instance links
                    SubInstanceLink[] addingSubInstanceLinks = new SubInstanceLink[phaseLists[l].phases[p].runForSubInstances.Length];
                    for (int s = 0; s < addingSubInstanceLinks.Length; s++)
                    {
                        SubInstanceLink link = phaseLists[l].phases[p].runForSubInstances[s];
                        addingSubInstanceLinks[s] = instance.subInstanceLinks[subInstanceLinksList.IndexOf(link)];
                    }
                    instance.phaseLists[l].phases[p].runForSubInstances = addingSubInstanceLinks;

                    // Redirecting shared variables
                    System.Type phaseType = phaseLists[l].phases[p].GetType();
                    FieldInfo[] allFields = phaseType.GetFields();

                    for (int f = 0; f < allFields.Length; f++)
                    {
                        if (allFields[f].FieldType.IsSubclassOf(typeof(SharedVariable)))
                        {
                            object         value          = allFields[f].GetValue(phaseLists[l].phases[p]);
                            SharedVariable sharedVariable = value as SharedVariable;
                            if (sharedVariable != null)
                            {
                                int index = sharedVariablesList.IndexOf(sharedVariable);
                                allFields[f].SetValue(instance.phaseLists[l].phases[p], instance.sharedVariables[index]);
                            }
                        }

                        if (allFields[f].FieldType.IsSubclassOf(typeof(SubVariable <>)))
                        {
                            object value = allFields[f].GetValue(phaseLists[l].phases[p]);

                            MethodInfo cloneMethod = value.GetType().GetMethod("Clone", BindingFlags.Instance | BindingFlags.NonPublic);
                            object     clone       = cloneMethod.Invoke(value, new object[] { });


                            allFields[f].SetValue(instance.phaseLists[l].phases[p], clone);
                        }
                    }
                }
            }

            instance.Initiate();

            return(gameObject);
        }
Exemplo n.º 4
0
        internal void Cast(IAbilityUser originator, IAbilityUser target)
        {
            m_CachedID   = originator.GetInstanceID() + "";
            m_Originator = originator;
            m_Target     = target;

            m_LastList = new Stack <int>();
            m_LastList.Push(0);

            transform.position = Vector3.zero;

            for (int s = 0; s < subInstanceLinks.Length; s++)
            {
                SubInstanceLink link = subInstanceLinks[s];

                // Set the correct spawn position
                switch (link.spawn)
                {
                case SubInstanceLink.Spawn.Originator:
                    link.obj.transform.position = originator.GetCenter() + link.spawnOffset;
                    break;

                case SubInstanceLink.Spawn.Target:
                    link.obj.transform.position = target.GetCenter() + link.spawnOffset;
                    break;

                case SubInstanceLink.Spawn.Zero:
                    link.obj.transform.position = link.spawnOffset;
                    break;
                }

                // Start particle system
                if (link.particleSystem != null)
                {
                    link.particleSystem.Play();
                }

                // Show mesh renderer
                if (link.meshRenderer != null)
                {
                    link.meshRenderer.enabled = true;
                }
                for (int r = 0; r < link.meshRendererAll.Length; r++)
                {
                    if (link.meshRendererAll[r] != null)
                    {
                        link.meshRendererAll[r].enabled = true;
                    }
                }

                if (target != null)
                {
                    link.direction = (target.GetCenter() - originator.GetCenter()).normalized;
                }
                else
                {
                    link.direction = Vector3.zero;
                }

                subInstanceLinks[s].obj.SetActive(true);
            }

            for (int v = 0; v < sharedVariables.Length; v++)
            {
                sharedVariables[v].RestoreDefault();
            }

            for (int p = 0; p < phaseLists.Length; p++)
            {
                DefineContext(phaseLists[p]);
                phaseLists[p].OnCast();
            }

            isUpdating = true;
        }
Exemplo n.º 5
0
 internal void SetValue(SubInstanceLink link, object value)
 {
     this[link.id] = (T)value;
 }
Exemplo n.º 6
0
 internal object GetValue(SubInstanceLink link)
 {
     return(this[link.id]);
 }
Exemplo n.º 7
0
 private void DefineContext(SubInstanceLink subInstanceLink)
 {
     AbilityContext.subInstanceLink = subInstanceLink;
 }