//============== Awake
    void Awake()
    {
//--------------------------------------------------------------------------------------------------------- Initialize values
        LocalSensitivity  = System.Windows.Forms.SystemInformation.MouseSpeed;
        StoredSensitivity = System.Windows.Forms.SystemInformation.MouseSpeed;
        Self         = this;
        Positions    = new Point[0];
        WindowOffset = new Vector2(System.Windows.Forms.Cursor.Position.X - Input.mousePosition.x, System.Windows.Forms.Cursor.Position.Y - (UnityEngine.Screen.height - Input.mousePosition.y));
        if (CrossSceneSupport)
        {
            DontDestroyOnLoad(transform.gameObject);
        }
    }
    private void Update()
    {
        MoveAndLook();

        //DEBUG CODE

        /*if (Input.GetKeyDown(KeyCode.Alpha9)) {
         *  foreach (AssetInventorySlot s in inventory) {
         *      s.asset = C.c.data.assetData[Random.Range(0, C.c.data.assetData.Count)];
         *      s.amount = 10;
         *  }
         *  pui.invRender.UpdateInventoryRender();
         * }*/

        //virtual mouse with controller
        if (Cursor.lockState == CursorLockMode.None)
        {
            HardwareCursor.SetPosition(HardwareCursor.GetPosition() + new Vector2(InputManager.MovementInput(playerId).x * 600 * Time.deltaTime, -InputManager.MovementInput(playerId).y * 600 * Time.deltaTime));
            if (InputManager.JumpInput(playerId))
            {
                HardwareCursor.LeftClick();
            }
        }



        //deliveries
        if (deliveryTimer > 0)
        {
            deliveryTimer -= Time.deltaTime;
            if (deliveryTimer <= 0)
            {
                C.c.StartCoroutine(C.c.Delivery());
                if (upcomingDeliveries.Count > 0)
                {
                    deliveryTimer = 60 * 3;
                }
            }
        }

        //hover assets for interaction
        assetHovering = null;
        lookingAtNpc  = null;
        RaycastHit hit;

        if (!buildMode && usingAsset == null)
        {
            if (Physics.Raycast(cam.transform.position + cam.transform.forward * .6f, cam.transform.forward, out hit, 2f))
            {
                if (hit.transform.CompareTag("Asset"))
                {
                    var asset = hit.transform.parent.GetComponent <Asset>();
                    if (asset)
                    {
                        assetHovering = asset;
                        asset.Hovering(this);
                    }
                }
                else if (hit.transform.CompareTag("NPC"))
                {
                    var npc = hit.transform.GetComponent <NPC>();
                    if (npc)
                    {
                        lookingAtNpc = npc;
                        StartCoroutine(npc.InteractWithAI());
                    }
                }
                else if (hit.transform.GetComponent <Interactable>())
                {
                    if (InputManager.InteractInput(playerId))
                    {
                        hit.transform.GetComponent <Interactable>().Use();
                    }
                }
            }
        }

        //Interacting with NPC
        if (interactingWithNpc)
        {
            rb.velocity = Vector3.zero;
            cam.LookAt(interactingWithNpc.interactPanel.transform);
        }

        //build mode
        BuildMode();

        //use asset
        if (InputManager.InteractInput(playerId) && !isSleeping && !teleporting)
        {
            if (assetHovering)
            {
                if (usingAsset)
                {
                    StopUsingAsset();
                }
                assetHovering.Use();
            }
            else if (usingAsset)
            {
                StopUsingAsset();
            }
            else if (nearbyPortal)
            {
                if (!teleporting && !isSleeping)
                {
                    StartCoroutine(TeleportSequence(nearbyPortal));
                }
            }
            else
            {
                if (Physics.Raycast(cam.transform.position + cam.transform.forward * .6f, cam.transform.forward, out hit, 2f))
                {
                    if (hit.transform.GetComponent <Money>())
                    {
                        float moneyValue = Mathf.Max(1, Mathf.Round(hit.transform.GetComponent <Money>().value));
                        money += moneyValue;
                        if (hit.transform.GetComponent <Money>().isTip)
                        {
                            pui.CreateInfoPopup("+ $" + moneyValue + " (tip)", C.c.data.colors[0]);
                        }
                        else
                        {
                            pui.CreateInfoPopup("+ $" + Mathf.Round(moneyValue), C.c.data.colors[0]);
                        }
                        Destroy(hit.transform.gameObject);
                    }
                    else if (hit.transform.name == "AssetBeingSoldModel")
                    {
                        var       npcAtRegister  = C.c.currentShop.npcCheckoutLine[0];
                        AssetData assetBeingSold = npcAtRegister.inventory[0].asset;
                        var       chargeAmount   = Mathf.Max(1f, Mathf.Round(assetBeingSold.currentValue));
                        if (assetBeingSold == C.c.data.bill)
                        {
                            chargeAmount = Mathf.Max(1f, Mathf.Round(npcAtRegister.owedAmount));
                        }
                        var m = C.c.SpawnMoney(C.c.currentShop.register.moneySpawnPoint.position, chargeAmount);
                        if (assetBeingSold == C.c.data.bill)
                        {
                            npcAtRegister.owedAmount = 0;
                            var tip = Mathf.Round(2f - npcAtRegister.timeSpentWaiting / 30);
                            if (tip > 0)
                            {
                                var tipMoney = C.c.SpawnMoney(C.c.currentShop.register.moneySpawnPoint.position, tip - Random.Range(0, .5f));
                                tipMoney.isTip = true;
                            }
                        }

                        if (--npcAtRegister.inventory[0].amount == 0)
                        {
                            npcAtRegister.inventory.Add(new AssetInventorySlot());
                            npcAtRegister.inventory.RemoveAt(0);
                        }
                        if (npcAtRegister.inventory[0].amount == 0)
                        {
                            npcAtRegister.GoHome();
                            C.c.currentShop.npcCheckoutLine.RemoveAt(0);
                            foreach (NPC n in C.c.currentShop.npcCheckoutLine)
                            {
                                n.UpdateInWaitingLine();
                            }
                        }

                        Destroy(hit.transform.gameObject);
                    }
                }
            }
        }

        //Inventory
        if (InputManager.ToggleInventory(playerId) && !buildMode)
        {
            ToggleInventory();
        }

        //use asset secondary use
        if (InputManager.SecondaryInteractInput(playerId))
        {
            if (assetHovering)
            {
                if (usingAsset)
                {
                    StopUsingAsset();
                }
                assetHovering.UseSecondary();
            }
            else if (usingAsset)
            {
                StopUsingAsset();
            }
        }

        //put asset on sale
        if (InputManager.SecondaryInteractInput(playerId))
        {
            if (assetHovering && assetHovering.playerUsing == null)
            {
                assetHovering.ToggleSelling();
            }
        }

        //pick up asset
        if (InputManager.PickUpInput(playerId))
        {
            if (assetHovering && !assetHovering.forceCantPickUp)
            {
                if (assetHovering.useTag == "Storage")
                {
                    var stor = assetHovering.model.GetComponent <Storage>();
                    if (stor)
                    {
                        if (!stor.IsEmpty())
                        {
                            stor.asset.Use(); return;
                        }
                    }
                }
                else if (assetHovering.useTag == "RestaurantTable")
                {
                    var diningTable = assetHovering.model.GetComponent <DiningTable>();
                    if (diningTable)
                    {
                        if (diningTable.isBeingUsed())
                        {
                            return;
                        }
                        else
                        {
                            diningTable.PickUpTable();
                        }
                    }
                }
                if (assetHovering.selling)
                {
                    assetHovering.ToggleSelling();
                }
                var added = AddAssetToInventory(assetHovering.data);
                if (added)
                {
                    Destroy(assetHovering.gameObject);
                }
                pui.invRender.UpdateInventoryRender();
            }
        }

        //Cycle active asset
        if (InputManager.CycleHotbar(playerId) != 0 && usingAsset == null)
        {
            inventoryCurrentIndex += (int)InputManager.CycleHotbar(playerId);
            if (inventoryCurrentIndex < 0)
            {
                inventoryCurrentIndex = 0;
            }
            if (inventoryCurrentIndex >= 8)
            {
                inventoryCurrentIndex = 7;
            }
            if (currentBuildAsset)
            {
                Destroy(currentBuildAsset.gameObject);
            }
            pui.invRender.UpdateInventoryRender();
        }
    }