public string SimulateBattle(int party1, int party2) { string log = "Begin of Battle" + Environment.NewLine + "Attacker Army: " + party1 + " Peasants" + Environment.NewLine + "Defender Army: " + party2 + " Peasants" + Environment.NewLine + Environment.NewLine; log += "time: " + time + Environment.NewLine + Environment.NewLine; TroopBattleData troopAtt = new TroopBattleData(); troopAtt.Troop = new Troop(){ UnitCount = party1 }; troopAtt.Name = "Army A"; TroopBattleData troopDeff = new TroopBattleData(); troopDeff.Troop = new Troop(){ UnitCount = party2 }; troopDeff.Name = "Army Z"; ArmyBattleData armyAtt = new ArmyBattleData(); armyAtt.Troops.Add(troopAtt); ArmyBattleData armyDeff = new ArmyBattleData(); armyDeff.Troops.Add(troopDeff); //1 - Preconditions //1.1 - Calculate Battle Points foreach (TroopBattleData item in armyAtt.Troops) { item.BattlePoints = item.Troop.UnitCount; log += item.Name + " - BP: " + item.BattlePoints + Environment.NewLine; } foreach (TroopBattleData item in armyDeff.Troops) { item.BattlePoints = item.Troop.UnitCount; log += item.Name + " - BP: " + item.BattlePoints + Environment.NewLine; } //1.2 - Base Damage Multiplier Calculation foreach (TroopBattleData att in armyAtt.Troops) { foreach (TroopBattleData deff in armyDeff.Troops) { att.BaseDamageMultiplier = 1; //fix to be AT-DM against DT log += att.Name + " - BDM: " + att.BaseDamageMultiplier + Environment.NewLine; } } foreach (TroopBattleData deff in armyDeff.Troops) { foreach (TroopBattleData att in armyAtt.Troops) { deff.BaseDamageMultiplier = 1; //fix to be AT-DM against DT log += deff.Name + " - BDM: " + deff.BaseDamageMultiplier + Environment.NewLine; } } //2 - Encounters //Todo: add multiple rounds if BP are left log += this.Encounter(armyAtt, armyDeff); //3 - Postconditions log += Environment.NewLine + "End of Battle" + Environment.NewLine + "Attacker Army: " + troopAtt.Troop.UnitCount + " Peasants" + Environment.NewLine + "Defender Army: " + troopDeff.Troop.UnitCount + " Peasants" + Environment.NewLine; return log; }
private string Encounter(ArmyBattleData armyAtt, ArmyBattleData armyDeff) { Random rand = new Random(); List<TroopBattleData> attackingTroops = new List<TroopBattleData>(); List<TroopBattleData> defendingTroops = new List<TroopBattleData>(); string log = ""; //2.1 Pre-Maneuver //2.1.1 Maneuver-Selection armyAtt.Troops[0].OpposingTroop = armyDeff.Troops[0]; armyDeff.Troops[0].OpposingTroop = armyAtt.Troops[0]; attackingTroops.Add(armyAtt.Troops[0]); attackingTroops.Add(armyDeff.Troops[0]); defendingTroops.Add(armyAtt.Troops[0]); defendingTroops.Add(armyDeff.Troops[0]); //2.2 Maneuvers foreach (TroopBattleData deff in defendingTroops) { //2.2.1 deff.LifePoints = deff.Troop.UnitCount; log += deff.Name + " - LP: " + deff.LifePoints + Environment.NewLine; } foreach (TroopBattleData att in attackingTroops) { log += att.Name + " attacking " + att.OpposingTroop.Name + Environment.NewLine; double luck = 0.95 + rand.NextDouble() * 0.1; log += att.Name + " - luck: " + luck + Environment.NewLine; //2.2.2 att.EffectiveDamageMultiplier = att.BaseDamageMultiplier * time * luck; log += att.Name + " - EDM: " + att.EffectiveDamageMultiplier + Environment.NewLine; //2.2.3 att.PotentialDamagePoints = att.BattlePoints * att.EffectiveDamageMultiplier; log += att.Name + " - PDP: " + att.PotentialDamagePoints + Environment.NewLine; //2.2.4 obsolete att.ProportionValue = att.BattlePoints / att.PotentialDamagePoints; //log += deff.Name + " - PV: " + att.EffectiveDamageMultiplier + Environment.NewLine; //2.2.5 att.OpposingTroop.DamagePoints = Math.Min(att.OpposingTroop.LifePoints, att.PotentialDamagePoints); log += att.Name + " - DP: " + att.DamagePoints + Environment.NewLine; //2.2.6 att.PotentialDamagePoints -= att.OpposingTroop.DamagePoints; log += att.Name + " - remaining PDP: " + att.PotentialDamagePoints + Environment.NewLine; //2.2.7 att.BattlePoints = att.PotentialDamagePoints / att.EffectiveDamageMultiplier; log += att.Name + " - remaining BP: " + att.BattlePoints + Environment.NewLine; } //2.3 - Post-Maneuver foreach (TroopBattleData deff in defendingTroops) { double proportionValue = deff.DamagePoints / deff.LifePoints; //2.3.1 deff.Troop.UnitCount -= (int)deff.DamagePoints; log += deff.Name + " - remaining Peasants: " + deff.Troop.UnitCount + Environment.NewLine; //2.3.2 deff.BattlePoints -= deff.BattlePoints * proportionValue; log += deff.Name = " - remafffffffasdfining BP: " + deff.BattlePoints + Environment.NewLine; } return log; }