Пример #1
0
        public Task ExecuteAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            if (action.Type != ActionType)
            {
                throw new InvalidActionTypeException(action.Type, ActionType);
            }
            if (action.Data == null)
            {
                throw new InvalidActionDataException(action.Type);
            }
            if (!action.Data.Ev.HasValue)
            {
                throw new InvalidActionDataException(action.Type);
            }

            var oldEv = context.TargetCharacter.Ev ?? 0;
            var newEv = oldEv + action.Data.Ev.Value;

            context.TargetCharacter.AddHistoryEntry(_characterHistoryUtil.CreateLogChangeEv(context.TargetCharacter, oldEv, newEv));
            context.TargetCharacter.Ev = newEv;
            notificationSession.NotifyCharacterChangeEv(context.TargetCharacter);

            return(Task.CompletedTask);
        }
Пример #2
0
        public Task ExecuteActionAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            switch (action.Type)
            {
            case "addEv":
                return(_addEvExecutor.ExecuteAsync(action, context, notificationSession));

            case "addEa":
                return(_addEaExecutor.ExecuteAsync(action, context, notificationSession));

            case "addItem":
                return(_addItemExecutor.ExecuteAsync(action, context, notificationSession));

            case "removeItem":
                return(_removeItemExecutor.ExecuteAsync(action, context, notificationSession));

            case "addEffect":
                return(_addEffectExecutor.ExecuteAsync(action, context, notificationSession));

            case "addCustomModifier":
                return(_addCustomModifierExecutor.ExecuteAsync(action, context, notificationSession));

            default:
                return(Task.CompletedTask);
            }
        }
Пример #3
0
        public Task ExecuteAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            if (action.Type != ActionType)
            {
                throw new InvalidActionTypeException(action.Type, ActionType);
            }
            if (action.Data == null)
            {
                throw new InvalidActionDataException(action.Type);
            }
            if (!action.Data.Ea.HasValue)
            {
                throw new InvalidActionDataException(action.Type);
            }
            if (!context.TargetCharacter.Ea.HasValue) // DO not touch ea of character that does no have any
            {
                return(Task.CompletedTask);
            }

            var oldEa = context.TargetCharacter.Ea;
            var newEa = oldEa + action.Data.Ea.Value;

            context.TargetCharacter.AddHistoryEntry(_characterHistoryUtil.CreateLogChangeEa(context.TargetCharacter, oldEa, newEa));
            context.TargetCharacter.Ea = newEa;
            notificationSession.NotifyCharacterChangeEa(context.TargetCharacter);

            return(Task.CompletedTask);
        }
        public Task ExecuteAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            if (action.Type != ActionType)
            {
                throw new InvalidActionTypeException(action.Type, ActionType);
            }
            if (action.Data?.Modifier == null)
            {
                throw new InvalidActionDataException(action.Type);
            }

            var modifier          = action.Data.Modifier;
            var characterModifier = new CharacterModifier
            {
                Name                = modifier.Name,
                Permanent           = false,
                DurationType        = modifier.DurationType,
                Duration            = modifier.Duration,
                Type                = modifier.Type,
                Description         = modifier.Description,
                Reusable            = modifier.Reusable,
                IsActive            = true,
                CombatCount         = modifier.CombatCount,
                CurrentCombatCount  = modifier.CombatCount,
                TimeDuration        = modifier.TimeDuration,
                CurrentTimeDuration = modifier.TimeDuration,
                LapCount            = modifier.LapCount,
                CurrentLapCount     = modifier.LapCount,
                Values              = modifier.Values.Select(v => new CharacterModifierValue
                {
                    Type     = v.Type,
                    StatName = v.Stat,
                    Value    = v.Value
                }).ToList()
            };

            if (context.TargetCharacter.Modifiers == null)
            {
                context.TargetCharacter.Modifiers = new List <CharacterModifier>();
            }

            context.TargetCharacter.Modifiers.Add(characterModifier);

            context.TargetCharacter.AddHistoryEntry(_characterHistoryUtil.CreateLogAddModifier(context.TargetCharacter, characterModifier));
            notificationSession.NotifyCharacterAddModifier(context.TargetCharacter.Id, characterModifier, true);

            return(Task.CompletedTask);
        }
Пример #5
0
        public Task ExecuteAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            if (action.Type != ActionType)
            {
                throw new InvalidActionTypeException(action.Type, ActionType);
            }

            if (_itemUtil.DecrementQuantityOrDeleteItem(context.UsedItem))
            {
                context.UnitOfWork.Items.Remove(context.UsedItem);
                notificationSession.NotifyItemDeleteItem(context.UsedItem);
            }

            return(Task.CompletedTask);
        }
Пример #6
0
        public async Task ExecuteAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            if (action.Type != ActionType)
            {
                throw new InvalidActionTypeException(action.Type, ActionType);
            }
            if (action.Data == null)
            {
                throw new InvalidActionDataException(action.Type);
            }
            if (!action.Data.TemplateId.HasValue)
            {
                throw new InvalidActionDataException(action.Type);
            }

            var itemTemplate = await context.UnitOfWork.ItemTemplates.GetAsync(action.Data.TemplateId.Value);

            if (itemTemplate == null)
            {
                throw new ItemTemplateNotFoundException(action.Data.TemplateId.Value);
            }

            var itemData = new ItemData();

            if (!string.IsNullOrEmpty(action.Data.ItemName))
            {
                itemData.Name = action.Data.ItemName;
            }
            if (action.Data.Quantity.HasValue)
            {
                itemData.Quantity = action.Data.Quantity.Value;
            }

            var item = _itemFactory.CreateItem(ItemOwnerType.Character, context.SourceCharacter.Id, itemTemplate, itemData);

            context.UnitOfWork.Items.Add(item);

            notificationSession.NotifyCharacterAddItem(context.SourceCharacter.Id, item, true);
        }
        public async Task ExecuteAsync(
            NhbkAction action,
            ActionContext context,
            INotificationSession notificationSession
            )
        {
            if (action.Type != ActionType)
            {
                throw new InvalidActionTypeException(action.Type, ActionType);
            }
            if (action.Data == null)
            {
                throw new InvalidActionDataException(action.Type);
            }
            if (!action.Data.EffectId.HasValue)
            {
                throw new InvalidActionDataException(action.Type);
            }
            if (action.Data.EffectData == null)
            {
                throw new InvalidActionDataException(action.Type);
            }

            var effect = await context.UnitOfWork.Effects.GetWithEffectWithModifiersAsync(action.Data.EffectId.Value);

            if (effect == null)
            {
                throw new EffectNotFoundException();
            }

            var combatCount  = effect.CombatCount;
            var timeDuration = effect.TimeDuration;
            var duration     = effect.Duration;
            var lapCount     = effect.LapCount;

            var customDurationType = action.Data.EffectData.Value <string?>("durationType");

            if (!string.IsNullOrEmpty(customDurationType))
            {
                timeDuration = null;
                duration     = null;
                combatCount  = null;
                lapCount     = null;
                switch (customDurationType)
                {
                case "combat":
                    combatCount = action.Data.EffectData.Value <int?>("combatCount");
                    break;

                case "time":
                    timeDuration = action.Data.EffectData.Value <int?>("timeDuration");
                    break;

                case "custom":
                    duration = action.Data.EffectData.Value <string>("duration");
                    break;

                case "lap":
                    lapCount = action.Data.EffectData.Value <int?>("lapCount");
                    break;

                case "forever":
                    break;

                default:
                    throw new InvalidCustomDurationActionException(customDurationType);
                }
            }



            var characterModifier = new CharacterModifier
            {
                Name                = effect.Name,
                Permanent           = false,
                DurationType        = customDurationType ?? effect.DurationType,
                Duration            = duration,
                Type                = effect.SubCategory.Name,
                Description         = effect.Description,
                Reusable            = false,
                IsActive            = true,
                CombatCount         = combatCount,
                CurrentCombatCount  = combatCount,
                TimeDuration        = timeDuration,
                CurrentTimeDuration = timeDuration,
                LapCount            = lapCount,
                CurrentLapCount     = lapCount,
                Values              = effect.Modifiers.Select(v => new CharacterModifierValue
                {
                    Type     = v.Type,
                    StatName = v.StatName,
                    Value    = v.Value
                }).ToList()
            };

            if (context.TargetCharacter.Modifiers == null)
            {
                context.TargetCharacter.Modifiers = new List <CharacterModifier>();
            }

            context.TargetCharacter.Modifiers.Add(characterModifier);

            context.TargetCharacter.AddHistoryEntry(_characterHistoryUtil.CreateLogAddModifier(context.TargetCharacter, characterModifier));
            notificationSession.NotifyCharacterAddModifier(context.TargetCharacter.Id, characterModifier, true);
        }