public override ValueTask <MovementResult> Update(CanvasTimingInformation context) { if (!_readyToExit && _door.CanGhostLeave(Ghost)) { _readyToExit = true; return(new ValueTask <MovementResult>(MovementResult.NotFinished)); } if (_finished) { Ghost.Direction = new DirectionInfo(Directions.Left, Directions.Left); Ghost.SetMovementMode(GhostMovementMode.Undecided); return(new ValueTask <MovementResult>(MovementResult.Finished)); } Vector2 diff = _cellToMoveTo - _cellToMoveFrom; if (diff != Vector2.Zero) { diff = diff.Normalize(); Ghost.Position = Ghost.Position + diff / Vector2s.Two; var dir = DirectionToIndexLookup.GetDirectionFromVector(diff); Ghost.Direction = new DirectionInfo(dir, dir); } if (Ghost.Position.Floor() == _cellToMoveTo.Floor()) { Ghost.Position = _cellToMoveTo; whenAtTargetCell(); } return(new ValueTask <MovementResult>(MovementResult.NotFinished)); }