public virtual void SpawnPlayer(PlayerController player, List <PlayerSpawnPosition> spawnPositions)
    {
        if (player.ControlledPlayer.NumLives - player.ControlledPlayer.NumDeaths <= 0)
        {
            player.InitializeForStartLevel(JailTransform.position, true);
            return;
        }

        int index = (int)(Random.value * (spawnPositions.Count - 1));
        PlayerSpawnPosition position = spawnPositions[index];

        spawnPositions.RemoveAt(index);
        player.InitializeForStartLevel(position.gameObject.transform.position, false);
        position.Spawn(player);
    }
        protected override void OnAttach()
        {
            base.OnAttach();

            //To load the HUD screen
            hudControl = ControlDeclarationManager.Instance.CreateControl("Gui\\AKActionHUD.gui");

            Controls.Add(hudControl);

            //not working very well. remove it -- iNCIN AK bug?
            InitCameraViewFromTarget();

            //Load target reticules

            textureGood = TextureManager.Instance.Load("Assault Knights\\Huds\\targetGood");
            textureBad = TextureManager.Instance.Load("Assault Knights\\Huds\\targetBad");
            textureWhite = TextureManager.Instance.Load("Assault Knights\\Huds\\targetWhite");

            missileLockClose = TextureManager.Instance.Load("Assault Knights\\Huds\\Hud2");
            missileLockDone = TextureManager.Instance.Load("Assault Knights\\Huds\\Hud3");
            missileLockStarted = TextureManager.Instance.Load("Assault Knights\\Huds\\Hud4");

            goodRadarTarget = TextureManager.Instance.Load("Assault Knights\\Huds\\FriendlyRadarDot");
            badRadarTarget = TextureManager.Instance.Load("Assault Knights\\Huds\\EnemyRadarDot");

            //CutSceneManager specific
            if (CutSceneManager.Instance != null)
            {
                CutSceneManager.Instance.CutSceneEnableChange += delegate(CutSceneManager manager)
                {
                    if (manager.CutSceneEnable)
                    {
                        //Cut scene activated. All keys and buttons need to reset.
                        EngineApp.Instance.KeysAndMouseButtonUpAll();
                        GameControlsManager.Instance.DoKeyUpAll();
                    }
                };
            }

            //fill observeCameraRegions list
            foreach (Entity entity in Map.Instance.Children)
            {
                ObserveCameraArea area = entity as ObserveCameraArea;
                if (area != null)
                    observeCameraAreas.Add(area);
            }

            FreeCameraEnabled = cameraType == CameraType.Free;
            lastCameraType = cameraType;

            //add game specific console command
            EngineConsole.Instance.AddCommand("movePlayerUnitToCamera", ConsoleCommand_MovePlayerUnitToCamera);

            EngineConsole.Instance.AddCommand("ChatCommand", ConsoleCommand_ChatCommand);
            EngineConsole.Instance.AddCommand("ToggleNightVision", ConsoleCommand_ToggleNightVision);
            EngineConsole.Instance.AddCommand("ToggleHeatVision", ConsoleCommand_ToggleHeatVision);
            EngineConsole.Instance.AddCommand("ChangeCamera", ConsoleCommand_ChangeCamera);
            EngineConsole.Instance.AddCommand("LoadBuyWindow", ConsoleCommand_LoadBuyWindow);
            //add Xanders Debug console command
            //EngineConsole.Instance.AddCommand("Xander",
            //    ConsoleCommand_Xander);

            //EngineConsole.Instance.AddCommand("ZoomInOut",
            //    ConsoleCommand_ZoomInOut);

            //accept commands of the player
            GameControlsManager.Instance.GameControlsEvent += GameControlsManager_GameControlsEvent;

            //MotionBlur for a player unit contusion
            {
                Compositor compositor = CompositorManager.Instance.GetByName("MotionBlur");
                if (compositor != null && compositor.IsSupported())
                    RendererWorld.Instance.DefaultViewport.AddCompositor("MotionBlur");
            }

            {//heat vision
                Compositor compositor = CompositorManager.Instance.GetByName("HeatVision");
                if (compositor != null && compositor.IsSupported())
                    RendererWorld.Instance.DefaultViewport.AddCompositor("HeatVision");
            }

            {//night vision
                Compositor compositor = CompositorManager.Instance.GetByName("NightVision");
                if (compositor != null && compositor.IsSupported())
                    RendererWorld.Instance.DefaultViewport.AddCompositor("NightVision");
            }

            //chat stuff

            //for chat support
            GameNetworkServer server = GameNetworkServer.Instance;
            if (server != null)
                server.ChatService.ReceiveText += Server_ChatService_ReceiveText;
            GameNetworkClient client = GameNetworkClient.Instance;
            if (client != null)
                client.ChatService.ReceiveText += Client_ChatService_ReceiveText;

            //get the list of flags
            foreach (Entity entity in Map.Instance.Children)
            {
                SpawnPoint sp = entity as SpawnPoint;
                if (sp != null && !spawnPoints.Contains(sp))
                {
                    PlayerSpawnPosition psp = new PlayerSpawnPosition();
                    psp.spawnPoint = sp;
                    playerSpawnPositions.Add(psp);
                }
            }
        }
    private void DrawRoomBaseButton(SORoomBase roomBase, Color defColor, out bool nowClicked)
    {
        nowClicked = false;

        bool isNowSelectedRoom = (_nowRoomIndex == _selectedRoomIndex);

        GUIContent roomText     = new GUIContent(roomBase.name);
        Rect       roomTextRect = GUILayoutUtility.GetRect(roomText, sceneTextStyle);

        if (isNowSelectedRoom)
        {
            if (focusedWindow == this)
            {
                GUI.color = EditorGUIUtility.isProSkin ? proSelectBackground : stdSelectBackground;
            }
            else
            {
                GUI.color = EditorGUIUtility.isProSkin ? proLostFocusSelectBackground : stdLostFocusSelectBackground;
            }
            GUI.DrawTexture(roomTextRect, EditorGUIUtility.whiteTexture);
        }

        GUI.color = (EditorGUIUtility.isProSkin ? proTextColor : (isNowSelectedRoom ? stdSelectTextColor : stdTextColor));
        GUIStyle nowSceneTextStyle = isNowSelectedRoom ? sceneSelectedTextStyle : sceneTextStyle;

        nowSceneTextStyle.fontStyle = FontStyle.Bold;

        GUI.Label(roomTextRect, roomText, nowSceneTextStyle);

        #region when click
        Event e = Event.current;

        if (roomTextRect.Contains(e.mousePosition))
        {
            if (e.type == EventType.MouseDown)
            {
                nowClicked         = true;
                _selectedRoomIndex = _nowRoomIndex;
            }
            else if (e.type == EventType.MouseUp)
            {
                if (e.button == 0)
                {
                    if (_lastClickedScene == _nowRoomIndex && Time.realtimeSinceStartup - _lastClickTime <= DoubleClickDelay)
                    {
                        var editor = GameObject.Find("LevelEditor").GetComponent <LevelEditor.TilemapEditorScript>();
                        if (EditorUtility.DisplayDialog("Are you sure?", "Importing this room will overlap the current one without saving it.", "Okay", "Cancel"))
                        {
                            string pathBase = "Assets/ForEditor/";

                            EnemySpawnPosition  enemyPointPrefab     = AssetDatabase.LoadAssetAtPath(pathBase + "EnemySpawnPosition.prefab", typeof(EnemySpawnPosition)) as EnemySpawnPosition;
                            PlayerSpawnPosition playerPointPrefab    = AssetDatabase.LoadAssetAtPath(pathBase + "PlayerSpawnPosition.prefab", typeof(PlayerSpawnPosition)) as PlayerSpawnPosition;
                            PlatformController  movingPlatformPrefab = AssetDatabase.LoadAssetAtPath(pathBase + "MovingPlatform.prefab", typeof(PlatformController)) as PlatformController;
                            Water waterPrefab = AssetDatabase.LoadAssetAtPath(pathBase + "Water/Water.prefab", typeof(Water)) as Water;

                            editor.Import(roomBase, enemyPointPrefab, playerPointPrefab, movingPlatformPrefab, waterPrefab);
                            LevelEditor.TilemapInspectorEditor.RoomNumber = roomBase.roomNumber;
                        }
                    }
                    else
                    {
                        _lastClickedScene = _nowRoomIndex;
                        _lastClickTime    = Time.realtimeSinceStartup;
                    }
                }
            }
        }
        #endregion

        _nowRoomIndex++;
        GUI.color = defColor;
    }