Пример #1
0
    private void _on_Map_finished_updating()
    {
        var currentSelectedNode = _map.GetSelectedNode();

        if (currentSelectedNode is Player player)
        {
            var newAngle = GetTargetAngle(player.GetDirection());
            this.RotationDegrees = newAngle;

            var gridPosition = player.GetGridPosition();

            if (GridHelper.CanMoveForward(_map, gridPosition.Column, gridPosition.Row, player.GetDirection()) &&
                !GridHelper.HasPlayerUnits(_gameManager, gridPosition.Column, gridPosition.Row, player.GetDirection()) &&
                !player.IsDisabledToWalk() &&
                player.AP > 0)
            {
                this.Modulate = new Color("ffffff");
                _disabled     = false;
            }
            else
            {
                this.Modulate = new Color("4affffff");
                _disabled     = true;
            }
        }
    }
Пример #2
0
    private void _on_Attack_DiceRolled(string rolledValue)
    {
        var selectedPlayer = (Player)Map.GetSelectedNode();
        var weapon         = _cardManager.GetPlayerWeapon(selectedPlayer.GetInstanceId());
        var currentMove    = _movementManager.CurrentPlayerMove;

        _movementManager.ProcessAttackOutput(rolledValue, weapon, (string text) =>
        {
            _displayText.SetText($"[center]{text}[/center]");
            _displayText.Display();

            _cardManager.RemoveWeapon(selectedPlayer.GetInstanceId());

            return(1);
        },
                                             (string text) =>
        {
            _displayText.SetText($"[center]{text}[/center]");
            _displayText.Display();

            return(1);
        },
                                             (string text) =>
        {
            _displayText.SetText($"[center]{text}[/center]");
            _displayText.Display();

            if (GridHelper.CanMoveForward(Map, currentMove.Position.Column, currentMove.Position.Row, currentMove.Direction) &&
                GridHelper.HasPlayerUnits(this, currentMove.Position.Column, currentMove.Position.Row, currentMove.Direction))
            {
                if (HasEnemyUnit(currentMove.Position.Column, currentMove.Position.Row, selectedPlayer.GetPlayerNumber(), out var enemy))
                {
                    enemy.PushFrom(currentMove.Direction);
                }
            }

            return(1);
        },
                                             (string text) =>
        {
            _displayText.SetText($"[center]{text}[/center]");
            _displayText.Display();

            if (HasEnemyUnit(currentMove.Position.Column, currentMove.Position.Row, selectedPlayer.GetPlayerNumber(), out var enemy))
            {
                _playerManager.KillUnit(enemy);
                _victoryManager.CheckForVictory();
            }

            return(1);
        });

        selectedPlayer.SetAP(selectedPlayer.AP - currentMove.APWeight, emitSignal: true);

        var attackDice = _diceManager.GetAttackDice();

        attackDice.HideDice();
    }
Пример #3
0
    private void _on_Zombie_DiceRolled(string rolledValue)
    {
        var selectedPlayer = (Player)Map.GetSelectedNode();
        var currentMove    = _movementManager.CurrentPlayerMove;

        var zombieDice = _diceManager.GetZombieDice();

        zombieDice.HideDice();

        _movementManager.ProcessZombieBiteOutput(rolledValue, (string text) =>
        {
            _displayText.SetText($"[center]{text}[/center]");
            _displayText.Display();

            if (GridHelper.CanMoveForward(Map, currentMove.Position.Column, currentMove.Position.Row, currentMove.Direction) &&
                GridHelper.HasPlayerUnits(this, currentMove.Position.Column, currentMove.Position.Row, currentMove.Direction))
            {
                if (HasEnemyUnit(currentMove.Position.Column, currentMove.Position.Row, selectedPlayer.GetPlayerNumber(), out var enemy))
                {
                    enemy.PushFrom(currentMove.Direction);
                }
            }

            SetupInfection();

            return(1);
        },
                                                 (string text) =>
        {
            _displayText.SetText($"[center]{text}[/center]");
            _displayText.Display();

            selectedPlayer.SetAP(selectedPlayer.AP - currentMove.APWeight, emitSignal: true);

            return(1);
        });
    }
Пример #4
0
    //ToDo: split functions
    private void SetScore(IDictionary <string, PlayerMove> edges, GridPosition targetPosition, int currentAP, GridPosition currentPosition,
                          string currentDirection, int maxAP, int playerNumber, int range, int wide)
    {
        var targetEdge      = targetPosition.ToEdgeString();
        var moveType        = PlayerMoveType.Move;
        var targetDirection = GetTargetDirection(targetPosition, currentPosition);

        if (!GridHelper.CanMoveForward(_root.Map, currentPosition.Column, currentPosition.Row, targetDirection))
        {
            return;
        }

        if (GridHelper.HasPlayerUnits(_root, currentPosition.Column, currentPosition.Row, targetDirection))
        {
            return;
        }

        if (!edges.ContainsKey(targetEdge))
        {
            return;
        }

        if (edges[targetEdge].Type == PlayerMoveType.Attack)
        {
            return;
        }

        var computedScore = edges[targetEdge].APWeight;

        if (targetDirection == currentDirection)
        {
            computedScore = currentAP + 1 < computedScore ? currentAP + 1 : computedScore;
        }
        else if (GridHelper.IsSideDirection(currentDirection, targetDirection))
        {
            computedScore = currentAP + 2 < computedScore ? currentAP + 2 : computedScore;
        }
        else if (GridHelper.IsOppositeDirection(currentDirection, targetDirection))
        {
            computedScore = currentAP + 3 < computedScore ? currentAP + 3 : computedScore;
        }

        if (currentAP < maxAP)
        {
            var attackPositions = GetAttackPositions(currentPosition, currentDirection, range, playerNumber);

            foreach (var attackPosition in attackPositions)
            {
                var attackPositionEdge  = attackPosition.ToEdgeString();
                var attackComputedScore = edges[attackPositionEdge].APWeight;

                if (currentAP + 1 < attackComputedScore)
                {
                    edges[attackPositionEdge].Type             = PlayerMoveType.Attack;
                    edges[attackPositionEdge].APWeight         = currentAP + 1;
                    edges[attackPositionEdge].AttackerPosition = currentPosition;
                    edges[attackPositionEdge].Direction        = currentDirection;
                }
            }
        }

        if (computedScore >= edges[targetEdge].APWeight)
        {
            return;
        }

        if (computedScore <= maxAP)
        {
            edges[targetEdge].APWeight  = computedScore;
            edges[targetEdge].Type      = moveType;
            edges[targetEdge].Direction = targetDirection;

            if (moveType == PlayerMoveType.Attack)
            {
                return;
            }

            var neighbors = GetNeighborEdges(targetPosition);

            foreach (var neighbor in neighbors)
            {
                SetScore(edges, neighbor, computedScore, targetPosition, targetDirection, maxAP, playerNumber, range, wide);
            }
        }
    }