// File: kube[P]gradius/AGameEntity.cpp
// Function: AGameEntity::refreshPhysics()
void  AGameEntity::refreshPhysics() {
  int didBounce = false;

  _world.setEntityAt((int)_posX, (int)_posY, NULL);

  _posX += _dirX * _acceleration;
  _posY += _dirY * _acceleration;

  _dirX *= _deceleration;
  _dirY *= _deceleration;

  if (_posX < 1) {
    _posX = 1;
    _dirX = -_dirX * _bounce;
    didBounce = true;
  }
  else if (_posX >= _world.getWidth()) {
    _posX = _world.getWidth() - 1;
    _dirX = -_dirX * _bounce;
    didBounce = true;
  }

  if (_posY < 1) {
    _posY = 1;
    _dirY = -_dirY * _bounce;
    didBounce = true;
  }
  else if (_posY >= _world.getHeight()) {
    _posY = _world.getHeight() - 1;
    _dirY = -_dirY * _bounce;
    didBounce = true;
  }
  _world.setEntityAt((int)_posX, (int)_posY, this);

  if (didBounce)
    bounce();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x18(%rbp)
movl $0x0, -0xc(%rbp)
movq 0x30(%rax), %rdi
cvttss2si 0x8(%rax), %esi
cvttss2si 0xc(%rax), %edx
xorl %eax, %eax
movl %eax, %ecx
callq 0x4670
movq -0x18(%rbp), %rax
movss 0x10(%rax), %xmm0
movss 0x18(%rax), %xmm2
movss 0x8(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, 0x8(%rax)
movss 0x14(%rax), %xmm0
movss 0x18(%rax), %xmm2
movss 0xc(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, 0xc(%rax)
movss 0x1c(%rax), %xmm0
mulss 0x10(%rax), %xmm0
movss %xmm0, 0x10(%rax)
movss 0x1c(%rax), %xmm0
mulss 0x14(%rax), %xmm0
movss %xmm0, 0x14(%rax)
movss 0x2840(%rip), %xmm0     # 0x5004
ucomiss 0x8(%rax), %xmm0
jbe 0x2801
movq -0x18(%rbp), %rax
movss 0x282e(%rip), %xmm0     # 0x5004
movss %xmm0, 0x8(%rax)
movss 0x10(%rax), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
mulss 0x20(%rax), %xmm0
movss %xmm0, 0x10(%rax)
movl $0x1, -0xc(%rbp)
jmp 0x286b
movq -0x18(%rbp), %rax
movss 0x8(%rax), %xmm0
movss %xmm0, -0x1c(%rbp)
movq 0x30(%rax), %rdi
callq 0x4280
movss -0x1c(%rbp), %xmm0
cvtsi2ss %eax, %xmm1
ucomiss %xmm1, %xmm0
jb 0x2869
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x4280
movl %eax, %ecx
movq -0x18(%rbp), %rax
subl $0x1, %ecx
cvtsi2ss %ecx, %xmm0
movss %xmm0, 0x8(%rax)
movss 0x10(%rax), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
mulss 0x20(%rax), %xmm0
movss %xmm0, 0x10(%rax)
movl $0x1, -0xc(%rbp)
jmp 0x286b
movq -0x18(%rbp), %rax
movss 0x278d(%rip), %xmm0     # 0x5004
ucomiss 0xc(%rax), %xmm0
jbe 0x28b4
movq -0x18(%rbp), %rax
movss 0x277b(%rip), %xmm0     # 0x5004
movss %xmm0, 0xc(%rax)
movss 0x14(%rax), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
mulss 0x20(%rax), %xmm0
movss %xmm0, 0x14(%rax)
movl $0x1, -0xc(%rbp)
jmp 0x291e
movq -0x18(%rbp), %rax
movss 0xc(%rax), %xmm0
movss %xmm0, -0x20(%rbp)
movq 0x30(%rax), %rdi
callq 0x4260
movss -0x20(%rbp), %xmm0
cvtsi2ss %eax, %xmm1
ucomiss %xmm1, %xmm0
jb 0x291c
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x4260
movl %eax, %ecx
movq -0x18(%rbp), %rax
subl $0x1, %ecx
cvtsi2ss %ecx, %xmm0
movss %xmm0, 0xc(%rax)
movss 0x14(%rax), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
mulss 0x20(%rax), %xmm0
movss %xmm0, 0x14(%rax)
movl $0x1, -0xc(%rbp)
jmp 0x291e
movq -0x18(%rbp), %rcx
movq 0x30(%rcx), %rdi
cvttss2si 0x8(%rcx), %esi
cvttss2si 0xc(%rcx), %edx
callq 0x4670
cmpl $0x0, -0xc(%rbp)
je 0x2945
movq -0x18(%rbp), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
addq $0x20, %rsp
popq %rbp
retq
nopl (%rax,%rax)