public override void Use(IEffectContext context)
        {
            foreach (var target in context.Targets)
            {
                var chance = context.Battle.RandomProvider.RandomDouble();

                var hits = chance switch
                {
                    var n when n < 0.375 => 2,
                    var n when n < 0.75 => 3,
                    var n when n < 0.875 => 4,
                    _ => 5
                };

                // Only the first strike can be a critical hit
                var damage = context.Battle.DamageFormula.DamageDealt(context, target);

                target.Damage(damage);

                // Successive hits deal the same amount of damage
                damage = context.Battle.DamageFormula.DamageDealt(context, target, false);

                for (var i = 1; i < hits; i++)
                {
                    target.Damage(damage);
                }
                // TODO: DoubleSlap will end immediately if it breaks a substitute. Bide and Counter will only acknowledge the last strike of this move.
            }
        }
    }
        public static async Task OnCreateWorkflow(CreateWorkflow action, IEffectContext context)
        {
            var dispatcher = context.Services.GetRequiredService <IDispatcher>();

            if (dispatcher == null)
            {
                throw new NullReferenceException("Unable to resolved service 'IDispatcher'.");
            }
            dispatcher.Dispatch(new DisableCreateButton());
            var api = context.Services.GetRequiredService <ISynapseManagementApi>();

            if (api == null)
            {
                throw new NullReferenceException("Unable to resolved service 'ISynapseManagementApi'.");
            }
            var command = new V1CreateWorkflowCommand()
            {
                Definition = action.Definition
            };

            try
            {
                var workflow = await api.CreateWorkflowAsync(command);

                dispatcher.Dispatch(new EnableCreateButton());
                if (workflow != null)
                {
                    context.Dispatcher.Dispatch(new NavigateTo("workflows"));
                }
            }
            catch (Exception ex)
            {
                dispatcher.Dispatch(new EnableCreateButton());
            }
        }
        public static async Task OnGetV1WorkflowById(GetV1WorkflowById action, IEffectContext context)
        {
            var api      = context.Services.GetRequiredService <ISynapseManagementApi>();
            var workflow = await api.GetWorkflowByIdAsync(action.WorkflowId);

            context.Dispatcher.Dispatch(new AddV1Workflow(workflow));
        }
        public static async Task OnListV1Workflows(ListV1Workflows action, IEffectContext context)
        {
            var api       = context.Services.GetRequiredService <ISynapseManagementApi>();
            var workflows = await api.GetWorkflowsAsync();

            context.Dispatcher.Dispatch(new SetV1WorkflowCollection(workflows));
        }
Beispiel #5
0
 public decimal Multiplier(IEffectContext context, IBattlePokemon target)
 {
     return(TargetsMultiplier(context.Targets.Count) *
            WeatherMultiplier(context) *
            RandomMultiplier(context.Battle.RandomProvider) *
            StabMultiplier(context.User, context.Move.Type) *
            TypeMultiplier(context.Move.Type, target));
 }
 public override void Use(IEffectContext context)
 {
     foreach (var target in context.Targets)
     {
         var damage = context.Battle.DamageFormula.DamageDealt(context, target);
         target.Damage(damage);
     }
 }
Beispiel #7
0
        public static async Task OnNavigateTo(NavigateTo action, IEffectContext context)
        {
            var navigationManager = context.Services.GetRequiredService <NavigationManager>();

            if (navigationManager == null)
            {
                throw new NullReferenceException("Unable to resolved service 'NavigationManager'.");
            }
            navigationManager.NavigateTo(action.Uri, action.ForceLoad, action.Replace);
            await Task.CompletedTask;
        }
Beispiel #8
0
        // TODO OtherMultiplier

        public int DamageDealt(IEffectContext context, IBattlePokemon target, bool canCrit = true)
        {
            var crit     = CriticalStrike(context);
            var level    = crit ? context.User.Level * 2 : context.User.Level;
            var power    = context.Move.Power;
            var attack   = context.Move.Category.AttackStat(target);
            var defense  = context.Move.Category.DefenseStat(target);
            var modifier = Multiplier(context, target);

            return((int)(((2 * level / 5 + 2) * power * (attack.ModifiedValue / defense.ModifiedValue) / 50 + 2) * modifier));
        }
Beispiel #9
0
        public bool CriticalStrike(IEffectContext context)
        {
            var @event = new CriticalRatioEvent();

            context.Battle.EventBus.Raise(@event);

            var multiplier = @event.Multiplier;
            var t          = (int)(context.User.Speed.ModifiedValue / 2M * multiplier);
            var tByte      = (byte)Math.Clamp(t, byte.MinValue, byte.MaxValue);
            var threshold  = context.Battle.RandomProvider.RandomByte();

            return(tByte < threshold);
        }
Beispiel #10
0
 public override void Use(IEffectContext context)
 {
 }
Beispiel #11
0
 public virtual void Use(IEffectContext context)
 {
 }
Beispiel #12
0
 public decimal WeatherMultiplier(IEffectContext context)
 {
     return(1); // TODO
 }
Beispiel #13
0
 public static async Task OnDeleteV1WorkflowInstance(DeleteV1WorkflowInstance action, IEffectContext context)
 {
     var api = context.Services.GetRequiredService <ISynapseManagementApi>();
     await api.DeleteWorkflowInstanceAsync(action.InstanceId);
 }
Beispiel #14
0
        public static async Task OnListV1WorkflowInstancesByDefinition(ListV1WorkflowInstancesByDefinition action, IEffectContext context)
        {
            var api = context.Services.GetRequiredService <ISynapseManagementApi>();
            var workflowInstances = await api.GetWorkflowInstancesAsync($"$filter={nameof(V1WorkflowInstance.WorkflowId)} eq '{action.DefinitionId}'");

            context.Dispatcher.Dispatch(new SetV1WorkflowInstanceCollection(workflowInstances));
        }