// File: /workspace/github_cpp_makefile_star2_O3/wrighteagle2d[P]wrighteaglebase/Debug/../src/Formation.cpp
// Function: FormationBase::GetExpectedGoaliePos(Vector const&, double, Vector const&, int)
Vector FormationBase::GetExpectedGoaliePos(const Vector &ball_pos, double run,
                                           const Vector &goalie_pos,
                                           int cycle_delay) {
  Vector p[2];
  p[0] = Vector(ServerParam::instance().PITCH_LENGTH / 2.0,
                -ServerParam::instance().goalWidth() / 2.0 + 0.1); // top
  p[1] = Vector(ServerParam::instance().PITCH_LENGTH / 2.0,
                ServerParam::instance().goalWidth() / 2.0 - 0.1); // down

  double tmp, distg;
  distg = ball_pos.Dist(goalie_pos);
  AngleDeg mid;
  mid = GetNormalizeAngleDeg(
      ((p[1] - ball_pos).Dir() + (p[0] - ball_pos).Dir()) / 2); //取角平分线
  tmp = ball_pos.Dist(Vector(ServerParam::instance().PITCH_LENGTH / 2.0, 0.0)) -
        2.0;
  Vector tgPos, jgPos;
  tgPos = ball_pos +
          Polar2Vector(distg, mid); // 估计守门员可能的位置,守门员向角平分线运动
  if (tgPos.Dist(ball_pos) > tmp) {
    tgPos = ball_pos + (tgPos - ball_pos).SetLength(tmp); // 调整到球场内
  }
  if (goalie_pos.Dist(tgPos) < run + cycle_delay * 0.8) {
    jgPos = tgPos; // 守门员向tgpos尽可能运动
  } else {
    jgPos = goalie_pos +
            Polar2Vector(run + cycle_delay * 0.8, (tgPos - goalie_pos).Dir());
  }
  return jgPos;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movl %ecx, %r14d
movq %rdx, %rbx
movsd %xmm0, -0x60(%rbp)
movq %rsi, %r15
callq 0x49360
leaq 0x4719b(%rip), %rax     # 0x6bee8
movsd 0x44b23(%rip), %xmm1    # 0x69878
movsd (%rax), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
callq 0x49360
movsd 0x3008(%rax), %xmm0
movsd 0x44b01(%rip), %xmm1    # 0x69878
mulsd %xmm1, %xmm0
movsd 0x4583d(%rip), %xmm1    # 0x6a5c0
subsd %xmm0, %xmm1
movapd %xmm1, -0x50(%rbp)
callq 0x49360
callq 0x49360
movsd 0x44ada(%rip), %xmm0    # 0x69878
mulsd 0x3008(%rax), %xmm0
addsd 0x4581a(%rip), %xmm0    # 0x6a5c8
movsd (%r15), %xmm6
movsd 0x8(%r15), %xmm8
movsd -0x30(%rbp), %xmm1
subsd %xmm6, %xmm1
subsd (%rbx), %xmm6
movapd %xmm8, %xmm7
subsd 0x8(%rbx), %xmm7
mulsd %xmm7, %xmm7
mulsd %xmm6, %xmm6
subsd %xmm8, %xmm0
movapd 0x4422b(%rip), %xmm4    # 0x69010
movapd %xmm1, %xmm2
andpd %xmm4, %xmm2
movsd 0x4424b(%rip), %xmm5    # 0x69040
ucomisd %xmm2, %xmm5
jbe 0x24e0f
movapd %xmm0, %xmm3
andpd %xmm4, %xmm3
ucomisd %xmm3, %xmm5
jbe 0x24e0f
xorpd %xmm3, %xmm3
jmp 0x24e60
movsd %xmm6, -0x40(%rbp)
movsd %xmm7, -0x58(%rbp)
callq 0x90d0
movsd -0x58(%rbp), %xmm7
movsd -0x40(%rbp), %xmm6
movsd 0x44210(%rip), %xmm5    # 0x69040
movapd %xmm0, %xmm3
mulsd 0x4420c(%rip), %xmm3    # 0x69048
divsd 0x4420c(%rip), %xmm3    # 0x69050
movsd 0x8(%r15), %xmm8
movsd -0x30(%rbp), %xmm1
subsd (%r15), %xmm1
movapd 0x441b4(%rip), %xmm2    # 0x69010
andpd %xmm1, %xmm2
addsd %xmm7, %xmm6
movapd -0x50(%rbp), %xmm4
subsd %xmm8, %xmm4
ucomisd %xmm2, %xmm5
jbe 0x24e8a
movapd 0x44194(%rip), %xmm2    # 0x69010
andpd %xmm4, %xmm2
xorpd %xmm0, %xmm0
ucomisd %xmm2, %xmm5
ja 0x24eb7
movapd %xmm4, %xmm0
movsd %xmm3, -0x50(%rbp)
movsd %xmm6, -0x40(%rbp)
callq 0x90d0
movsd -0x40(%rbp), %xmm6
movsd -0x50(%rbp), %xmm3
mulsd 0x44199(%rip), %xmm0    # 0x69048
divsd 0x44199(%rip), %xmm0    # 0x69050
addsd %xmm0, %xmm3
mulsd 0x449b5(%rip), %xmm3    # 0x69878
xorps %xmm1, %xmm1
sqrtsd %xmm6, %xmm1
movsd 0x4418e(%rip), %xmm0    # 0x69060
ucomisd %xmm3, %xmm0
movapd %xmm1, -0x40(%rbp)
jbe 0x24ef1
movsd 0x4418b(%rip), %xmm1    # 0x69070
addsd %xmm1, %xmm3
ucomisd %xmm3, %xmm0
ja 0x24ee5
jmp 0x24f15
ucomisd 0x4414f(%rip), %xmm3    # 0x69048
jb 0x24f15
movsd 0x44165(%rip), %xmm0    # 0x69068
movsd 0x4413d(%rip), %xmm1    # 0x69048
addsd %xmm0, %xmm3
ucomisd %xmm1, %xmm3
jae 0x24f0b
movsd %xmm3, -0x50(%rbp)
callq 0x49360
movsd (%r15), %xmm0
movsd 0x8(%r15), %xmm1
subsd -0x30(%rbp), %xmm0
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
sqrtsd %xmm0, %xmm0
addsd 0x44139(%rip), %xmm0    # 0x69080
movsd %xmm0, -0x30(%rbp)
movsd -0x50(%rbp), %xmm0
mulsd 0x440f7(%rip), %xmm0    # 0x69050
divsd 0x440e7(%rip), %xmm0    # 0x69048
leaq -0x70(%rbp), %r12
leaq -0x68(%rbp), %r13
movq %r12, %rdi
movq %r13, %rsi
callq 0x92d0
movsd (%r13), %xmm7
movapd -0x40(%rbp), %xmm1
mulsd %xmm1, %xmm7
mulsd (%r12), %xmm1
movsd (%r15), %xmm0
movsd 0x8(%r15), %xmm2
addsd %xmm0, %xmm7
addsd %xmm2, %xmm1
movapd %xmm7, %xmm3
subsd %xmm0, %xmm3
movapd %xmm1, %xmm4
subsd %xmm2, %xmm4
movapd %xmm4, %xmm5
mulsd %xmm4, %xmm5
movapd %xmm3, %xmm6
mulsd %xmm3, %xmm6
addsd %xmm5, %xmm6
xorps %xmm5, %xmm5
sqrtsd %xmm6, %xmm5
movsd -0x30(%rbp), %xmm6
ucomisd %xmm6, %xmm5
jbe 0x25007
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm5
divsd %xmm5, %xmm6
mulsd %xmm6, %xmm4
ja 0x24fea
xorpd %xmm3, %xmm3
jmp 0x24fee
mulsd %xmm6, %xmm3
cmpltsd %xmm5, %xmm1
andpd %xmm4, %xmm1
addsd %xmm3, %xmm0
addsd %xmm1, %xmm2
movapd %xmm0, %xmm7
movapd %xmm2, %xmm1
movsd (%rbx), %xmm2
movsd 0x8(%rbx), %xmm0
movapd %xmm2, %xmm3
subsd %xmm7, %xmm3
movapd %xmm0, %xmm4
subsd %xmm1, %xmm4
mulsd %xmm4, %xmm4
mulsd %xmm3, %xmm3
addsd %xmm4, %xmm3
xorps %xmm4, %xmm4
cvtsi2sd %r14d, %xmm4
mulsd 0x45594(%rip), %xmm4    # 0x6a5d0
sqrtsd %xmm3, %xmm3
addsd -0x60(%rbp), %xmm4
ucomisd %xmm3, %xmm4
ja 0x250e4
movsd %xmm4, -0x30(%rbp)
subsd %xmm2, %xmm7
subsd %xmm0, %xmm1
movapd %xmm7, %xmm0
movapd 0x43fa8(%rip), %xmm2    # 0x69010
andpd %xmm2, %xmm0
movsd 0x43fcc(%rip), %xmm3    # 0x69040
ucomisd %xmm0, %xmm3
jbe 0x25088
andpd %xmm1, %xmm2
xorpd %xmm0, %xmm0
ucomisd %xmm2, %xmm3
ja 0x250ad
movapd %xmm1, %xmm0
movapd %xmm7, %xmm1
callq 0x90d0
mulsd 0x43fab(%rip), %xmm0    # 0x69048
movsd 0x43fab(%rip), %xmm1    # 0x69050
divsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
divsd 0x43f93(%rip), %xmm0    # 0x69048
leaq -0x70(%rbp), %r14
leaq -0x68(%rbp), %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0x92d0
movsd (%r15), %xmm7
movsd -0x30(%rbp), %xmm1
mulsd %xmm1, %xmm7
mulsd (%r14), %xmm1
addsd (%rbx), %xmm7
addsd 0x8(%rbx), %xmm1
movapd %xmm7, %xmm0
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop