private Option <ICommand> HandleInput() { IState currentState = _states.Peek(); if (!Terminal.HasInput()) { return((currentState is AutoexploreState) ? currentState.HandleKeyInput(Terminal.TK_INPUT_NONE) : Option.None <ICommand>()); } int key = Terminal.Read(); if (key == Terminal.TK_CLOSE) { Game.Exit(); return(Option.None <ICommand>()); } bool left = key == Terminal.TK_MOUSE_LEFT; bool right = key == Terminal.TK_MOUSE_RIGHT; if (key == Terminal.TK_MOUSE_MOVE || left || right) { int x = Terminal.State(Terminal.TK_MOUSE_X); int y = Terminal.State(Terminal.TK_MOUSE_Y); LayerInfo layer = _consoles[currentState.GetType()]; return(layer.PointInside(x, y) ? currentState.HandleMouseInput(x - layer.X, y - layer.Y, left, right) : Option.None <ICommand>()); } if (key == Terminal.TK_ESCAPE) { PopState(); if (_states.Count == 0) { Game.Exit(); } return(Option.None <ICommand>()); } return(currentState.HandleKeyInput(key)); }