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); }
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; }
//現在地から目的地(引数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; }
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; } } }
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); }
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); }
//敵キャラ移動用メソッド 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()); }
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); }
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; }
//敵キャラ移動用メソッド 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()); }