DestructibleDamageGroupTest.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using Content.Server.Destructible.Thresholds.Triggers;
  2. using Content.Shared.Damage;
  3. using Content.Shared.Damage.Prototypes;
  4. using Content.Shared.FixedPoint;
  5. using Robust.Shared.GameObjects;
  6. using Robust.Shared.IoC;
  7. using Robust.Shared.Map;
  8. using Robust.Shared.Prototypes;
  9. using static Content.IntegrationTests.Tests.Destructible.DestructibleTestPrototypes;
  10. namespace Content.IntegrationTests.Tests.Destructible
  11. {
  12. [TestFixture]
  13. [TestOf(typeof(DamageGroupTrigger))]
  14. [TestOf(typeof(AndTrigger))]
  15. public sealed class DestructibleDamageGroupTest
  16. {
  17. [Test]
  18. public async Task AndTest()
  19. {
  20. await using var pair = await PoolManager.GetServerClient();
  21. var server = pair.Server;
  22. var testMap = await pair.CreateTestMap();
  23. var sEntityManager = server.ResolveDependency<IEntityManager>();
  24. var sPrototypeManager = server.ResolveDependency<IPrototypeManager>();
  25. var sEntitySystemManager = server.ResolveDependency<IEntitySystemManager>();
  26. EntityUid sDestructibleEntity = default;
  27. DamageableComponent sDamageableComponent = null;
  28. TestDestructibleListenerSystem sTestThresholdListenerSystem = null;
  29. DamageableSystem sDamageableSystem = null;
  30. await server.WaitPost(() =>
  31. {
  32. var coordinates = testMap.GridCoords;
  33. sDestructibleEntity = sEntityManager.SpawnEntity(DestructibleDamageGroupEntityId, coordinates);
  34. sDamageableComponent = sEntityManager.GetComponent<DamageableComponent>(sDestructibleEntity);
  35. sTestThresholdListenerSystem = sEntitySystemManager.GetEntitySystem<TestDestructibleListenerSystem>();
  36. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  37. sDamageableSystem = sEntitySystemManager.GetEntitySystem<DamageableSystem>();
  38. });
  39. await server.WaitRunTicks(5);
  40. await server.WaitAssertion(() =>
  41. {
  42. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  43. });
  44. await server.WaitAssertion(() =>
  45. {
  46. var bruteDamageGroup = sPrototypeManager.Index<DamageGroupPrototype>("TestBrute");
  47. var burnDamageGroup = sPrototypeManager.Index<DamageGroupPrototype>("TestBurn");
  48. DamageSpecifier bruteDamage = new(bruteDamageGroup, FixedPoint2.New(5));
  49. DamageSpecifier burnDamage = new(burnDamageGroup, FixedPoint2.New(5));
  50. // Raise brute damage to 5
  51. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage, true);
  52. // No thresholds reached yet, the earliest one is at 10 damage
  53. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  54. // Raise brute damage to 10
  55. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage, true);
  56. // No threshold reached, burn needs to be 10 as well
  57. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  58. // Raise burn damage to 10
  59. sDamageableSystem.TryChangeDamage(sDestructibleEntity, burnDamage * 2, true);
  60. // One threshold reached, brute 10 + burn 10
  61. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Has.Count.EqualTo(1));
  62. // Threshold brute 10 + burn 10
  63. var msg = sTestThresholdListenerSystem.ThresholdsReached[0];
  64. var threshold = msg.Threshold;
  65. // Check that it matches the YAML prototype
  66. Assert.Multiple(() =>
  67. {
  68. Assert.That(threshold.Behaviors, Is.Empty);
  69. Assert.That(threshold.Trigger, Is.Not.Null);
  70. Assert.That(threshold.Triggered, Is.True);
  71. Assert.That(threshold.Trigger, Is.InstanceOf<AndTrigger>());
  72. });
  73. var trigger = (AndTrigger) threshold.Trigger;
  74. Assert.Multiple(() =>
  75. {
  76. Assert.That(trigger.Triggers[0], Is.InstanceOf<DamageGroupTrigger>());
  77. Assert.That(trigger.Triggers[1], Is.InstanceOf<DamageGroupTrigger>());
  78. });
  79. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  80. // Raise brute damage to 20
  81. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage * 2, true);
  82. // No new thresholds reached
  83. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  84. // Raise burn damage to 20
  85. sDamageableSystem.TryChangeDamage(sDestructibleEntity, burnDamage * 2, true);
  86. // No new thresholds reached
  87. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  88. // Lower brute damage to 0
  89. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage * -10);
  90. Assert.Multiple(() =>
  91. {
  92. Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(FixedPoint2.New(20)));
  93. // No new thresholds reached, healing should not trigger it
  94. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  95. });
  96. // Raise brute damage back up to 10
  97. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage * 2, true);
  98. // 10 brute + 10 burn threshold reached, brute was healed and brought back to its threshold amount and slash stayed the same
  99. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Has.Count.EqualTo(1));
  100. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  101. // Heal both classes of damage to 0
  102. sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
  103. // No new thresholds reached, healing should not trigger it
  104. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  105. // Raise brute damage to 10
  106. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage * 2, true);
  107. // No new thresholds reached
  108. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  109. // Raise burn damage to 10
  110. sDamageableSystem.TryChangeDamage(sDestructibleEntity, burnDamage * 2, true);
  111. // Both classes of damage were healed and then raised again, the threshold should have been reached as triggers once is default false
  112. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Has.Count.EqualTo(1));
  113. // Threshold brute 10 + burn 10
  114. msg = sTestThresholdListenerSystem.ThresholdsReached[0];
  115. threshold = msg.Threshold;
  116. // Check that it matches the YAML prototype
  117. Assert.Multiple(() =>
  118. {
  119. Assert.That(threshold.Behaviors, Is.Empty);
  120. Assert.That(threshold.Trigger, Is.Not.Null);
  121. Assert.That(threshold.Triggered, Is.True);
  122. Assert.That(threshold.Trigger, Is.InstanceOf<AndTrigger>());
  123. });
  124. trigger = (AndTrigger) threshold.Trigger;
  125. Assert.Multiple(() =>
  126. {
  127. Assert.That(trigger.Triggers[0], Is.InstanceOf<DamageGroupTrigger>());
  128. Assert.That(trigger.Triggers[1], Is.InstanceOf<DamageGroupTrigger>());
  129. });
  130. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  131. // Change triggers once to true
  132. threshold.TriggersOnce = true;
  133. // Heal brute and burn back to 0
  134. sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
  135. // No new thresholds reached from healing
  136. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  137. // Raise brute damage to 10
  138. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bruteDamage * 2, true);
  139. // No new thresholds reached
  140. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  141. // Raise burn damage to 10
  142. sDamageableSystem.TryChangeDamage(sDestructibleEntity, burnDamage * 2, true);
  143. // No new thresholds reached as triggers once is set to true and it already triggered before
  144. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  145. });
  146. await pair.CleanReturnAsync();
  147. }
  148. }
  149. }