// File: /workspace/github_cpp_makefile_star2_O2/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 0x54759
cmpl $0x1, %edx
jne 0x5488d
movq (%rbx), %rcx
movq 0x5638(%rcx), %rax
movq %rax, %rdx
shrq $0x20, %rdx
cmpl %edx, 0x10(%rcx)
jne 0x5488d
cmpl %eax, 0xc(%rcx)
jne 0x5488d
movq 0x8(%rbx), %rsi
movq 0x8(%rsi), %rdi
movl 0x14b90(%rdi), %eax
addl $0x9, %eax
pushq $0xa
popq %r8
cltd
idivl %r8d
movslq %edx, %rax
imulq $0x2128, %rax, %rax     # imm = 0x2128
movups 0x38(%rdi,%rax), %xmm0
leaq -0x40(%rbp), %r14
movaps %xmm0, (%r14)
movsd 0x5640(%rcx), %xmm1
movsd 0x5648(%rcx), %xmm2
subsd (%r14), %xmm1
movsd %xmm1, -0x28(%rbp)
subsd 0x8(%r14), %xmm2
movsd %xmm2, -0x20(%rbp)
movsd 0x38(%rsi), %xmm0
addsd %xmm1, %xmm0
movsd 0x40(%rsi), %xmm1
addsd %xmm2, %xmm1
movsd %xmm0, (%r14)
movsd %xmm1, 0x8(%r14)
callq 0x3db2c
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 0xde1c
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %rdi
movl 0x70(%rax), %edx
movsd 0x78(%rax), %xmm0
movq %r15, %rsi
callq 0xdde8
jmp 0x54995
movq (%rbx), %rax
movq 0x5638(%rax), %rcx
movq %rcx, %rdx
shrq $0x20, %rdx
cmpl %edx, 0x10(%rax)
jne 0x5488d
cmpl %ecx, 0xc(%rax)
jne 0x5488d
movslq 0x14(%rbx), %rax
movq 0x8(%rbx), %rcx
imulq $0x178, %rax, %rax      # imm = 0x178
leaq (%rax,%rcx), %rdi
addq $-0xd0, %rdi
callq 0x3adba
movsd (%rax), %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 0x3db2c
movsd -0x28(%rbp), %xmm1
divsd 0x30e0(%rax), %xmm1
movsd -0x20(%rbp), %xmm0
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
callq 0x3db2c
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 0x3db2c
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 0xde1c
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 0xdde8
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 0x3db2c
movsd -0x20(%rbp), %xmm0
mulsd 0x30e8(%rax), %xmm0
movsd %xmm0, -0x20(%rbp)
callq 0x3db2c
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 0x3db2c
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 0x3db2c
movsd 0x30e0(%rax), %xmm0
movq %r14, %rsi
callq 0x54b58
movq 0x8(%rbx), %rax
leaq 0x30(%rax), %r14
movsd 0x38(%rax), %xmm0
movsd 0x40(%rax), %xmm1
callq 0x52ee3
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 0xde1c
addq $0x38, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq