// File: /workspace/github_c_makefile_star2_O1/tylerneylon[P]APIsWithLua/ch4/eatyguy8.c
// Function: main
int main() {

  start();

  // Create a Lua state and load the module.
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);

  // Set up API functions written in C.
  lua_register(L, "timestamp", timestamp);
  luaopen_Pair(L);
  lua_setglobal(L, "Pair");

  // Set up API functions written in Lua.
  luaL_dofile(L, "util.lua");
  luaL_dofile(L, "Character.lua");
  lua_setglobal(L, "Character");

  // Load eatyguy8 and run the init() function.
  luaL_dofile(L, "eatyguy8.lua");
  lua_setglobal(L, "eatyguy");
  lua_settop(L, 0);

  lua_getglobal(L, "eatyguy");
  lua_getfield(L, -1, "init");  // -1 means stack top.
  lua_call(L, 0, 0);            // 0, 0 = #args, #retvals

  lua_getglobal(L, "eatyguy");
  while (1) {
    int is_end_of_seq;
    int key = getkey(&is_end_of_seq);
    if (key == ESC_KEY || key == 'q' || key == 'Q') done();

    // Call eatyguy.loop(state).
    lua_getfield(L, -1, "loop");
    push_state_table(L, key, is_end_of_seq);
    lua_call(L, 1, 0);

    sleephires(0.016);  // Sleep for 16ms.
  }

  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
callq 0x5900
callq 0x153c6
movq %rax, %rbx
movq %rax, %rdi
callq 0x155c8
leaq -0x76(%rip), %rsi       # 0x5a1a
movq %rbx, %rdi
xorl %edx, %edx
callq 0x6591
leaq 0x1b5e2(%rip), %rsi     # 0x21083
movq %rbx, %rdi
callq 0x69c7
movq %rbx, %rdi
callq 0x20d04
leaq 0x1b5d5(%rip), %rsi     # 0x2108d
movq %rbx, %rdi
callq 0x69c7
leaq 0x1b5cb(%rip), %rsi     # 0x21092
movq %rbx, %rdi
xorl %edx, %edx
callq 0x14b39
testl %eax, %eax
jne 0x5aec
movq %rbx, %rdi
xorl %esi, %esi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
xorl %ecx, %ecx
xorl %r8d, %r8d
xorl %r9d, %r9d
callq 0x6e8a
leaq 0x1b5a8(%rip), %rsi     # 0x2109b
movq %rbx, %rdi
xorl %edx, %edx
callq 0x14b39
testl %eax, %eax
jne 0x5b18
movq %rbx, %rdi
xorl %esi, %esi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
xorl %ecx, %ecx
xorl %r8d, %r8d
xorl %r9d, %r9d
callq 0x6e8a
leaq 0x1b58a(%rip), %rsi     # 0x210a9
movq %rbx, %rdi
callq 0x69c7
leaq 0x1b585(%rip), %rsi     # 0x210b3
movq %rbx, %rdi
xorl %edx, %edx
callq 0x14b39
testl %eax, %eax
jne 0x5b53
movq %rbx, %rdi
xorl %esi, %esi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
xorl %ecx, %ecx
xorl %r8d, %r8d
xorl %r9d, %r9d
callq 0x6e8a
leaq 0x1b566(%rip), %r14     # 0x210c0
movq %rbx, %rdi
movq %r14, %rsi
callq 0x69c7
movq %rbx, %rdi
xorl %esi, %esi
callq 0x5d51
movq %rbx, %rdi
movq %r14, %rsi
callq 0x6660
leaq 0x1b547(%rip), %rdx     # 0x210c8
movq %rbx, %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x6777
movq %rbx, %rdi
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x6e22
movq %rbx, %rdi
movq %r14, %rsi
callq 0x6660
leaq -0x2c(%rbp), %r14
leaq 0x1bf5f(%rip), %r15     # 0x21b14
leaq -0x40(%rbp), %r12
movq %r14, %rdi
callq 0x5811
cmpl $0x1b, %eax
je 0x5c22
movl %eax, %r13d
cmpl $0x71, %eax
je 0x5c22
cmpl $0x51, %r13d
je 0x5c22
movq %rbx, %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
movq %r15, %rdx
callq 0x6777
movl -0x2c(%rbp), %edx
movq %rbx, %rdi
movl %r13d, %esi
callq 0x598e
movq %rbx, %rdi
movl $0x1, %esi
xorl %edx, %edx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x6e22
movq $0x0, -0x40(%rbp)
movq $0xf42400, -0x38(%rbp)  # imm = 0xF42400
movq %r12, %rdi
xorl %esi, %esi
callq 0x51a0
jmp 0x5bb9
callq 0x5935
nop