// File: /workspace/github_c_makefile_star2_O0/skeeto[P]goblin-com/src/game.c
// Function: invader_step
static void
invader_step(game_t *game, invader_t *i)
{
    uint16_t base = invader_base(game, i);
    uint16_t building = invader_building(game, i);
    uint16_t target_base = map_base(game->map, i->tx, i->ty);
    uint16_t target_building = map_building(game->map, i->tx, i->ty);
    if (i->embarked || game->population >= GAME_WIN_POP) {
        if (IS_WATER(base)) {
            i->tx = CASTLE_X;
            i->ty = CASTLE_Y;
        } else {
            i->embarked = false;
            invader_find_target(game, i);
        }
    } else if (IS_WATER(target_base)) {
        invader_find_target(game, i);
    }
    if (building != C_NONE) {
        if (++i->rampage_time > INVADER_RAMPAGE_END) {
            i->rampage_time = 0;
            game_unbuild(game, i->x, i->y); // destroy
        }
    } else {
        /* Pursue */
        i->rampage_time = 0;
        float dx = i->tx - i->x;
        float dy = i->ty - i->y;
        float d = sqrt(dx * dx + dy * dy);
        if (d < 0.1) {
            if (target_building != C_NONE) {
                i->x = i->tx;
                i->y = i->ty;
            } else {
                invader_find_target(game, i);
            }
        } else {
            float speed = INVADER_SPEED;
            if (base == BASE_MOUNTAIN)
                speed *= 0.5;
            else if (IS_WATER(base))
                speed *= 1.5;
            if (game->population >= GAME_WIN_POP)
                speed *= -1; // run away
            i->x += (speed / (float)DAY) * dx / d;
            i->y += (speed / (float)DAY) * dy / d;
        }
    }
    i->embarked = IS_WATER(base);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x8190
movw %ax, -0x12(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x81d0
movw %ax, -0x14(%rbp)
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x10(%rbp), %rax
cvttss2si 0xc(%rax), %esi
movq -0x10(%rbp), %rax
cvttss2si 0x10(%rax), %edx
callq 0x6270
movw %ax, -0x16(%rbp)
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x10(%rbp), %rax
cvttss2si 0xc(%rax), %esi
movq -0x10(%rbp), %rax
cvttss2si 0x10(%rax), %edx
callq 0x6310
movw %ax, -0x18(%rbp)
movq -0x10(%rbp), %rax
testb $0x1, 0x20(%rax)
jne 0x7b99
movq -0x8(%rbp), %rax
movsd 0x30(%rax), %xmm0
movsd 0x1e85(%rip), %xmm1     # 0x9a18
ucomisd %xmm1, %xmm0
jb 0x7be8
movzwl -0x12(%rbp), %eax
cmpl $0x20, %eax
je 0x7bad
movzwl -0x12(%rbp), %eax
cmpl $0x2248, %eax           # imm = 0x2248
jne 0x7bd1
movq -0x10(%rbp), %rax
movss 0x1dfb(%rip), %xmm0     # 0x99b4
movss %xmm0, 0xc(%rax)
movq -0x10(%rbp), %rax
movss 0x1de6(%rip), %xmm0     # 0x99b0
movss %xmm0, 0x10(%rax)
jmp 0x7be6
movq -0x10(%rbp), %rax
movb $0x0, 0x20(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x8210
jmp 0x7c0b
movzwl -0x16(%rbp), %eax
cmpl $0x20, %eax
je 0x7bfc
movzwl -0x16(%rbp), %eax
cmpl $0x2248, %eax           # imm = 0x2248
jne 0x7c09
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x8210
jmp 0x7c0b
movzwl -0x14(%rbp), %eax
cmpl $0x0, %eax
je 0x7c63
movq -0x10(%rbp), %rcx
movq 0x18(%rcx), %rax
addq $0x1, %rax
movq %rax, 0x18(%rcx)
cvtsi2sd %rax, %xmm0
movsd 0x1dcf(%rip), %xmm1     # 0x9a00
ucomisd %xmm1, %xmm0
jbe 0x7c5e
movq -0x10(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
cvttss2si 0x4(%rax), %esi
movq -0x10(%rbp), %rax
cvttss2si 0x8(%rax), %edx
callq 0x6d40
jmp 0x7e0c
movq -0x10(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x10(%rbp), %rax
movss 0xc(%rax), %xmm0
movq -0x10(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x1c(%rbp)
movq -0x10(%rbp), %rax
movss 0x10(%rax), %xmm0
movq -0x10(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x20(%rbp)
movss -0x1c(%rbp), %xmm0
movss -0x1c(%rbp), %xmm2
movss -0x20(%rbp), %xmm1
mulss -0x20(%rbp), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
cvtss2sd %xmm0, %xmm0
callq 0x1270
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x24(%rbp)
movss -0x24(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x1d2c(%rip), %xmm0     # 0x9a08
ucomisd %xmm1, %xmm0
jbe 0x7d23
movzwl -0x18(%rbp), %eax
cmpl $0x0, %eax
je 0x7d11
movq -0x10(%rbp), %rax
movss 0xc(%rax), %xmm0
movq -0x10(%rbp), %rax
movss %xmm0, 0x4(%rax)
movq -0x10(%rbp), %rax
movss 0x10(%rax), %xmm0
movq -0x10(%rbp), %rax
movss %xmm0, 0x8(%rax)
jmp 0x7d1e
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x8210
jmp 0x7e0a
movss 0x1c99(%rip), %xmm0     # 0x99c4
movss %xmm0, -0x28(%rbp)
movzwl -0x12(%rbp), %eax
cmpl $0x25b2, %eax           # imm = 0x25B2
jne 0x7d5b
movss -0x28(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x1ba4(%rip), %xmm1     # 0x98f0
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x28(%rbp)
jmp 0x7d8f
movzwl -0x12(%rbp), %eax
cmpl $0x20, %eax
je 0x7d6f
movzwl -0x12(%rbp), %eax
cmpl $0x2248, %eax           # imm = 0x2248
jne 0x7d8d
movss -0x28(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x1ca0(%rip), %xmm1     # 0x9a20
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x28(%rbp)
jmp 0x7d8f
movq -0x8(%rbp), %rax
movsd 0x30(%rax), %xmm0
movsd 0x1c78(%rip), %xmm1     # 0x9a18
ucomisd %xmm1, %xmm0
jb 0x7db8
movss 0x1ba2(%rip), %xmm0     # 0x9950
mulss -0x28(%rbp), %xmm0
movss %xmm0, -0x28(%rbp)
movss -0x28(%rbp), %xmm0
movss 0x1bf7(%rip), %xmm1     # 0x99bc
divss %xmm1, %xmm0
mulss -0x1c(%rbp), %xmm0
divss -0x24(%rbp), %xmm0
movq -0x10(%rbp), %rax
addss 0x4(%rax), %xmm0
movss %xmm0, 0x4(%rax)
movss -0x28(%rbp), %xmm0
movss 0x1bce(%rip), %xmm1     # 0x99bc
divss %xmm1, %xmm0
mulss -0x20(%rbp), %xmm0
divss -0x24(%rbp), %xmm0
movq -0x10(%rbp), %rax
addss 0x8(%rax), %xmm0
movss %xmm0, 0x8(%rax)
jmp 0x7e0c
movzwl -0x12(%rbp), %ecx
movb $0x1, %al
cmpl $0x20, %ecx
movb %al, -0x29(%rbp)
je 0x7e29
movzwl -0x12(%rbp), %eax
cmpl $0x2248, %eax           # imm = 0x2248
sete %al
movb %al, -0x29(%rbp)
movb -0x29(%rbp), %cl
movq -0x10(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x20(%rax)
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax)