public void spawnStoneMouse()
    {
        if (currSpawnedStone != null)
        {
            Destroy(currSpawnedStone);
        }
        InSceneLevel.levelType t = gameController.getCurrLevel().type;
        Vector3    pos           = cam.ScreenToWorldPoint(Input.mousePosition);
        GameObject go            = null;

        switch (t)
        {
        case InSceneLevel.levelType.DRUM:
            go = Instantiate(drumCubes[Random.Range(0, drumCubes.Length)], pos,
                             Quaternion.Euler(t != InSceneLevel.levelType.BASS ? new Vector3(0, 0, Random.Range(-angleNoise, angleNoise)) : Vector3.zero));
            break;

        case InSceneLevel.levelType.PAD:
            go = Instantiate(padCrystals[Random.Range(0, padCrystals.Length)], pos,
                             Quaternion.Euler(t != InSceneLevel.levelType.BASS ? new Vector3(0, 0, Random.Range(-angleNoise, angleNoise)) : Vector3.zero));

            break;

        case InSceneLevel.levelType.BASS:
            go = Instantiate(bassStones[Random.Range(0, bassStones.Length)], pos,
                             Quaternion.Euler(t != InSceneLevel.levelType.BASS ? new Vector3(0, 0, Random.Range(-angleNoise, angleNoise)) : Vector3.zero));
            break;

        case InSceneLevel.levelType.GUITAR:
            go = Instantiate(branchRocks[Random.Range(0, branchRocks.Length)], pos,
                             Quaternion.Euler(t != InSceneLevel.levelType.BASS ? new Vector3(0, 0, Random.Range(-angleNoise, angleNoise)) : Vector3.zero));

            break;
        }

        go.transform.parent = currFloor.transform;

        stoneBehavior s = go.GetComponent <stoneBehavior>();

        s.myLevel        = gameController.getCurrLevel();
        currSpawnedStone = go;
    }
 public void spawnStone(stoneBehavior[] stones, int index, InSceneLevel.levelType type, Vector3 deltaPosition, Vector3 rotation, int note)
 {
     StartCoroutine(spawnStoneCoroutine(stones, index, type, deltaPosition, rotation, note, false));
 }
    private IEnumerator spawnStoneCoroutine(stoneBehavior[] stones, int index, InSceneLevel.levelType type, Vector3 deltaPosition, Vector3 rotation, int note, bool mouseDrag)
    {
        Vector3    spawnPos = getFloorOrigin() + deltaPosition, deltaUp = new Vector3(0, 40, 0);
        GameObject go = null;

        if (note != 0)
        {
            switch (type)
            {
            case InSceneLevel.levelType.DRUM:
                if (note != -1)
                {
                    spawnPos += new Vector3(0, notesOffsetY[note], 0);
                }
                go = Instantiate(drumCubes[Random.Range(0, drumCubes.Length)], spawnPos + deltaUp, Quaternion.Euler(rotation));
                break;

            case InSceneLevel.levelType.PAD:
                if (note != -1)
                {
                    spawnPos += new Vector3(0, notesOffsetY[note], 0);
                }
                go = Instantiate(padCrystals[Random.Range(0, padCrystals.Length)], spawnPos + deltaUp, Quaternion.Euler(rotation));

                break;

            case InSceneLevel.levelType.BASS:
                if (note != -1)
                {
                    spawnPos += new Vector3(0, notesOffsetY[note], 0);
                }
                go = Instantiate(bassStones[Random.Range(0, bassStones.Length)], spawnPos + deltaUp, Quaternion.Euler(rotation));
                break;

            case InSceneLevel.levelType.GUITAR:
                if (note != -1)
                {
                    spawnPos += new Vector3(0, notesOffsetY[note], 0);
                }
                go = Instantiate(branchRocks[Random.Range(0, branchRocks.Length)], spawnPos + deltaUp, Quaternion.Euler(rotation));

                break;
            }

            go.transform.parent = currFloor.transform;

            if (mouseDrag)
            {
                currSpawnedStone = go;
            }

            yield return(StartCoroutine(Global.moveToInSecs(go, spawnPos, 0.5f)));
        }
        else
        { //space, generate hint highlight prefab
            go = Instantiate(highlightPrefab, spawnPos, Quaternion.Euler(0, 0, 0));
            go.transform.parent = currFloor.transform;
            SpriteRenderer spr = go.transform.GetChild(0).GetComponent <SpriteRenderer>();

            StartCoroutine(Global.brieflyChangeColor(spr.color, new Color(250, 130, 0, spr.color.a), spr, 0.4f));
        }

        stoneBehavior s = go.GetComponent <stoneBehavior>();

        stones[index] = s;
        s.index       = index; s.myLevel = gameController.getCurrLevel(); s.note = note;
    }