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