private void Move() { // 目標のセルへ移動する Assert.IsTrue(this.targetCell.CanMove, $"{this.actor.Spec.Name}が移動不可能なセルへ移動しようとしています cellId = {this.targetCell.Id}"); var cell = this.actor.CellController; var velocity = FieldController.GetTargetPointSign( cell.Id, this.targetCell.Id, (from, to) => { // 味方が移動先にいる場合は移動できない var actor = FieldController.Cells[to.y, to.x].RideActor; if (actor != null && !this.actor.IsOpponent(actor)) { return(false); } return(FieldController.CanMove(from, to)); }); if (!velocity.IsZero) { this.lastMoveDirection = velocity.ToDirection(); this.actor.NextPosition(cell.Id + velocity); } }
/// <summary> /// 次移動する座標を更新する /// </summary> /// <remarks> /// 移動先のセルに何かしらのイベントがある場合は様々な処理を実行する /// 敵対する<see cref="Actor"/>の場合は攻撃を行う /// 何もいない場合は移動して<see cref="CellEvent"/>を実行します /// </remarks> /// <returns>何かしらの行動を行ったか返す</returns> public bool NextPosition(Point nextId) { var targetActor = FieldController.Cells[nextId.y, nextId.x].RideActor; if (targetActor) { if (this.IsOpponent(targetActor)) { targetActor.TakeDamage(Calculator.GetDamageFtomAttack(this, targetActor), this); return(true); } Assert.IsTrue(false, $"{this.Spec.Name}は{targetActor.Spec.Name}に対して何もしませんでした"); return(false); } else if (FieldController.CanMove(this.Id, nextId)) { this.SetPosition(nextId); return(true); } return(false); }