public bool OnAttachAsSub(Character target)
        {
            attachType = ModifierAttachType.Sub;
            bool attachSuccess = false;

            try {
                Modifier           highest     = target.FindModifierOfHighestRank();
                MType              highestType = (MType)(int)highest.Type();
                MType              thisType    = (MType)(int)Type();
                List <Interaction> inters      = modifierInteractionCollection.Find(highestType, thisType);
                if (inters.Count < 1)
                {
                    return(attachSuccess);
                }

                Interaction       inter = inters[0];
                bool              isStateQuerySuccess = false;
                MainModifierState mainState           = MainModifierState.Ground;
                if (highest is BaseModifier)
                {
                    bool justChanged;
                    isStateQuerySuccess = ((BaseModifier)highest).TryQueryingState(out mainState, out justChanged);
                }

                if (!isStateQuerySuccess)
                {
                    mainState = target.IsOnGround()
                                                ? MainModifierState.Ground
                                                : MainModifierState.Air;
                }

                List <ActionDetails> actions = inter.FindActions(mainState);
                if (actions.Count < 1)
                {
                    return(attachSuccess);
                }

                for (int i = 0; i < actions.Count; i++)
                {
                    ActionDetails ad = actions[i];
                    switch (ad.ShowActionType())
                    {
                    case InteractionActionType.DoNothing:
                        attachSuccess = false;
                        break;

                    case InteractionActionType.Vibrate:
                        VibrateActionDetails vad = (VibrateActionDetails)ad;
                        VibrateTarget(
                            vad.xAmplitude, vad.duration, vad.frequency, vad.shouldDecay,
                            vad.decayConstant, targetGameObject, () => subLifetime.End()
                            );
                        attachSuccess = true;
                        break;

                    case InteractionActionType.PlayAnimation:
                        PlayAnimationActionDetails paad = (PlayAnimationActionDetails)ad;
                        if (targetAnimation.CurrentAnimationNames().Contains(paad.name))
                        {
                            targetAnimation.Stop();
                        }

                        targetAnimation.PlayAnimation(paad.name);
                        targetAnimation.JumpToFrame(paad.startFrame);
                        if (highest is StunModifier)
                        {
                            ((StunModifier)highest).OnAnimationPlayedBySubModifier(paad.name);
                        }
                        subLifetime.End();
                        attachSuccess = true;
                        break;

                    case InteractionActionType.Jump:
                        JumpActionDetails jad = (JumpActionDetails)ad;
                        movingJumpRequest = new MovingJumpRequest(
                            jad.height, jad.timeToPeak, jad.timeToGround, jad.timeToFloat, jad.distance
                            );
                        targetEntity.GetComponent <MovementComponent>().AddMovementRequest(
                            movingJumpRequest
                            );
                        attachSuccess = true;
                        break;

                    case InteractionActionType.Dash:
                        MovementComponent casterMc     = casterEntity.GetComponent <MovementComponent>();
                        Direction         casterFacing = casterMc.FacingDirection;
                        DashActionDetails dad          = (DashActionDetails)ad;
                        dashRequest = new DashRequest(
                            casterFacing, dad.distance, dad.duration, 0, dad.constantSpeed
                            );
                        targetEntity.GetComponent <MovementComponent>().AddMovementRequest(
                            dashRequest
                            );
                        attachSuccess = true;
                        break;

                    case InteractionActionType.OverrideMainModifier:
                        attachType = ModifierAttachType.Main;
                        target.RemoveModifier(highest);
                        OnAttachAsMain(target);
                        attachSuccess = true;
                        break;

                    case InteractionActionType.IncreaseLyingDuration:
                        StunInfo si = (StunInfo)info;
                        increaseLyingDuration = new IncreaseLyingDuration(
                            subLifetime, si.ShowDuration(), targetEntity
                            );
                        attachSuccess = true;
                        break;

                    default:
                        throw new Exception(
                                  "Missing logic to handle SubModifier of ActionType " + ad.ShowActionType()
                                  );
                    }
                }

                return(attachSuccess);
            }
            catch (Exception e) {
                DLog.LogError(e);
                return(attachSuccess);
            }
        }
Exemple #2
0
        protected override void OnDelayedAttachAsMain(Character target)
        {
            Log("OnAttach", target);
            Character casterCharacter = casterEntity.GetComponent <SkillComponent>().Character;

            if (attachType == ModifierAttachType.Main)
            {
                Direction movementDirection = CalculateMovementDirection(
                    casterMovementComponent, targetMovementComponent,
                    collidedProjectilePosition, info.MovementBehavior
                    );
                Direction facingDirection = CalculateFacingDirection(
                    casterMovementComponent, targetMovementComponent,
                    collidedProjectilePosition, info.FacingBehavior, movementDirection
                    );
                targetMovementComponent.MovingDirection = movementDirection.ToNormalizedVector2();
                targetMovementComponent.FacingDirection = facingDirection;

                float gravity = targetMovementComponent.Gravity;
                for (int kIndex = 0; kIndex < targetMovementComponent.MovementRequests.Count; kIndex++)
                {
                    Request     r           = targetMovementComponent.MovementRequests[kIndex];
                    RequestType requestType = r.ShowRequestType();
                    if (requestType == RequestType.StationaryJump ||
                        requestType == RequestType.MovingJump)
                    {
                        gravity = ((StationaryJumpRequest)r).GroundingGravity;
                    }
                }
                FallRequest fallRequest = new FallRequest(gravity, targetMovementComponent.Velocity.magnitude);
                if (info.Distance != 0)
                {
                    DashRequest dashRequest = new DashRequest(info.Distance, info.MovementDuration, 0);
                    dashRequest.AddCorunningRequest(fallRequest);
                    targetMovementComponent.AddMovementRequest(dashRequest);
                }
                if (targetMovementComponent.ConfigData.isFallable)
                {
                    targetMovementComponent.AddMovementRequest(fallRequest);
                }

                if (ShouldInterruptTargetSkill())
                {
                    target.InterruptChannelingSkill();
                }
                string animationName = AnimationName.Stagger.SOFT;
                if (info.Behaviors.Contains(Behavior.InterruptTargetSkill))
                {
                    animationName = AnimationName.Stagger.HARD;
                }
                if (!string.IsNullOrEmpty(info.OverrideAnimation))
                {
                    animationName = info.OverrideAnimation;

                    string[] split = info.OverrideAnimation.Split(',');
                    if (split.Length > 0)
                    {
                        animationName = split[BattleUtils.RandomRangeInt(0, split.Length)].Trim();
                    }
                }

                if (ShouldPlayAnimation())
                {
                    targetAnimationComponent.Animation.PlayAnimation(animationName, 1, PlayMethod.Play, 0);
                    targetAnimationComponent.Animation.JumpToFrame(info.AnimFrame);
                }
            }
        }
        public DashTowardTarget(BaseEvent ef, Character caster, Environment environment)
        {
            this.ef          = ef;
            this.caster      = caster;
            this.environment = environment;

            dtta = (DashTowardTargetAction)ef.ShowAction();
            float scaletime = 1;

            if (ef.ShowTrigger() is TimelineTrigger)
            {
                TimelineTrigger tt = (TimelineTrigger)ef.ShowTrigger();
                scaletime = tt.ShowScaleTime();
            }
            duration = dtta.ShowDurationInSeconds(scaletime);
            List <Character> enemies = environment.FindNearbyCharacters(
                caster, Vector3.zero, 999,
                new[] {
                FindingFilter.ExcludeAllies, FindingFilter.ExcludeMe
            }
                );

            if (enemies.Count > 0)
            {
                enemy = enemies[0];
                Vector2 diff = enemy.Position() - caster.Position();

                if (!dtta.track)
                {
                    float distance        = Math.Abs(diff.x);
                    bool  isTargetFarAway = distance > dtta.distanceToKeep;
                    if (isTargetFarAway)
                    {
                        float distanceToDash = distance - dtta.distanceToKeep;
                        if (dtta.maxDistance >= 0)
                        {
                            distanceToDash = Mathf.Min(distanceToDash, dtta.maxDistance);
                        }
                        if (diff.x > 0)
                        {
                            caster.SetFacingDirectionToRight();
                            caster.SetMovingDirectionToRight();
                        }
                        else
                        {
                            caster.SetFacingDirectionToLeft();
                            caster.SetMovingDirectionToLeft();
                        }
                        dashRequest = (DashRequest)caster.Dash(distanceToDash, duration, 0, true, true, true, dtta.uniform);
                    }
                    else
                    {
                        isFinished = true;
                    }
                }
                else
                {
                    if (diff.x > 0)
                    {
                        caster.SetFacingDirectionToRight();
                        caster.SetMovingDirectionToRight();
                    }
                    else
                    {
                        caster.SetFacingDirectionToLeft();
                        caster.SetMovingDirectionToLeft();
                    }
                    dashRequest = (DashRequest)caster.Dash(dtta.distance, duration, 0, true, true, true, dtta.uniform);
                }
            }
            else
            {
                isFinished = true;
            }
        }