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