// File: /workspace/github_cpp_makefile_star2_O3/wrighteagle2d[P]wrighteaglebase/Debug/../src/WorldState.cpp
// Function: WorldStateUpdater::EstimateBall(bool, int)
void WorldStateUpdater::EstimateBall(bool is_estimate_to_now, int cycle) {
  if (!is_estimate_to_now &&
      mpObserver->GetBallKickTime() == mpObserver->CurrentTime()) {
    double eps = (2 * SelfState().GetKickRand() +
                  mpObserver->GetBallVelByKick().Mod() /
                      ServerParam::instance().ballDecay()) *
                 ServerParam::instance().ballRand();
    Ball().UpdatePosEps(Ball().GetPosEps() + eps);
    Ball().UpdateVelEps(Ball().GetVelEps() +
                        eps * ServerParam::instance().ballDecay());
    Ball().UpdatePos(mpObserver->GetBallPosByKick(), GetBall().GetPosDelay(),
                     GetBall().GetPosConf());
    Ball().UpdateVel(mpObserver->GetBallVelByKick(), GetBall().GetVelDelay(),
                     GetBall().GetVelConf());
  } else if (is_estimate_to_now && cycle == 1 &&
             mpObserver->GetBallKickTime() == mpObserver->CurrentTime()) {
    Vector pos = mpWorldState->GetHistory(1)->GetBall().GetPos();

    Vector vel = mpObserver->GetBallPosByKick() - pos;
    pos = vel + Ball().GetPos();
    vel *= ServerParam::instance().ballDecay();

    Ball().UpdatePos(pos, GetBall().GetPosDelay(), GetBall().GetPosConf());
    Ball().UpdateVel(vel, GetBall().GetVelDelay(), GetBall().GetVelConf());
  } else {
    double eps = (Ball().GetVel().Mod() + Ball().GetVelEps()) *
                 ServerParam::instance().ballRand() *
                 ServerParam::instance().ballDecay();
    Ball().UpdateVelEps(Ball().GetVelEps() + eps);

    eps = (Ball().GetVel().Mod() + Ball().GetVelEps()) *
          ServerParam::instance().ballRand();
    Ball().UpdatePosEps(Ball().GetPosEps() + eps + Ball().GetVelEps());

    ComputeNextCycle(Ball(), ServerParam::instance().ballDecay());
    Ball().UpdatePos(LimitToField(Ball().GetPos()), Ball().GetPosDelay(),
                     Ball().GetPosConf()); // limit ball in  field
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
testl %esi, %esi
je 0x661df
cmpl $0x1, %edx
jne 0x66320
movq (%rbx), %rax
movq 0x5638(%rax), %rcx
movq %rcx, %rdx
shrq $0x20, %rdx
cmpl %edx, 0x10(%rax)
jne 0x66320
cmpl %ecx, 0xc(%rax)
jne 0x66320
movq 0x8(%rbx), %rcx
movq 0x8(%rcx), %rdx
movl 0x14b90(%rdx), %esi
movl %esi, %edi
addl $0x9, %edi
movslq %edi, %rdi
imulq $0x66666667, %rdi, %rdi # imm = 0x66666667
movq %rdi, %r8
shrq $0x3f, %r8
sarq $0x22, %rdi
addl %r8d, %edi
addl %edi, %edi
leal (%rdi,%rdi,4), %edi
negl %edi
addl %edi, %esi
addl $0x9, %esi
movslq %esi, %rsi
imulq $0x2128, %rsi, %rsi     # imm = 0x2128
movups 0x38(%rdx,%rsi), %xmm0
leaq -0x40(%rbp), %r14
movaps %xmm0, (%r14)
movsd 0x5640(%rax), %xmm1
movsd 0x5648(%rax), %xmm2
subsd (%r14), %xmm1
movsd %xmm1, -0x28(%rbp)
subsd 0x8(%r14), %xmm2
movsd %xmm2, -0x20(%rbp)
movsd 0x38(%rcx), %xmm0
addsd %xmm1, %xmm0
movsd 0x40(%rcx), %xmm1
addsd %xmm2, %xmm1
movsd %xmm0, (%r14)
movsd %xmm1, 0x8(%r14)
callq 0x49360
movsd 0x30e0(%rax), %xmm0
movsd -0x28(%rbp), %xmm1
mulsd %xmm0, %xmm1
leaq -0x50(%rbp), %r15
movsd %xmm1, (%r15)
movsd -0x20(%rbp), %xmm1
mulsd %xmm0, %xmm1
movsd %xmm1, 0x8(%r15)
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %rdi
movl 0x48(%rax), %edx
movsd 0x50(%rax), %xmm0
movq %r14, %rsi
callq 0xf572
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %rdi
movl 0x70(%rax), %edx
movsd 0x78(%rax), %xmm0
movq %r15, %rsi
callq 0xf53c
jmp 0x66428
movq (%rbx), %rax
movq 0x5638(%rax), %rcx
movq %rcx, %rdx
shrq $0x20, %rdx
cmpl %edx, 0x10(%rax)
jne 0x66320
cmpl %ecx, 0xc(%rax)
jne 0x66320
movslq 0x14(%rbx), %r14
movq 0x8(%rbx), %r15
callq 0x43dce
movq 0x5c38(%rax), %rax
imulq $0x178, %r14, %rcx      # imm = 0x178
movslq 0x44(%r15,%rcx), %rcx
imulq $0x3700, %rcx, %rcx     # imm = 0x3700
movsd 0x3048(%rax,%rcx), %xmm0
movsd %xmm0, -0x20(%rbp)
movq (%rbx), %rax
movsd 0x5650(%rax), %xmm0
movsd 0x5658(%rax), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
sqrtsd %xmm0, %xmm0
movsd %xmm0, -0x28(%rbp)
callq 0x49360
movsd -0x28(%rbp), %xmm1
divsd 0x30e0(%rax), %xmm1
movsd -0x20(%rbp), %xmm0
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
callq 0x49360
movsd -0x20(%rbp), %xmm1
mulsd 0x30e8(%rax), %xmm1
movsd %xmm1, -0x20(%rbp)
movq 0x8(%rbx), %r14
movsd 0x58(%r14), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x58(%r14)
movsd 0x80(%r14), %xmm0
movsd %xmm0, -0x28(%rbp)
callq 0x49360
movsd -0x20(%rbp), %xmm0
mulsd 0x30e0(%rax), %xmm0
addsd -0x28(%rbp), %xmm0
movsd %xmm0, 0x80(%r14)
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %rdi
movl $0x5640, %esi           # imm = 0x5640
addq (%rbx), %rsi
movl 0x48(%rax), %edx
movsd 0x50(%rax), %xmm0
callq 0xf572
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %rdi
movl $0x5650, %esi           # imm = 0x5650
addq (%rbx), %rsi
movl 0x70(%rax), %edx
movsd 0x78(%rax), %xmm0
addq $0x38, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
jmp 0xf53c
movq 0x8(%rbx), %rax
movsd 0x60(%rax), %xmm0
movsd 0x68(%rax), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
sqrtsd %xmm0, %xmm0
addsd 0x80(%rax), %xmm0
movsd %xmm0, -0x20(%rbp)
callq 0x49360
movsd -0x20(%rbp), %xmm0
mulsd 0x30e8(%rax), %xmm0
movsd %xmm0, -0x20(%rbp)
callq 0x49360
movsd -0x20(%rbp), %xmm0
mulsd 0x30e0(%rax), %xmm0
movq 0x8(%rbx), %rax
addsd 0x80(%rax), %xmm0
movsd %xmm0, 0x80(%rax)
movapd %xmm0, %xmm2
movsd 0x60(%rax), %xmm0
movsd 0x68(%rax), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
sqrtsd %xmm0, %xmm0
addsd %xmm2, %xmm0
movsd %xmm0, -0x20(%rbp)
callq 0x49360
movsd -0x20(%rbp), %xmm0
mulsd 0x30e8(%rax), %xmm0
movq 0x8(%rbx), %rax
addsd 0x58(%rax), %xmm0
leaq 0x30(%rax), %r14
addsd 0x80(%rax), %xmm0
movsd %xmm0, 0x58(%rax)
callq 0x49360
movsd 0x30e0(%rax), %xmm0
movq %r14, %rsi
callq 0x66690
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %r14
movsd 0x38(%rax), %xmm0
movsd 0x40(%rax), %xmm1
callq 0x63fdb
leaq -0x40(%rbp), %rsi
movsd %xmm0, (%rsi)
movsd %xmm1, 0x8(%rsi)
movq 0x8(%rbx), %rax
movl 0x48(%rax), %edx
movsd 0x50(%rax), %xmm0
movq %r14, %rdi
callq 0xf572
addq $0x38, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
nop