Ejemplo n.º 1
0
        public override void Enter(IActorStateContext context)
        {
            base.Enter(context);

            this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Fall);

            this.ReceiveRequestMoveOnMove(() => this.owner.StatusController.MoveSpeed);

            this.owner.Broker.Receive <Landed>()
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Idle);
            })
            .AddTo(this.events);

            this.owner.Broker.Receive <RequestJump>()
            .Where(_ => this.owner.StatusController.CanJump)
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Jump);
            })
            .AddTo(this.events);

            this.ReceiveRequestFireOnChangeAttackState();
            this.SyncActorDirection();
        }
Ejemplo n.º 2
0
        public void Change(ActorState.Name nextState, IActorStateContext context)
        {
            Assert.IsTrue(this.states.ContainsKey(nextState), $"{nextState}に対応した{typeof(IActorState)}が存在しません");

            this.states[this.currentState].Exit(nextState);
            this.currentState = nextState;
            this.states[this.currentState].Enter(context);
        }
Ejemplo n.º 3
0
        public override void Enter(IActorStateContext context)
        {
            base.Enter(context);

            var stateRunContext = (StateRunContext)context;

            var newEnterTime = Time.realtimeSinceStartup;
            var diffTime     = newEnterTime - this.enterTime;

            if (this.CanDash(stateRunContext.Direction, newEnterTime))
            {
                this.owner.StatusController.StartDash();
            }

            this.enterTime = newEnterTime;

            this.lastDirection = stateRunContext.Direction;

            this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Run);

            this.AddMove(stateRunContext.Direction, () => this.owner.StatusController.MoveSpeed);

            this.ReceiveRequestMoveOnMove(() => this.owner.StatusController.MoveSpeed);

            this.owner.Broker.Receive <Messages.Idle>()
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Idle);
            })
            .AddTo(this.events);

            this.owner.Broker.Receive <RequestJump>()
            .Where(_ => this.owner.StatusController.CanJump)
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Jump);
            })
            .AddTo(this.events);

            this.owner.Broker.Receive <Messages.Fall>()
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StatusController.AddJumpCount();
                _this.owner.StateManager.Change(ActorState.Name.Fall);
            })
            .AddTo(this.events);

            this.ReceiveRequestFireOnChangeAttackState();
            this.SyncActorDirection();
            this.ReceiveRequestFallOneWayPlatforms();
        }
Ejemplo n.º 4
0
        public override void Enter(IActorStateContext context)
        {
            base.Enter(context);
            this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Knockback);

            // 着地もしくは指定した時間になったらノックバック終了
            Observable.Merge(
                this.owner.Broker.Receive <Landed>().AsUnitObservable(),
                Observable.Timer(TimeSpan.FromSeconds(Constants.KnockbackDuration)).AsUnitObservable()
                )
            .TakeUntilDestroy(this.owner)
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Idle);
            })
            .AddTo(this.events);
        }
Ejemplo n.º 5
0
        public override void Enter(IActorStateContext context)
        {
            base.Enter(context);

            this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Idle);

            this.owner.Broker.Receive <RequestMove>()
            .SubscribeWithState(this, (x, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Run, new StateRunContext(x.Direction));
            })
            .AddTo(this.events);

            this.owner.Broker.Receive <RequestJump>()
            .Where(_ => this.owner.StatusController.CanJump)
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StateManager.Change(ActorState.Name.Jump);
            })
            .AddTo(this.events);

            this.owner.Broker.Receive <Messages.Fall>()
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.owner.StatusController.AddJumpCount();
                _this.owner.StateManager.Change(ActorState.Name.Fall);
            })
            .AddTo(this.events);

            if (this.owner.StatusController.IsDash)
            {
                this.owner.Broker.Receive <Messages.Idle>()
                .Take(1)
                .SubscribeWithState(this, (_, _this) =>
                {
                    _this.owner.StatusController.EndDash();
                })
                .AddTo(this.events);
            }

            this.ReceiveRequestFireOnChangeAttackState();
            this.ReceiveRequestInvokeGameEventOnInvokeGameEvent();
            this.ReceiveRequestFallOneWayPlatforms();
        }
Ejemplo n.º 6
0
        public override void Enter(IActorStateContext context)
        {
            base.Enter(context);

            var stateAttackContext = (StateAttackContext)context;

            Assert.IsNotNull(stateAttackContext);

            var equippedWeapon = this.owner.StatusController.EquippedWeapons[stateAttackContext.EquippedWeaponIndex];

            Assert.IsTrue(equippedWeapon.CanFire, "攻撃不可能な状態なのに攻撃しようとしました");

            this.nextStateDelaySeconds = 0.0f;
            this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Attack);
            var weaponRecord = equippedWeapon.InstanceWeapon.WeaponRecord;

            this.canNextFire = weaponRecord.CanAutoAttack;

            this.CreateGimmick(equippedWeapon);

            if (this.canNextFire)
            {
                this.owner.Broker.Receive <RequestTerminationFire>()
                .Where(x => x.EquippedWeaponIndex == stateAttackContext.EquippedWeaponIndex)
                .SubscribeWithState(this, (_, _this) =>
                {
                    _this.canNextFire = false;
                })
                .AddTo(this.events);
            }

            // 恐怖の状態異常にかかったらオート攻撃を終了する
            this.owner.Broker.Receive <AttachedAbnormalCondition>()
            .Where(x => x.Type == Constants.AbnormalStatus.Fear)
            .SubscribeWithState(this, (_, _this) =>
            {
                _this.canNextFire = false;
            })
            .AddTo(this.events);

            this.owner.UpdateAsObservable()
            .SubscribeWithState3(this, weaponRecord, equippedWeapon, (_, _this, _weaponRecord, _equippedWeapon) =>
            {
                _this.nextStateDelaySeconds += Time.deltaTime * (1.0f + _this.owner.StatusController.ItemModifierEffect.GetPercent(Constants.ItemModifierType.FireSpeedUpRate));
                if (_this.nextStateDelaySeconds >= _weaponRecord.NextStateDelaySeconds)
                {
                    if (this.canNextFire)
                    {
                        _this.CreateGimmick(_equippedWeapon);
                        _this.nextStateDelaySeconds = 0.0f;
                    }
                    else
                    {
                        _this.owner.StateManager.Change(ActorState.Name.Idle);
                    }
                }
            })
            .AddTo(this.events);

            var moveSpeed = this.owner.Context.BasicStatus.MoveSpeed;

            moveSpeed -= moveSpeed * weaponRecord.MoveSpeedAttenuationRate;
            this.ReceiveRequestMoveOnMove(() => moveSpeed);
            this.ReceiveRequestJumpOnJump();
            this.ReceiveRequestFallOneWayPlatforms();
        }
Ejemplo n.º 7
0
 public virtual void Enter(IActorStateContext context)
 {
     this.context = context;
 }