public static void Activate(LevelData levelData)
    {
        if (_instance != null)
        {
            _instance.rotationSlider.value = (int)LevelEditor.selectedObject.transform.rotation.eulerAngles.z;
            speedStrip = LevelEditor.selectedObject.GetComponent <SpeedStrip>();

            if (speedStrip != null)
            {
                _instance.pushSlider.value = speedStrip.accelSpeed;
            }
        }
        editData = levelData;
        started  = false;
    }
    private void Start()
    {
        _instance = this;
        onPreferenceChange.AddListener(PreferenceChanged);

        if (LevelEditor.selectedObject != null && LevelEditor.selectedObject.objectType == objectType && rotationSlider.IsActive() && pushSlider.IsActive())
        {
            rotationSlider.value = (int)LevelEditor.selectedObject.transform.rotation.eulerAngles.z;

            speedStrip = LevelEditor.selectedObject.GetComponent <SpeedStrip>();

            if (speedStrip != null)
            {
                pushSlider.value = speedStrip.accelSpeed;
            }

            started = false;
        }
    }
Exemple #3
0
        // add an object to the level. this step of reference is needed for later deconstruction of the level and serialization
        public LevelObject AddObject(LevelObject.ObjectType type, Vector3 position)
        {
            if (LevelPlacer._instance != null)
            {
                switch (type)
                {
                case LevelObject.ObjectType.turret:
                    Turret turret = (Turret)Instantiate(LevelPlacer._instance.turretPrefab, Vector3.zero, Quaternion.identity);
                    turret.transform.parent = LevelPlacer.generatedLevel.transform;
                    Vector2 turretPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ);
                    turret.transform.position = turretPos;
                    turrets.Add(turret);
                    // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1);
                    UndoManager.AddUndoPoint();
                    return(turret);

                case LevelObject.ObjectType.attractor:
                    Attractor a = (Attractor)Instantiate(LevelPlacer._instance.attractorPrefab, Vector3.zero, Quaternion.identity);
                    a.transform.parent = LevelPlacer.generatedLevel.transform;
                    Vector2 aPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ);
                    a.transform.position = aPos;
                    attractors.Add(a);
                    //ProgressManager.GetProgress().unlocks.inventory.Add(type, -1);
                    UndoManager.AddUndoPoint();
                    return(a);

                case LevelObject.ObjectType.portal:
                    Portal p = (Portal)Instantiate(LevelPlacer._instance.portalPrefab, Vector3.zero, Quaternion.identity);
                    p.transform.parent = LevelPlacer.generatedLevel.transform;
                    Vector2 pPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ);
                    p.transform.position = pPos;
                    p.portalID           = GetFreePortalID(0);
                    p.linkedPortalID     = -1;
                    portals.Add(p);
                    // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1);
                    UndoManager.AddUndoPoint();
                    return(p);

                case LevelObject.ObjectType.speedStrip:
                    SpeedStrip s = (SpeedStrip)Instantiate(LevelPlacer._instance.speedStripPrefab, Vector3.zero, Quaternion.identity);
                    s.transform.parent = LevelPlacer.generatedLevel.transform;
                    Vector2 sPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ);
                    s.transform.position = sPos;
                    s.transform.rotation = Quaternion.Euler(0, 0, 180);
                    speedStrips.Add(s);
                    // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1);
                    UndoManager.AddUndoPoint();
                    return(s);

                case LevelObject.ObjectType.bouncer:
                    Bouncer b = (Bouncer)Instantiate(LevelPlacer._instance.bouncerPrefab, Vector3.zero, Quaternion.identity);
                    b.transform.parent = LevelPlacer.generatedLevel.transform;
                    Vector2 bPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ);
                    b.transform.position = bPos;
                    b.transform.rotation = Quaternion.Euler(0, 0, 0);
                    bouncers.Add(b);
                    // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1);
                    UndoManager.AddUndoPoint();
                    return(b);

                default:
                    //Debug.Log("Wasnt able to add the levelobject to the LevelDataMono of type " + lo.objectType);
                    break;
                }
            }
            else
            {
                Debug.LogError("LevelPlacer needed to add an object to the level.");
            }
            return(null);
        }
Exemple #4
0
        // generate a level based on the input leveldata and assign it as placedLevel, ready for referencing
        public bool Place(LevelData levelData)
        {
            if (levelData != null)
            {
                if (generatedLevel != null)
                {
                    bool vertsDifferen = levelData.moveVerticies != generatedLevel.levelData.moveVerticies;
                    Debug.Log("Destroy Old generated Level, verticies are different: " + vertsDifferen);
                    DestroyImmediate(generatedLevel.gameObject);
                    generatedLevel = null;
                }

                // create the base level gameobject, parent of all levelObjects
                GameObject generatedLevelGO;
                generatedLevelGO = new GameObject("Generated Level " + levelData.id);

                // add leveldatamono
                generatedLevel                    = generatedLevelGO.AddComponent <LevelDataMono>();
                generatedLevel.levelData          = levelData;
                generatedLevel.gameObject.tag     = "Level";
                generatedLevel.gameObject.layer   = LayerMask.NameToLayer("LevelMask");
                generatedLevel.transform.parent   = transform;
                generatedLevel.transform.position = transform.position;

                // create lists
                generatedLevel.turrets     = new List <Turret>();
                generatedLevel.portals     = new List <Portal>();
                generatedLevel.speedStrips = new List <SpeedStrip>();
                generatedLevel.attractors  = new List <Attractor>();
                generatedLevel.bouncers    = new List <Bouncer>();

                // add spawn
                Spawn spawn = (Spawn)Instantiate(spawnPrefab, Vector3.zero, Quaternion.identity);
                spawn.transform.parent = generatedLevel.transform;
                Vector2 spawnPos = new Vector3(levelData.objectData.spawnPosition.x, levelData.objectData.spawnPosition.y, levelObjectZ);
                print("spawnpos loading: " + spawnPos);
                spawn.transform.localPosition = spawnPos;
                generatedLevel.spawn          = spawn;

                // add finish
                Finish finish = (Finish)Instantiate(finishPrefab, Vector3.zero, Quaternion.identity);
                finish.transform.parent = generatedLevel.transform;
                Vector2 finishPos = new Vector3(levelData.objectData.finishPosition.x, levelData.objectData.finishPosition.y, levelObjectZ);
                finish.transform.localPosition = finishPos;
                generatedLevel.finish          = finish;

                // add turrets
                foreach (TurretData td in levelData.objectData.turretData)
                {
                    // create gameobject
                    Turret turret = (Turret)Instantiate(turretPrefab, Vector3.zero, Quaternion.identity);
                    turret.transform.parent = generatedLevel.transform;
                    Vector2 turretPos = new Vector3(td.position.x, td.position.y, levelObjectZ);
                    turret.transform.localPosition = turretPos;

                    turret.transform.rotation = Quaternion.Euler(td.rotation.x, td.rotation.y, td.rotation.z);

                    // assign values
                    turret.shotDelay    = td.shotDelay;
                    turret.startupDelay = td.startupDelay;
                    turret.constantFire = td.constantFire;
                    turret.shotSpeed    = td.shotSpeed;

                    generatedLevel.turrets.Add(turret);
                }

                // add attractors
                foreach (AttractorData ad in levelData.objectData.attractorData)
                {
                    // create gameobject
                    Attractor attractor = (Attractor)Instantiate(attractorPrefab, Vector3.zero, Quaternion.identity);
                    attractor.transform.parent = generatedLevel.transform;
                    Vector2 attractorPos = new Vector3(ad.position.x, ad.position.y, levelObjectZ);
                    attractor.transform.localPosition = attractorPos;

                    // assign values
                    attractor.pullRadius   = ad.radius;
                    attractor.maxPullForce = ad.pullStrength;
                    attractor.SetScale();

                    // add to the reference list for later saving access
                    generatedLevel.attractors.Add(attractor);
                }

                // add speedstrips
                foreach (SpeedStripData sd in levelData.objectData.speedStripData)
                {
                    // create gameobject
                    SpeedStrip speedStrip = (SpeedStrip)Instantiate(speedStripPrefab, Vector3.zero, Quaternion.identity);
                    speedStrip.transform.parent = generatedLevel.transform;
                    Vector2 speedStripPos = new Vector3(sd.position.x, sd.position.y, levelObjectZ);
                    speedStrip.transform.localPosition = speedStripPos;
                    speedStrip.transform.rotation      = Quaternion.Euler(sd.rotation.x, sd.rotation.y, sd.rotation.z);
                    speedStrip.accelSpeed = sd.pushStrength;
                    generatedLevel.speedStrips.Add(speedStrip);
                }

                // add bouncers
                foreach (BouncerData bd in levelData.objectData.bouncerData)
                {
                    Bouncer bouncer = (Bouncer)Instantiate(bouncerPrefab, Vector3.zero, Quaternion.identity);
                    bouncer.transform.parent = generatedLevel.transform;
                    Vector2 bouncerPos = new Vector3(bd.position.x, bd.position.y, levelObjectZ);
                    bouncer.transform.localPosition = bouncerPos;
                    bouncer.transform.rotation      = Quaternion.Euler(bd.rotation.x, bd.rotation.y, bd.rotation.z);
                    bouncer.bounciness = bd.bounciness;
                    bouncer.width      = bd.width;
                    generatedLevel.bouncers.Add(bouncer);
                }

                // add portals...
                foreach (PortalData pd in levelData.objectData.portalData)
                {
                    // create gameobject
                    Portal portal = (Portal)Instantiate(portalPrefab, Vector3.zero, Quaternion.identity);
                    portal.transform.parent = generatedLevel.transform;
                    Vector2 portalPos = new Vector3(pd.position.x, pd.position.y, levelObjectZ);
                    portal.transform.localPosition = portalPos;

                    // assign values
                    portal.portalID       = pd.portalID;
                    portal.linkedPortalID = pd.linkedPortalID;
                    portal.active         = pd.active;

                    generatedLevel.portals.Add(portal);
                }

                // ... and link them with one another - if there is no fitting counterpart, delete them
                foreach (Portal p in generatedLevel.portals)
                {
                    // get the portal that matches the linked id
                    Portal linkPortal = generatedLevel.portals.Find(x => x.portalID == p.linkedPortalID);
                    p.Link(linkPortal);

                    //// link both portals
                    //if (linkPortal != null)
                    //{
                    //    p.linkedPortal = linkPortal;
                    //    linkPortal.linkedPortal = p;
                    //}
                    //// no matching portal was found, linking not possible. Set this portal to inactive.
                    //else
                    //{
                    //    p.active = false;
                    //}
                }

                // create movearea
                MoveArea moveArea = (MoveArea)Instantiate(moveAreaPrefab, Vector3.zero, Quaternion.identity);
                moveArea.transform.parent        = generatedLevel.transform;
                moveArea.transform.localPosition = Vector3.zero;
                int length = levelData.moveVerticies.Length;
                generatedLevel.moveArea = moveArea;

                // if the leveldata has verticies listed, generate a mesh from it and place it
                if (length > 0)
                {
                    MeshFilter mr = moveArea.GetComponent <MeshFilter>();

                    Vector3[] verts = new Vector3[length];
                    for (int i = 0; i < length; i++)
                    {
                        verts[i] = new Vector3(levelData.moveVerticies[i].x, levelData.moveVerticies[i].y, moveAreaZ);
                    }
                    Mesh m = CreateMoveAreaMesh(verts, levelData.moveTriangles);
                    mr.sharedMesh = m;
                }
                // ... otherwise create a default level mesh and place it
                else
                {
                    MeshFilter mr = moveArea.GetComponent <MeshFilter>();

                    Vector3[] verts = new Vector3[4];
                    int[]     tri   = new int[6];

                    // upper left
                    verts[0] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(3990f, 1110f, moveAreaZ)));
                    // upper right
                    verts[1] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(4050f, 1110f, moveAreaZ)));
                    // lower left
                    verts[2] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(3990f, 950f, moveAreaZ)));
                    // lower right
                    verts[3] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(4050f, 950f, moveAreaZ)));

                    // create clockwise triangles based on the vertices we just created
                    tri[0] = 0;
                    tri[1] = 1;
                    tri[2] = 2;
                    tri[3] = 1;
                    tri[4] = 3;
                    tri[5] = 2;

                    Mesh m = CreateMoveAreaMesh(verts, tri);
                    mr.sharedMesh = m;
                    //LevelLoader.SaveCustomLevel(LevelEditor.CreateLevelData());
                }

                // set the movearea as the selected object
                if (Main.currentScene == Main.ActiveScene.editor)
                {
                    LevelEditor.SetSelectedObject(generatedLevel.moveArea);
                }
                return(true);
            }
            else
            {
                print("[LevelLoader] level already placed or the LevelData trying to be generated is null");
            }
            return(false);
        }