Advertisement
Guest User

Kart 64 for BizHawk 1.11.1

a guest
Feb 6th, 2016
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 42.86 KB | None | 0 0
  1. --This Lua script was developed by Drew Weatherton for the BizHawk emulator (additional authors: micro500, adelikat)--
  2. --NOTE: Script must be stored in the same directory as EmuHawk.exe for some functions to work-------------------------
  3. --Purpose: Partially automate the process of executing perfect maneuvers in Mario Kart 64-----------------------------
  4. console.clear()
  5.  
  6. local InputQueue = nil
  7. local queueIterator = nil
  8.  
  9. --User has clicked the "Generate Input" button
  10. function GenerateButton()
  11.  
  12. --Variables, from Interface:
  13.     Direction = forms.gettext(DirectionDropdown)
  14.     Maneuver = forms.gettext(ManeuverDropdown)
  15.     BlankLeadingFrames = tonumber(forms.gettext(TextBoxBlankLeadingFrames))
  16.  
  17.     --Input Catalog Logic-----------------------------------------------------------------
  18.     --NOTE: We use the bk2 N64 movie mnemonic format (|..|    0,    0,...........A......|)
  19.     --|rP| -XXX, -YYY,UDLRUDLRSZBAudrllr|
  20.     --|rP| -XXX, -YYY,
  21.     --      (+ analog)UDLR
  22.     --             (D-pad)UDLR
  23.     --                        SZBA
  24.     --                 (C buttons)udrl
  25.     --                      (Shoulder)lr|
  26.  
  27.     --Add an array to store inputs in
  28.     FramesQueue = {}
  29.  
  30.     -- Add any desired blank frames to the start
  31.     local i = 0
  32.  
  33.     while i < tonumber(forms.gettext(TextBoxBlankLeadingFrames)) do
  34.         FramesQueue[#FramesQueue+1] = "|..|    0,    0,...........A......|"
  35.         i = i + 1
  36.     end
  37.  
  38.     -- Add specific maneuver inputs
  39.     if Direction == "1.Right" then
  40.  
  41.         if Maneuver == "1.Outward MT (fastest)" then
  42.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  43.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  44.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  45.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  46.             FramesQueue[#FramesQueue+1] = "|..|  -35,    0,...........A.....r|"
  47.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  48.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  49.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  50.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  51.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  52.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  53.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  54.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  55.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  56.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  57.             FramesQueue[#FramesQueue+1] = "|..|   39,    0,...........A.....r|"
  58.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  59.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  60.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  61.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  62.             FramesQueue[#FramesQueue+1] = "|..|   39,    0,...........A.....r|"
  63.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  64.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  65.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  66.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  67.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  68.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  69.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  70.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  71.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  72.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  73.             FramesQueue[#FramesQueue+1] = "|..|   63,    0,...........A......|"
  74.  
  75.         elseif Maneuver == "2.Straight MT (faster)" then
  76.             FramesQueue[#FramesQueue+1] = "|..|   62,    0,...........A.....r|"
  77.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  78.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  79.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  80.             FramesQueue[#FramesQueue+1] = "|..|  -35,    0,...........A.....r|"
  81.             FramesQueue[#FramesQueue+1] = "|..|   64,    0,...........A.....r|"
  82.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  83.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  84.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  85.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  86.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  87.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  88.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  89.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  90.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  91.             FramesQueue[#FramesQueue+1] = "|..|   39,    0,...........A.....r|"
  92.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  93.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  94.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  95.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  96.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  97.             FramesQueue[#FramesQueue+1] = "|..|  -56,    0,...........A......|"
  98.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  99.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  100.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  101.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  102.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  103.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  104.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  105.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  106.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  107.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  108.             FramesQueue[#FramesQueue+1] = "|..|   61,    0,...........A......|"
  109.  
  110.         elseif Maneuver == "3.Inward MT (fast)" then
  111.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  112.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  113.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  114.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  115.             FramesQueue[#FramesQueue+1] = "|..|   20,    0,...........A.....r|"
  116.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  117.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  118.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  119.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  120.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  121.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  122.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  123.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  124.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  125.             FramesQueue[#FramesQueue+1] = "|..|  -60,    0,...........A.....r|"
  126.             FramesQueue[#FramesQueue+1] = "|..|   39,    0,...........A.....r|"
  127.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  128.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  129.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  130.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  131.             FramesQueue[#FramesQueue+1] = "|..|   40,    0,...........A.....r|"
  132.             FramesQueue[#FramesQueue+1] = "|..|  -55,    0,...........A......|"
  133.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  134.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  135.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  136.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  137.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  138.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  139.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  140.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  141.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  142.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  143.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  144.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  145.  
  146.         elseif Maneuver == "4.Classic MT (reliable)" then
  147.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  148.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  149.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  150.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  151.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  152.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  153.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  154.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  155.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  156.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  157.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  158.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  159.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  160.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  161.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  162.             FramesQueue[#FramesQueue+1] = "|..|   39,    0,...........A.....r|"
  163.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  164.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  165.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  166.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  167.             FramesQueue[#FramesQueue+1] = "|..|   39,    0,...........A.....r|"
  168.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  169.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  170.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  171.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  172.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  173.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  174.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  175.             FramesQueue[#FramesQueue+1] = "|..|  -40,    0,...........A......|"
  176.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  177.         elseif Maneuver == "5.Shroom Slide" then
  178.  
  179.             OuterFramesPer = tonumber(forms.gettext(TextBoxOuterFramesPer))
  180.             InnerMagnitude = tonumber(forms.gettext(TextBoxInnerMagnitude))
  181.             TotalShroomSlideFrames = tonumber(forms.gettext(TextBoxTotalShroomSlideFrames))
  182.  
  183.             local i = 0
  184.             while i <= TotalShroomSlideFrames do
  185.                 local j = 0
  186.                 while j < OuterFramesPer do
  187.                     FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  188.                     j = j + 1
  189.                     i = i +1
  190.                 end
  191.  
  192.                 FramesQueue[#FramesQueue+1] = "|..|   ".. InnerMagnitude ..",    0,...........A.....r|"
  193.                 i = i +1
  194.             end
  195.         end
  196.  
  197.     elseif Direction == "2.Left" then
  198.             if Maneuver == "1.Outward MT (fastest)" then
  199.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  200.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  201.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  202.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  203.             FramesQueue[#FramesQueue+1] = "|..|   35,    0,...........A.....r|"
  204.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  205.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  206.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  207.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  208.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  209.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  210.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  211.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  212.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  213.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  214.             FramesQueue[#FramesQueue+1] = "|..|  -39,    0,...........A.....r|"
  215.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  216.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  217.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  218.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  219.             FramesQueue[#FramesQueue+1] = "|..|  -39,    0,...........A.....r|"
  220.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  221.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  222.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  223.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  224.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  225.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  226.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  227.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  228.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  229.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  230.             FramesQueue[#FramesQueue+1] = "|..|  -63,    0,...........A......|"
  231.  
  232.         elseif Maneuver == "2.Straight MT (faster)" then
  233.             FramesQueue[#FramesQueue+1] = "|..|  -62,    0,...........A.....r|"
  234.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  235.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  236.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  237.             FramesQueue[#FramesQueue+1] = "|..|   35,    0,...........A.....r|"
  238.             FramesQueue[#FramesQueue+1] = "|..|  -64,    0,...........A.....r|"
  239.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  240.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  241.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  242.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  243.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  244.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  245.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  246.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  247.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  248.             FramesQueue[#FramesQueue+1] = "|..|  -39,    0,...........A.....r|"
  249.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  250.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  251.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  252.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  253.             FramesQueue[#FramesQueue+1] = "|..|  -50,    0,...........A.....r|"
  254.             FramesQueue[#FramesQueue+1] = "|..|   56,    0,...........A......|"
  255.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  256.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  257.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  258.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  259.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  260.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  261.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  262.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  263.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  264.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  265.             FramesQueue[#FramesQueue+1] = "|..|  -61,    0,...........A......|"
  266.  
  267.         elseif Maneuver == "3.Inward MT (fast)" then
  268.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  269.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  270.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  271.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  272.             FramesQueue[#FramesQueue+1] = "|..|  -20,    0,...........A.....r|"
  273.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  274.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  275.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  276.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  277.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  278.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  279.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  280.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  281.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  282.             FramesQueue[#FramesQueue+1] = "|..|   60,    0,...........A.....r|"
  283.             FramesQueue[#FramesQueue+1] = "|..|  -39,    0,...........A.....r|"
  284.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  285.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  286.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  287.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  288.             FramesQueue[#FramesQueue+1] = "|..|  -40,    0,...........A.....r|"
  289.             FramesQueue[#FramesQueue+1] = "|..|   55,    0,...........A......|"
  290.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  291.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  292.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  293.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  294.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  295.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  296.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  297.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  298.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  299.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  300.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  301.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  302.  
  303.         elseif Maneuver == "4.Classic MT (reliable)" then
  304.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  305.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  306.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  307.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  308.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  309.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A.....r|"
  310.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  311.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  312.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  313.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  314.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  315.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  316.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  317.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  318.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  319.             FramesQueue[#FramesQueue+1] = "|..|  -39,    0,...........A.....r|"
  320.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  321.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  322.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  323.             FramesQueue[#FramesQueue+1] = "|..|   50,    0,...........A.....r|"
  324.             FramesQueue[#FramesQueue+1] = "|..|  -39,    0,...........A.....r|"
  325.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  326.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  327.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  328.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  329.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  330.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  331.             FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A......|"
  332.             FramesQueue[#FramesQueue+1] = "|..|   40,    0,...........A......|"
  333.             FramesQueue[#FramesQueue+1] = "|..|  -65,    0,...........A......|"
  334.  
  335.         elseif Maneuver == "5.Shroom Slide" then
  336.  
  337.             OuterFramesPer = tonumber(forms.gettext(TextBoxOuterFramesPer))
  338.             InnerMagnitude = tonumber(forms.gettext(TextBoxInnerMagnitude))
  339.             TotalShroomSlideFrames = tonumber(forms.gettext(TextBoxTotalShroomSlideFrames))
  340.  
  341.             local i = 0
  342.             while i <= TotalShroomSlideFrames do
  343.                 local j = 0
  344.                 while j < OuterFramesPer do
  345.                     FramesQueue[#FramesQueue+1] = "|..|   65,    0,...........A.....r|"
  346.                     j = j + 1
  347.                     i = i +1
  348.                 end
  349.  
  350.                 FramesQueue[#FramesQueue+1] = "|..|  -".. InnerMagnitude ..",    0,...........A.....r|"
  351.                 i = i +1
  352.             end
  353.         end
  354.     end
  355.  
  356.     -- Append any desired blank frames to the end
  357.     local i = 0
  358.  
  359.     while i < tonumber(forms.gettext(TextBoxBlankTrailingFrames)) do
  360.         FramesQueue[#FramesQueue+1] = "|..|    0,    0,...........A......|"
  361.         i = i + 1
  362.     end
  363.  
  364.     -- Convert the FramesQueue table
  365.     local i = 1
  366.     local tableStr = ""
  367.     while i <= #FramesQueue do
  368.         if (i > 1) then
  369.             tableStr = tableStr .. "\r\n"
  370.         end
  371.         tableStr = tableStr .. FramesQueue[i]
  372.         i = i +1
  373.     end
  374.     -- Verify output to the console
  375.     -- console.log(tableStr)
  376.     -- Output to the Main Window
  377.     forms.settext(GeneratedTextBox, tableStr)
  378. end
  379.  
  380. --User has clicked the "Execute Input" button
  381. function ExecuteButton()
  382.     TextBoxContents = forms.gettext(InputQueueTextBox)
  383.  
  384.     local handle = io.open("MarioKart64_AutoTransmission_InputQueueArchive.txt", "a+")
  385.     handle:write("\r\n" .. "\r\n" .. os.date("%c") .. "\r\n" .. TextBoxContents)
  386.     handle:close()
  387.  
  388.  
  389.     InputQueue = bizstring.split(TextBoxContents, "\r\n")
  390.     if (emu.islagged()) then
  391.       queueIterator = -1
  392.     else
  393.       queueIterator = 0
  394.     end
  395.     forms.setproperty(ExecuteButtonHandle, "Enabled", false)
  396.     forms.setproperty(RecordButtonHandle, "Enabled", false)
  397.     forms.setproperty(ExecuteItemBotButtonHandle, "Enabled", false)
  398. end
  399.  
  400. --User has clicked the "HUD Options" button
  401. function HudButton()
  402.     MainWindow = forms.newform(225, 100, "HUD Options")
  403.  
  404.  
  405.     --HUD Customizations
  406.     forms.label(MainWindow, "HUD Settings:  (check to exclude)", 10, 6, 240, 18)
  407.     CheckboxHUD_LapPosition = forms.checkbox(MainWindow, "Lap / Position", 10, 21)
  408.     CheckboxHUD_Coordinates = forms.checkbox(MainWindow, "Coordinates", 10, 40)
  409.     CheckboxHUD_Time = forms.checkbox(MainWindow, "Time", 120, 21)
  410.     CheckboxHUD_SpeedState = forms.checkbox(MainWindow, "Speed / State", 120, 40)
  411. end
  412.  
  413. --Generate the User Interface
  414. ------------INPUTS ARE X,Y,WIDTH,HEIGHT  -- For Text Boxes: WIDTH, HEIGHT, "signed", X, Y-------
  415. MainWindow = forms.newform(655, 800, "Mario Kart 64 Automatic Transmission v1.00")
  416.  
  417. -- Blank frames
  418. forms.label(MainWindow, "Blank leading frames", 28, 8, 105, 18)
  419. TextBoxBlankLeadingFrames = forms.textbox(MainWindow, "0", 20, 18, "UNSIGNED", 10, 5)
  420.  
  421. forms.label(MainWindow, "Blank trailing frames", 158, 8, 105, 18)
  422. TextBoxBlankTrailingFrames = forms.textbox(MainWindow, "0", 20, 18, "UNSIGNED", 140, 5)
  423.  
  424. --Direction dropdown
  425. LabelDirection = forms.label(MainWindow, "facing", 67, 31, 40, 20)
  426. a = { }
  427. a[0] = "1.Right"
  428. a[1] = "2.Left"
  429. DirectionDropdown = forms.dropdown(MainWindow, a, 10, 28, 57, 20)
  430.  
  431. --Maneuver dropdown
  432. a = { }
  433. a[0] = "1.Outward MT (fastest)"
  434. a[1] = "2.Straight MT (faster)"
  435. a[2] = "3.Inward MT (fast)"
  436. a[3] = "4.Classic MT (reliable)"
  437. a[4] = "5.Shroom Slide"
  438. ManeuverDropdown = forms.dropdown(MainWindow, a, 110, 28, 131, 20)
  439.  
  440. --Shroomslide options
  441. forms.label(MainWindow, "(Shroom slide parameters:", 5, 57, 130, 18)
  442.  
  443. forms.label(MainWindow, "Total frames", 28, 80, 65, 18)
  444. TextBoxTotalShroomSlideFrames = forms.textbox(MainWindow, "60", 20, 18, "UNSIGNED", 10, 78)
  445.  
  446. forms.label(MainWindow, "Inner", 122, 74, 40, 14)
  447. forms.label(MainWindow, "magnitude", 116, 85, 60, 14)
  448. TextBoxInnerMagnitude = forms.textbox(MainWindow, "32", 20, 18, "UNSIGNED", 96, 78)
  449.  
  450. forms.label(MainWindow, "Outer frames", 197, 74, 67, 14)
  451. forms.label(MainWindow, "per inner frame", 202, 85, 60, 14)
  452. forms.label(MainWindow, ")", 261, 79, 8, 14)
  453. TextBoxOuterFramesPer = forms.textbox(MainWindow, "1", 20, 18, "UNSIGNED", 175, 78)
  454.  
  455. --Create Input
  456. GenerateButtonHandle = forms.button(MainWindow, "Generate Input", GenerateButton, 10, 110, 86, 23)
  457.  
  458. --Multi-Line Textbox for Generating Input
  459. forms.label(MainWindow, "INPUT CATALOG", 96, 120, 93, 15)
  460. GeneratedTextBox = forms.textbox(MainWindow, "|..|    0,    0,...........A......|", 255, 565, "", 10, 135, true, true)
  461. forms.setproperty(GeneratedTextBox, "MaxLength", "1000000000")
  462.  
  463.  
  464. --HUD window creation WORKINGHERE
  465. HUDButtonHandle = forms.button(MainWindow, "HUD Options", HudButton, 189, 721, 86, 23)
  466.  
  467. --Textbox for Frame Reference
  468. forms.label(MainWindow, "Frame v", 281, 30, 45, 13)
  469. FrameReferenceTextBox = forms.textbox(MainWindow, "12345", 50, 712, "", 280, 44, true, true)
  470.  
  471. --Populate the Frame Reference Table
  472. function PopulateFrameReference()
  473.     local i = 2
  474.     local LoadFramecount = emu.framecount()
  475.     local FramecountList
  476.  
  477.     FramecountList = LoadFramecount
  478.    
  479.     while i <= 98 do
  480.         FramecountList = FramecountList .. "\r\n" .. LoadFramecount + i
  481.         i = i + 2
  482.     end
  483.  
  484.     forms.settext(FrameReferenceTextBox, FramecountList)
  485. end
  486.  
  487. event.onloadstate(PopulateFrameReference)
  488.  
  489. --Item selection dropdown
  490. itemOptions = { }
  491. itemOptions[0] = "01. Banana"
  492. itemOptions[1] = "02. Banana Bunch"
  493. itemOptions[2] = "03. Green Shell"
  494. itemOptions[3] = "04. Triple Green Shell"
  495. itemOptions[4] = "05. Red Shell"
  496. itemOptions[5] = "06. Triple Red Shell"
  497. itemOptions[6] = "07. Spiny Shell"
  498. itemOptions[7] = "08. Thunder Bolt"
  499. itemOptions[8] = "09. Fake Item Box"
  500. itemOptions[9] = "10. Super Star"
  501. itemOptions[10] = "11. Boo"
  502. itemOptions[11] = "12. Mushroom"
  503. itemOptions[13] = "14. Triple Mushrooms"
  504. itemOptions[14] = "15. Super Mushroom"
  505. ItemSelectionDropdown = forms.dropdown(MainWindow, itemOptions, 468, 2, 120, 20)
  506.  
  507. BooModeCheckbox = forms.checkbox(MainWindow, "Boo Mode", 398,0)
  508.  
  509. --Multi-Line Textbox for Input Queue
  510. forms.label(MainWindow, "INPUT QUEUE", 305, 9, 150, 15)
  511. forms.label(MainWindow, "<-Format", 582, 26, 60, 18)
  512. forms.textbox(MainWindow, "|rP| -XXX, -YYY,UDLRUDLRSZBAudrllr|", 255, 20, "", 328, 24, true, true)
  513. InputQueueTextBox = forms.textbox(MainWindow, "|..|    0,    0,...........A......|", 255, 712, "", 328, 44, true, true)
  514. forms.setproperty(InputQueueTextBox, "MaxLength", "1000000000")
  515.  
  516. --Execute Input
  517. ExecuteButtonHandle = forms.button(MainWindow, "Execute Input", ExecuteButton, 585, 44, 55, 712)
  518.  
  519. RecordButtonHandle = nil
  520.  
  521. RecordState = 0
  522.  
  523. function RecordButton()
  524.   if (RecordState == 0) then
  525.     forms.setproperty(ExecuteButtonHandle, "Enabled", false)
  526.     forms.setproperty(ExecuteItemBotButtonHandle, "Enabled", false)
  527.    
  528.     -- Clear the queue
  529.     forms.settext(GeneratedTextBox, "")
  530.    
  531.     -- set flag to indicate in record mode
  532.     RecordState = 1
  533.    
  534.     forms.settext(RecordButtonHandle, "Stop Recording")
  535.   else
  536.     forms.setproperty(ExecuteButtonHandle, "Enabled", true)
  537.     forms.setproperty(ExecuteItemBotButtonHandle, "Enabled", true)
  538.  
  539.     RecordState = 0
  540.  
  541.     forms.settext(RecordButtonHandle, "Record Input")
  542.   end
  543. end
  544.  
  545. RecordButtonHandle = forms.button(MainWindow, "Record Input", RecordButton, 189, 110, 77, 23)
  546.  
  547. function ClearQueue()
  548.     InputQueue = nil
  549.     queueIterator = nil
  550.     forms.setproperty(ExecuteButtonHandle, "Enabled", true)
  551.     forms.setproperty(RecordButtonHandle, "Enabled", true)
  552.     forms.setproperty(ExecuteItemBotButtonHandle, "Enabled", true)
  553. end
  554.  
  555. function CopyInputButton()
  556.     forms.settext(InputQueueTextBox, forms.gettext(GeneratedTextBox))
  557. end
  558.  
  559. CopyInputHandle = forms.button(MainWindow, ">", CopyInputButton, 258, 150, 30, 23)
  560.  
  561. function AppendInputButton()
  562.     forms.settext(InputQueueTextBox, forms.gettext(InputQueueTextBox) .. "\r\n" .. forms.gettext(GeneratedTextBox))
  563. end
  564.  
  565. AppendInputHandle = forms.button(MainWindow, ">>", AppendInputButton, 258, 200, 30, 23)
  566.  
  567. -- Bot variables
  568.  
  569. -- Item bot States:
  570. -- -1: not active
  571. -- 0: searching for first chance to hit Z
  572. -- 1: about to press Z
  573. -- 2: Waiting to see what item we got
  574. -- 3: advancing one input frame past the last time we tried
  575. -- 4. Successful cleanup
  576.  
  577. ItemBotState = -1
  578.  
  579. ItemBotIteratorSave = -1
  580.  
  581. ItemBotWantedItem = -1
  582.  
  583. ExecuteItemBotButtonHandle = nil
  584.  
  585. function ExecuteItemBotButton()
  586.     if (ItemBotState ~= -1) then
  587.         -- disable the bot
  588.         ItemBotState = -1
  589.         ClearQueue()
  590.  
  591.         -- Change the button text to something
  592.         forms.settext(ExecuteItemBotButtonHandle, "Item Bot")
  593.     else
  594.         -- Set up the input queue
  595.         ExecuteButton()
  596.  
  597.         -- Make both buttons disabled
  598.         forms.setproperty(ExecuteButtonHandle, "Enabled", false)
  599.        
  600.         -- Make a starting state
  601.         savestate.save("ItemBotStartingState")
  602.        
  603.         -- Find the desired item
  604.         itemSelection = forms.gettext(ItemSelectionDropdown)
  605.         local i = 0
  606.         while (i < 15) do
  607.             if (itemOptions[i] == itemSelection) then
  608.                 ItemBotWantedItem = i + 1
  609.             end
  610.             i = i + 1
  611.         end
  612.  
  613.         forms.setproperty(ExecuteItemBotButtonHandle, "Enabled", true)
  614.         forms.settext(ExecuteItemBotButtonHandle, "Stop Bot")
  615.        
  616.         ItemBotState = 0
  617.     end
  618. end
  619.  
  620. --Item Select Bot Execute
  621. ExecuteItemBotButtonHandle = forms.button(MainWindow, "Item Bot", ExecuteItemBotButton, 585, 1, 55, 23)
  622.  
  623. function load_state_handler()
  624.     if (ItemBotState == -1) then
  625.         ClearQueue()
  626.     end
  627.    
  628.     if (RecordState == 1) then
  629.       forms.setproperty(ExecuteButtonHandle, "Enabled", true)
  630.       forms.setproperty(ExecuteItemBotButtonHandle, "Enabled", true)
  631.    
  632.       RecordState = 0
  633.    
  634.       forms.settext(RecordButtonHandle, "Record Input")
  635.     end
  636. end
  637.  
  638. loadstateEventHandle = event.onloadstate(load_state_handler, "load_state_handler")
  639.  
  640. while true do
  641.  
  642.     --NOTE: I was having an error from the HUD Options check boxes and have commented out that functionality for now
  643.     --if forms.ischecked(CheckboxHUD_Time) == false then
  644.         local TimerAddr = 0x0DC598
  645.  
  646.         Timer=mainmemory.readfloat(TimerAddr, true)
  647.         gui.text(0,0, "TIME ".. string.format("%.3f", Timer),0x50000000,"orange","topright")
  648.     --end
  649.  
  650.     --if forms.ischecked(CheckboxHUD_LapPosition) == false then
  651.         local LapAddr = 0x164390
  652.         local PathAddr = 0x163288
  653.         local PlaceAddr = 0x18CF99
  654.  
  655.         Lap=mainmemory.read_s32_be(LapAddr) + 1
  656.         Path=mainmemory.read_s32_be(PathAddr)
  657.         Place=mainmemory.read_u8(PlaceAddr) + 1
  658.         gui.text(client.borderwidth()+client.bufferwidth()*.25,0, "LAP ".. Lap .. "/3, Path " .. Path .. ", Place " .. Place .. "/8",0x50000000,"purple")
  659.     --end
  660.  
  661.     --if forms.ischecked(CheckboxHUD_Coordinates) == false then
  662.         local Xaddr = 0x0F69A4
  663.         local XvAddr = 0x0F69C4
  664.         local Yaddr = 0x0F69AC
  665.         local YvAddr = 0x0F69CC
  666.         local Zaddr = 0xF69A8
  667.         local ZvAddr = 0x0F69C8
  668.         local ZgroundAddr = 0x0F6A04
  669.  
  670.  
  671.         PlayerX=mainmemory.readfloat(Xaddr, true)
  672.         gui.text(0,17, "X ".. string.format("%.3f", PlayerX),"black","white","bottomleft")
  673.         PlayerXv=mainmemory.readfloat(XvAddr, true) * 12
  674.         gui.text(0,2, "Xv ".. string.format("%.3f", PlayerXv),"black","white","bottomleft")
  675.  
  676.         PlayerY=mainmemory.readfloat(Yaddr, true)
  677.         gui.text(120,17, "Y ".. string.format("%.3f", PlayerY),"black","white","bottomleft")
  678.         PlayerYv=mainmemory.readfloat(YvAddr, true) * 12
  679.         gui.text(120,2, "Yv ".. string.format("%.3f", PlayerYv),"black","white","bottomleft")
  680.  
  681.         PlayerZ=mainmemory.readfloat(Zaddr, true)
  682.         gui.text(240,17, "Z ".. string.format("%.3f", PlayerZ),"black","white","bottomleft")
  683.         PlayerZv=mainmemory.readfloat(ZvAddr, true) * 12
  684.         gui.text(240,2, "Zv ".. string.format("%.3f", PlayerZv),"black","white","bottomleft")
  685.  
  686.         gui.text(360,2, "XYZv " .. string.format("%.3f", math.sqrt (PlayerXv^2+PlayerYv^2+PlayerZv^2)) .. " km/h","black","white","bottomleft")
  687.  
  688.         GroundHeight=mainmemory.readfloat(ZgroundAddr, true)
  689.         PlayerHeight=mainmemory.readfloat(Zaddr, true)
  690.         PlayerAGL=(PlayerHeight-GroundHeight-5.317)
  691.         gui.text(360,17, "Z[AGL] " .. string.format("%.2f", PlayerAGL),"black","white","bottomleft")
  692.  
  693.         --Rivals
  694.         local Rival1Addr = 0x163349
  695.         local Rival2Addr = 0x16334B
  696.  
  697.         characters = {
  698.             "Mario","Luigi","Yoshi","Toad","DK","Wario","Peach","Bowser"
  699.         }
  700.    
  701.         Rival1=mainmemory.read_u8(Rival1Addr)
  702.         Rival2=mainmemory.read_u8(Rival2Addr)
  703.  
  704.         gui.text(536,17, "R1: " .. characters[Rival1+1],"black","yellow","bottomleft")
  705.         gui.text(536,2, "R2: " .. characters[Rival2+1],"black","yellow","bottomleft")
  706.    
  707.     --end
  708.  
  709.     --if forms.ischecked(CheckboxHUD_SpeedState) == false then
  710.  
  711.         local MTglideAddr = 0x0F6BCB
  712.  
  713.         MTglide=mainmemory.read_u8(MTglideAddr)
  714.         if MTglide > 0 then
  715.             gui.text(client.screenwidth()*.5-30,client.screenheight()*.5 - 30, "MT " .. 31 - MTglide,"","red")
  716.         end
  717.  
  718.         local StateEAddr = 0x0F6A4E
  719.         StateE=mainmemory.read_u8(StateEAddr)
  720.  
  721.         if bit.check(StateE,5) then
  722.             gui.text(client.screenwidth()*.5-50,client.screenheight()*.5 - 15, "SHROOMING","","red")
  723.         end
  724.  
  725.         --This speed address is what actually feeds the speedometer but it is only the XY velocity and also stops reporting after a race ends
  726.         --local SpeedAddr = 0x18CFE4
  727.         --Speed=mainmemory.readfloat(SpeedAddr, true)
  728.         --I chose to calculate the velocity based on the XY velocity rather than reading the speedometer memory value
  729.  
  730.         gui.text(client.screenwidth()*.5-60,client.screenheight()*.5, string.format("%.3f", math.sqrt (PlayerXv^2+PlayerYv^2)) .. " km/h","black","white")
  731.        
  732.         local StateFAddr = 0x0F6A4F
  733.         StateF=mainmemory.read_u8(StateFAddr)
  734.  
  735.         if bit.check(StateF,5) then
  736.             gui.text(client.screenwidth()*.5-60,client.screenheight()*.5 + 15, "AB SPINNING","","red")
  737.         end
  738.  
  739.         if bit.check(StateF,3) then
  740.             gui.text(client.screenwidth()*.5-55,client.screenheight()*.5 + 30, "OFF GROUND","","red")
  741.         end
  742.     --end
  743.    
  744.     -- Detect if this is a lag frame
  745.     isLag = emu.islagged()
  746.    
  747.     if (RecordState == 1) then
  748.       if (isLag == false) then
  749.         forms.settext(GeneratedTextBox, forms.gettext(GeneratedTextBox) .. movie.getinputasmnemonic(emu.framecount()-1) .. "\r\n")
  750.       end
  751.     elseif (InputQueue ~= nil) then
  752.         if (isLag == false) then
  753.             queueIterator = queueIterator + 1
  754.             if (ItemBotState == 1) then
  755.                 -- Change state to detection mode
  756.                 ItemBotState = 2
  757.             end
  758.            
  759.             if (ItemBotState == 3) then
  760.                -- Save the state
  761.                savestate.save("ItemBotIterator")
  762.                
  763.                -- Save the iterator
  764.                ItemBotIteratorSave = queueIterator
  765.                
  766.                -- Switch to hitting state
  767.                ItemBotState = 1
  768.             end
  769.             --console.log("Non-lag frame, incrementing index")
  770.         else
  771.             --console.log("lag frame, keeping previous index")
  772.         end
  773.        
  774.         -- If looking for the first chance to press z, check now
  775.         if (ItemBotState == 0) then
  776.             -- Read the delay timer value
  777.             local delayTimerAddr = 0x165F07
  778.             z_delay_timer = memory.read_u8(delayTimerAddr)
  779.            
  780.             -- Found it, switch states
  781.             if (((z_delay_timer == 0 or z_delay_timer == 1) and isLag == true) or forms.ischecked(BooModeCheckbox)) then
  782.                 -- Make a state here
  783.                 savestate.save("ItemBotIterator")
  784.                
  785.                 -- Remember what spot we're on in the queue
  786.                 ItemBotIteratorSave = queueIterator
  787.                
  788.                 -- Change State
  789.                 ItemBotState = 1
  790.             else
  791.                 -- Still looking
  792.             end
  793.         end
  794.        
  795.         -- If waiting to see what item we got, check if its set yet, and if its what we want
  796.         if (ItemBotState == 2) then
  797.           item_we_got = memory.read_s8(0x165F5B)
  798.           z_delay_timer = memory.read_u8(0x165F07)
  799.  
  800.           if (item_we_got > 0 or (z_delay_timer == 255 and forms.ischecked(BooModeCheckbox))) then
  801.             if (item_we_got == ItemBotWantedItem) then
  802.                 -- We succeeded
  803.                
  804.                 local i = 0
  805.                 local tableStr = ""
  806.                 while i <= #InputQueue do
  807.                     local to_edit = bizstring.replace(InputQueue[i], "\n", "")
  808.                    
  809.                     -- store the Z in the right spot in the text box
  810.                     if (i == ItemBotIteratorSave) then
  811.                         to_edit = string.sub(to_edit,0,25) .. "Z" .. string.sub(to_edit,27)
  812.                     end
  813.                    
  814.                     if (i > 0) then
  815.                       tableStr = tableStr .. "\r\n"
  816.                     end
  817.                    
  818.                     tableStr = tableStr .. to_edit
  819.                     i = i +1
  820.                 end
  821.                 forms.settext(InputQueueTextBox, tableStr)
  822.                
  823.                 -- Clean up the queue
  824.                 ClearQueue()
  825.                
  826.                 -- Load the starting state
  827.                 savestate.load("ItemBotStartingState")
  828.                
  829.                 -- turn off the bot
  830.                 ItemBotState = 4
  831.                
  832.                 -- Pause
  833.                 client.pause()
  834.             else
  835.                 -- We failed
  836.                 -- load the state
  837.                 savestate.load("ItemBotIterator")
  838.                
  839.                 -- load the iterator value
  840.                 queueIterator = ItemBotIteratorSave
  841.  
  842.                 -- Switch to skip a frame mode
  843.                 ItemBotState = 3
  844.             end
  845.           end
  846.         end
  847.  
  848.         --console.log("Getting index " .. queueIterator .. " of InputQueue")
  849.         if (ItemBotState ~= 4) then
  850.             if (queueIterator < table.getn(InputQueue) + 1) then
  851.                 toPut = bizstring.replace(InputQueue[queueIterator], "\n", "")
  852.                
  853.                 -- If we're going to press Z
  854.                 if (ItemBotState == 1) then
  855.                     -- Inject the Z to next state
  856.                     toPut = string.sub(toPut,0,25) .. "Z" .. string.sub(toPut,27)
  857.                 end
  858.                
  859.                 --console.log(toPut)
  860.                     --console.log(forms.gettext(TextBoxItemFrame))
  861.  
  862.                 joypad.setfrommnemonicstr(toPut)
  863.             else
  864.                 -- We ran out of input, and the bot is running
  865.                 if (ItemBotState >= 0) then
  866.                   -- We failed!
  867.                  
  868.                   -- print out a message?
  869.                   console.log("Item bot ran out of queued input!")
  870.                  
  871.                   -- Re-enable the button
  872.                   forms.settext(ExecuteItemBotButtonHandle, "Item Bot")
  873.                  
  874.                   ItemBotState = -1
  875.                 end
  876.                
  877.                 --console.log("input queue is done, clearing everything out")
  878.                 ClearQueue()
  879.             end
  880.         else
  881.             ItemBotState = -1
  882.            
  883.             -- Re-enable the button
  884.             forms.settext(ExecuteItemBotButtonHandle, "Item Bot")
  885.         end
  886.     end
  887.  
  888.     emu.frameadvance()
  889. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement