예제 #1
0
        void Update()
        {
            if (!GameManager.Instance.gameObject.activeSelf)
            {
                //Something has killed the game loop. DontDestroyOnLoad doesn't protect from deactivation
                GameManager.Instance.gameObject.SetActive(true);
            }

            if (Client == null || _actionNumber < 1)
            {
                return;
            }

            if (_isAnimationRunning)
            {
                if (_subActionNumber == 5 && SelectedMonster != null && FriendlyMonsters.Contains(SelectedMonster))
                {
                    IEnumerable <BoardSpace> availableSpaces =
                        BoardSpaces.Values.Where(b => FriendlyMonsters.Select(f => f.CurrentNode.Id).Contains(b.Node.Id));
                    foreach (BoardSpace space in availableSpaces)
                    {
                        space.SendMessage("OnAvailableMonsters", availableSpaces.Select(s => s.Node.Id));
                    }
                    BoardSpaces[SelectedMonster.CurrentNode.Id].SendMessage("OnClearHighlightingWithSelection",
                                                                            SelectedMonster.CurrentNode);
                }
            }
        }
예제 #2
0
        public virtual void ConfirmSelectMonster(int selectedMonsterId, int actionNumber, int subActionNumber)
        {
            SelectedMonster  = FriendlyMonsters.SingleOrDefault(m => m.MonsterTypeId == selectedMonsterId) ?? EnemyMonsters.Single(m => m.MonsterTypeId == selectedMonsterId);
            _actionNumber    = actionNumber;
            _subActionNumber = subActionNumber;

            if (SelectedMonster != null && (_actionNumber == 1 || _actionNumber == 2))
            {
                foreach (BoardSpace space in BoardSpaces.Values)
                {
                    space.SendMessage("OnMonsterSelected", SelectedMonster.CurrentNode.Id);
                }
            }
            Client.SendStateAck(GetAdjustedActionNumber(), _subActionNumber);
        }
예제 #3
0
 private void SelectMonster(int nodeId)
 {
     SelectedMonster = FriendlyMonsters.SingleOrDefault(m => m.CurrentNode.Id == nodeId);
     if (SelectedMonster != null)
     {
         Client.Send(CustomMessageTypes.SelectMonsterRequest, new SelectMonsterRequestMessage
         {
             ActionNumber          = GetAdjustedActionNumber(),
             SubActionNumber       = _subActionNumber,
             Message               = SelectedMonster.Name,
             MessageTypeId         = CustomMessageTypes.SelectMonsterRequest,
             SelectedMonsterTypeId = SelectedMonster.MonsterTypeId
         });
     }
 }
예제 #4
0
        private void ProcessKill(Monster killed, bool isFriendlyMonster)
        {
            MonsterPrefabs.Remove(killed);

            if (isFriendlyMonster)
            {
                FriendlyMonsters.Remove(killed);
            }
            else
            {
                EnemyMonsters.Remove(killed);
            }

            _isAnimationRunning = true;
            killed.SendMessage("OnLoseBattle", BattleSmoke);
        }
예제 #5
0
        void OnPreviewEnter(int nodeId)
        {
            if (_actionNumber == 1 || _actionNumber == 2)
            {
                PreviewMonster = EnemyMonsters.FirstOrDefault(m => m.CurrentNode.Id == nodeId) ?? FriendlyMonsters.FirstOrDefault(m => m.CurrentNode.Id == nodeId);

                UpdatePreviewMenu();

                if (SelectedMonster != null && EnemyMonsters.Any(m => m.CurrentNode.Id == nodeId))
                {
                    UpdateAttackResultPreview();
                }
                else if (SelectedMonster != null && FriendlyMonsters.Any(m => m.CurrentNode.Id == nodeId))
                {
                    ClearAttackResultPreview();
                }
            }
        }
예제 #6
0
        public override void ConfirmPushDestination(int[] pathToDestinationNodeIds, int destinationNodeId, int actionNumber, int subActionNumber)
        {
            bool enemyPush        = (_actionNumber == 3 || _actionNumber == 4) && _subActionNumber == 6;
            bool enemyCounterPush = (_actionNumber == 1 || _actionNumber == 2) && _subActionNumber == 7;

            bool push        = (_actionNumber == 1 || _actionNumber == 2) && _subActionNumber == 6;
            bool counterPush = (_actionNumber == 3 || _actionNumber == 4) && _subActionNumber == 7;

            Monster pushedMonster;

            if (push)
            {
                pushedMonster = EnemyMonsters.Single(m => m.CurrentNode.Id == SelectedAttackNode.Id);
            }
            else if (counterPush)
            {
                pushedMonster = EnemyMonsters.Single(m => m.CurrentNode.Id == SelectedMonster.CurrentNode.Id);
            }
            else if (enemyPush)
            {
                pushedMonster = FriendlyMonsters.Single(m => m.CurrentNode.Id == SelectedAttackNode.Id);
            }
            else if (enemyCounterPush)
            {
                pushedMonster = FriendlyMonsters.Single(m => m.CurrentNode.Id == SelectedMonster.CurrentNode.Id);
            }
            else
            {
                return;
            }
            Node        selectedNode      = GameGraph.Nodes[destinationNodeId];
            List <Node> pathToDestination = new List <Node> {
                selectedNode
            };
            NodePath movementPath = new NodePath(pathToDestination, selectedNode);

            _isAnimationRunning = true;
            pushedMonster.SendMessage("OnBeginMoveAnimation", movementPath);

            pushedMonster.CurrentNode = selectedNode;

            _actionNumber    = actionNumber;
            _subActionNumber = subActionNumber;
        }
예제 #7
0
        private void DisplayMonsters(List <Monster> friendlyMonsters, List <Monster> enemyMonsters)
        {
            foreach (Monster monster in friendlyMonsters)
            {
                float yRotationAdjustment = Client.IsHost ? 0 : 180;

                Quaternion monsterQuaternion = Quaternion.Euler(monster.transform.localRotation.eulerAngles.x, yRotationAdjustment, monster.transform.localRotation.eulerAngles.z);
                Vector3    monsterPosition   = new Vector3(monster.CurrentNode.XPosition, 0, monster.CurrentNode.YPosition);

                monster.transform.localPosition = monsterPosition;
                monster.transform.localRotation = monsterQuaternion;

                monster.gameObject.SetActive(true);

                monster.BelongsToHost       = false;
                monster.YRotationAdjustment = yRotationAdjustment;
                monster.ShouldActivate();
                if (FriendlyMonsters.All(m => m.MonsterTypeId != monster.MonsterTypeId))
                {
                    FriendlyMonsters.Add(monster);
                }
            }

            foreach (Monster enemyMonster in enemyMonsters)
            {
                float yRotationAdjustment = Client.IsHost ? 180 : 0;

                Quaternion enemyMonsterQuaternion = Quaternion.Euler(enemyMonster.transform.localRotation.eulerAngles.x, yRotationAdjustment, enemyMonster.transform.localRotation.eulerAngles.z);
                Vector3    enemyMonsterPosition   = new Vector3(enemyMonster.CurrentNode.XPosition, 0, enemyMonster.CurrentNode.YPosition);

                enemyMonster.transform.localPosition = enemyMonsterPosition;
                enemyMonster.transform.localRotation = enemyMonsterQuaternion;

                enemyMonster.BelongsToHost       = true;
                enemyMonster.YRotationAdjustment = yRotationAdjustment;

                enemyMonster.ShouldActivate();
                if (EnemyMonsters.All(m => m.MonsterTypeId != enemyMonster.MonsterTypeId))
                {
                    EnemyMonsters.Add(enemyMonster);
                }
            }
        }
예제 #8
0
        public override void ConfirmAttackKillResult(AttackResult attackResult, int attackingMonsterTypeId, int defendingMonsterTypeId, int actionNumber, int subActionNumber)
        {
            bool isFriendlyMonster = _actionNumber == 1 || _actionNumber == 2;

            Monster attacker = FriendlyMonsters.SingleOrDefault(m => m.MonsterTypeId == attackingMonsterTypeId) ??
                               EnemyMonsters.SingleOrDefault(m => m.MonsterTypeId == attackingMonsterTypeId);

            Monster defender = FriendlyMonsters.SingleOrDefault(m => m.MonsterTypeId == defendingMonsterTypeId) ??
                               EnemyMonsters.SingleOrDefault(m => m.MonsterTypeId == defendingMonsterTypeId);

            Vector3 battlePosition = new Vector3(BattleSmoke.transform.localPosition.x, BattleSmoke.transform.localPosition.y, BattleSmoke.transform.localPosition.z);

            if (attackResult == AttackResult.Kill)
            {
                AttackResultTextPrefab.GetComponent <TextMesh>().text = "KiLL";
                AttackResultTextPrefab.gameObject.SetActive(true);
                AttackResultTextPrefab.transform.localPosition = battlePosition;

                AttackResultTextPrefab.LerpDestination = AttackResultTextPrefab.transform.localPosition + Vector3.up;

                ProcessKill(defender, !isFriendlyMonster);
            }
            else if (attackResult == AttackResult.CounterKill)
            {
                AttackResultTextPrefab.GetComponent <TextMesh>().text = "Counter KiLL";
                AttackResultTextPrefab.gameObject.SetActive(true);
                AttackResultTextPrefab.transform.localPosition = battlePosition;

                AttackResultTextPrefab.LerpDestination = AttackResultTextPrefab.transform.localPosition + Vector3.up;

                ProcessKill(attacker, isFriendlyMonster);
                SelectedMonster = null;
            }

            _actionNumber    = actionNumber;
            _subActionNumber = subActionNumber;
        }
예제 #9
0
 public override void ConfirmSelectMonster(int selectedMonsterId, int actionNumber, int subActionNumber)
 {
     SelectedMonster  = FriendlyMonsters.SingleOrDefault(m => m.MonsterTypeId == selectedMonsterId) ?? EnemyMonsters.SingleOrDefault(m => m.MonsterTypeId == selectedMonsterId);
     _actionNumber    = actionNumber;
     _subActionNumber = subActionNumber;
 }
예제 #10
0
        public override void UpdateGameState(int actionNumber, int subActionNumber, IDictionary <int, int> friendlyMonsterState, IDictionary <int, int> enemyMonsterState, bool isFullSync = false)
        {
            _actionNumber    = actionNumber;
            _subActionNumber = subActionNumber;

            foreach (int monsterTypeId in friendlyMonsterState.Keys)
            {
                if (FriendlyMonsters.All(m => m.MonsterTypeId != monsterTypeId))
                {
                    Monster monster = MonsterPrefabs.SingleOrDefault(m => m.MonsterTypeId == monsterTypeId);
                    monster.CurrentNode = GameGraph.Nodes[friendlyMonsterState[monsterTypeId]];
                    FriendlyMonsters.Add(monster);
                }
            }

            foreach (int monsterTypeId in enemyMonsterState.Keys)
            {
                if (EnemyMonsters.All(m => m.MonsterTypeId != monsterTypeId))
                {
                    Monster monster = MonsterPrefabs.SingleOrDefault(m => m.MonsterTypeId == monsterTypeId);
                    monster.CurrentNode = GameGraph.Nodes[enemyMonsterState[monsterTypeId]];
                    EnemyMonsters.Add(monster);
                }
            }

            foreach (Monster monster in FriendlyMonsters)
            {
                if (!friendlyMonsterState.ContainsKey(monster.MonsterTypeId))
                {
                    FriendlyMonsters.Remove(monster);
                    MonsterPrefabs.Remove(monster);
                }
                else if (monster.CurrentNode.Id != friendlyMonsterState[monster.MonsterTypeId])
                {
                    monster.CurrentNode = GameGraph.Nodes[friendlyMonsterState[monster.MonsterTypeId]];
                }
            }

            foreach (Monster monster in EnemyMonsters)
            {
                if (!enemyMonsterState.ContainsKey(monster.MonsterTypeId))
                {
                    EnemyMonsters.Remove(monster);
                    MonsterPrefabs.Remove(monster);
                }
                else if (monster.CurrentNode.Id != enemyMonsterState[monster.MonsterTypeId])
                {
                    monster.CurrentNode = GameGraph.Nodes[enemyMonsterState[monster.MonsterTypeId]];
                }
            }

            DisplayMonsters(FriendlyMonsters, EnemyMonsters);

            if (!isFullSync)
            {
                if (_actionNumber == 1 || _actionNumber == 3)
                {
                    SelectedMonster = null;
                }

                SelectedAttackNode   = null;
                SelectedMovementPath = null;
            }
        }
예제 #11
0
        public override void ConfirmSelectAttackAction(int attackNodeId, int actionNumber, int subActionNumber)
        {
            SelectedAttackNode   = GameGraph.Nodes[attackNodeId];
            SelectedMovementPath = null;

            _actionNumber    = actionNumber;
            _subActionNumber = subActionNumber;

            Monster opponent = EnemyMonsters.FirstOrDefault(monster => monster.CurrentNode.Equals(SelectedAttackNode)) ?? FriendlyMonsters.FirstOrDefault(monster => monster.CurrentNode.Equals(SelectedAttackNode));

            ProcessAttackAction(SelectedMonster, opponent);
        }
예제 #12
0
        public virtual void UpdateGameState(int actionNumber, int subActionNumber, IDictionary <int, int> friendlyMonsterState, IDictionary <int, int> enemyMonsterState, bool isFullSync = false)
        {
            _actionNumber    = actionNumber;
            _subActionNumber = subActionNumber;

            foreach (Monster monster in FriendlyMonsters)
            {
                if (!friendlyMonsterState.ContainsKey(monster.MonsterTypeId))
                {
                    FriendlyMonsters.Remove(monster);
                    MonsterPrefabs.Remove(monster);
                }
                else if (monster.CurrentNode.Id != friendlyMonsterState[monster.MonsterTypeId])
                {
                    monster.CurrentNode = GameGraph.Nodes[friendlyMonsterState[monster.MonsterTypeId]];
                }
            }

            foreach (Monster monster in EnemyMonsters)
            {
                if (!enemyMonsterState.ContainsKey(monster.MonsterTypeId))
                {
                    EnemyMonsters.Remove(monster);
                    MonsterPrefabs.Remove(monster);
                }
                else if (monster.CurrentNode.Id != enemyMonsterState[monster.MonsterTypeId])
                {
                    monster.CurrentNode = GameGraph.Nodes[enemyMonsterState[monster.MonsterTypeId]];
                }
            }


            if (_actionNumber == 2 && !isFullSync)
            {
                foreach (BoardSpace space in BoardSpaces.Values)
                {
                    Node selectedNode = null;

                    if (SelectedMonster != null)
                    {
                        selectedNode = SelectedMonster.CurrentNode;
                        IEnumerable <BoardSpace> availableSpaces =
                            BoardSpaces.Values.Where(
                                s => FriendlyMonsters.Select(m => m.CurrentNode.Id).Contains(s.Node.Id)).ToList();
                        space.SendMessage("OnAvailableMonsters", availableSpaces.Select(s => s.Node.Id));
                    }
                    else
                    {
                        ClearSelectionMenu();
                        space.SendMessage("OnClearHighlighting");
                    }

                    space.SendMessage("OnClearHighlightingWithSelection", selectedNode);
                }
            }
            else if (!isFullSync)
            {
                foreach (BoardSpace space in BoardSpaces.Values)
                {
                    space.SendMessage("OnClearHighlighting");
                }

                if (_actionNumber == 1 || _actionNumber == 3)
                {
                    SelectedMonster = null;
                }

                SelectedAttackNode   = null;
                SelectedMovementPath = null;
            }

            if (_actionNumber == 3 || _actionNumber == 4)
            {
                ClearSelectionMenu();
            }

            Client.SendStateAck(GetAdjustedActionNumber(), _subActionNumber);
        }