/// [NEW FOR ASSESSMENT 4] /// <summary> /// Sets the attacker. /// also handles actions that need to happen when the attacker changes /// </summary> void setAttacker(CombatCharacter character) { if (attacker == character) { return; } attacker = character; float val = Random.value; Debug.Log(val); if (val < attacker.attackFriendlyChance) { //select a random alive friendly character List <int> options = new List <int> (); for (int i = 0; i < frendlyChars.Count; i++) { if (frendlyChars [i].health > 0) { options.Add(i); } } int toAttack = options [Random.Range(0, options.Count - 1)]; //attack them attackTargets = new List <CombatCharacter> (); attackTargets.Add(frendlyChars [toAttack]); attack = attacker.basicAttack; attacker.updateEntityAnimation("move"); currentStage = turnStages.moving; } }
//called in update() if the current stage is the selection stage void selectionStage() { if (!frendlyAttacking) { //TODO write better enemy combat logic int toAttack = CombatCharacter.getFirstAlive(defendChars); if (toAttack == -1) { lose(); } else { attackTargets = new List <CombatCharacter> (); attackTargets.Add(defendChars [toAttack]); attack = attacker.basicAttack; attacker.updateEntityAnimation("move"); currentStage = turnStages.moving; } } else { selectorRen.enabled = true; selectorObj.transform.position = attacker.entity.transform.position; } }
//called in update() if the current stage is the target selection stage /// <summary> /// [EXTENSION Un-Two] Gorrila check added for target selection to allow randomisation for the gorilla void targetSelectionStage() { selectorRen.enabled = false; hideAbilities(); if (attackTargets == null) { attackTargets = new List <CombatCharacter> (); } if (targetsRemaining == 0) { removeTargetSelectors(); currentStage = turnStages.moving; attacker.updateEntityAnimation("move"); return; } if (targetSelectorButtonObjs == null) { targetSelectorButtonObjs = new List <GameObject> (); List <CombatCharacter> selectableCharacters; if (attack.isAssist) { selectableCharacters = attackChars; } else if (attack.isGorrila) //[Un-Two] this statement detects if the attack is from the Gorrila and if it is will randomly select to target players or enemies { Debug.Log("Gorrila Attack"); if (Random.Range(0, 10) <= 3) { Debug.Log("Hit Players"); selectableCharacters = attackChars; } else { Debug.Log("Hit Enemies"); selectableCharacters = defendChars; } } else { selectableCharacters = defendChars; } foreach (CombatCharacter character in selectableCharacters) { if (character.isAlive()) { GameObject newButtonObj = Instantiate(canvasObj.transform.Find("ReferenceTargetButton").gameObject, canvasObj.transform); newButtonObj.transform.position = character.entity.transform.position; newButtonObj.SetActive(true); targetSelectorButtonObjs.Add(newButtonObj); UnityEngine.UI.Button newButton = newButtonObj.GetComponent <UnityEngine.UI.Button> (); CombatCharacter tempValue = character; // necessary to deal with weird scoping newButton.onClick.AddListener(delegate { selectTarget(tempValue); }); } } } }
// function called when an abililty button on abilities panel is pressed /// <summary> /// [changes] - check that character has sufficient mana before launching attack /// - this fixes error from crashing due to no mana /// </summary> void selectAbility(CombatAbility ability) { if (attacker.energy >= ability.energyCost) { attack = ability; currentStage = turnStages.targetSelection; targetsRemaining = attack.maxTargets; } }
// function to be called when the "attack" button is hit public void doAttack() { if (currentStage == turnStages.selecting && frendlyAttacking) { attack = attacker.basicAttack; currentStage = turnStages.targetSelection; targetsRemaining = attack.maxTargets; } }
//called in update() if the current stage is the attacking stage void attackingStage() // TODO add animations and delays to attack stage { if (timer > 1f) { attack.doAbility(attackTargets, attacker); attackTargets = null; currentStage = turnStages.returning; attacker.updateEntityAnimation("return"); } }
//called in update() if the current stage is the attacking stage void attackingStage() { if (timer > 1f) { attack.doAbility(attackTargets, attacker); attackTargets = null; currentStage = turnStages.returning; attacker.updateEntityAnimation("return"); } }
//called in update() if the current stage is the movement stage void movingStage() { hideAbilities(); selectorRen.enabled = false; if (attacker.entity.moveAttack()) { attacker.updateEntityAnimation("attack"); timer = 0f; currentStage = turnStages.attacking; } }
//called in update() if the current stage is the target selection stage void targetSelectionStage() { selectorRen.enabled = false; hideAbilities(); if (attackTargets == null) { attackTargets = new List <CombatCharacter> (); } if (targetsRemaining == 0) { removeTargetSelectors(); currentStage = turnStages.moving; attacker.updateEntityAnimation("move"); return; } if (targetSelectorButtonObjs == null) { targetSelectorButtonObjs = new List <GameObject> (); List <CombatCharacter> selectableCharacters; if (attack.isAssist) { selectableCharacters = attackChars; } else { selectableCharacters = defendChars; } foreach (CombatCharacter character in selectableCharacters) { if (character.isAlive()) { GameObject newButtonObj = Instantiate(canvasObj.transform.Find("ReferenceTargetButton").gameObject, canvasObj.transform); newButtonObj.transform.position = character.entity.transform.position; newButtonObj.SetActive(true); targetSelectorButtonObjs.Add(newButtonObj); UnityEngine.UI.Button newButton = newButtonObj.GetComponent <UnityEngine.UI.Button> (); CombatCharacter tempValue = character; // necessary to deal with weird scoping newButton.onClick.AddListener(delegate { selectTarget(tempValue); }); } } } }
//called in update() if the current stage is the returning stage void returningStage() { if (CombatCharacter.getFirstAlive(frendlyChars) == -1) { lose(); } if (CombatCharacter.getFirstAlive(enemyChars) == -1) { win(); } if (attacker.entity.moveRest()) { attacker.updateEntityAnimation("base"); do { attackerPos++; if (attackerPos >= attackChars.Count) { break; } attacker = attackChars[attackerPos]; } while (!attacker.isAlive()); if (attackerPos >= attackChars.Count) { frendlyAttacking = !frendlyAttacking; foreach (CombatCharacter character in defendChars) { character.doEffects(); } attackerPos = CombatCharacter.getFirstAlive(defendChars); } if (attackerPos == -1) { Debug.Log("somethings wrong, there's no one left to take a turn"); } currentStage = turnStages.selecting; } }
float timer = 0f; //timer used to time animations /// <summary> /// [EXTENSION] - Start playing battle music /// - Explicity set character sprites and canvas to "Player" level /// </summary> void Start() { SoundManager.instance.playBGM("battle"); canvasObj = this.transform.parent.gameObject; WinPanel = this.transform.parent.Find("WinPanel").gameObject; LosePanel = this.transform.parent.Find("LosePanel").gameObject; abilitiesPanel = canvasObj.transform.Find("AbilitiesPanel").gameObject; state = GameStateManager.getGameStateManager(); //hide non combat objects in the scene sceneObjects = new List <GameObject> (); foreach (GameObject obj in GameObject.FindObjectsOfType <GameObject>()) { if (obj.tag == "MainCamera") { canvasObj.GetComponent <Canvas> ().worldCamera = obj.GetComponent <Camera> (); canvasObj.GetComponent <Canvas> ().sortingLayerName = "Player"; startingCameraPosition = obj.transform.position; sceneCamera = obj; obj.transform.position = new Vector3(0f, 0f, -10f); } else if (!obj.transform.IsChildOf(this.transform.parent) && obj.name != "AudioManager") { sceneObjects.Add(obj); obj.SetActive(false); } } List <GameObject> gameObjectsToLeaveActive = new List <GameObject> (); foreach (GameObject obj in sceneObjects) { if (obj.transform.IsChildOf(sceneCamera.transform)) { gameObjectsToLeaveActive.Add(obj); } if (obj.tag == "GameStateManager") { gameObjectsToLeaveActive.Add(obj); } } foreach (GameObject obj in gameObjectsToLeaveActive) { sceneObjects.Remove(obj); obj.SetActive(true); } frendlyAttacking = true; attackerPos = 0; currentStage = turnStages.selecting; selectorObj = new GameObject("Selector"); selectorRen = selectorObj.AddComponent(typeof(SpriteRenderer)) as SpriteRenderer; selectorRen.sprite = Resources.Load <Sprite> ("Selector"); selectorRen.enabled = false; GameObject combatEntityPrefab = Resources.Load <GameObject> ("CombatEntity"); // create objects representing combatants Vector3 pos = new Vector3(-4, 3); // arbitrary start position Vector3 offset = new Vector3(0, -2); // arbitrary offset foreach (CombatCharacter c in frendlyChars) { GameObject obj = GameObject.Instantiate(combatEntityPrefab, pos, new Quaternion()); obj.GetComponent <SpriteRenderer> ().sortingLayerName = "Player"; c.entity = obj.GetComponent <CombatEntity> (); c.entity.setupBars(false, true); c.updateEntityBars(); c.updateEntityAnimation("base"); pos += offset; } pos = new Vector3(4, 3); // arbitrary start position foreach (CombatCharacter c in enemyChars) { GameObject obj = GameObject.Instantiate(combatEntityPrefab, pos, new Quaternion()); obj.GetComponent <SpriteRenderer> ().sortingLayerName = "Player"; c.entity = obj.GetComponent <CombatEntity> (); c.entity.setupBars(true, false); c.updateEntityBars(); c.updateEntityAnimation("base"); pos += offset; } attacker = frendlyChars [attackerPos]; }
// called when a winning state is detected void win() { currentStage = turnStages.win; }
//called when a losing state is detected void lose() { currentStage = turnStages.lose; Debug.Log("You Lose! Now implement losing."); }
// function called when an abililty button on abilities panel is pressed void selectAbility(CombatAbility ability) { attack = ability; currentStage = turnStages.targetSelection; targetsRemaining = attack.maxTargets; }