// 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); }
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); }