// File: tkaczenko[P]asteroids-clone/src/Ship.cpp
// Function: Ship::updatePosition(float const&)
void Ship::updatePosition(const float& dt)
{
    if (thrust) {
        speed += 1;
        if (speed > 5) {
            speed = 5;
        }
        velocity[0] += speed * cosA;
        velocity[1] += speed * sinA;
    } else {
        speed = 0;
    }
    switch (rot) {
        case LEFT: {
            angle -= 0.175;
            break;
        }
        case RIGHT: {
            angle += 0.175;
            break;
        }
        case NONE: {
            break;
        }
    }

    position.x = prevPosition.x - velocity[0] * dt;
    position.y = prevPosition.y - velocity[1] * dt;

    if (position.x > 800) {
        position.x -= 800;
    }
    if (position.x < 0) {
        position.x += 800;
    }
    if (position.y > 600) {
        position.y -= 600;
    }
    if (position.y < 0) {
        position.y += 600;
    }
    for (auto i = bullets.begin(); i != bullets.end(); ) {
        if ((i -> second).isDead())
            i = bullets.erase(i);
        else
            ++i;
    }
    for (auto i = bullets.begin(); i != bullets.end(); i++) {
        i->second.updatePosition(dt, bullets);
    }
    prevPosition.x = position.x;
    prevPosition.y = position.y;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x50(%rbp)
testb $0x1, 0x89(%rax)
je 0x771e
movq -0x50(%rbp), %rax
movss 0x1a13(%rip), %xmm0     # 0x90b4
addss 0x84(%rax), %xmm0
movss %xmm0, 0x84(%rax)
movss 0x84(%rax), %xmm0
movss 0x19ef(%rip), %xmm1     # 0x90b0
ucomiss %xmm1, %xmm0
jbe 0x76da
movq -0x50(%rbp), %rax
movss 0x19de(%rip), %xmm0     # 0x90b0
movss %xmm0, 0x84(%rax)
movq -0x50(%rbp), %rax
movss 0x84(%rax), %xmm0
movss 0x24(%rax), %xmm2
movss 0x1c(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, 0x1c(%rax)
movss 0x84(%rax), %xmm0
movss 0x28(%rax), %xmm2
movss 0x20(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, 0x20(%rax)
jmp 0x772d
movq -0x50(%rbp), %rax
xorps %xmm0, %xmm0
movss %xmm0, 0x84(%rax)
movq -0x50(%rbp), %rax
movl 0x80(%rax), %eax
movl %eax, -0x54(%rbp)
testl %eax, %eax
je 0x779c
jmp 0x7740
movl -0x54(%rbp), %eax
subl $0x1, %eax
je 0x7754
jmp 0x774a
movl -0x54(%rbp), %eax
subl $0x2, %eax
je 0x7778
jmp 0x779e
movq -0x50(%rbp), %rax
movss 0x18(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x1957(%rip), %xmm1     # 0x90c0
subsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x18(%rax)
jmp 0x779e
movq -0x50(%rbp), %rax
movss 0x18(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x1933(%rip), %xmm1     # 0x90c0
addsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x18(%rax)
jmp 0x779e
jmp 0x779e
movq -0x50(%rbp), %rax
cvtsi2ssl 0x8(%rax), %xmm1
movss 0x1c(%rax), %xmm0
movq -0x10(%rbp), %rcx
movss (%rcx), %xmm2
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
cvttss2si %xmm0, %ecx
movl %ecx, 0x10(%rax)
cvtsi2ssl 0xc(%rax), %xmm1
movss 0x20(%rax), %xmm0
movq -0x10(%rbp), %rcx
movss (%rcx), %xmm2
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
cvttss2si %xmm0, %ecx
movl %ecx, 0x14(%rax)
cmpl $0x320, 0x10(%rax)      # imm = 0x320
jle 0x7819
movq -0x50(%rbp), %rax
movl 0x10(%rax), %ecx
subl $0x320, %ecx            # imm = 0x320
movl %ecx, 0x10(%rax)
movq -0x50(%rbp), %rax
cmpl $0x0, 0x10(%rax)
jge 0x7833
movq -0x50(%rbp), %rax
movl 0x10(%rax), %ecx
addl $0x320, %ecx            # imm = 0x320
movl %ecx, 0x10(%rax)
movq -0x50(%rbp), %rax
cmpl $0x258, 0x14(%rax)      # imm = 0x258
jle 0x7850
movq -0x50(%rbp), %rax
movl 0x14(%rax), %ecx
subl $0x258, %ecx            # imm = 0x258
movl %ecx, 0x14(%rax)
movq -0x50(%rbp), %rax
cmpl $0x0, 0x14(%rax)
jge 0x786a
movq -0x50(%rbp), %rax
movl 0x14(%rax), %ecx
addl $0x258, %ecx            # imm = 0x258
movl %ecx, 0x14(%rax)
movq -0x50(%rbp), %rdi
addq $0x40, %rdi
callq 0x54e0
movq %rax, -0x18(%rbp)
movq -0x50(%rbp), %rdi
addq $0x40, %rdi
callq 0x5540
movq %rax, -0x20(%rbp)
leaq -0x18(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x5510
testb $0x1, %al
jne 0x789f
jmp 0x78ec
leaq -0x18(%rbp), %rdi
callq 0x5570
movq %rax, %rdi
addq $0x20, %rdi
callq 0x4240
testb $0x1, %al
jne 0x78ba
jmp 0x78e1
movq -0x50(%rbp), %rdi
addq $0x40, %rdi
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rsi
callq 0x55e0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x18(%rbp)
jmp 0x78ea
leaq -0x18(%rbp), %rdi
callq 0x66d0
jmp 0x787b
movq -0x50(%rbp), %rdi
addq $0x40, %rdi
callq 0x54e0
movq %rax, -0x38(%rbp)
movq -0x50(%rbp), %rdi
addq $0x40, %rdi
callq 0x5540
movq %rax, -0x40(%rbp)
leaq -0x38(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x5510
testb $0x1, %al
jne 0x7921
jmp 0x7953
leaq -0x38(%rbp), %rdi
callq 0x5570
movq -0x50(%rbp), %rdx
movq %rax, %rdi
addq $0x20, %rdi
movq -0x10(%rbp), %rsi
addq $0x40, %rdx
callq 0x4010
leaq -0x38(%rbp), %rdi
xorl %esi, %esi
callq 0x5620
movq %rax, -0x48(%rbp)
jmp 0x78fd
movq -0x50(%rbp), %rax
movl 0x10(%rax), %ecx
movl %ecx, 0x8(%rax)
movl 0x14(%rax), %ecx
movl %ecx, 0xc(%rax)
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax)