Ejemplo n.º 1
0
    protected override IEnumerator Run(MainSystem sys)
    {
        // 攻撃キャラを、ターゲットとの中間に移動させる(攻撃アニメーションの代替)
        var src = Actor.Position;
        var dst = src;

        dst.x          = (src.x + _target.Position.x) / 2;
        dst.y          = (src.y + _target.Position.y) / 2;
        Actor.Position = dst;

        // ターゲットの方を向く
        Actor.ChangeDir(Actor.Loc.Toward(_target.Loc));
        _target.HideDirection();

        // ターゲットは攻撃者の方を向く。ただし以下の場合は振り向かない
        // - 目の前に敵が存在する
        // - 攻撃者が透明状態
        if (!sys.ExistsEnemy(_target.Front()) && !Actor.IsInvisible())
        {
            _target.ChangeDir(_target.Loc.Toward(Actor.Loc));
        }

        _target.RemoveStatus(StatusType.Sleep);
        var dmg = 16 + new System.Random().Next(30);

        yield return(Anim.Par(sys,
                              () => _target.DamageAnim(dmg),
                              () => EffectAnim.PopupWhiteDigits(_target, dmg)));

        _target.DamageHp(dmg);
        Actor.Position = src;
    }
Ejemplo n.º 2
0
    public override IEnumerator Use(CharacterBase sender, MainSystem sys)
    {
        var   src      = sender.Position;
        float duration = 0.5f;
        float elapsed  = 0;

        while (elapsed <= duration)
        {
            float y = UTween.Ease(EaseType.InCubic, src.y, src.y + 6, elapsed / duration);
            sender.Position = new Vector3(src.x, y, 0);
            elapsed        += Time.deltaTime;
            yield return(null);
        }
        yield return(new WaitForSeconds(0.36f));

        var loc = sys.Warp(sender.Loc, true);

        sender.Position = loc.ToPosition();
        sender.ChangeDir(Dir.S);
        sender.UpdateLoc(loc);
        yield return(new WaitForSeconds(0.4f));
    }