Exemple #1
0
        public MessageProcessingResult Process(
            PropertyValueChangedMessage <GameEntity, int> message, GameManager manager)
        {
            switch (message.ChangedPropertyName)
            {
            case nameof(PlayerComponent.HandWeapons):
            case nameof(PlayerComponent.ShortWeapons):
            case nameof(PlayerComponent.MediumWeapons):
            case nameof(PlayerComponent.LongWeapons):
                RecalculateWeaponAbilities(message.Entity, melee: true, manager);
                break;

            case nameof(PlayerComponent.CloseRangeWeapons):
            case nameof(PlayerComponent.ShortRangeWeapons):
            case nameof(PlayerComponent.MediumRangeWeapons):
            case nameof(PlayerComponent.LongRangeWeapons):
                RecalculateWeaponAbilities(message.Entity, melee: false, manager);
                break;

            case nameof(PlayerComponent.LightArmor):
            case nameof(PlayerComponent.HeavyArmor):
            case nameof(PlayerComponent.Artifice):
                // TODO: Update hindrance
                break;

            default:
                throw new InvalidOperationException($"Property {message.ChangedPropertyName} not supported.");
            }

            return(MessageProcessingResult.ContinueProcessing);
        }
Exemple #2
0
        public MessageProcessingResult Process(
            PropertyValueChangedMessage <GameEntity, bool> message, GameManager manager)
        {
            TrySlot((AbilityComponent)message.ChangedComponent, manager);

            return(MessageProcessingResult.ContinueProcessing);
        }
Exemple #3
0
        public MessageProcessingResult Process(
            PropertyValueChangedMessage <GameEntity, ExtremityType> message, GameManager manager)
        {
            if (message.Entity.Being.IsAlive)
            {
                RecalculateWeaponAbilities(message.Entity, melee: true, manager);
                RecalculateWeaponAbilities(message.Entity, melee: false, manager);
            }

            return(MessageProcessingResult.ContinueProcessing);
        }
        public MessageProcessingResult Process(
            PropertyValueChangedMessage <GameEntity, int> message, GameManager manager)
        {
            var being = message.Entity.Being;

            switch (message.ChangedPropertyName)
            {
            case nameof(BeingComponent.HitPoints):
                if (message.OldValue > 0 &&
                    message.NewValue <= 0)
                {
                    EnqueueDiedMessage(message.Entity, manager);
                }

                break;

            case nameof(BeingComponent.HitPointMaximum):
                if (being.HitPoints > message.NewValue)
                {
                    being.HitPoints = message.NewValue;
                }

                if (message.OldValue == 1)
                {
                    being.HitPoints = message.NewValue;

                    // TODO: Move to AI/Player system
                    // Initialize NextActionTick here so that actors don't try to act before they have HP
                    var ai = message.Entity.AI;
                    if (ai != null)
                    {
                        if (ai.NextActionTick == null)
                        {
                            ai.NextActionTick = manager.Game.CurrentTick;
                        }
                    }
                    else
                    {
                        var player = message.Entity.Player;
                        if (player != null)
                        {
                            player.NextActionTick = manager.Game.CurrentTick;
                        }
                    }
                }

                break;

            case nameof(BeingComponent.EnergyPointMaximum):
                if (being.EnergyPoints > message.NewValue)
                {
                    being.EnergyPoints = message.NewValue;
                }

                if (message.OldValue == 0)
                {
                    being.EnergyPoints = message.NewValue;
                }

                break;

            case nameof(BeingComponent.Might):
                var hpEffect = manager.EffectApplicationSystem.GetPropertyEffect(
                    message.Entity, nameof(BeingComponent.HitPointMaximum), AttributedAbilityName);

                hpEffect.Amount = message.NewValue * 10;

                break;

            case nameof(BeingComponent.Focus):
                var epEffect = manager.EffectApplicationSystem.GetPropertyEffect(
                    message.Entity, nameof(BeingComponent.EnergyPointMaximum), AttributedAbilityName);

                epEffect.Amount = message.NewValue * 10;

                break;

            case nameof(BeingComponent.Speed):
                var movementEffect = manager.EffectApplicationSystem.GetPropertyEffect(
                    message.Entity, nameof(PositionComponent.MovementDelay), AttributedAbilityName);

                movementEffect.Amount = message.NewValue == 0
                        ? 0
                        : TimeSystem.DefaultActionDelay * 10 / message.NewValue;

                var evasionEffect = manager.EffectApplicationSystem.GetPropertyEffect(
                    message.Entity, nameof(BeingComponent.Evasion), AttributedAbilityName);

                evasionEffect.Amount = message.NewValue * 5;

                break;
            }

            return(MessageProcessingResult.ContinueProcessing);
        }