public void BattleManager_CorrectlyCalculatesDamageForShield() { int shieldDefense = 10; IronBattleShield shield = new IronBattleShield((shieldDefense * 2) + 1, shieldDefense, 0); _humanPlayer1.SetBattleShield(shield); _logger.SubscribeAll(_humanPlayer1.BattleShield); _humanPlayer1.SetDefense(shieldDefense); _humanPlayer1.SetStrength(_enemyPlayer1.MaxHealth + _enemyPlayer1.Defense); _humanPlayer1.SetMove(_basicAttackMove); _humanPlayer1.SetMoveTarget(_enemyPlayer1); _enemyPlayer1.SetSpeed(1); _enemyPlayer1.SetStrength(shieldDefense * 2); _enemyPlayer1.SetMove(_basicAttackMove); _chanceService.PushEventsOccur(true, false, true, false); //attacks hit, not misses _humanTeam = new Team(_menuManager, _humanPlayer1); _enemyTeam = new Team(_menuManager, _enemyPlayer1); _battleManager.Battle(_humanTeam, _enemyTeam); List <EventLog> logs = _logger.Logs; Assert.AreEqual(1, logs.Count); PhysicalDamageTakenEventArgs e = logs[0].E as PhysicalDamageTakenEventArgs; Assert.NotNull(e); Assert.AreEqual(shieldDefense, e.Damage); }
public void AttackMovePower_AppropriatelyAffectsDamage() { _logger.Subscribe(_team2Fighter, EventType.DamageTaken); int weakAttackPower = 4; int strongAttackPower = 8; AttackBattleMove weakerAttack = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 0, weakAttackPower); AttackBattleMove strongerAttack = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 0, strongAttackPower); _team1Fighter.SetStrength(0); _team1Fighter.SetMove(weakerAttack, 1); _team1Fighter.SetMove(strongerAttack, 1); _chanceService.PushEventsOccur(true, false, true, false); //attacks hit, not crits _team2Fighter.SetHealth(weakAttackPower + strongAttackPower); _team2Fighter.SetMove(_doNothingMove); _battleManager.Battle(_team1, _team2); List <EventLog> logs = _logger.Logs; Assert.AreEqual(2, logs.Count); PhysicalDamageTakenEventArgs e = logs[0].E as PhysicalDamageTakenEventArgs; Assert.NotNull(e); Assert.AreEqual(weakAttackPower, e.Damage); e = logs[1].E as PhysicalDamageTakenEventArgs; Assert.NotNull(e); Assert.AreEqual(strongAttackPower, e.Damage); }
public virtual int DecrementHealth(int damage) { if (damage < 0) { throw new ArgumentException("DecrementHealth cannot be given a negative amount of damage!", nameof(damage)); } var previousHealth = CurrentHealth; CurrentHealth -= damage; if (CurrentHealth < 0) { CurrentHealth = 0; } PhysicalDamageTakenEventArgs e = new PhysicalDamageTakenEventArgs(damage); OnDamageTaken(e); if (CurrentHealth == 0) { OnShieldDestroyed(new ShieldDestroyedEventArgs()); } return(previousHealth - CurrentHealth); }
public void AttackMethod_AppropriatelyRaisesEvents_WhenEnemySurvives() { var expectedDamage = _fighter.Strength - _enemy.Defense; _enemy.SetHealth(expectedDamage + 1); _fighter.Attack(_enemy); var logs = _logger.Logs; Assert.AreEqual(2, logs.Count); Assert.AreEqual(EventType.DamageTaken, logs[0].Type); Assert.AreEqual(_enemy, logs[0].Sender); PhysicalDamageTakenEventArgs e1 = logs[0].E as PhysicalDamageTakenEventArgs; Assert.NotNull(e1); Assert.AreEqual(expectedDamage, e1.Damage); Assert.AreEqual(EventType.AttackSuccessful, logs[1].Type); Assert.AreEqual(_fighter, logs[1].Sender); AttackSuccessfulEventArgs e2 = logs[1].E as AttackSuccessfulEventArgs; Assert.NotNull(e2); Assert.AreEqual(expectedDamage, e2.DamageDealt); }
public void AttackMethod_AppropriatelyRaisesEvents_WhenEnemyDies() { _fighter = (TestHumanFighter)TestFighterFactory.GetFighter(TestFighterType.TestHuman, 1, "Ted"); _logger.SubscribeAll(_fighter); _fighter.SetStrength(_enemy.MaxHealth + 1); _fighter.Attack(_enemy); var logs = _logger.Logs; Assert.AreEqual(4, logs.Count); //first event, damage taken Assert.AreEqual(EventType.DamageTaken, logs[0].Type); Assert.AreEqual(_enemy, logs[0].Sender); PhysicalDamageTakenEventArgs e1 = logs[0].E as PhysicalDamageTakenEventArgs; Assert.NotNull(e1); Assert.AreEqual(_fighter.Strength, e1.Damage); //second event, killed - fired by enemy Assert.AreEqual(EventType.Killed, logs[1].Type); Assert.AreEqual(_enemy, logs[1].Sender); KilledEventArgs e2 = logs[1].E as KilledEventArgs; Assert.That(e2, Is.Not.Null); //third event, damageDealt to enemy Assert.AreEqual(EventType.AttackSuccessful, logs[2].Type); Assert.AreEqual(_fighter, logs[2].Sender); AttackSuccessfulEventArgs e3 = logs[2].E as AttackSuccessfulEventArgs; Assert.NotNull(e3); Assert.AreEqual(_enemy.MaxHealth, e3.DamageDealt); //fourth event, killed enemy Assert.AreEqual(EventType.EnemyKilled, logs[3].Type); Assert.AreEqual(_fighter, logs[3].Sender); EnemyKilledEventArgs e4 = logs[3].E as EnemyKilledEventArgs; Assert.NotNull(e4); Assert.AreEqual(_enemy, e4.Enemy); }
protected void PrintPhysicalDamageMessage(object sender, PhysicalDamageTakenEventArgs e) { int damage = e.Damage; if (Config.ShowPhysicalDamageMessages) { IBattleShield senderAsShield = sender as IBattleShield; string output; if (senderAsShield != null) { output = $"{senderAsShield.Owner.DisplayName}'s {senderAsShield.GetDisplayText(false)} took {damage} damage!"; } else { output = $"It did {damage} damage!"; } _output.WriteLine(output); } }
public void CalculatedAttackPowerCannotBeNegative() { _logger.Subscribe(_team2Fighter, EventType.DamageTaken); AttackBattleMove attack = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 0, -1); _team1Fighter.SetStrength(0); _team1Fighter.SetMove(attack, 1); _team1Fighter.SetMove(_runawayMove, 1); _chanceService.PushEventsOccur(true, false); //attack hit, not crits _team2Fighter.SetMove(_doNothingMove); _battleManager.Battle(_team1, _team2); List <EventLog> logs = _logger.Logs; Assert.AreEqual(1, logs.Count); PhysicalDamageTakenEventArgs e = logs[0].E as PhysicalDamageTakenEventArgs; Assert.NotNull(e); Assert.AreEqual(0, e.Damage); }
private void _logDamageTaken(object sender, PhysicalDamageTakenEventArgs e) { Logs.Add(new EventLog(EventType.DamageTaken, sender, e)); }
public void OnDamageTaken(PhysicalDamageTakenEventArgs e) { DamageTaken?.Invoke(this, e); }