Ejemplo n.º 1
0
        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
                                              ))
                                  ));
        }