protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            ActorInstanceLayer actorInstanceLayer = _board.ActorInstanceLayer;
            Coordinate coordinate = _actorInstance.Coordinate;
            Sprite foregroundSprite = _board.ForegroundLayer[coordinate];
            ActorInstance existingActorInstance = actorInstanceLayer[coordinate];

            if (foregroundSprite != null || existingActorInstance != null || (context.CurrentBoard == _board && context.Player.Coordinate == coordinate))
            {
                return CommandResult.Failed;
            }

            EventResult result = context.RaiseEvent(_actorInstance.OnCreated, new ActorInstanceCreatedEvent(_actorInstance));

            if (result == EventResult.Canceled)
            {
                return CommandResult.Failed;
            }

            actorInstanceLayer.AddActorInstance(context.CurrentBoard, context.Player, _actorInstance);

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("worldInstance");

            Coordinate coordinate = context.Player.Coordinate;

            switch (_direction)
            {
                case MoveDirection.Up:
                    _destinationCoordinate = new Coordinate(coordinate.X, coordinate.Y - 1);
                    break;
                case MoveDirection.Down:
                    _destinationCoordinate = new Coordinate(coordinate.X, coordinate.Y + 1);
                    break;
                case MoveDirection.Left:
                    _destinationCoordinate = new Coordinate(coordinate.X - 1, coordinate.Y);
                    break;
                case MoveDirection.Right:
                    _destinationCoordinate = new Coordinate(coordinate.X + 1, coordinate.Y);
                    break;
                default:
                    throw new Exception(String.Format("Unexpected direction '{0}'", _direction));
            }

            return ProcessDestinationCoordinate(context, context.CurrentBoard, _destinationCoordinate.Value);
        }
        protected override sealed CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            _destinationCoordinate = GetDestinationCoordinate(context);

            return _destinationCoordinate != null ? MoveActorInstance(context, _destinationCoordinate.Value) : CommandResult.Failed;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            _spriteLayer.RemoveTile(_coordinate);

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            context.PlayerInput.Resume();

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            context.MultimediaPlayer.StopSong();

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            context.MultimediaPlayer.PlaySong(_song.Id, _song.Data, _volume);

            return CommandResult.Succeeded;
        }
Beispiel #8
0
        public CommandList(IWorldObserver worldObserver, CommandContext context)
        {
            worldObserver.ThrowIfNull("worldObserver");
            context.ThrowIfNull("context");

            _worldObserver = worldObserver;
            _context = context;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            context.EnqueueMessage(_message, MessageQueuePosition.Last);

            return CommandResult.Succeeded;
        }
        public CommandQueue(IWorldObserver worldObserver, WorldInstance worldInstance)
        {
            _worldObserver = worldObserver;
            _worldInstance = worldInstance;
            worldObserver.ThrowIfNull("worldObserver");
            worldInstance.ThrowIfNull("worldInstance");

            _context = new CommandContext(_worldInstance, this);
            _commandList = new CommandList(worldObserver, _context);
        }
Beispiel #11
0
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            if (_targetTotalWorldTime == null)
            {
                _targetTotalWorldTime = context.WorldTime.Total + _delay;
            }

            return context.WorldTime.Total >= _targetTotalWorldTime.Value ? CommandResult.Succeeded : CommandResult.Deferred;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            if (_targetTotalWorldTime == null)
            {
                double percentage = _random.NextDouble();

                _delay = TimeSpan.FromTicks((long)(_minimumDelay.Ticks + ((_maximumDelay.Ticks - _minimumDelay.Ticks) * percentage)));
                _targetTotalWorldTime = context.WorldTime.Total + _delay;
            }

            return context.WorldTime.Total >= _targetTotalWorldTime.Value ? CommandResult.Succeeded : CommandResult.Deferred;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            if (!_executingNestedCommand && _commandQueue.Any())
            {
                _executingNestedCommand = true;

                Command command = _commandQueue.Peek();

                context.EnqueueCommand(command, NestedCommandExecuted);
            }

            return _executingNestedCommand ? CommandResult.Deferred : CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            EventResult result = context.RaiseEvent(_actorInstance.OnDestroyed, new ActorInstanceDestroyedEvent(_actorInstance));

            if (result == EventResult.Canceled || !context.CurrentBoard.ActorInstanceLayer.RemoveActorInstance(_actorInstance))
            {
                return CommandResult.Failed;
            }

            context.CancelCommands(_actorInstance);

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            Board oldBoard = context.CurrentBoard;

            if (context.RaiseEvent(oldBoard.OnExited, new BoardExitedEvent(oldBoard, _destinationBoard)) == EventResult.Canceled)
            {
                return CommandResult.Failed;
            }

            CommandResult result = context.Player.ChangeLocation(_destinationBoard, _playerCoordinate) ? CommandResult.Succeeded : CommandResult.Failed;

            context.RaiseEvent(_destinationBoard.OnEntered, new BoardEnteredEvent(oldBoard, _destinationBoard));

            return result;
        }
        protected override Coordinate? GetDestinationCoordinate(CommandContext context)
        {
            context.ThrowIfNull("context");

            Coordinate coordinate = ActorInstance.Coordinate;

            switch (_direction)
            {
                case MoveDirection.Up:
                    return new Coordinate(coordinate.X, coordinate.Y - 1);
                case MoveDirection.Down:
                    return new Coordinate(coordinate.X, coordinate.Y + 1);
                case MoveDirection.Left:
                    return new Coordinate(coordinate.X - 1, coordinate.Y);
                case MoveDirection.Right:
                    return new Coordinate(coordinate.X + 1, coordinate.Y);
                default:
                    throw new Exception(String.Format("Unexpected direction '{0}'.", _direction));
            }
        }
        protected bool IsValidDestinationCoordinate(CommandContext context, Coordinate destinationCoordinate)
        {
            context.ThrowIfNull("context");

            Board board = context.GetBoardById(_actorInstance.BoardId);
            Player player = context.Player;
            var exitUpCoordinate = new Coordinate(destinationCoordinate.X, destinationCoordinate.Y + 1);
            var exitDownCoordinate = new Coordinate(destinationCoordinate.X, destinationCoordinate.Y - 1);
            var exitLeftCoordinate = new Coordinate(destinationCoordinate.X + 1, destinationCoordinate.Y);
            var exitRightCoordinate = new Coordinate(destinationCoordinate.X - 1, destinationCoordinate.Y);
            bool invalidCoordinate =
                board.IsCoordinateOccupied(destinationCoordinate) ||
                (player.BoardId == board.Id && player.Coordinate == destinationCoordinate) ||
                board.Exits.Any(arg => arg.Coordinate == exitUpCoordinate && arg.Direction == BoardExitDirection.Up) ||
                board.Exits.Any(arg => arg.Coordinate == exitDownCoordinate && arg.Direction == BoardExitDirection.Down) ||
                board.Exits.Any(arg => arg.Coordinate == exitLeftCoordinate && arg.Direction == BoardExitDirection.Left) ||
                board.Exits.Any(arg => arg.Coordinate == exitRightCoordinate && arg.Direction == BoardExitDirection.Right);

            return !invalidCoordinate;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            switch (_action)
            {
                case TimerAction.Start:
                    _timer.Start();
                    break;
                case TimerAction.Stop:
                    _timer.Stop();
                    break;
                case TimerAction.Reset:
                    _timer.Reset();
                    break;
                case TimerAction.Restart:
                    _timer.Restart();
                    break;
                default:
                    throw new Exception(String.Format("Unexpected timer action '{0}'.", _action));
            }

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            return _actorInstance.ChangeCoordinate(context.CurrentBoard, context.Player, _coordinate) ? CommandResult.Succeeded : CommandResult.Failed;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            if (_executingNestedCommand)
            {
                return CommandResult.Deferred;
            }
            if (_result != null)
            {
                return _result.Value;
            }

            _executingNestedCommand = true;

            context.EnqueueCommandWithExecutionDelay(_command, _completedAttempts == 0 ? TimeSpan.Zero : _retryDelay, NestedCommandExecuted);

            return CommandResult.Deferred;
        }
        protected override Coordinate? GetDestinationCoordinate(CommandContext context)
        {
            context.ThrowIfNull("context");

            var directions = new List<RandomMoveDirection>();
            Coordinate coordinate = ActorInstance.Coordinate;
            var leftCoordinate = new Coordinate(coordinate.X - 1, coordinate.Y);
            var rightCoordinate = new Coordinate(coordinate.X + 1, coordinate.Y);
            var upCoordinate = new Coordinate(coordinate.X, coordinate.Y - 1);
            var downCoordinate = new Coordinate(coordinate.X, coordinate.Y + 1);
            Board board = context.GetBoardById(ActorInstance.BoardId);

            switch (_direction)
            {
                case RandomMoveDirection.Any:
                    directions.Add(RandomMoveDirection.Up);
                    directions.Add(RandomMoveDirection.Down);
                    directions.Add(RandomMoveDirection.Left);
                    directions.Add(RandomMoveDirection.Right);
                    break;
                case RandomMoveDirection.AnyUnoccupied:
                    if (coordinate.X > 0 && IsValidDestinationCoordinate(context, leftCoordinate))
                    {
                        directions.Add(RandomMoveDirection.Left);
                    }
                    if (coordinate.X < board.Size.Width - 1 && IsValidDestinationCoordinate(context, rightCoordinate))
                    {
                        directions.Add(RandomMoveDirection.Right);
                    }
                    if (coordinate.Y > 0 && IsValidDestinationCoordinate(context, upCoordinate))
                    {
                        directions.Add(RandomMoveDirection.Up);
                    }
                    if (coordinate.Y < board.Size.Height - 1 && IsValidDestinationCoordinate(context, downCoordinate))
                    {
                        directions.Add(RandomMoveDirection.Down);
                    }
                    break;
                default:
                    directions.Add(_direction);
                    break;
            }

            if (!directions.Any())
            {
                return null;
            }

            _actualDirection = directions[_random.Next(0, directions.Count)];

            switch (_actualDirection)
            {
                case RandomMoveDirection.Up:
                    return upCoordinate;
                case RandomMoveDirection.Down:
                    return downCoordinate;
                case RandomMoveDirection.Left:
                    return leftCoordinate;
                case RandomMoveDirection.Right:
                    return rightCoordinate;
                default:
                    throw new Exception(String.Format("Unexpected direction '{0}'.", _actualDirection));
            }
        }
 protected abstract Coordinate? GetDestinationCoordinate(CommandContext context);
 protected abstract CommandResult OnExecute(CommandContext context);
        public CommandResult Execute(CommandContext context)
        {
            if (Paused)
            {
                return CommandResult.Deferred;
            }

            switch (Status)
            {
                case CommandStatus.Queued:
                case CommandStatus.Complete:
                    Reset();
                    break;
            }

            CommandResult result = OnExecute(context);

            if (result == CommandResult.Deferred)
            {
                return CommandResult.Deferred;
            }

            Status = CommandStatus.Complete;

            return result;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            _command = _commandDelegate(context);

            return _command.Execute(context);
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            _tile.Character = _character;

            return CommandResult.Succeeded;
        }
        protected override CommandResult OnExecute(CommandContext context)
        {
            context.ThrowIfNull("context");

            return context.Player.ChangeLocation(context.CurrentBoard, _coordinate) ? CommandResult.Succeeded : CommandResult.Failed;
        }