public async Task TestDamageTypeDamageAndHeal()
        {
            var server = StartServerDummyTicker(new ServerContentIntegrationOption
            {
                ExtraPrototypes = Prototypes
            });

            await server.WaitIdleAsync();

            var sEntityManager = server.ResolveDependency <IEntityManager>();
            var sMapManager    = server.ResolveDependency <IMapManager>();

            IEntity sDamageableEntity = null;
            IDamageableComponent sDamageableComponent = null;

            await server.WaitPost(() =>
            {
                var mapId       = sMapManager.NextMapId();
                var coordinates = new MapCoordinates(0, 0, mapId);
                sMapManager.CreateMap(mapId);

                sDamageableEntity    = sEntityManager.SpawnEntity(DamageableEntityId, coordinates);
                sDamageableComponent = sDamageableEntity.GetComponent <IDamageableComponent>();
            });

            await server.WaitRunTicks(5);

            await server.WaitAssertion(() =>
            {
                Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(0));

                var damageToDeal = 7;

                foreach (var type in Enum.GetValues <DamageType>())
                {
                    Assert.That(sDamageableComponent.SupportsDamageType(type));

                    // Damage
                    Assert.That(sDamageableComponent.ChangeDamage(type, damageToDeal, true), Is.True);
                    Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(damageToDeal));
                    Assert.That(sDamageableComponent.TryGetDamage(type, out var damage), Is.True);
                    Assert.That(damage, Is.EqualTo(damageToDeal));

                    // Heal
                    Assert.That(sDamageableComponent.ChangeDamage(type, -damageToDeal, true), Is.True);
                    Assert.That(sDamageableComponent.TotalDamage, Is.Zero);
                    Assert.That(sDamageableComponent.TryGetDamage(type, out damage), Is.True);
                    Assert.That(damage, Is.Zero);
                }
            });
        }
示例#2
0
        public bool Reached(IDamageableComponent damageable, DestructibleSystem system)
        {
            if (Type == null)
            {
                return(false);
            }

            return(damageable.TryGetDamage(Type.Value, out var damageReceived) &&
                   damageReceived >= Damage);
        }
        public async Task TotalDamageTest()
        {
            var server = StartServerDummyTicker(new ServerContentIntegrationOption
            {
                ExtraPrototypes = Prototypes
            });

            await server.WaitIdleAsync();

            var sEntityManager = server.ResolveDependency <IEntityManager>();
            var sMapManager    = server.ResolveDependency <IMapManager>();

            IEntity sDamageableEntity;
            IDamageableComponent sDamageableComponent = null;

            await server.WaitPost(() =>
            {
                var mapId       = sMapManager.NextMapId();
                var coordinates = new MapCoordinates(0, 0, mapId);
                sMapManager.CreateMap(mapId);

                sDamageableEntity    = sEntityManager.SpawnEntity(DamageableEntityId, coordinates);
                sDamageableComponent = sDamageableEntity.GetComponent <IDamageableComponent>();
            });

            await server.WaitAssertion(() =>
            {
                var damageType = DamageClass.Brute;
                var damage     = 10;

                Assert.True(sDamageableComponent.ChangeDamage(DamageClass.Brute, damage, true));
                Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(10));

                var totalTypeDamage = 0;

                foreach (var type in damageType.ToTypes())
                {
                    Assert.True(sDamageableComponent.TryGetDamage(type, out var typeDamage));
                    Assert.That(typeDamage, Is.LessThanOrEqualTo(damage));

                    totalTypeDamage += typeDamage;
                }

                Assert.That(totalTypeDamage, Is.EqualTo(damage));
            });
        }
示例#4
0
        public async Task TestAllSupportDamageableComponent()
        {
            var server = StartServerDummyTicker();
            await server.WaitIdleAsync();

            var sEntityManager    = server.ResolveDependency <IEntityManager>();
            var sMapManager       = server.ResolveDependency <IMapManager>();
            var sPrototypeManager = server.ResolveDependency <IPrototypeManager>();

            IEntity sFullyDamageableEntity;
            IDamageableComponent sFullyDamageableComponent = null;

            await server.WaitPost(() =>
            {
                var mapId       = sMapManager.NextMapId();
                var coordinates = new MapCoordinates(0, 0, mapId);
                sMapManager.CreateMap(mapId);

                // When prototypes are loaded using the ExtraPrototypes option, they seem to be loaded first?
                // Or at least, no damage prototypes were loaded in by the time that the damageContainer here is loaded.
                // So for now doing explicit loading of prototypes.
                // I have no idea what I am doing, but it works.
                sPrototypeManager.LoadString($@"
# we want to test the all damage container
- type: damageContainer
  id: testAllDamageContainer
  supportAll: true

# create entities
- type: entity
  id: {AllDamageDamageableEntityId}
  name: {AllDamageDamageableEntityId}
  components:
  - type: Damageable
    damageContainer: testAllDamageContainer
");

                sFullyDamageableEntity    = sEntityManager.SpawnEntity(AllDamageDamageableEntityId, coordinates);
                sFullyDamageableComponent = sFullyDamageableEntity.GetComponent <IDamageableComponent>();
            });

            await server.WaitRunTicks(5);

            await server.WaitAssertion(() =>
            {
                // First check that there actually are any damage types/groups
                // This test depends on a non-empty damage.yml
                Assert.That(sPrototypeManager.EnumeratePrototypes <DamageTypePrototype>().ToList().Count, Is.GreaterThan(0));
                Assert.That(sPrototypeManager.EnumeratePrototypes <DamageGroupPrototype>().ToList().Count, Is.GreaterThan(0));


                // Can we set and get all damage.
                Assert.That(sFullyDamageableComponent.TrySetAllDamage(-10), Is.False);
                Assert.That(sFullyDamageableComponent.TrySetAllDamage(0), Is.True);

                // Test that the all damage container supports every damage type, and that we can get, set, and change
                // every type with the expected results. Notable: if the damage does not change, they all return false
                var initialDamage = 10;
                foreach (var damageType in sPrototypeManager.EnumeratePrototypes <DamageTypePrototype>())
                {
                    var damage = initialDamage;
                    Assert.That(sFullyDamageableComponent.IsSupportedDamageType(damageType));
                    Assert.That(sFullyDamageableComponent.TrySetDamage(damageType, -damage), Is.False);
                    Assert.That(sFullyDamageableComponent.TrySetDamage(damageType, damage), Is.True);
                    Assert.That(sFullyDamageableComponent.TrySetDamage(damageType, damage), Is.True); // intentional duplicate
                    Assert.That(sFullyDamageableComponent.GetDamage(damageType), Is.EqualTo(damage));
                    Assert.That(sFullyDamageableComponent.TryChangeDamage(damageType, -damage / 2, true), Is.True);
                    Assert.That(sFullyDamageableComponent.TryGetDamage(damageType, out damage), Is.True);
                    Assert.That(damage, Is.EqualTo(initialDamage / 2));
                    Assert.That(sFullyDamageableComponent.TryChangeDamage(damageType, damage, true), Is.True);
                    Assert.That(sFullyDamageableComponent.GetDamage(damageType), Is.EqualTo(2 * damage));
                    Assert.That(sFullyDamageableComponent.TryChangeDamage(damageType, 0, true), Is.False);
                }
                // And again, for every group
                foreach (var damageGroup in sPrototypeManager.EnumeratePrototypes <DamageGroupPrototype>())
                {
                    var damage    = initialDamage;
                    var groupSize = damageGroup.DamageTypes.Count();
                    Assert.That(sFullyDamageableComponent.IsFullySupportedDamageGroup(damageGroup));
                    Assert.That(sFullyDamageableComponent.IsApplicableDamageGroup(damageGroup));
                    Assert.That(sFullyDamageableComponent.TrySetDamage(damageGroup, -damage), Is.False);
                    Assert.That(sFullyDamageableComponent.TrySetDamage(damageGroup, damage), Is.True);
                    Assert.That(sFullyDamageableComponent.TrySetDamage(damageGroup, damage), Is.True); // intentional duplicate
                    Assert.That(sFullyDamageableComponent.GetDamage(damageGroup), Is.EqualTo(damage *groupSize));
                    Assert.That(sFullyDamageableComponent.TryChangeDamage(damageGroup, -groupSize *damage / 2, true), Is.True);
                    Assert.That(sFullyDamageableComponent.TryGetDamage(damageGroup, out damage), Is.True);
                    Assert.That(damage, Is.EqualTo(groupSize *initialDamage / 2));
                    Assert.That(sFullyDamageableComponent.TryChangeDamage(damageGroup, damage, true), Is.True);
                    Assert.That(sFullyDamageableComponent.GetDamage(damageGroup), Is.EqualTo(2 * damage));
                    Assert.That(sFullyDamageableComponent.TryChangeDamage(damageGroup, 0, true), Is.False);
                }
            });
        }