Пример #1
0
    public void SetupAndShow(UnitBasicProperties unit, MoveChoserType moveType, UnitBasicProperties awayFrom = null)
    {
        var positions        = GameStateManager.Instance.GetActiveTile().GetPositions();
        var awayFromPosition = awayFrom != null?positions.First(p => p.HasUnit(awayFrom.gameObject)) : null;

        SetupAndShow(unit, moveType, awayFromPosition);
    }
Пример #2
0
        private void ShowNextPushAway()
        {
            if (unitToPushRemaining.Count == 0)
            {
                FinishCurrentStep();
                return;
            }

            currentDefender = unitToPushRemaining[0];
            unitToPushRemaining.RemoveAt(0);

            SetDefenderPanel();
            SetAttackerPanel();

            defenderPortraitRenderer.material = currentDefender.portrait;
            attackerPortraitRenderer.material = attackerRecieved.portrait;

            currentDefender.ShowAttackedBrillance();
            if (movementRecieved.PushDamage > 0)
            {
                ShowNextPushAwayBlockDodge();
            }
            else
            {
                ShowNextPushAwayPush();
            }
        }
Пример #3
0
 private void ApplyFrostbite(MovementAction movement, UnitBasicProperties attacker)
 {
     if (attacker.side == UnitSide.Hollow)
     {
         movement.MoveDistance = Math.Max(0, movement.MoveDistance - (attacker.isFrozen ? 1 : 0));
     }
 }
Пример #4
0
 private void ClearCurrent()
 {
     defenderCurrent = null;
     defenseCurrent  = null;
     blockRoll       = 0;
     dodgeRoll       = 0;
 }
Пример #5
0
 private void CloneRecievedToCurrent()
 {
     defenderCurrent     = defenderRecieved;
     attackResolved      = false;
     shiftBeforeResolved = 0;
     shiftAfterResolved  = 0;
 }
Пример #6
0
        private void ApplyPushDamage()
        {
            var damageToApply = movementRecieved.PushDamage;
            var hit           = true;

            if (rollType == EncounterRollType.Block)
            {
                damageToApply = Math.Max(0, damageToApply - blockRoll);
            }
            else if (rollType == EncounterRollType.Dodge)
            {
                if (dodgeRoll >= movementRecieved.DodgeLevel)
                {
                    damageToApply = 0;
                    hit           = false;
                }
                currentDefender.ConsumeStamina(1 + (currentDefender.isFrozen ? 1 : 0));
            }

            currentDefender.RecieveInjuries(damageToApply);

            DestroyDices();
            confirmButton.SetActive(false);
            if (hit)
            {
                ShowNextPushAwayPush();
            }
            else
            {
                currentDefender = null;
            }
        }
Пример #7
0
 private void ApplyStagger(AttackAction attack, UnitBasicProperties unit)
 {
     attack.StaminaCost += unit.isStaggered ? 1 : 0;
     if (unit is EnemyProperties)
     {
         attack.FlatModifier = System.Math.Max(0, attack.FlatModifier - (unit.isStaggered ? 1 : 0));
     }
 }
Пример #8
0
        private void ActivateNextUnit()
        {
            firstMovementFree = true;
            bool isEnemyTurn = false;

            if (currentUnit == null)
            {
                // first turn, set the  next player to be the one carying the activation token, or the first players by default.
                isEnemyTurn     = true;
                LastActiveEnemy = -1;

                var lastactivePlayer = players.FirstOrDefault(p => p.hasActivationToken);
                if (lastactivePlayer == null)
                {
                    LastActivePlayer = -1;
                }
                else
                {
                    LastActivePlayer = players.IndexOf(lastactivePlayer) - 1;
                }
            }
            else
            {
                currentUnit.EndOfTurn();
                if (currentUnit.side == UnitSide.Hollow && LastActiveEnemy >= enemies.Count - 1)
                {
                    LastActivePlayer = LastActivePlayer < players.Count - 1 ? LastActivePlayer : -1;
                }
                else
                {
                    isEnemyTurn = true;
                    if (currentUnit.side == UnitSide.Player)
                    {
                        LastActiveEnemy = -1;
                    }
                }
            }


            currentUnitHasAttacked = false;
            currentUnitHasMoved    = false;
            CheckUnitsAlive();

            if (isEnemyTurn)
            {
                LastActiveEnemy++;
                currentUnit = enemies[LastActiveEnemy];
                enemyAi.ResolveEnemyTurn(enemies[LastActiveEnemy].gameObject);
            }
            else
            {
                RemoveAllAggroToken();
                LastActivePlayer++;
                currentUnit = players[LastActivePlayer];
            }

            currentUnit.Activate();
        }
Пример #9
0
        private void FinalizeEncounter()
        {
            resolvingMovement = false;

            movementRecieved      = null;
            attackerRecieved      = null;
            primaryTargetRecieved = null;

            SetGlobalPanelVisibility(false);
        }
Пример #10
0
        private void SetNextToCurrent()
        {
            var next = defensesToResolve.First();

            defenderCurrent = next;
            defenderCurrent.ShowAttackedBrillance();
            defenseCurrent = defenderCurrent.GetDefenseDices(attackRecieved.MagicAttack);
            blockRoll      = 0;
            dodgeRoll      = 0;
        }
Пример #11
0
 public void SetUnit(UnitBasicProperties unitBasic)
 {
     if (unitBasic != null && unitBasic is PlayerProperties)
     {
         unit = (PlayerProperties)unitBasic;
     }
     else
     {
         unit = null;
     }
 }
Пример #12
0
 private void RemoveEnemy(UnitBasicProperties enemy)
 {
     enemy.ClearEquipement();
     enemyToProperties.Remove(enemy.gameObject);
     enemies.Remove(enemy);
     foreach (var position in positions)
     {
         position.RemoveNonBossUnit(enemy.gameObject);
     }
     Destroy(enemy.gameObject);
 }
Пример #13
0
        private void PrepareEncounterToResolve(BehaviorAction attack, UnitBasicProperties originalTarget)
        {
            var sourcePosition = positions.FirstOrDefault(p => p.HasActiveUnit());
            var targetPosition = positions.FirstOrDefault(p => p.HasUnit(originalTarget.gameObject));

            var encounter = new Encounter(attack, currentUnit, originalTarget);

            UnregisterPositionClicked();
            EventManager.RaiseEvent(ObjectEventType.EncounterToResolve, encounter);
            EventManager.StartListening(ObjectEventType.EncountersResolved, CheckUnitStatusAfterEncounter);
        }
Пример #14
0
 private void ApplyStagger(AttackAction attack, UnitBasicProperties attacker)
 {
     if (attacker.side == UnitSide.Player)
     {
         attack.StaminaCost += attacker.isStaggered ? 1 : 0;
     }
     else if (attacker.side == UnitSide.Hollow)
     {
         attack.FlatModifier = attack.FlatModifier - (attacker.isStaggered ? 1 : 0);
     }
 }
Пример #15
0
        public void Execute(UnitBasicProperties unit, MovementAction movement)
        {
            var tile            = gameState.GetActiveTile();
            var positions       = tile.GetPositions();
            var currentPosition = positions.First(p => p.HasUnit(unit.gameObject));

            var targetsInRange = movement.FindTargetsInRange(unit, currentPosition, positions);
            var target         = FindClosestTarget(currentPosition, movement.TargetPreference, targetsInRange);

            EventManager.RaiseEvent(ObjectEventType.AttackSelected, movement);
            EventManager.RaiseEvent(GameObjectEventType.UnitSelected, target);
        }
Пример #16
0
 private void PushMoveSelected(PositionBehavior position)
 {
     currentDefender.HideAttakedBrillance();
     if (currentStep == MovementStep.InitialPush)
     {
         currentDefender = null;
     }
     else if (currentStep == MovementStep.PushAway)
     {
         currentDefender = null;
     }
 }
Пример #17
0
        public override List <UnitBasicProperties> FindTargetsInRange(UnitBasicProperties attacker, PositionBehavior attackerPosition, IEnumerable <PositionBehavior> positions)
        {
            var currentSide = attacker.side;
            var targetSide  = currentSide == UnitSide.Hollow ? UnitSide.Player : UnitSide.Hollow;

            var targets = new List <UnitBasicProperties>();

            foreach (var position in positions)
            {
                var potential = position.GetUnits(targetSide).ToList();
                targets.AddRange(potential.Select(p => p.GetComponent <UnitBasicProperties>()));
            }
            return(targets);
        }
Пример #18
0
        public List <UnitBasicProperties> FindTargetsOnNode(UnitBasicProperties attacker, PositionBehavior targetPosition, UnitBasicProperties originalTarget)
        {
            var currentSide = attacker.side;
            var targetSide  = TargetAllies ? currentSide : currentSide == UnitSide.Hollow ? UnitSide.Player : UnitSide.Hollow;

            var targets = new List <UnitBasicProperties>();

            if (NodeSplash)
            {
                targets = targetPosition.GetUnits(targetSide).Select(u => u.GetComponent <UnitBasicProperties>()).ToList();
            }
            else
            {
                targets.Add(originalTarget);
            }
            return(targets);
        }
Пример #19
0
    private void ShowAggroSeleciton()
    {
        AggroSelectionCanvas.SetActive(true);
        Portrait1.enabled = false;
        Portrait2.enabled = false;
        Portrait3.enabled = false;
        Portrait4.enabled = false;

        var i = 0;

        foreach (var player in GameStateManager.Instance.players.Select(p => p.GetComponent <UnitBasicProperties>()))
        {
            if (i == 0)
            {
                Portrait1.material = player.portrait;
                Portrait1.enabled  = true;
                Char1 = player;
                Char1.hasAggroToken = false;
            }
            else if (i == 1)
            {
                Portrait2.material = player.portrait;
                Portrait2.enabled  = true;
                Char2 = player;
                Char1.hasAggroToken = false;
            }
            else if (i == 2)
            {
                Portrait3.material = player.portrait;
                Portrait3.enabled  = true;
                Char3 = player;
                Char1.hasAggroToken = false;
            }
            else if (i == 3)
            {
                Portrait4.material = player.portrait;
                Portrait4.enabled  = true;
                Char4 = player;
                Char1.hasAggroToken = false;
            }

            i++;
        }
    }
Пример #20
0
        public void Resolve(object eventLoad)
        {
            var castLoad = (Encounter)eventLoad;

            if (castLoad.Action.GetType() != typeof(MovementAction))
            {
                return;
            }

            resolvingMovement  = true;
            currentStepCounter = 0;

            movementRecieved      = (MovementAction)castLoad.Action.Clone();
            attackerRecieved      = castLoad.Attacker;
            primaryTargetRecieved = castLoad.Defender;
            ApplyFrostbite(movementRecieved, attackerRecieved);

            PrepareEncounter();
        }
Пример #21
0
    public void SetupTile(BehaviorAction action, UnitBasicProperties properties, AttackSide side)
    {
        action.Side = side;
        if (action is AttackAction)
        {
            attack = (AttackAction)action;
        }
        else if (action is MovementAction)
        {
            movement = (MovementAction)action;
        }

        UnitProperties = properties;

        IsSelected = false;
        IsDisabled = false;

        SetupAttack();
    }
Пример #22
0
        private void PreparePushAway()
        {
            currentStep   = MovementStep.PushAway;
            checkNextStep = false;

            if (!movementRecieved.Push)
            {
                FinishCurrentStep();
                return;
            }

            SetPushAwayVisibility();
            unitToPushRemaining = GetUnitsToPush();
            foreach (var unit in unitToPushRemaining)
            {
                unit.ShowTargetableBrillance();
            }
            currentDefender = null;
        }
Пример #23
0
    public void SetupAndShow(UnitBasicProperties unit, MoveChoserType moveType, PositionBehavior awayFromPosition)
    {
        movingUnit           = unit;
        DescriptionText.text = $"Choose {moveType.ToString()} {Environment.NewLine} Direction";

        OcclusionBackground.SetActive(true);
        DescriptionText.gameObject.SetActive(true);

        var positions = GameStateManager.Instance.GetActiveTile().GetPositions();

        currentPosition = positions.First(p => p.HasUnit(unit.gameObject));

        ShowValidDirections(currentPosition, awayFromPosition);

        if (moveType == MoveChoserType.Shift)
        {
            NoneButton.SetActive(true);
        }
    }
Пример #24
0
        private void ShowNextInitialPush()
        {
            if (unitToPushRemaining.Count == 0)
            {
                FinishCurrentStep();
                return;
            }

            currentDefender = unitToPushRemaining[0];
            unitToPushRemaining.RemoveAt(0);

            defenderPortraitRenderer.material = currentDefender.portrait;
            attackerPortraitRenderer.material = attackerRecieved.portrait;

            SetDefenderPanel();
            SetAttackerPanel();

            currentDefender.ShowAttackedBrillance();
            pushMover.SetupAndShow(currentDefender, MoveChoserType.Push, attackerRecieved);
        }
Пример #25
0
        private List <UnitBasicProperties> FindTargetsInRangeInternal(UnitBasicProperties attacker, PositionBehavior attackerPosition, IEnumerable <PositionBehavior> positions, bool withShift)
        {
            var currentSide = attacker.side;
            var targetSide  = TargetAllies ? currentSide : currentSide == UnitSide.Hollow ? UnitSide.Player : UnitSide.Hollow;

            var targets = new List <UnitBasicProperties>();

            foreach (var position in positions)
            {
                var pathLength = PathFinder.GetPath(attackerPosition, position).Count;
                if (!InRange(pathLength, withShift))
                {
                    continue;
                }

                var potential = position.GetUnits(targetSide).ToList();
                targets.AddRange(potential.Select(p => p.GetComponent <UnitBasicProperties>()));
            }
            return(targets);
        }
Пример #26
0
        private void PrepareInitialPush()
        {
            currentStep   = MovementStep.InitialPush;
            checkNextStep = false;
            DestroyDices();

            if (!movementRecieved.Push)
            {
                FinishCurrentStep();
                return;
            }

            SetInitialPushVisibility();
            unitToPushRemaining = GetUnitsToPush();
            foreach (var unit in unitToPushRemaining)
            {
                unit.ShowTargetableBrillance();
            }
            currentDefender    = null;
            attackerOriginNode = null;
        }
Пример #27
0
        public void Resolve(object eventLoad)
        {
            var castLoad = (Encounter)eventLoad;

            if (castLoad.Action.GetType() != typeof(AttackAction))
            {
                return;
            }

            resolvingEncounter     = true;
            currentDefenderIsSetup = true;

            attackRecieved   = (AttackAction)castLoad.Action.Clone();
            attackerRecieved = castLoad.Attacker;
            defenderRecieved = castLoad.Defender;

            ApplyStagger(attackRecieved, attackerRecieved);
            CloneRecievedToCurrent();
            currentStep         = EncounterStep.None;
            attackRepeatCounter = 1;
        }
 private void SetLeftAttack(BehaviorAction action, UnitBasicProperties unitProperties, int index)
 {
     if (index == 0)
     {
         LeftAttack1.gameObject.SetActive(true);
         LeftAttack1.Reset();
         LeftAttack1.SetupTile(action, unitProperties, AttackSide.Left);
         existing.Add(LeftAttack1);
     }
     else if (index == 1)
     {
         LeftAttack2.gameObject.SetActive(true);
         LeftAttack2.Reset();
         LeftAttack2.SetupTile(action, unitProperties, AttackSide.Left);
         existing.Add(LeftAttack2);
     }
     else if (index == 2)
     {
         LeftAttack3.gameObject.SetActive(true);
         LeftAttack3.Reset();
         LeftAttack3.SetupTile(action, unitProperties, AttackSide.Left);
         existing.Add(LeftAttack3);
     }
 }
Пример #29
0
 private void NewTileFocused(GameObject arg0)
 {
     focusedTile = gameState.GetActiveTile();
     activeUnit  = null;
 }
Пример #30
0
 private void NewUnitActivated(GameObject unitObject)
 {
     activeUnit       = unitObject.GetComponent <UnitBasicProperties>();
     followActiveUnit = true;
 }