Пример #1
0
        // TODO: Detect when IsUsable changes to false and deactivate

        public MessageProcessingResult Process(EntityRemovedMessage <GameEntity> message, GameManager manager)
        {
            switch (message.Group.Name)
            {
            case nameof(GameManager.AbilitiesToAffectableRelationship):
                var ability = message.ChangedComponent as AbilityComponent ?? message.Entity.Ability;
                if (ability != null &&
                    (ability.Activation & ActivationType.Continuous) != 0 &&
                    ability.IsActive)
                {
                    Deactivate(ability, message.ReferencedEntity, manager);
                }

                break;

            case nameof(GameManager.EntityItemsToContainerRelationship):
                if (message.ReferencedEntity?.HasComponent(EntityComponent.Being) == true)
                {
                    DeactivateAbilities(
                        message.Entity.Id, ActivationType.WhilePossessed, message.ReferencedEntity, manager);
                }

                break;

            case nameof(GameManager.Effects):
                var effect = (EffectComponent)message.ChangedComponent;
                if (effect.ContainingAbilityId != null)
                {
                    var containingAbility = manager
                                            .FindEntity(effect.ContainingAbilityId)?.Ability;
                    if (containingAbility != null &&
                        (containingAbility.Activation & ActivationType.Continuous) != 0 &&
                        containingAbility.IsActive &&
                        manager.EffectsToContainingAbilityRelationship[containingAbility.EntityId].Count == 0)
                    {
                        Deactivate(containingAbility, message.ReferencedEntity, manager);
                    }
                }

                break;

            default:
                throw new InvalidOperationException(message.Group.Name);
            }

            return(MessageProcessingResult.ContinueProcessing);
        }
Пример #2
0
        public MessageProcessingResult Process(EntityRemovedMessage <GameEntity> message, GameManager manager)
        {
            var effect = message.Entity.Effect ?? message.ChangedComponent as EffectComponent;
            var player = manager.FindEntity(effect?.AffectedEntityId)?.Player;

            if (player?.Entity.Being.IsAlive != true)
            {
                return(MessageProcessingResult.ContinueProcessing);
            }

            var race       = message.Entity.Race ?? message.ChangedComponent as RaceComponent;
            var template   = PlayerRace.Loader.Find(race.TemplateName);
            var levelsLost = race.Level - 1;

            player.SkillPoints    -= levelsLost * template.SkillPointRate;
            player.TraitPoints    -= levelsLost * template.TraitPointRate;
            player.MutationPoints -= levelsLost * template.MutationPointRate;

            manager.XPSystem.UpdateNextLevelXP(player.Entity);
            return(MessageProcessingResult.ContinueProcessing);
        }