public void StatusMove_AppropriatelyDisplaysExecutionText() { const string executionText = "performs the foo ritual"; Status status = new MagicMultiplierStatus(2, MagicType.Water, 2); StatusMove move = new StatusMove("foo", TargetType.Self, status, executionText); _team1Fighter.SetMove(move, 1); _team1Fighter.SetMove(_runawayMove); _team2Fighter.SetMove(_doNothingMove); BattleManagerBattleConfiguration config = new BattleManagerBattleConfiguration { ShowIntroAndOutroMessages = false, ShowExpAndLevelUpMessages = false }; //status move hits _chanceService.PushEventOccurs(true); _battleManager.Battle(_team1, _team2, config: config); MockOutputMessage[] outputs = _output.GetOutputs(); Assert.AreEqual(2, outputs.Length); string expectedStatusOutput = $"{_team1Fighter.DisplayName} {executionText}!\n"; Assert.AreEqual(expectedStatusOutput, outputs[0].Message); }
protected void PrintStatusAddedMessage(object sender, StatusAddedEventArgs e) { Status status = e.Status; IFighter senderAsFighter = sender as IFighter; if (senderAsFighter == null) { throw new InvalidOperationException("BattleManager.PrintStatusAddedMessage() should only subscribe to instances of IFighter"); } CriticalChanceMultiplierStatus criticalChanceStatus = status as CriticalChanceMultiplierStatus; StatMultiplierStatus statMultiplierStatus = status as StatMultiplierStatus; MagicMultiplierStatus magicMultiplierStatus = status as MagicMultiplierStatus; MagicResistanceMultiplierStatus resistanceMultiplierStatus = status as MagicResistanceMultiplierStatus; ReflectStatus reflectStatus = status as ReflectStatus; SpellCostMultiplierStatus spellCostMultiplierStatus = status as SpellCostMultiplierStatus; AutoEvadeStatus autoEvadeStatus = status as AutoEvadeStatus; CounterAttackStatus counterAttackStatus = status as CounterAttackStatus; BlindStatus blindStatus = status as BlindStatus; if (criticalChanceStatus != null) { PrintStatusAddedMessage(senderAsFighter, criticalChanceStatus); } if (statMultiplierStatus != null) { PrintStatusAddedMessage(senderAsFighter, statMultiplierStatus); } if (magicMultiplierStatus != null) { PrintStatusAddedMessage(senderAsFighter, magicMultiplierStatus); } if (resistanceMultiplierStatus != null) { PrintStatusAddedMessage(senderAsFighter, resistanceMultiplierStatus); } if (reflectStatus != null) { PrintStatusAddedMessage(senderAsFighter, reflectStatus); } if (spellCostMultiplierStatus != null) { PrintStatusAddedMessage(senderAsFighter, spellCostMultiplierStatus); } if (autoEvadeStatus != null) { PrintStatusAddedMessage(senderAsFighter, autoEvadeStatus); } if (counterAttackStatus != null) { PrintStatusAddedMessage(senderAsFighter, counterAttackStatus); } if (blindStatus != null) { PrintStatusAddedMessage(senderAsFighter, blindStatus); } }
public void FighterStatusCounterTicksDown_OnTurnEnd() { Status status = new MagicMultiplierStatus(3, MagicType.Lightning, 1.25); _humanFighter.AddStatus(status); _humanFighter.OnTurnEnded(new TurnEndedEventArgs(_humanFighter)); Status returnedStatus = _humanFighter.Statuses[0]; Assert.AreEqual(2, returnedStatus.TurnCounter); }
protected void PrintStatusAddedMessage(IFighter fighter, MagicMultiplierStatus status) { string strengthenedOrWeakened = (status.Multiplier > 1.0) ? "strengthened" : "weakened"; MagicType magicType = status.MagicType; string output = $"{fighter.DisplayName} has {strengthenedOrWeakened}"; if (magicType != MagicType.All) { string magicTypeString = magicType.ToString().ToLower(); output = $"{output} {magicTypeString}"; } output = $"{output} magic for {GetDurationString(status)}!"; _output.WriteLine(output); }
public void FighterStatus_MultipleInstancesOfStatus_HaveSeparateCounters() { MagicMultiplierStatus status = new MagicMultiplierStatus(4, MagicType.All, 1.25); _humanFighter.AddStatus(status); for (var i = 0; i < 2; ++i) { _humanFighter.OnTurnEnded(new TurnEndedEventArgs(_humanFighter)); } TestHumanFighter fighter2 = new TestHumanFighter("Bob", 1); fighter2.AddStatus(status); Status returnedStatus = fighter2.Statuses[0]; Assert.AreEqual(4, returnedStatus.TurnCounter); }
public void FighterOnRoundEnd_CorrectlyRemovesStatusesWithTurnCounter0_MultipleStatuses([Values(1, 2, 3)] int turnCount) { ReflectStatus firstStatus = new ReflectStatus(turnCount, MagicType.Ice); MagicMultiplierStatus secondStatus = new MagicMultiplierStatus(turnCount, MagicType.Ice, 2.0); _humanFighter.AddStatus(firstStatus); _humanFighter.AddStatus(secondStatus); _logger.Subscribe(EventType.StatusRemoved, _humanFighter); for (var i = 0; i < turnCount; ++i) { _humanFighter.OnTurnEnded(new TurnEndedEventArgs(_humanFighter)); } _humanFighter.OnRoundEnded(new RoundEndedEventArgs(_humanTeam, _humanFighter)); List <EventLog> logs = _logger.Logs; Assert.AreEqual(2, logs.Count); EventLog log = logs[0]; Assert.AreEqual(EventType.StatusRemoved, log.Type); Assert.AreEqual(_humanFighter, log.Sender); StatusRemovedEventArgs args = log.E as StatusRemovedEventArgs; Assert.NotNull(args); Assert.IsTrue(firstStatus.AreEqual(args.Status)); log = logs[1]; Assert.AreEqual(EventType.StatusRemoved, log.Type); Assert.AreEqual(_humanFighter, log.Sender); args = log.E as StatusRemovedEventArgs; Assert.NotNull(args); Assert.IsTrue(secondStatus.AreEqual(args.Status)); }
public void CastSpell_CalculatesCorrectDamage( [Values(40, 80)] int magicStrength, [Values(0, 6)] int magicBonus, [Values(null, 0.25, 1.5)] double?individualMagicStrengthMultiplier, [Values(null, 0.5, 2.0)] double?teamMagicStrengthMultiplier, [Values(0, 4)] int resistance, [Values(0, 2)] int resistanceBonus, [Values(FighterMagicRelationshipType.Weak, FighterMagicRelationshipType.Resistant, FighterMagicRelationshipType.Immune)] FighterMagicRelationshipType relationshipType, [Values(MagicType.Ice, MagicType.All)] MagicType affinityMagicType, [Values(MagicType.Ice, MagicType.Lightning)] MagicType spellMagicType, [Values(false, true)] bool useAllTypeMultiplier ) { const int maxHealth = 500; const int spellStrength = 10; int totalStrength = magicStrength + spellStrength + magicBonus; totalStrength = ApplyNullableMultiplier(totalStrength, individualMagicStrengthMultiplier); totalStrength = ApplyNullableMultiplier(totalStrength, teamMagicStrengthMultiplier); MagicType magicMultiplierType = (useAllTypeMultiplier) ? MagicType.All : spellMagicType; if (individualMagicStrengthMultiplier != null) { MagicMultiplierStatus status = new MagicMultiplierStatus(1, magicMultiplierType, individualMagicStrengthMultiplier.Value); _human.AddStatus(status); } if (teamMagicStrengthMultiplier != null) { MagicMultiplierStatus status = new MagicMultiplierStatus(1, magicMultiplierType, teamMagicStrengthMultiplier.Value); _humanTeam.AddStatus(status); } int totalResistance = resistance + resistanceBonus; int total = totalStrength - totalResistance; switch (relationshipType) { case FighterMagicRelationshipType.Immune: _enemy.SetElementalImmunity(affinityMagicType); if (affinityMagicType == MagicType.All || affinityMagicType == spellMagicType) { total = 0; } break; case FighterMagicRelationshipType.Resistant: _enemy.SetElementalResistance(affinityMagicType); if (affinityMagicType == MagicType.All || affinityMagicType == spellMagicType) { total /= 2; } break; case FighterMagicRelationshipType.Weak: _enemy.SetElementalWeakness(affinityMagicType); if (affinityMagicType == MagicType.All || affinityMagicType == spellMagicType) { total *= 2; } break; } int expectedRemainingHealth = (total >= maxHealth) ? 0 : maxHealth - total; var spell = new Spell("foo", spellMagicType, SpellType.Attack, TargetType.SingleEnemy, 0, spellStrength); _human.SetMagicStrength(magicStrength); _human.SetMagicBonus(spellMagicType, magicBonus); _human.SetDeathOnTurnEndEvent(); _human.AddSpell(spell); _human.SetMove(spell); _human.SetMoveTarget(_enemy); _enemy.SetHealth(500); _enemy.SetMagicResistance(resistance); _enemy.SetResistanceBonus(spellMagicType, resistanceBonus); _battleManager.Battle(_humanTeam, _enemyTeam); Assert.AreEqual(expectedRemainingHealth, _enemy.CurrentHealth); }