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; }
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); }
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; }