Example #1
0
    public Vector2 ApproachWalk(Vector2 dest)
    {
        Vector2 Dir = new Vector2();
        int     min = RogueGeneric.Distance(logicalPos, dest);

        for (int i = 1; i <= 9; i++)
        {
            Vector2 tmp = RogueGeneric.GetVectorFromNum(i);
            if (tmp != new Vector2() && AttemptMove <MovingObject>((int)tmp.x, (int)tmp.y))
            {
                int distance = RogueGeneric.Distance(logicalPos + tmp, dest);
                if (distance < min)
                {
                    min = distance;
                    Dir = tmp;
                }
                else if (distance == min)
                {
                    if ((logicalPos + tmp - dest).sqrMagnitude < (logicalPos + Dir - dest).sqrMagnitude)
                    {
                        Dir = tmp;
                    }
                }
            }
        }

        return(Dir);
    }
Example #2
0
    protected IEnumerator AttackAnimationCoroutine(Vector3 end, int speedFactor = 1)
    {
        isAttackingAnimation = true;
        inverseMoveTime      = 1f / moveTime * speedFactor;
        if (RogueGeneric.GetNumFromVector(end - transform.position) % 2 != 0)
        {
            inverseMoveTime *= Mathf.Sqrt(2);
        }
        Vector3 startPosition        = transform.position;
        float   sqrRemainingDistance = (transform.position - end).sqrMagnitude;

        while (sqrRemainingDistance > float.Epsilon)
        {
            Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime);
            rb2D.MovePosition(newPosition);
            sqrRemainingDistance = (transform.position - end).sqrMagnitude;
            yield return(null);
        }

        end = startPosition;
        sqrRemainingDistance = (transform.position - end).sqrMagnitude;
        while (sqrRemainingDistance > float.Epsilon)
        {
            Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime);
            rb2D.MovePosition(newPosition);
            sqrRemainingDistance = (transform.position - end).sqrMagnitude;
            yield return(null);
        }
        isAttackingAnimation = false;
    }
Example #3
0
    //現在地から目的地(引数end)へ移動するためのメソッド
    protected IEnumerator SmoothMovement(Vector3 end)
    {
        isMoving        = true;
        isMovingPre     = true;
        inverseMoveTime = 1f / moveTime;
        if (RogueGeneric.GetNumFromVector(end - transform.position) % 2 != 0)
        {
            inverseMoveTime *= Mathf.Sqrt(2);
        }
        //現在地から目的地を引き、2点間の距離を求める(Vector3型)
        //sqrMagnitudeはベクトルを2乗したあと2点間の距離に変換する(float型)
        float sqrRemainingDistance = (transform.position - end).sqrMagnitude;

        //2点間の距離が0になった時、ループを抜ける
        //Epsilon : ほとんど0に近い数値を表す
        while (sqrRemainingDistance > float.Epsilon)
        {
            //現在地と移動先の間を1秒間にinverseMoveTime分だけ移動する場合の、
            //1フレーム分の移動距離を算出する
            Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime);
            //算出した移動距離分、移動する
            rb2D.MovePosition(newPosition);
            //現在地が目的地寄りになった結果、sqrRemainDistanceが小さくなる
            sqrRemainingDistance = (transform.position - end).sqrMagnitude;
            if (sqrRemainingDistance < 0.01)
            {
                isMovingPre = false;
            }
            //1フレーム待ってから、while文の先頭へ戻る
            yield return(null);
        }
        isMoving = false;
    }
Example #4
0
    public virtual void CastMagic(Vector2 Direction, MovingObject owner)
    {
        Vector2 attackLine = RogueGeneric.GetUnitVector(Direction) * Profile.Range;

        others = new List <GameObject>();
        MessageWindow.instance.ConOut(owner.Status.Name + "は" + Profile.Name + "を唱えた!\n");
        if (Profile.FigureTypeValue == MagicProfile.MagicFigureType.Shot)
        {
            StartCoroutine(ShotProcess(attackLine, owner));
        }
        if (Profile.FigureTypeValue == MagicProfile.MagicFigureType.Self)
        {
            Renderer.enabled = false;
            Particle.Play();
            others.Add(owner.gameObject);
        }
        if (Profile.FigureTypeValue == MagicProfile.MagicFigureType.RandomSpace)
        {
            Renderer.enabled = false;
            Vector2 RandomDest;
            if (GetRandomSpace(2, out RandomDest))
            {
                transform.position = RandomDest;
                logicalPos         = RandomDest;
                Particle.Play();
            }
            else
            {
                MagicIsSuccess = false;
            }
        }
    }
Example #5
0
    private int CalculateMagicDamege(int atk, int atk_base, int cri, out bool crit)
    {
        int result = atk_base;

        crit    = false;
        result += RogueGeneric.CalculateKeyNo(atk, cri, out crit);
        return(result);
    }
Example #6
0
    private int BattlePhyDamege(int atk, int atk_base, int cri, int def, out bool crit)
    {
        int result = atk_base;

        crit    = false;
        result += RogueGeneric.CalculateKeyNo(atk, cri, out crit);
        result -= def;
        return(result);
    }
Example #7
0
    //敵キャラ移動用メソッド GameManagerから呼ばれる
    public TurnCommand CommandEnemy()
    {
        SetCommand(TurnCommand.Undef);
        int xDir = 0;
        int yDir = 0;


        if (Status.UsableMagicList.Count > 0)
        {
            SetCommand(SpecialCommand());
        }

        if (GetCommand() != TurnCommand.Undef)
        {
            print(UseMagic);
        }

        Vector2 distance = GameManager.instance.player.logicalPos - logicalPos;

        if (GetCommand() == TurnCommand.Undef)
        {
            if (distance.x <= 1.0f && distance.x >= -1.0f &&
                distance.y <= 1.0f && distance.y >= -1.0f)
            {
                SetDirection(distance);
                SetAttackLine(GetDirection());
                if (AttemptAttack <Wall>().Count == 0)
                {
                    SetCommand(TurnCommand.Attack);
                }
            }
        }

        if (GetCommand() == TurnCommand.Undef)
        {
            Vector2 tmp;
            if (RogueGeneric.Distance(Player.instance.logicalPos, logicalPos) > 5)
            {
                tmp = RandomWalk();
            }
            else
            {
                tmp = ApproachWalk(Player.instance.logicalPos);
            }
            xDir = (int)tmp.x;
            yDir = (int)tmp.y;
            if (AttemptMove <Player>(xDir, yDir))
            {
                SetCommand(TurnCommand.Move);
            }
        }

        TurnCount++;
        return(GetCommand());
    }
Example #8
0
    private TurnCommand SpecialCommand()
    {
        Vector2 TargetPos;

        List <Enemy> enemies = GameManager.instance.GetEnemyList();

        foreach (Enemy e in enemies)
        {
            TargetPos = e.logicalPos;

            if (Status.UsableMagicList.Count != 0)
            {
                foreach (string m in Status.UsableMagicList)
                {
                    MagicProfile tmp = MagicManager.instance.GetMagicProfileFromID(m);

                    if (tmp.EffectTypeValue == MagicProfile.MagicEffectType.SummonMonster)
                    {
                        if (TurnCount > 10)
                        {
                            UseMagic   = m;
                            TurnCount -= 10;
                            return(TurnCommand.CastMagic);
                        }
                    }

                    if (tmp.FigureTypeValue == MagicProfile.MagicFigureType.Shot &&
                        tmp.EffectTypeValue == MagicProfile.MagicEffectType.Damege)
                    {
                        if ((TargetPos - logicalPos).x == (TargetPos - logicalPos).y ||
                            (TargetPos - logicalPos).x == 0 ||
                            (TargetPos - logicalPos).y == 0)
                        {
                            if (RogueGeneric.Distance(TargetPos, logicalPos) > tmp.Range)
                            {
                                continue;
                            }
                            if (CheckHitLine <Enemy>(logicalPos, TargetPos, AttackableLayer, true))
                            {
                                SetDirection(TargetPos - logicalPos);
                                SetAttackLine(GetDirection());
                                UseMagic = m;
                                return(TurnCommand.CastMagic);
                            }
                        }
                    }
                }
            }
        }

        return(TurnCommand.Undef);
    }
Example #9
0
    public virtual IEnumerator Attack <T>()
        where T : MovingObject
    {
        waitAttackingProcess = true;

        MovingObject        other;
        List <MovingObject> others = new List <MovingObject>();
        List <int>          damege = new List <int>();
        List <bool>         crit   = new List <bool>();
        bool           tmp         = false;
        List <Vector2> AttackLines = new List <Vector2>();
        bool           AllowSlat   = false;

        int[] Attack       = { Status.NwAttack, 0 };
        int[] AttackTimes  = { Status.NwAttackTimes, 0 };
        int[] CriticalRate = { Status.NwAttackCriticalRate, 13 };
        int[] AttackBase   = { Status.AttackBase, 0 };
        int[] Aim          = { Status.Aim, 0 };

        ItemProfile RightHand = null;

        if (Equip.RightHand != null)
        {
            RightHand = ItemManager.instance.GetItemProfileFromID(Equip.RightHand.ID);
        }
        ItemProfile LeftHand = null;

        if (Equip.LeftHand != null)
        {
            LeftHand = ItemManager.instance.GetItemProfileFromID(Equip.LeftHand.ID);
        }

        // 右手の攻撃
        if (RightHand != null)
        {
            Attack[0]       = RightHand.Attack;
            AttackTimes[0]  = RightHand.AttackTimes;
            CriticalRate[0] = RightHand.AttackCriticalRate;
            AttackBase[0]   = Status.AttackBase + RightHand.AttackBase;
            Aim[0]          = Status.Aim + RightHand.Aim;
        }
        // 左手の攻撃
        if (LeftHand != null)
        {
            Attack[1]       = LeftHand.Attack;
            AttackTimes[1]  = LeftHand.AttackTimes;
            CriticalRate[1] = LeftHand.AttackCriticalRate;
            AttackBase[1]   = Status.AttackBase + LeftHand.AttackBase;
            Aim[1]          = Status.Aim + LeftHand.Aim;
        }

        //近接ステータスの再計算
        AttackTimes[0] += Status.AdditionalAttackTimes;

        if (attackLine == new Vector2(0, 0))
        {
            attackLine = direction;
        }
        AttackLines.Add(attackLine);
        if (BattleCanHit3Way())
        {
            attackLine = RogueGeneric.RotateDirection(attackLine, 1);
            AttackLines.Add(attackLine);
            attackLine = RogueGeneric.RotateDirection(attackLine, -2);
            AttackLines.Add(attackLine);
            AllowSlat = true;
        }

        for (int j = 0; j < 2; j++)
        {
            for (int i = 0; i < AttackTimes[j]; i++)
            {
                AttackAnimation();
                while (isAttackingAnimation)
                {
                    yield return(null);
                }

                foreach (Vector2 line in AttackLines)
                {
                    other = CheckHitLine <MovingObject>(logicalPos, logicalPos + line, AttackableLayer, AllowSlat);
                    if (other)
                    {
                        others.Add(other);
                        if (BattleHit(Aim[0], other.Status.Dodge))
                        {
                            damege.Add(BattlePhyDamege(Attack[j], AttackBase[j], CriticalRate[j], other.Status.Defence, out tmp));
                            crit.Add(tmp);
                        }
                        else
                        {
                            damege.Add(-1);
                            crit.Add(false);
                        }
                    }
                }
            }
        }

        if (others.Count != 0)
        {
            MessageWindow.instance.ConOut(Status.Name + "の攻撃!\n");
        }

        StartCoroutine(WaitDamegeEffect(others, damege, crit));
        do
        {
            yield return(null);
        } while (waitDamegeEffect);
        waitAttackingProcess = false;
    }
Example #10
0
    //敵キャラ移動用メソッド GameManagerから呼ばれる
    public TurnCommand CommandNPC()
    {
        if (swapFlag)
        {
            swapFlag = false;
            SetCommand(TurnCommand.Move);
            destPos = SwapDestPos;
            return(GetCommand());
        }
        else
        {
            SetCommand(TurnCommand.Undef);
        }
        int xDir = 0;
        int yDir = 0;

        if (GetCommand() == TurnCommand.Undef)
        {
            if (Status.UsableMagicList.Count > 0)
            {
                SetCommand(SpecialCommand());
            }
        }

        if (GetCommand() == TurnCommand.Undef)
        {
            Vector2      distance;
            List <Enemy> enemies = GameManager.instance.GetEnemyList();

            foreach (Enemy e in enemies)
            {
                distance = e.logicalPos - logicalPos;
                if (distance.x <= 1.0f && distance.x >= -1.0f &&
                    distance.y <= 1.0f && distance.y >= -1.0f)
                {
                    SetDirection(distance);
                    SetAttackLine(GetDirection());
                    if (AttemptAttack <Wall>().Count == 0)
                    {
                        SetCommand(TurnCommand.Attack);
                    }
                }
            }
        }

        if (GetCommand() == TurnCommand.Undef)
        {
            Vector2 tmp;
            tmp = ApproachWalk(Player.instance.logicalPos);
            List <Enemy> enemies = GameManager.instance.GetEnemyList();
            foreach (Enemy e in enemies)
            {
                if (RogueGeneric.Distance(e.logicalPos, logicalPos) < 5)
                {
                    tmp = ApproachWalk(e.logicalPos);
                }
            }
            xDir = (int)tmp.x;
            yDir = (int)tmp.y;
            if (AttemptMove <Player>(xDir, yDir))
            {
                SetCommand(TurnCommand.Move);
            }
        }

        TurnCount++;
        return(GetCommand());
    }