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); }
public MessageProcessingResult Process( PropertyValueChangedMessage <GameEntity, bool> message, GameManager manager) { TrySlot((AbilityComponent)message.ChangedComponent, manager); return(MessageProcessingResult.ContinueProcessing); }
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); }