Ejemplo n.º 1
0
    private void Start()
    {
        timer          = 0f;
        nextSpawnDelay = GetRandomTime(delay, delayRandomize);

        LineRenderer boltTemplate = this.GetComponent <LineRenderer>();

        //initialize bolts
        for (int i = 0; i < bolts.Length; i++)
        {
            GameObject g = new GameObject("Bolt_" + i.ToString().PadLeft(2, '0'));
            g.transform.SetParent(transform);
            g.transform.localPosition = Vector3.zero;
            g.transform.localRotation = Quaternion.identity;
            bolts[i] = new Bolt(g, boltTemplate);
        }

        Destroy(boltTemplate);

        this.emitting = this.initOn;

        if (UFLevel.GetByID(targetID) == null || UFLevel.GetByID(targetID).objectRef == null)
        {
            Debug.LogWarning("Bolt emitter " + name + " has no valid target and will be deactivated");
            this.gameObject.SetActive(false);
        }
    }
Ejemplo n.º 2
0
    private void Trigger()
    {
        //sync this trigger press over the network if necessary
        if (permanent && !permanentTriggered)
        {
            permanentTriggered = true;
            UFLevel.SyncTrigger(ownID);
        }

        if (resetsRemaining > 0)
        {
            resetsRemaining--;
        }
        else if (resetsRemaining == 0)
        {
            return;
        }

        insideTime = -resetDelay;
        buttonTime = 0f;

        foreach (int link in links)
        {
            Activate(link);
        }

        if (switchRef >= 0)
        {
            IDRef     swtch = UFLevel.GetByID(switchRef);
            UFClutter s     = swtch.objectRef.GetComponent <UFClutter>();
            s.Activate(true);
        }
    }
Ejemplo n.º 3
0
    private List <T> GetLinksOfType <T>(IDRef.Type type) where T : Component
    {
        List <T> toReturn = new List <T>();

        foreach (int link in links)
        {
            if (UFLevel.GetByID(link).type == type || type == IDRef.Type.All)
            {
                toReturn.Add(UFLevel.GetByID(link).objectRef.GetComponent <T>());
            }
        }
        return(toReturn);
    }
Ejemplo n.º 4
0
    private void Trigger(bool positive, IDRef.Type ignoredType = IDRef.Type.None)
    {
        if (ignoredType == IDRef.Type.All)
        {
            return;
        }

        foreach (int link in links)
        {
            if (UFLevel.GetByID(link).type != ignoredType)
            {
                UFTrigger.Activate(link, positive);
            }
        }
    }
Ejemplo n.º 5
0
    private void Awake()
    {
        rb    = this.GetComponent <Rigidbody>();
        sound = this.GetComponent <AudioSource>();

        //extract transforms to be moved by this mover
        List <Transform> contents = new List <Transform>();

        foreach (int link in links)
        {
            GameObject g = UFLevel.GetByID(link).objectRef;
            if (g != null)
            {
                contents.Add(g.transform);
            }
        }

        //make sure all contents have (kinematic) rigidbodies
        this.content = new Rigidbody[contents.Count];
        for (int i = 0; i < contents.Count; i++)
        {
            Rigidbody rb = contents[i].GetComponent <Rigidbody>();
            if (rb == null)
            {
                rb = contents[i].gameObject.AddComponent <Rigidbody>();
            }
            rb.isKinematic   = true;
            rb.interpolation = RigidbodyInterpolation.Interpolate;
            this.content[i]  = rb;
        }

        //turn off all contained colliders if needed
        if (noPlayerCollide)
        {
            foreach (Transform t in contents)
            {
                Collider[] cols = t.GetComponentsInChildren <Collider>();
                foreach (Collider c in cols)
                {
                    if (!c.isTrigger)
                    {
                        c.enabled = false;
                    }
                }
            }
        }
    }
Ejemplo n.º 6
0
    private void LateUpdate()
    {
        //update existing bolts
        foreach (Bolt bolt in bolts)
        {
            if (!bolt.DecayTick())
            {
                Transform boltTarget = UFLevel.GetByID(targetID).objectRef.transform;
                bolt.Animate(boltTarget, jitter, boltShape);
            }
        }

        //emit new bolts
        if (emitting)
        {
            EmitUpdate();
        }
    }
Ejemplo n.º 7
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if (UFLevel.singleton != level)
        {
            GUILayout.Label("This level is inactive.");
        }
        else if (level.idDictionary == null)
        {
            GUILayout.Label("ID Dictionary not initialized. ");
        }
        else
        {
            GUILayout.Label("Number of available IDs: " + level.idDictionary.Count);

            findID = EditorGUILayout.IntField("Search ID: ", findID);

            IDRef obj = UFLevel.GetByID(findID);
            if (obj == null)
            {
                GUILayout.Label("Invalid ID");
            }
            else
            {
                GUILayout.Label("Found reference type: " + obj.type.ToString());
                if (obj.objectRef != null)
                {
                    GUILayout.Label(obj.objectRef.name);
                    if (GUILayout.Button("Select game object"))
                    {
                        Selection.activeGameObject = obj.objectRef;
                    }
                }
                else
                {
                    GUILayout.Label("Object is not in scene.");
                }
            }

            drawLinks = GUILayout.Toggle(drawLinks, "Draw links");
        }
    }
Ejemplo n.º 8
0
    private static IDRef TryGetObject(int id)
    {
        IDRef toReturn = UFLevel.GetByID(id);

        if (toReturn == null)
        {
            Debug.LogWarning("Tried to link to non existant ID: " + id);
            return(null);
        }

        GameObject obj = toReturn.objectRef;

        if (obj == null)
        {
            Debug.LogWarning("Tried to link to ID that is not in the scene: " + toReturn.id + ", of type " + toReturn.type);
            return(null);
        }

        return(toReturn);
    }
Ejemplo n.º 9
0
    /// <summary>
    /// Perform effects of this event.
    /// Returns the type of IDRef that is used up when performing the event,
    /// these references do not get activated in the usual sense by this
    /// event type.
    /// </summary>
    private IDRef.Type DoEffect(bool positive)
    {
        //preperatory variables
        Transform        playerTr = UFLevel.GetPlayer <Transform>();
        UFPlayerLife     playerLi = UFLevel.GetPlayer <UFPlayerLife>();
        UFPlayerMovement playerMo = UFLevel.GetPlayer <UFPlayerMovement>();
        AudioSource      sound    = this.GetComponent <AudioSource>();

        //find effect type and do its effects. Return IDRefts that were used up.
        switch (type)
        {
        case UFLevelStructure.Event.EventType.Teleport:
            foreach (int link in links)
            {
                Transform t = UFLevel.GetByID(link).objectRef.transform;
                t.position = transform.position;
                t.rotation = transform.rotation;
            }
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Teleport_Player:
            playerTr.position = transform.position;
            playerTr.GetComponent <CharacterController>().Move(Vector3.zero);
            playerMo.SetRotation(transform.rotation);
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Music_Start:
            if (sound.clip == null)
            {
                Debug.LogWarning("Music event has no audio clip assigned: " + name);
            }
            sound.Play();
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Play_Sound:
            sound.rolloffMode = AudioRolloffMode.Linear;
            if (float1 >= 0f)
            {
                sound.minDistance  = float1;
                sound.maxDistance  = float1 * 2f;
                sound.spatialBlend = 1f;
            }
            else
            {
                sound.spatialBlend = 0f;
            }
            if (sound.clip == null)
            {
                Debug.LogWarning("Play sound event has no audio clip assigned: " + name);
            }
            sound.loop = bool1;
            sound.Play();
            if (float2 > 0f && !bool1)
            {
                sound.SetScheduledEndTime(float2);
            }
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Music_Stop:
            float fadeTime = float1;
            foreach (UFEvent e in GetEventsOfType(UFLevelStructure.Event.EventType.Music_Start))
            {
                StartCoroutine(e.FadeAudioSource(fadeTime, 0f));
            }
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Particle_State:
            foreach (UFParticleEmitter pem in GetLinksOfType <UFParticleEmitter>(IDRef.Type.ParticleEmitter))
            {
                pem.Activate(positive);
            }
            return(IDRef.Type.ParticleEmitter);

        case UFLevelStructure.Event.EventType.Mover_Pause:
            foreach (UFMover mov in GetLinksOfType <UFMover>(IDRef.Type.Keyframe))
            {
                mov.Activate(!positive);
            }
            return(IDRef.Type.Keyframe);

        case UFLevelStructure.Event.EventType.Reverse_Mover:
            bool setForwardIfMoving = int1 != 0;
            foreach (UFMover mov in GetLinksOfType <UFMover>(IDRef.Type.Keyframe))
            {
                mov.Reverse(setForwardIfMoving);
            }
            return(IDRef.Type.Keyframe);

        case UFLevelStructure.Event.EventType.Modify_Rotating_Mover:
            bool  increase = string1.Equals("Increase");
            float factor   = increase ? 1f + (float1 / 100f) : 1f - (float1 / 100f);
            foreach (UFMover mov in GetLinksOfType <UFMover>(IDRef.Type.Keyframe))
            {
                mov.ChangeRotationSpeed(factor);
            }
            return(IDRef.Type.Keyframe);

        case UFLevelStructure.Event.EventType.Explode:
            float radius = float1;
            float damage = float2;
            bool  geo    = bool1;
            float dist   = (playerTr.position - transform.position).magnitude;
            if (dist < radius)
            {
                playerLi.TakeDamage(damage, UFPlayerLife.DamageType.Explosive, false);
            }
            if (geo)
            {
                Debug.LogWarning("Explosion " + name + " requested geo mod; this will not work as of now!");
            }
            GameObject explosionPrefab = obj as GameObject;
            if (explosionPrefab != null)
            {
                Vector3    explPos   = transform.position;
                Quaternion explRot   = transform.rotation;
                GameObject explosion = Instantiate(explosionPrefab, explPos, explRot, transform);
                explosion.transform.localScale = radius * 2f * Vector3.one;
            }
            else
            {
                Debug.LogWarning("Explosion prefab for event " + name + " was not provided!");
            }
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Skybox_State:
            UFLevel.playerInfo.SetSkyboxRotation(string1, float1);
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Bolt_State:
            foreach (UFBoltEmitter bem in GetLinksOfType <UFBoltEmitter>(IDRef.Type.BoltEmitter))
            {
                bem.Activate(positive);
            }
            return(IDRef.Type.BoltEmitter);

        case UFLevelStructure.Event.EventType.Push_Region_State:
            foreach (UFForceRegion pr in GetLinksOfType <UFForceRegion>(IDRef.Type.PushRegion))
            {
                pr.Activate(positive);
            }
            return(IDRef.Type.PushRegion);

        case UFLevelStructure.Event.EventType.Countdown_Begin:
            UFLevel.singleton.SetCountDown(int1);
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Countdown_End:
            UFLevel.singleton.SetCountDown(0f);
            return(IDRef.Type.None);

        case UFLevelStructure.Event.EventType.Remove_Object:
            foreach (int link in links)
            {
                GameObject g = UFLevel.GetByID(link).objectRef;
                if (g == null)
                {
                    Debug.LogWarning("Trying to remove ID ref that does not exist: " + link);
                }
                else
                {
                    g.SetActive(false);
                }
            }
            return(IDRef.Type.All);

        case UFLevelStructure.Event.EventType.Heal:
            if (bool1)
            {
                UFLevel.GetPlayer <UFPlayerLife>().GainHealth(int1);
                return(IDRef.Type.None);
            }
            else
            {
                Debug.LogError("Entity heal not implemented");
                return(IDRef.Type.Entity);
            }

        case UFLevelStructure.Event.EventType.Set_Gravity:
            Physics.gravity = float1 * Vector3.down;
            return(IDRef.Type.None);

        default:
            Debug.LogError("Event type " + type + " not implemented");
            return(IDRef.Type.None);
        }
    }
Ejemplo n.º 10
0
    private string GetInfo(RaycastHit hit)
    {
        if (hit.collider == null)
        {
            return("Void");
        }
        Transform target = hit.collider.transform;

        if (target.GetComponent <Collider>().isTrigger)
        {
            UFForceRegion force = target.GetComponent <UFForceRegion>();
            if (force != null)
            {
                switch (force.type)
                {
                case UFForceRegion.ForceType.AddVel:
                    return("Push region");

                case UFForceRegion.ForceType.Climb:
                    switch (force.soundType)
                    {
                    case UFLevelStructure.ClimbingRegion.ClimbingType.Fence:
                        return("Climbable\nFence");

                    case UFLevelStructure.ClimbingRegion.ClimbingType.Ladder:
                        return("Ladder");

                    case UFLevelStructure.ClimbingRegion.ClimbingType.Undefined:
                        return("Climbable");
                    }
                    break;

                case UFForceRegion.ForceType.SetVel:
                    return("Jump pad");
                }
            }

            UFLiquid liquid = target.GetComponent <UFLiquid>();
            if (liquid != null)
            {
                switch (liquid.type)
                {
                case UFLevelStructure.Room.LiquidProperties.LiquidType.Acid:
                    return("Acid");

                case UFLevelStructure.Room.LiquidProperties.LiquidType.Lava:
                    return("Lava");

                case UFLevelStructure.Room.LiquidProperties.LiquidType.Water:
                    return("Water");

                case UFLevelStructure.Room.LiquidProperties.LiquidType.Undefined:
                    return("Unkown\nLiquid");
                }
            }

            UFTrigger trig = target.GetComponent <UFTrigger>();
            if (trig != null)
            {
                if (trig.requireUseKey)
                {
                    if (trig.resetsRemaining == 0)
                    {
                        return("Spent\nButton\nArea");
                    }
                    else
                    {
                        return("Button\nArea");
                    }
                }

                foreach (int link in trig.links)
                {
                    IDRef idRef = UFLevel.GetByID(link);
                    switch (idRef.type)
                    {
                    case IDRef.Type.Event:
                        UFEvent eventRef = idRef.objectRef.GetComponent <UFEvent>();

                        switch (eventRef.type)
                        {
                        case UFLevelStructure.Event.EventType.Continuous_Damage:
                            bool insta = eventRef.int1 <= 0 || eventRef.int1 >= 100;
                            if (insta)
                            {
                                return("Death\nTrigger");
                            }
                            else
                            {
                                return("Damage\nArea");
                            }

                        case UFLevelStructure.Event.EventType.Teleport_Player:
                        case UFLevelStructure.Event.EventType.Teleport:
                            return("Teleporter");
                        }
                        break;
                    }
                }

                return("Trigger");
            }

            /*
             * if(target.GetComponentInParent<UFPlayerInfo>())
             *  return "Level\nBounds";
             */

            if (target.GetComponentInParent <MapFinish>())
            {
                return("Finish\nTrigger");
            }
        }
        else
        {
            if (target.name.StartsWith("StaticVisible"))
            {
                return("Solid");
            }

            if (target.name.StartsWith("StaticIcy"))
            {
                return("Slippery");
            }

            if (target.name.StartsWith("StaticInvisible"))
            {
                if (hit.normal.y > .7f)
                {
                    return("Invisible\nFloor");
                }
                else if (hit.normal.y < -.7f)
                {
                    return("Invisible\nCeiling");
                }
                else
                {
                    return("Invisible\nWall");
                }
            }

            if (target.parent != null)
            {
                switch (target.parent.name)
                {
                case "Scrollers":
                    return("Scroller");

                case "PortalGeometry":
                    return("Illegal\nGeometry");

                case "Moving geometry":
                    return("Mover");
                }
            }

            UFClutter clutter = target.GetComponentInParent <UFClutter>();
            if (clutter != null)
            {
                if (clutter.isSwitch)
                {
                    return("Switch");
                }
                else if (clutter.life <= 0f)
                {
                    return("Solid\nClutter");
                }
                else
                {
                    return("Destru-\nctible\nClutter");
                }
            }

            UFDestructible destr = target.GetComponent <UFDestructible>();
            if (destr != null)
            {
                string life    = UFUtils.GetShortFormat(destr.currentLife, 4);
                string maxLife = UFUtils.GetShortFormat(destr.life, 4);
                return("Destru-\nctible\n" + life + "/" + maxLife);
            }

            if (target.name.ToLower().Contains("help"))
            {
                return("Secret\nFix");
            }
        }

        Debug.Log("Could not recognize target: " + target);
        return("Unkown");
    }