internal Maybe <GameState> ActionPlayer(int colDelta, int rowDelta) { var actionTo = Player.LevelPosition + new Point(colDelta, rowDelta); var maybeCell = Dungeon.GetCell(actionTo); if (!maybeCell.HasValue) { return(Maybe.None <GameState>()); } var c = maybeCell.Value; if (!c.LetterTile.HasValue && !c.Occupant.HasValue) { return(Maybe.None <GameState>()); } if (c.Occupant.HasValue) { var occupant = c.Occupant.Value; if (occupant is DownStairs) { var d = Dungeon.Descend(); if (!d.HasValue) { return(Maybe.None <GameState>()); } return(new GameState( d.Value, Player.SetPosition(c.Position), TilePlacer )); } //} //else if (occupant is UpStairs) //{ // var d = Dungeon.Ascend(); // if (!d.HasValue) return Maybe.None<GameState>(); // return new GameState( // d.Value, // Player.SetPosition(c.Position), // TilePlacer // ); //} } //if (maybeCell.HasValue && !maybeCell.Value.LetterTile.HasValue) //{ // return new GameState( // Dungeon, // Player, // new TilePlacer( // maybeCell.Value.Position, // Player, // colDelta != 0 ? TilePlacementDir.Row : TilePlacementDir.Col, // Enumerable.Empty<Maybe<LetterTile>>() // )); //} return(maybeCell.Bind(cell => Player .Action(cell) .Select(playerAndCell => new GameState( Dungeon.ReplaceCell(playerAndCell.Item2), playerAndCell.Item1, TilePlacer )) )); }