/// <summary>
        /// Begins the Subject's death. Subjects can be 'down-but-not-out' for a period of time, then completely die.
        /// </summary>
        void Die()
        {
            // Deny controls, reset velocity, turn off ai, turn off collider
            if (_isControllable)
            {
                SetInputPermission(false, false, false);
            }

            _myRigidbody.velocity        = Vector3.zero;
            _myRigidbody.angularVelocity = 0f;

            if (GetComponent <Intellect>() != null)
            {
                GetComponent <Agent>().enabled = false;
            }

            GetComponent <Collider2D>().enabled = false;

            if (Stats.DeathFx)
            {
                StaticUtil.Spawn(Stats.DeathFx, transform.position, Quaternion.identity);
            }
            if (OnDeath != null)
            {
                OnDeath();
            }

            // Update stats
            Stats.Deaths++;
            LastAttacker.Stats.Kills++;
            StaticUtil.GiveXp((int)Stats.XpReward.Actual, LastAttacker);
            //

            IsDead = true;
            StartCoroutine(CrippleAndDie());
        }
        private void Start()
        {
            if (IsOwner)
            {
                SetInputPermission(true, true, true);
                OnHealthChanged  += Subject_OnHealthChanged;
                OnSwitchedWeapon += Subject_OnSwitchedWeapon;
                OnReload         += Subject_OnReload;
                OnFire           += Subject_OnFire;
            }
            isPlayer          = true;
            serializePosition = SerializeVector3Properties.XY;
            serializeRotation = SerializeVector3Properties.Z;
            serializeScale    = SerializeVector3Properties.None;
            StartCoroutine(InputLoop());

            if ((int)Stats.Level.Actual == 0)
            {
                StaticUtil.GiveXp((int)Stats.Experience.Max, this);
            }

            // TODO Cleanup
            // Different (terrible) formatting to save vertical space... Was getting pointlessly long.
            _currentWeapon = 0;
            bool weaponSetupIsOkay = true;

            if (Stats.WeaponMountPoint != null)
            {
                _hand = Stats.WeaponMountPoint.transform;
            }
            else
            {
                weaponSetupIsOkay = false;
                if (WeaponListEditor.Count != 0)
                {
                    Debug.LogWarning("No Weapon Mount Point is specified! Assign it on the Subject.");
                }
            }

            // Initialize if there were no problems.
            if (!weaponSetupIsOkay)
            {
                return;
            }
            if (LogDebug)
            {
                Debug.Log(".... Weapon setup is okay");
            }

            // Create the predefined weapons, if any
            if (WeaponListEditor.Count == 0)
            {
                return;
            }
            foreach (GameObject boomboom in WeaponListEditor)
            {
                PickupWeapon(boomboom);
            }
            StartCoroutine(ChangeWeaponToSlot(0));
            _initialized = true;
        }