IEnumerator SelectAbility() { int potentialDamage = 0; AbilitySelected = null; AbilityTarget = null; PlayerControlledBoardUnit newTarget = null; foreach (AbilityDescription ability in currentUnit.AbilityActivator.ListOfAbilities) //Find the most damage we can do { if (ability.AbilityTargetType == AbilityDescription.TargetType.TargetEnemy) { int newPotentialDamage = CheckPotentialDamage(ability, ref newTarget); if (newPotentialDamage > potentialDamage) { AbilityTarget = newTarget; AbilitySelected = ability; } } } if (AbilitySelected == null || AbilityTarget == null) //No ability to use { EndTurn(); } else { StartCoroutine("TargetAbility"); } yield return(null); }
/// <summary> /// Enter state while waiting for enemy team to go /// </summary> void EnterStateEnemyTurn() { currentPhaseStateMethod = new CurrentPhaseState(StateEnemyTurn); CombatUIManager.instance.StartEnemyTurnPhase(); CurrentlySelectedUnit = null; AIManager.StartEnemyTurn(); CurrentPhase = PhaseState.EnemyTurn; }
public void SetAbilities(PlayerControlledBoardUnit u) { for (int i = 0; i < u.AbilityActivator.ListOfAbilities.Count; i++) { AbilityDescription a = u.AbilityActivator.ListOfAbilities [i]; icons[i].SetIcon(a.AbilityIcon); icons[i].SetCooldown(a.Cooldown, a.currentCooldown); icons[i].gameObject.SetActive(true); } }
public void SetCurrentUnit(PlayerControlledBoardUnit u) { if (u == null) { abilities.StopShowing(); } else { abilities.SetAbilities(u); } }
/// <summary> /// Starts the turn for a unit /// </summary> void StartTurn(PlayerControlledBoardUnit nextUnit) { CurrentlySelectedUnit = nextUnit as PlayerControlledBoardUnit; CombatUIManager.instance.SelectCharacter(nextUnit.transform); BoardManager.instance.StartTurn(); CurrentlySelectedUnit.StartTurn(); currentAbility = null; if (!CurrentlySelectedUnit.CanTakeTurn()) { EnterStateEndOfTurn(); } else { EnterStateMovementSelection(); } }
/// <summary> /// Setup combat initialization like party, enemies, map, etc /// </summary> public void SetupCombat(int mapIndex, List <PartyUnit> currentParty, List <EnemyUnitInfo> listEnemies) { map = BoardManager.instance.Maps [mapIndex]; AIManager = gameObject.AddComponent <CombatAIManager> (); AIManager.combatManager = this; EnterStateWaiting(); if (listEnemies.Count == 0) { Debug.LogError("No enemies found for combat, lots of errors incoming"); } foreach (PartyUnit unit in currentParty) { GameObject go = Instantiate(unit.UnitPrefab) as GameObject; if (go.GetComponent <MyHeroController3rdPerson> ()) { Destroy(go.GetComponent <MyHeroController3rdPerson> ()); } go.AddComponent <PlayerControlledBoardUnit> (); go.AddComponent <AbilityActivator> (); PlayerControlledBoardUnit bu = go.GetComponent <PlayerControlledBoardUnit> (); bu.Initialize(unit); go.name = bu.UnitClass.ToString(); bu.Spawn(BoardManager.instance.GetHexagonFromArray((int)map.PlayerSpawns [currentParty.IndexOf(unit)].x, (int)map.PlayerSpawns [currentParty.IndexOf(unit)].y)); CurrentParty.Add(bu); } foreach (EnemyUnitInfo unit in listEnemies) { GameObject go = Instantiate(unit.UnitPrefab) as GameObject; go.AddComponent <NonPlayerControlledBoardUnit> (); go.AddComponent <AbilityActivator> (); NonPlayerControlledBoardUnit bu = go.GetComponent <NonPlayerControlledBoardUnit> (); bu.Initialize(unit); bu.Spawn(BoardManager.instance.GetHexagonFromArray((int)map.EnemySpawns [listEnemies.IndexOf(unit)].x, (int)map.EnemySpawns [listEnemies.IndexOf(unit)].y)); CurrentEnemies.Add(bu); } StartTurn(CurrentParty [0]); //should be started from a list of characters }
/// <summary> /// Check how much damage an ability can do /// </summary> public int CheckPotentialDamage(AbilityDescription ability, ref PlayerControlledBoardUnit a) { List <PlayerControlledBoardUnit> units = BoardManager.instance.GetEnemiesInRange(currentUnit.CurrentlyOccupiedHexagon, ability.castRange, ability.AbilityTargetType); if (units.Count == 0) { return(0); } PlayerControlledBoardUnit target = units[0]; if (units.Count > 1) { target = FindBestTarget(ability, units); } a = target; return(1); }
/// <summary> /// Finds the best target for an ability given a number of targets /// </summary> public PlayerControlledBoardUnit FindBestTarget(AbilityDescription ability, List <PlayerControlledBoardUnit> targets) { PlayerControlledBoardUnit currTarget = targets[0]; float potentialDamage = 0; foreach (DebuffEffect debuff in ability.debuffs) { if (debuff.DebuffType == DebuffEffect.Debuff.Damage) { potentialDamage += debuff.Damage; } } foreach (PlayerControlledBoardUnit target in targets) { if (target.CurrentHealth < potentialDamage) //If we have lethal damage, its a no brainer { return(target); } if (target.CurrentHealth / target.MaxHealth //If we find someone with lower health go for them < currTarget.CurrentHealth / currTarget.MaxHealth) { currTarget = target; } if (currTarget.UnitClass == PlayerControlledBoardUnit.PlayerClass.Warrior) { if (target.UnitClass == PlayerControlledBoardUnit.PlayerClass.Wizard || target.UnitClass == PlayerControlledBoardUnit.PlayerClass.Support) { currTarget = target; } } } return(currTarget); }