public AttackResults(int dmg, bool isMiss, DamageRelated AttackingUnit) { DamageDealt = dmg; Miss = isMiss; Unit = AttackingUnit.UnitReference; }
//Actually calculate the combat and it's results AttackResults[] GetCombatResults(DamageRelated Attacker, DamageRelated Defender) { List <AttackResults> AttackList = new List <AttackResults> { }; //Attacker Phase if (Attacker.AttackCount > 0) { AttackList.Add(AttackRoll(Attacker)); Attacker.AttackCount--; Defender.HP -= AttackList[AttackList.Count - 1].DamageDealt; print(Attacker.UnitReference.name + " Attacked: Dealt " + AttackList[AttackList.Count - 1].DamageDealt); if (Defender.HP <= 0) { return(AttackList.ToArray()); } } //Defender Phase if (Defender.AttackCount > 0) { AttackList.Add(AttackRoll(Defender)); Defender.AttackCount--; Attacker.HP -= AttackList[AttackList.Count - 1].DamageDealt; print(Defender.UnitReference.name + " Attacked. Dealt: " + AttackList[AttackList.Count - 1].DamageDealt); if (Attacker.HP <= 0) { return(AttackList.ToArray()); } } //Bonus Phase if (Attacker.AttackCount > 0) { AttackList.Add(AttackRoll(Attacker)); Attacker.AttackCount--; Defender.HP -= AttackList[AttackList.Count - 1].DamageDealt; print(Attacker.UnitReference.name + " Attacked: Dealt " + AttackList[AttackList.Count - 1].DamageDealt); } else if (Defender.AttackCount > 0) { AttackList.Add(AttackRoll(Defender)); Defender.AttackCount--; Attacker.HP -= AttackList[AttackList.Count - 1].DamageDealt; print(Defender.UnitReference.name + " Attacked: Dealt " + AttackList[AttackList.Count - 1].DamageDealt); } return(AttackList.ToArray()); }
//Simulates an attack, then returns the damage AttackResults AttackRoll(DamageRelated Attacker) { int Roll = Random.Range(0, 100), Damage = 0; bool Missed = false; if (Roll <= Attacker.CritChance) { Damage = Attacker.Damage * 3; } else if (Roll <= Attacker.HitChance) { Damage = Attacker.Damage; } else { Missed = true; } return(new AttackResults(Damage, Missed, Attacker)); }
//Sets up all the variables/structs needed locally, but can be triggered from another class public void InitializeCombatParameters(RPGClass Attacker, RPGClass Defender, Terrain AttackerTerrain, Terrain DefenderTerrain) { //Set up my probabilities and damage including resistances AttackerDamageParameters = ProbableDamage(Attacker.CombatParameters, Defender.CombatParameters, AttackerTerrain, DefenderTerrain); DefenderDamageParameters = ProbableDamage(Defender.CombatParameters, Attacker.CombatParameters, DefenderTerrain, AttackerTerrain); //Set up the 'sides', that way world space can be somewhat reflected in the animations and attacker/defender only get to be on one specific side if (Attacker.x > Defender.x || Attacker.y > Defender.y) { RightSide.Unit = Attacker; RightSide.Probabilites = AttackerDamageParameters; LeftSide.Unit = Defender; LeftSide.Probabilites = DefenderDamageParameters; } else { RightSide.Unit = Defender; RightSide.Probabilites = DefenderDamageParameters; LeftSide.Unit = Attacker; LeftSide.Probabilites = AttackerDamageParameters; } //Display a window showing combat information getCombatInfo menu = FindObjectOfType <getCombatInfo>(); menu.PassStats(AttackerDamageParameters, DefenderDamageParameters); }