void KillArmy(CombatMonsterGroup group) { int playerId = group.playerId; armies.Remove(group); TimelineTurn turn = GetTimelineItem(group.armyId); GameObject army = GetArmyObject(group.armyId); Destroy(army); Destroy(group.gameObject); Destroy(turn.gameObject); int count = CountPlayerArmies(playerId) - 1; if (count == 0) { combatOver = true; if (playerId == 0) { lostCanvas.SetActive(true); } else { wonCanvas.SetActive(true); } } }
void NextTurn() { TimelineTurn turn = timeline.transform.GetChild(0).GetComponent <TimelineTurn>(); currentPlayer = turn.group.playerId; turnTitle.GetComponent <Text>().text = GetTurnTitle(currentPlayer); if (currentArmy) { currentArmy.SetColor(new Color(1.0f, 1.0f, 1.0f, 1.0f)); } currentArmy = turn.group; currentArmy.SetColor(new Color(0.3f, 0.3f, 0.6f, 1.0f)); currentArmy.hasMoved = false; currentArmy.hasAttacked = false; Camera.main.GetComponent <CameraController>().MoveTo(currentArmy.transform.position + new Vector3(0.0f, 0.0f, -3.0f)); pathfinder.SetTerrain(terrainPassable); List <Vector2i> tilesInRange = pathfinder.GetInRange(currentArmy.gamePosition, Creatures.Get(currentArmy.creatureId).speed); ClearHighlightedTiles(); HighlightTiles(tilesInRange); pathfinder.SetTerrain(GetPassableTerrain()); if (currentPlayer != 0) { computerTurnStartDelay = true; computerTurnStartCurrent = 0.0f; } }
void HoverTile() { Vector3 mousePosition = Input.mousePosition; Ray ray = Camera.main.ScreenPointToRay(mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider.tag == "Tile") { Tile tile = hit.collider.GetComponent <Tile>(); bool isthere = GetArmyAt(tile.gamePosition) == null; string has = isthere ? "true" : "false"; debugPosition.text = tile.gamePosition.ToString() + ": " + has; CombatMonsterGroup group = GetArmyAt(tile.gamePosition); if (group != null) { int armyId = group.armyId; TimelineTurn turn = GetTimelineItem(armyId); turn.SetColor(new Color(0.75f, 0.75f, 0.0f, 0.4f)); group.SetColor(new Color(0.75f, 0.75f, 0.0f)); string contextString = ""; Creature creature = Creatures.Get(group.creatureId); if (group.playerId != 0) { contextString = GetChanceToHit(Creatures.Get(currentArmy.creatureId).attack, creature.defense).ToString() + "%\n"; } contextString += "A: " + creature.attack + "\nD: " + creature.defense + "\nDMG: " + creature.damage + "\nSPD: " + creature.speed; ShowContext(contextString, group.transform.position); } else { HideContext(); } tile.GetComponent <Renderer>().material.color = new Color(0.2f, 0.2f, 0.2f, 1.0f); if (hoverTile && hoverTile.gamePosition != tile.gamePosition) { ClearHoverTile(); } hoverTile = tile; } else { ClearHoverTile(); HideContext(); } } else { ClearHoverTile(); HideContext(); } }
int ApplyDamage(CombatMonsterGroup attacking, CombatMonsterGroup defending) { Creature attCreature = Creatures.Get(attacking.creatureId); int damage = attCreature.damage * attacking.count; int startingCount = defending.count; defending.ApplyDamage(damage); int newCount = defending.count; int diff = startingCount - newCount; return(diff); }
void ClearHoverTile() { if (hoverTile == null) { return; } bool highlighted = false; for (int i = 0; i < highlightedTiles.Count; i++) { if (highlightedTiles[i] == hoverTile) { highlighted = true; break; } } if (highlighted) { hoverTile.GetComponent <Renderer>().material.color = new Color(0.3f, 0.3f, 0.3f, 1.0f); } else { hoverTile.GetComponent <Renderer>().material.color = new Color(0.375f, 0.375f, 0.375f, 1.0f); } CombatMonsterGroup group = GetArmyAt(hoverTile.gamePosition); hoverTile = null; debugPosition.text = ""; if (group == null) { return; } if (group.dead) { return; } TimelineTurn turn = GetTimelineItem(group.armyId); turn.SetColor(new Color(1.0f, 1.0f, 1.0f, 0.4f)); if (currentArmy == group) { group.SetColor(new Color(0.3f, 0.3f, 0.6f, 1.0f)); } else { group.SetColor(new Color(1.0f, 1.0f, 1.0f)); } }
CombatMonsterGroup GetArmyAt(Vector2i position) { for (int i = 0; i < armyContainer.transform.childCount; i++) { GameObject child = armyContainer.transform.GetChild(i).gameObject; CombatMonsterGroup group = child.GetComponent <CombatMonsterGroup>(); if (group.gamePosition == position) { return(group); } } return(null); }
void Attack(CombatMonsterGroup attacker, CombatMonsterGroup defender) { attacker.hasAttacked = true; int killed = Hit(attacker, defender); switch (killed) { case -1: ShowAttackFeedback("Missed", defender.transform.position); break; case 0: ShowAttackFeedback("0", defender.transform.position); break; default: ShowAttackFeedback("-" + killed.ToString(), defender.transform.position); break; } UpdateTimelineItem(defender); if (defender.dead) { KillArmy(defender); return; } killed = Hit(defender, attacker); switch (killed) { case -1: ShowCounterFeedback("Missed", defender.transform.position); break; case 0: ShowCounterFeedback("0", defender.transform.position); break; default: ShowCounterFeedback("-" + killed.ToString(), defender.transform.position); break; } UpdateTimelineItem(attacker); if (attacker.dead) { KillArmy(attacker); return; } }
void PlaceMonsterArmy(Tile tile, Vector3 position, Vector2i gamePosition, int armyID) { CombatMonsterGroup group = Instantiate(monsterPrefab, armyContainer.transform); group.transform.position = position; group.transform.Find("Monster").transform.rotation = Quaternion.Euler(0.0f, 90.0f, 0.0f); group.SetCounter(monsters.armies[armyID].count); group.creatureId = monsters.armies[armyID].creatureID; group.initiative = Creatures.Get(group.creatureId).initiative + Random.Range(-2, 3); group.SetHP(Creatures.Get(group.creatureId).hp); group.playerId = 1; group.gamePosition = gamePosition; armies.Add(group); }
void RotateArmy(CombatMonsterGroup group, float angle) { GameObject child; if (currentPlayer == 0) { child = group.transform.Find("Knight").gameObject; } else { child = group.transform.Find("Monster").gameObject; } child.transform.rotation = Quaternion.Euler(0.0f, 180.0f - angle, 0.0f); }
void UpdateTimelineItem(CombatMonsterGroup group) { TimelineTurn turn = GetTimelineItem(group.armyId); if (!turn) { Debug.Log("No turn found for this army."); return; } turn.GetComponentInChildren <Text>().text = group.count.ToString(); if (group.dead) { turn.GetComponentInChildren <Image>().color = new Color(1.0f, 0.0f, 0.0f, 1.0f); } }
int Hit(CombatMonsterGroup attacker, CombatMonsterGroup defender) { Creature attacking = Creatures.Get(attacker.creatureId); Creature defending = Creatures.Get(defender.creatureId); float chanceToHit = GetChanceToHit(attacking.attack, defending.defense); int chance = Random.Range(1, 101); if (chance < chanceToHit) { return(ApplyDamage(attacker, defender)); } else { return(-1); } }
void ComputerTurn() { Vector2i position = currentArmy.gamePosition; CombatMonsterGroup targetPlayerArmy = null; List <Vector2i> neighbours = pathfinder.GetNeighbours(position); for (int i = 0; i < neighbours.Count; i++) { CombatMonsterGroup army = GetArmyAt(neighbours[i]); if (army == null || army.playerId != 0) { continue; } if (targetPlayerArmy == null || GetTotalHP(army) > GetTotalHP(targetPlayerArmy)) { targetPlayerArmy = army; } } List <MovementPoint> path = null; if (targetPlayerArmy) { path = pathfinder.FindPath(currentArmy.gamePosition, targetPlayerArmy.gamePosition, Creatures.Get(currentArmy.creatureId).speed); if (path == null) { Debug.Log("path error"); return; } path.RemoveAt(path.Count - 1); movingToAttack = true; attackTarget = targetPlayerArmy; } else { // find the player army with lowest amount of HP for (int i = 0; i < armies.Count; i++) { if (armies[i].playerId != 0) { continue; } CombatMonsterGroup army = armies[i]; if (targetPlayerArmy == null || GetTotalHP(army) > GetTotalHP(targetPlayerArmy)) { targetPlayerArmy = army; } } if (targetPlayerArmy == null) { Debug.Log("Error: no enemy army chosen :("); return; } path = pathfinder.FindPath(currentArmy.gamePosition, targetPlayerArmy.gamePosition); if (path.Count > Creatures.Get(currentArmy.creatureId).speed + 2) { path = path.GetRange(0, Creatures.Get(currentArmy.creatureId).speed + 1); movingToAttack = false; } else { path.RemoveAt(path.Count - 1); movingToAttack = true; attackTarget = targetPlayerArmy; } } movementPath = path; movementNextStep = 0; isMoving = true; currentArmy.hasMoved = true; MovementNextStep(); }
int GetTotalHP(CombatMonsterGroup army) { return(Creatures.Get(army.creatureId).hp *(army.count - 1) + army.hp); }
void CheckClick() { if (releaseTime < 0.0f || pressTime < 0.0f) { return; } if (releaseTime - pressTime > 0.5f) { return; } if (pressTile != releaseTile) { return; } if (currentArmy.hasMoved) { return; } Vector2i position = hoverTile.gamePosition; if (currentArmy.gamePosition == position) { return; } CombatMonsterGroup monstersAt = GetArmyAt(position); bool hasMonsters = monstersAt != null; if (!hasMonsters) { if (!pathfinder.IsPassable(position)) { return; } } else { if (monstersAt.playerId == currentPlayer) { return; } } int range = Creatures.Get(currentArmy.creatureId).speed; if (hasMonsters) { range++; } List <MovementPoint> path = pathfinder.FindPath(currentArmy.gamePosition, releaseTile.gamePosition, range); if (path == null) { return; } if (hasMonsters) { path.RemoveAt(path.Count - 1); movingToAttack = true; attackTarget = monstersAt; } else { movingToAttack = false; } movementPath = path; movementNextStep = 0; isMoving = true; currentArmy.hasMoved = true; MovementNextStep(); }