/// <summary> /// Uses the item at the given index and removes it if there are no more charges left. /// </summary> /// <param name="index"></param> /// <param name="player"></param> public void UseItem(int index, TacticsMove player) { InventoryTuple useItem = inventory[index]; if (useItem.itemCategory == ItemCategory.CONSUME) { if (useItem.weaponType == WeaponType.C_HEAL) { player.TakeHeals(useItem.power); } else if (useItem.attackType == AttackType.KEY) { //Door is done in another place } else { Boost boost = useItem.boost; player.stats.BoostBaseStats(boost); } } else { Debug.LogWarning("WTF!?"); return; } useItem.currentCharges--; if (useItem.currentCharges <= 0) { inventory[index] = new InventoryTuple(null); CleanupInventory(); } player.End(); }
private IEnumerator ActionLoop() { state = State.ACTION; for (int i = 0; i < actions.Count; i++) { BattleAction act = actions[i]; if (act.type == BattleAction.Type.DAMAGE && act.attacker.inventory.GetFirstUsableItemTuple(ItemCategory.WEAPON).currentCharges <= 0) { continue; //Broken weapon } if (act.type != BattleAction.Type.DAMAGE && act.attacker.inventory.GetFirstUsableItemTuple(ItemCategory.SUPPORT).currentCharges <= 0) { continue; //Broken staff } yield return(new WaitForSeconds(1f * currentGameSpeed.value)); BattleAnimator.AnimationInfo animationInfo = new BattleAnimator.AnimationInfo(); // Deal damage bool isCrit = false; if (act.type == BattleAction.Type.DAMAGE) { int damage = act.AttemptAttack(useTrueHit.value); if (damage != -1 && act.AttemptCrit()) { damage = (int)(damage * BattleCalc.CRIT_MODIFIER); isCrit = true; } act.defender.TakeDamage(damage, isCrit); BattleAnimator.HitType hitType = (damage < 0) ? BattleAnimator.HitType.MISS : (isCrit) ? BattleAnimator.HitType.CRIT : BattleAnimator.HitType.NORMAL; animationInfo.side = act.side; animationInfo.weaponType = act.weaponAtk.weaponType; animationInfo.hitType = hitType; animationInfo.leathal = !act.defender.IsAlive(); animationInfo.damage = damage; if (damage > 0) { if (act.side == AttackSide.LEFT) { _attackerDealtDamage = true; } else { _defenderDealtDamage = true; } } act.attacker.inventory.ReduceItemCharge(ItemCategory.WEAPON); } else { // Heal or buff if (act.staffAtk.weaponType == WeaponType.MEDKIT) { int health = act.GetHeals(); act.defender.TakeHeals(health); //StartCoroutine(DamageDisplay(act.leftSide, health, false, false)); } else if (act.staffAtk.weaponType == WeaponType.BARRIER) { act.defender.ReceiveBuff(act.attacker.GetEquippedWeapon(ItemCategory.SUPPORT).boost, true, true); } act.attacker.inventory.ReduceItemCharge(ItemCategory.SUPPORT); _attackerDealtDamage = true; } //Animate!! waitForAnimation = true; battleAnimator.PlayAttack(animationInfo); while (waitForAnimation) { yield return(null); } //Check Death // Debug.Log("Check death"); if (!act.defender.IsAlive()) { yield return(new WaitForSeconds(1f * currentGameSpeed.value)); if (act.defender.stats.charData.deathQuote != null) { Debug.Log("Death quote"); state = State.DEATH; dialogueMode.value = (int)DialogueMode.QUOTE; currentDialogue.value = dialogue = act.defender.stats.charData.deathQuote; showDialogueEvent.Invoke(); lockControls.value = false; while (state == State.DEATH) { yield return(null); } } break; } } //Handle exp yield return(StartCoroutine(ShowExpGain())); //Broken weapons yield return(StartCoroutine(HandleBrokenWeapons())); //Drop Items if (!actions[0].attacker.IsAlive() && actions[0].attacker.faction == Faction.ENEMY) { yield return(StartCoroutine(DropItems(actions[0].attacker, actions[0].defender))); } else if (!actions[0].defender.IsAlive() && actions[0].defender.faction == Faction.ENEMY) { yield return(StartCoroutine(DropItems(actions[0].defender, actions[0].attacker))); } //Give debuffs if (actions[0].type == BattleAction.Type.DAMAGE) { actions[0].attacker.ActivateSkills(SkillActivation.POSTCOMBAT, actions[0].defender); actions[0].defender.ActivateSkills(SkillActivation.POSTCOMBAT, actions[0].attacker); actions[0].defender.stats.fatigueAmount = Mathf.Min(actions[0].defender.fatigueCap, actions[0].defender.stats.fatigueAmount + 1); } //Clean up state = State.INIT; currentAction.value = ActionMode.NONE; battleAnimator.CleanupScene(); battleAnimationObject.SetActive(false); uiCanvas.SetActive(true); actions[0].attacker.EndSkills(SkillActivation.INITCOMBAT, actions[0].defender); actions[0].attacker.EndSkills(SkillActivation.PRECOMBAT, actions[0].defender); actions[0].defender.EndSkills(SkillActivation.PRECOMBAT, actions[0].attacker); actions.Clear(); if (currentTurn.value == Faction.PLAYER) { lockControls.value = false; } _currentCharacter.End(); _currentCharacter = null; yield return(new WaitForSeconds(0.5f * currentGameSpeed.value)); //Music stopTransitionMusicEvent.Invoke(); //Send game finished battleFinishedEvent.Invoke(); }
private IEnumerator ActionLoop() { leftDamageObject.SetActive(false); rightDamageObject.SetActive(false); leftTransform.GetComponent <SpriteRenderer>().sprite = actions[0].attacker.stats.battleSprite; rightTransform.GetComponent <SpriteRenderer>().sprite = actions[0].defender.stats.battleSprite; leftTransform.GetComponent <SpriteRenderer>().color = Color.white; rightTransform.GetComponent <SpriteRenderer>().color = Color.white; for (int i = 0; i < actions.Count; i++) { BattleAction act = actions[i]; Transform attackTransform = (!useBattleAnimations.value) ? act.attacker.transform : (act.leftSide) ? leftTransform : rightTransform; Transform defenseTransform = (!useBattleAnimations.value) ? act.defender.transform : (act.leftSide) ? rightTransform : leftTransform; Vector3 startPos = attackTransform.localPosition; Vector3 enemyPos = defenseTransform.localPosition; enemyPos = startPos + (enemyPos - startPos).normalized; battleAnimationObject.SetActive(useBattleAnimations.value); if (useBattleAnimations.value) { leftHealth.fillAmount = actions[0].attacker.GetHealthPercent(); rightHealth.fillAmount = actions[0].defender.GetHealthPercent(); yield return(new WaitForSeconds(1f)); } //Move forward float f = 0; Debug.Log("Start moving"); while (f < 0.5f) { f += Time.deltaTime * speed; attackTransform.localPosition = Vector3.Lerp(startPos, enemyPos, f); yield return(null); } // Deal damage if (act.isDamage) { int damage = act.GetDamage(); if (act.attacker.SkillReady(SkillType.DAMAGE)) { damage = act.attacker.GetSkill().GenerateDamage(damage); act.attacker.skillCharge = -1; Debug.Log("Bonus damage!"); } act.defender.TakeDamage(damage); StartCoroutine(DamageDisplay(act.leftSide, damage, true)); Debug.Log(i + " Dealt damage : " + damage); if (act.attacker.SkillReady(SkillType.HEAL)) { int health = act.attacker.GetSkill().GenerateHeal(damage); act.attacker.skillCharge = -1; act.attacker.TakeHeals(health); rightDamageText.text = damage.ToString(); StartCoroutine(DamageDisplay(!act.leftSide, damage, false)); Debug.Log(i + " Healt damage : " + health); } if (!act.defender.IsAlive()) { if (act.leftSide) { rightTransform.GetComponent <SpriteRenderer>().color = new Color(0.4f, 0.4f, 0.4f); } else { leftTransform.GetComponent <SpriteRenderer>().color = new Color(0.4f, 0.4f, 0.4f); } } //Add skill charges act.attacker.IncreaseSkill(); act.defender.IncreaseSkill(); } else { if (act.attacker.GetSupport().supportType == SupportType.HEAL) { int health = act.GetHeals(); act.defender.TakeHeals(health); StartCoroutine(DamageDisplay(act.leftSide, health, false)); Debug.Log(i + " Healt damage : " + health); if (act.attacker.faction == Faction.PLAYER) { act.attacker.GainSP(1, true); } } else if (act.attacker.GetSupport().supportType == SupportType.BUFF) { act.defender.ReceiveBuff(act.attacker.GetSupport().boost, true, true); Debug.Log("Boost them up!"); } } //Update health leftHealth.fillAmount = (act.leftSide) ? act.attacker.GetHealthPercent() : act.defender.GetHealthPercent(); rightHealth.fillAmount = (act.leftSide) ? act.defender.GetHealthPercent() : act.attacker.GetHealthPercent(); // Move back Debug.Log("Moving back"); while (f > 0f) { f -= Time.deltaTime * speed; attackTransform.localPosition = Vector3.Lerp(startPos, enemyPos, f); yield return(null); } //Check Death Debug.Log("Check death"); if (!act.defender.IsAlive()) { if (act.attacker.faction == Faction.PLAYER) { act.attacker.GainSP(3, true); } yield return(new WaitForSeconds(1f)); break; } } //Handle exp yield return(StartCoroutine(ShowExpGain())); //Give debuffs if (actions[0].isDamage) { actions[0].attacker.ActivateSkills(Activation.POSTCOMBAT, actions[0].defender); actions[0].defender.ActivateSkills(Activation.POSTCOMBAT, actions[0].attacker); } //Check game finished battleFinishedEvent.Invoke(); //Clean up battleAnimationObject.SetActive(false); leftDamageObject.SetActive(false); rightDamageObject.SetActive(false); actions[0].attacker.EndSkills(Activation.INITCOMBAT, actions[0].defender); actions[0].attacker.EndSkills(Activation.PRECOMBAT, actions[0].defender); actions[0].defender.EndSkills(Activation.PRECOMBAT, actions[0].attacker); actions.Clear(); TurnController.busy = false; _currentCharacter.End(); _currentCharacter = null; }