void setRocks()
    {
        var topRockTemplate = this.gameObject.transform.GetChild(0);

        for (var xx = 0; xx < MinerData.XCOUNT; ++xx)
        {
            var topRockCopy = Instantiate(topRockTemplate);
            topRockCopy.transform.position = new Vector3(xx * 15, 0);
            string spriteCount = ("" + ((xx % 6) + 1)).PadLeft(2, '0');
            var spriteName = "world top rocks ";
            if (xx == 22)
            {
                spriteName += "empty";
            }
            else
            {
                spriteName += spriteCount;
            }
            var spriteAtlasIndex = SpriteAtlas[spriteName];
            topRockCopy.GetComponent<SpriteRenderer>().sprite = spriteCollection[spriteAtlasIndex];//Resources.Load<Sprite>(spriteName);
        }
        topRockTemplate.gameObject.SetActive(false);

        var template = this.gameObject.transform.GetChild(1);
        var hardFactor = 10.0;
        var graniteFactor = 98.0;
        var graniteFactorOriginal = 90.0;
        var graniteFactorOriginal1 = 65.0;
        var endStoneFactor = 101.0;
        var arrTypes = new string[MinerData.XCOUNT];
        Random rnd = new Random();
        for (var xx = 0; xx < MinerData.XCOUNT; ++xx)
        {
            arrTypes[xx] = "light";
        }

        for (var yy = 0; yy < MinerData.YCOUNT; yy++)
        {
            var invisibleWall = Instantiate(invisibleWallTemplate, new Vector3(180, yy * -20 - 30), Quaternion.identity) as Transform;
            hardFactor = 10;
            graniteFactor = graniteFactorOriginal - (yy / 5.0);
            int xCave = Random.Range(0, MinerData.XCOUNT);
            int yRnd = Random.Range(0, 101);
            bool hasCave = yRnd < yy;
            for (var xx = 0; xx < MinerData.XCOUNT; xx++)
            {
                string type = "light";
                string afterType = "light empty";
                var rock = Instantiate(template);
                rock.name = "Rock_" + xx + "_" + yy;
                rock.SetParent(this.gameObject.transform);
                rock.transform.position = new Vector3(xx * 15, (yy * -20) - 10);

                if (!MinerSaveGame.Instance.Current.Loaded) // isFresh (also nicht aus Savegame)
                {
                    var randomNumber = Mathf.FloorToInt(Random.Range(0, 100f));
                    if (arrTypes[xx] == "hard")
                    {
                        hardFactor = 60;
                    }
                    if (arrTypes[xx] == "granite")
                    {
                        graniteFactor = graniteFactorOriginal1 - (yy / 5.0);
                    }
                    if (randomNumber < hardFactor)
                    {
                        type = "hard";
                        hardFactor = 60;
                    }
                    else
                    {
                        hardFactor = 10;
                    }

                    if (randomNumber > graniteFactor)
                    {
                        type = "granite";
                        graniteFactor = graniteFactorOriginal1 - (yy / 5.0);
                    }
                    else
                    {
                        graniteFactor = graniteFactorOriginal - (yy / 5.0);
                    }

                    if (yy == 96) endStoneFactor = 75;
                    if (yy == 97) endStoneFactor = 50;
                    if (yy == 98) endStoneFactor = 25;

                    if (randomNumber > endStoneFactor)
                    {
                        type = "endstone";
                    }

                    arrTypes[xx] = type;

                    if (xx == 22)
                    {
                        type = "light empty";
                    }
                    if (yy >= 99)
                    {
                        type = "endstone";
                    }

                    if (type == "light empty")
                    {
                        afterType = "light empty";
                    }
                    else
                    {
                        if (hasCave && xCave == xx)
                        {
                            afterType = "cave " + type;
                        }
                        else
                        {
                            afterType = type + " empty";
                        }
                    }
                    // Im Savegame speíchern
                    MinerData.Rock r = new MinerData.Rock();
                    r.Type = type;
                    r.AfterType = afterType;
                    r.X = xx;
                    r.Y = yy;
                    r.CounterInterval = 0;
                    r.CounterStart = 0;
                    r.EnemyHealth = 0;
                    r.EnemyState = EnemyState.None;
                    r.EnemyType = EnemyType.None;
                    MinerSaveGame.Instance.Current.setRock(xx, yy, r);
                }
                else
                {
                    type = MinerSaveGame.Instance.Current.Rocks[xx, yy].Type;
                }
                if (type.Contains("cave"))
                {
                    Transform enemy = CastEnemy(MinerSaveGame.Instance.Current.Rocks[xx, yy], true);
                }
                int randomImage = Random.Range(1, type.Contains("cave") ? 5 : 6);
                string strRandomImage = "" + randomImage;
                strRandomImage = strRandomImage.PadLeft(2, '0');
                //string spriteName = "rocks/rock " + type;
                string spriteName = "rock " + type;
                if (type.IndexOf("empty") < 0)
                {
                    spriteName += " " + strRandomImage;
                }
                int spriteAtlasIndex = SpriteAtlas[spriteName];
                rock.GetComponent<SpriteRenderer>().sprite = spriteCollection[spriteAtlasIndex]; //Resources.Load<Sprite>(spriteName);
            } // xx
        } // yy
        foreach (InventoryItem candle in MinerSaveGame.Instance.Current.Candles)
        {
            CastCandle(this.transform, candle);
        }
        MinerSaveGame.Instance.Current.Loaded = true;
        template.gameObject.SetActive(false);
    }
    // Update is called once per frame
    void Update () {

        CheckIfAlive();
        if (gameOver.activeSelf) return;

        HandleInGameMenu();
        HandleInventory();
        UpdateDayTime();
        CheckLevel();

        float step = Data.Speed * BASIC_SPEED * Time.deltaTime; // Movement Speed
        bool left = false, right = false, up = false, down = false;
        Vector3 targetElevator = elevator.transform.position;
        Vector3 currentTarget = target;
        bool arrived = false;
        bool workDone = false;
        bool itemUseDone = false;
        bool shouldWalk = false;
        bool hasWorked = (oldAction == Action.Pick || oldAction == Action.Shovel);//workingRock != null;
        bool hasUsedItem = oldAction == Action.UseItem;
        MinerData.Rock oldWorkingRock = workingRock;

        int pos = elevator.transform.position.y >= 0 ? 0 : Mathf.Abs((int)(elevator.transform.position.y + 10) / 20) + 1;
        if (elevatorLabel.GetComponent<UnityEngine.UI.Text>().text != pos.ToString())
            elevatorLabel.GetComponent<UnityEngine.UI.Text>().text = pos.ToString();
#if UNITY_EDITOR
        if (HasLineCave(pos - 1))
        {
            elevatorLabel.GetComponent<UnityEngine.UI.Text>().color = Color.yellow;
        }
        else
        {
            elevatorLabel.GetComponent<UnityEngine.UI.Text>().color = Color.red;
        }
#endif

        GetComponent<Animator>().SetFloat("walkingSpeed", (Data.Speed / 3.5f) * 0.7f);

        if (!inventory.activeSelf && !inGameMenu.activeSelf && !inventoryWasClosed)
        {
            if (Input.GetAxis("Horizontal") < -0.1)
            {
                left = true;
            }
            else if (Input.GetAxis("Horizontal") > 0.1)
            {
                right = true;
            }
            else if (Input.GetAxis("Vertical") < -0.1)
            {
                down = true;
            }
            else if (Input.GetAxis("Vertical") > 0.1)
            {
                up = true;
            }

            if (Input.GetMouseButton(0) && Input.mousePosition.x < Screen.width * 0.25 && !mouseOverRucksack)
            {
                left = true;
            }
            else if (Input.GetMouseButton(0) && Input.mousePosition.x > Screen.width * 0.75 && !mouseOverRucksack)
            {
                right = true;
            }
            else if (Input.GetMouseButton(0) && Input.mousePosition.y < Screen.height * 0.25 && !mouseOverRucksack)
            {
                down = true;
            }
            else if (Input.GetMouseButton(0) && Input.mousePosition.y > Screen.height * 0.75 && !mouseOverRucksack)
            {
                up = true;
            }
            if (Input.GetButtonUp("Torch"))
            {
                var torches = GameObject.FindGameObjectsWithTag("Torch");
                if (torches.Count() == 0)
                {
                    var torch = Instantiate(Resources.Load<Transform>("prefabs/Torch"));
                    torch.SetParent(this.transform, false);
                    //Debug.Log("Instantiating new torch " + torch.name);
                }
                else
                {
                    foreach(var torch in torches)
                    {
                        if (torch.name.Contains("Torch"))
                        {
                            Destroy(torch);
                        }
                    }
                }
            }
        }
        if (isAnimated) // gucken, ob er mit irgendwas fertig ist
        {
            // Am Ziel angekommen?
            if (transform.position == target && oldAction == Action.Move)
            {
                //Debug.Log("arrived");
                arrived = true;
                Data.X = transform.position.x;
                Data.Y = transform.position.y;
                Data.ElevatorX = elevator.position.x;
                Data.ElevatorY = elevator.position.y;
            }

            // Fertig mit der Arbeit?
            if (Time.time - workStartedTime > estimatedWorkTime && hasWorked)
            {
                //Debug.Log("work done");
                workDone = true;
                workingRock = null;
            }

            // Kerze
            if (hasUsedItem && !itemUseHandled &&
                this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("placing") &&
                this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).normalizedTime > (0.5f * this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).speed))
            {
                HandleItemUse();
            }

            // Apfel
            if (hasUsedItem && !itemUseHandled &&
                this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("apple") &&
                this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).normalizedTime > (0.6f * this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).speed))
            {
                HandleItemUse();
            }

            if (hasUsedItem &&
                !(this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("apple")
                || this.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("placing")))
            {
                itemUseDone = true;
            }

            if (arrived || (workDone && hasWorked) || (hasUsedItem && itemUseDone))
            {
                isAnimated = false;
                if (moveElevator)
                {
                    elevator.transform.position = transform.position;
                    moveElevator = false;
                }
            }
        }
        if (!isAnimated)
        {
            moveElevator = false;
            if (left && transform.position.x > 8)
            {
                target = gameObject.transform.position + new Vector3(-15, 0);
                GetComponent<SpriteRenderer>().flipX = false;
                shouldWalk = true;
            }
            if (right && transform.position.x < (elevator.transform.position.y == transform.position.y ? 330 : 315))
            {
                target = transform.position + new Vector3(15, 0);
                GetComponent<SpriteRenderer>().flipX = true;
                shouldWalk = true;
            }
            if (down && transform.position.y > -2000 && (transform.position.y != 10 || inElevator))
            {
                target = transform.position + new Vector3(0, -20);
                if (transform.position.y == 10)
                {
                    target += new Vector3(0, -10);
                }
                if (inElevator)
                {
                    moveElevator = true;
                }
                shouldWalk = true;
            }
            if (up && transform.position.y < 10 && (transform.position.y != 10 || inElevator) && (transform.position.y != -20 || inElevator))
            {
                target = transform.position + new Vector3(0, 20);
                if (transform.position.y == -20)
                {
                    target += new Vector3(0, 10);
                }
                if (inElevator)
                {
                    moveElevator = true;
                }
                shouldWalk = true;
            }
        }

        if (Input.GetMouseButtonUp(0))
        {
            inventoryWasClosed = false;
        }

        //int targetGridX = (int)target.x / 15;
        int targetGridX, targetGridY;
        RockGroupBehaviour.GetGridPosition(target, true, out targetGridX, out targetGridY);

        Action newAction = oldAction;

        MinerData.Rock newWorkingRock = null;

        if (arrived || workDone || itemUseDone)
        {
            //Debug.Log("Done, idling");
            newAction = Action.Idle;
        }

        if (shouldWalk) // kein else if, weil er sonst er stoppen würde und dann weiterlaufen, er soll aber direkt weiterlaufen
        {
            newAction = Action.Move;
        }

        if (workDone)
        {
            HandleWorkDone(oldWorkingRock);
        }
        if (arrived)
        {
            HandleArrived();
        }

        if (newAction == Action.Idle && requestedAction != Action.Empty)
        {
            newAction = requestedAction;
            requestedAction = Action.Empty;
        }
        
        // Wenn er laufen soll, schauen, ob er buddeln müsste
        if (newAction == Action.Move && targetGridX < MinerData.XCOUNT && targetGridY < MinerData.YCOUNT && targetGridY >= 0 && targetGridX >= 0 && Data.Rocks[targetGridX, targetGridY] != null)
        {
            newWorkingRock = Data.Rocks[targetGridX, targetGridY];
            if (!IsWalkable(targetGridX, targetGridY))
            {
                newAction = Action.NeedsWork;
            }
        }
        string orientation = oldOrientation;
        // Richtung ermitteln
        if (target.x < transform.position.x)
        {
            orientation = "side";
        }
        else if (target.x > transform.position.x)
        {
            orientation = "side";
        }
        else if (target.y < transform.position.y)
        {
            orientation = "down";
        }
        else if (target.y > transform.position.y)
        {
            orientation = "up";
        }

        if (newAction == Action.NeedsWork)
        {
            // Arbeitstyp ermitteln
            if (newWorkingRock.Type == "hard")
            {
                newAction = Action.Pick;
            }
            else if (newWorkingRock.Type == "light")
            {
                newAction = Action.Shovel;
            }
            else
            {
                newAction = Action.Idle;
            }
        }

        if (newAction == Action.Collect)
        {
            if (newAction != oldAction)
            {
                GetComponent<Animator>().Play("placing");
                isAnimated = true;
                //Debug.Log("Playing placing animation");
            }
        }
        else if (newAction == Action.Idle || newAction == Action.NeedsWork)
        {
            target = currentTarget;
            if (newAction != oldAction)
            {
                //Debug.Log("Playing idle, Action = " + newAction);
                GetComponent<Animator>().Play("idle");
            }
        }
        else if (newAction == Action.Move)
        {
            // speed up elevator
            if (moveElevator) step *= 1.25f;
            transform.position = Vector3.MoveTowards(transform.position, target, step);

            if (moveElevator)
            {
                targetElevator = target;
                elevator.transform.position = Vector3.MoveTowards(elevator.transform.position, targetElevator, step);
            }
            if (moveElevator)
            {
                GetComponent<Animator>().Play("idle");
            }
            else if (newAction != oldAction || oldOrientation != orientation)
            {
                //Debug.Log("Playing walking");
                GetComponent<Animator>().Play("walking");
            }
            isAnimated = true;
        }
        else if (newAction == Action.Pick && (newAction != oldAction || oldOrientation != orientation))
        {
            target = currentTarget;
            //Debug.Log("Playing pick");
            GetComponent<Animator>().Play("pick " + orientation);
            workStartedTime = Time.time;
            estimatedWorkTime = 4.5f;
            workingRock = newWorkingRock;
            //Debug.Log(workingRock);
            isAnimated = true;
        }
        else if (newAction == Action.Shovel && (newAction != oldAction || oldOrientation != orientation))
        {
            target = currentTarget;
            //Debug.Log("Playing spade " + orientation);
            GetComponent<Animator>().Play("spade " + orientation);
            workStartedTime = Time.time;
            estimatedWorkTime = 2.25f;
            workingRock = newWorkingRock;
            //Debug.Log(workingRock);
            isAnimated = true;
        }
        oldAction = newAction;
        oldOrientation = orientation;
    }