public bool CanMoveToDestinationCoordinates()
        {
            if (_currentMapStateProvider.MapWarpState == WarpState.WarpStarted)
            {
                return(false);
            }

            var mainCharacter    = _characterProvider.MainCharacter;
            var renderProperties = mainCharacter.RenderProperties;
            var destX            = renderProperties.GetDestinationX();
            var destY            = renderProperties.GetDestinationY();

            var cellState = _mapCellStateProvider.GetCellStateAt(destX, destY);

            if (cellState.Character.HasValue) //todo: walk through players after certain elapsed time
            {
                return(mainCharacter.NoWall && IsTileSpecWalkable(cellState.TileSpec));
            }
            if (cellState.NPC.HasValue)
            {
                return(mainCharacter.NoWall && IsTileSpecWalkable(cellState.TileSpec));
            }
            if (cellState.Warp.HasValue)
            {
                return(mainCharacter.NoWall || IsWarpWalkable(cellState.Warp.Value, cellState.TileSpec));
            }

            return(mainCharacter.NoWall || IsTileSpecWalkable(cellState.TileSpec));
        }
        public void Update(GameTime gameTime)
        {
            //todo: don't do anything if there are dialogs or a context menu and mouse is over context menu

            var offsetX = MainCharacterOffsetX();
            var offsetY = MainCharacterOffsetY();

            SetGridCoordsBasedOnMousePosition(offsetX, offsetY);
            UpdateDrawPostionBasedOnGridPosition(offsetX, offsetY);

            var cellState = _mapCellStateProvider.GetCellStateAt(_gridX, _gridY);

            UpdateCursorSourceRectangle(cellState);

            var currentMouseState = Mouse.GetState();

            CheckForClicks(currentMouseState, cellState);
            _previousMouseState = currentMouseState;
        }
Exemple #3
0
        public void HandleWalkError()
        {
            var destX = MainCharacter.RenderProperties.GetDestinationX();
            var destY = MainCharacter.RenderProperties.GetDestinationY();

            var cellState = _mapCellStateProvider.GetCellStateAt(destX, destY);

            if (cellState.Character.HasValue) //todo: walk through players after certain elapsed time (3-5sec?)
            {
                HandleWalkThroughOtherCharacter();
            }
            else if (cellState.Warp.HasValue)
            {
                HandleWalkToWarpTile(cellState.Warp.Value);
            }
            else
            {
                HandleWalkToTileSpec(cellState);
            }
        }
Exemple #4
0
        public AttackValidationError ValidateCharacterStateBeforeAttacking()
        {
            if (_characterProvider.MainCharacter.Stats[CharacterStat.Weight] >
                _characterProvider.MainCharacter.Stats[CharacterStat.MaxWeight])
            {
                return(AttackValidationError.Overweight);
            }
            if (_characterProvider.MainCharacter.Stats[CharacterStat.SP] <= 0)
            {
                return(AttackValidationError.Exhausted);
            }

            var cellState = _mapCellStateProvider.GetCellStateAt(
                _characterProvider.MainCharacter.RenderProperties.GetDestinationX(),
                _characterProvider.MainCharacter.RenderProperties.GetDestinationY());

            if (cellState.NPC.HasValue && cellState.NPC.Value.OpponentID.HasValue &&
                cellState.NPC.Value.OpponentID != _characterProvider.MainCharacter.ID)
            {
                return(AttackValidationError.NotYourBattle);
            }

            return(AttackValidationError.OK);
        }