private void Update() { if (IsAnimateFight) { FightTime -= Time.deltaTime; if (FightTime <= 0) { IsAnimateFight = false; Attacker.gameObject.GetComponent <Animator>().enabled = false; Defender.gameObject.GetComponent <Animator>().enabled = false; Attacker.gameObject.GetComponent <SpriteRenderer>().sprite = DefaultSpriteAttacker; Defender.gameObject.GetComponent <SpriteRenderer>().sprite = DefaultSpriteDefender; Attacker.UpdateHealthText(); Defender.UpdateHealthText(); FightTime = 1f; // Create the animation fight event. But set the needsanimating to false. Meaning that the method Attack.BattleSimulation() is called. var fight = new OnAnimFight { attacker = Attacker, defender = Defender, needsAnimating = false }; EventHandler.dispatch(fight); } } }
/// <summary> /// The method which does all the complicated battle simulation. From calculating Damage to dealing Damage and so forth. /// Gets called when the event OnAnimFight is fired. When the needsAnimating property is false it will execute this code. /// </summary> /// <param Name="Attacker"></param> /// <param Name="Defender"></param> private void BattleSimulation(OnAnimFight evt) { if (evt.attacker != null && evt.defender != null && !evt.needsAnimating) { UnitGameObject attacker = evt.attacker; UnitGameObject defender = evt.defender; attacker.UnitGame.UpdateUnitColor(); Unit attUnit = attacker.UnitGame; Unit defUnit = defender.UnitGame; float damageToDefender = attUnit.Damage * attUnit.GetStrength() * attUnit.GetGroundModifier() * attUnit.GetUnitModifier(defender.type); float damageToAttacker = defUnit.Damage * defUnit.GetStrength() * defUnit.GetGroundModifier() * defUnit.GetUnitModifier(attacker.type); damageToDefender = Mathf.Clamp(damageToDefender, 1f, float.MaxValue); damageToAttacker = Mathf.Clamp(damageToAttacker, 1f, float.MaxValue); defUnit.DecreaseHealth(damageToDefender); if (defUnit.AttackRange >= attUnit.AttackRange) { attUnit.DecreaseHealth(damageToAttacker); } CheckUnitsHealth(attacker, defender); } }
/// <summary> /// Get called whenever an OnHighlightClick is fired. If it is possible it will attack an enemy unit. /// </summary> /// <param Name="evt"></param> public void BattlePreparation(OnHighlightClick evt) { if (evt.highlight != null) { HighlightObject highlightObj = evt.highlight; if (highlight.IsHighlightOn && !movement.NeedsMoving && highlightObj.highlightTypeActive == HighlightTypes.highlight_attack) { UnitGameObject attackingUnit = highlight.UnitSelected; UnitGameObject defendingUnit = highlightObj.Tile.unitGameObject; if (!attackingUnit.UnitGame.HasAttacked) { if (!attackingUnit.UnitGame.HasMoved || (attackingUnit.UnitGame.HasMoved && attackingUnit.UnitGame.CanAttackAfterMove)) { if (TileHelper.IsTileWithinRange(attackingUnit.transform.position, defendingUnit.transform.position, attackingUnit.UnitGame.AttackRange)) { attackingUnit.UnitGame.HasAttacked = true; attackingUnit.UnitGame.HasMoved = true; attackingUnit.UnitGame.PlaySound(UnitSoundType.Attack); highlight.ClearHighlights(); // Check if units are faces the wrong way FacingDirectionUnits(attackingUnit, defendingUnit); // Dispatch the animation fight event. But set the needsanimating to true. OnAnimFight fight = new OnAnimFight(); fight.attacker = attackingUnit; fight.defender = defendingUnit; fight.needsAnimating = true; EventHandler.dispatch(fight); } else { Notificator.Notify("Move to this unit to attack!", 1f); } } } } } }
private void OnFightAnim(OnAnimFight evt) { if (evt.attacker != null && evt.defender != null && evt.needsAnimating) { Defender = evt.defender; Attacker = evt.attacker; DefaultSpriteAttacker = Attacker.gameObject.GetComponent <SpriteRenderer>().sprite; DefaultSpriteDefender = Defender.gameObject.GetComponent <SpriteRenderer>().sprite; Attacker.gameObject.GetComponent <Animator>().enabled = true; if (Defender.UnitGame.AttackRange >= Attacker.UnitGame.AttackRange) { Defender.gameObject.GetComponent <Animator>().enabled = true; } IsAnimateFight = true; } }