Advertisement
Jimmie1717

BizHawk: Toy Story (Sega Genesis)

Feb 2nd, 2018
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 15.02 KB | None | 0 0
  1. -- Disney's Toy Story (Sega Genesis)
  2. -- by Jimmie1717
  3. -- BizHawk 1.11.1
  4. -- This will only work with the NTSC-U version of the game.
  5. -- ** This probably works with the PAL version too.
  6.  
  7. console.clear(); -- Clear the console of previous errors/data.
  8. console.writeline("Disney's Toy Story (Sega Genesis)");
  9. console.writeline("By Jimmie1717");
  10.  
  11. -- Globals
  12. readByte                        = mainmemory.read_u8;
  13. readSByte                       = mainmemory.read_s8;
  14. readWord                        = mainmemory.read_u16_be;
  15. readSWord                       = mainmemory.read_s16_be;
  16. readDWord                       = mainmemory.read_u32_be;
  17. readSDWord                      = mainmemory.read_s32_be;
  18. readFloat                       = mainmemory.readfloat;
  19. writeByte                       = mainmemory.write_u8;
  20. writeSByte                      = mainmemory.write_s8;
  21. writeWord                       = mainmemory.write_u16_be;
  22. writeSWord                      = mainmemory.write_s16_be;
  23. writeDWord                      = mainmemory.write_u32_be;
  24. writeSDWord                     = mainmemory.write_s32_be;
  25. writeFloat                      = mainmemory.writefloat;
  26. formNew                         = forms.newform;
  27. formLabel                       = forms.label;
  28. formSetText                     = forms.settext;
  29. formGetText                     = forms.gettext;
  30. formSetProperty                 = forms.setproperty;
  31. formGetProperty                 = forms.getproperty;
  32. formButton                      = forms.button;
  33. formDroplist                    = forms.dropdown;
  34. formTextbox                     = forms.textbox;
  35. formCheckbox                    = forms.checkbox;
  36. formCheckboxChecked             = forms.ischecked;
  37. formDestroy                     = forms.destroy;
  38. formDestroyAll                  = forms.destroyall;
  39.  
  40. -- RAM Addresses
  41. local addrs                     = {
  42.     general                     = {
  43.         level                   = 0x049A,
  44.         bonus_stars             = {
  45.             total               = 0x049C,
  46.             level               = 0x049E
  47.         }
  48.     },
  49.     woody                       = {
  50.         position                = {
  51.             x                   = 0x0686,
  52.             y                   = 0x068A
  53.         },
  54.         velocity                = {
  55.             x                   = 0x069A,
  56.             y                   = 0x069E
  57.         },
  58.         ground                  = 0x06A2,
  59.         state                   = 0x06F6,
  60.         lives                   = 0x04A0,
  61.         health                  = 0x04A2
  62.     },
  63.     screen                      = {
  64.         position                = {
  65.             x                   = 0x05B4,
  66.             y                   = 0x05B6
  67.         },
  68.         velocity                = {
  69.             x                   = 0x05CA,
  70.             y                   = 0x05CC
  71.         }
  72.     },
  73.     level_data                  = {
  74.         [5]                     = {
  75.             battery             = 0x0C05
  76.         },
  77.         [8]                     = {
  78.             buzz                = {
  79.                 position        = {
  80.                     x           = 0x0AEE,
  81.                     y           = 0x0AE2
  82.                 }
  83.             },
  84.             tire                = {
  85.                 position        = {
  86.                     x           = 0x0B08,
  87.                     y           = nil
  88.                 }
  89.             }
  90.         },
  91.         [12]                    = {
  92.             buzz                = {
  93.                 position        = {
  94.                     x           = 0x2522,
  95.                     y           = 0x2524
  96.                 }
  97.             },
  98.             claw                = {
  99.                 mode            = 0x0ADE,
  100.                 health          = 0x0B00
  101.             },
  102.             aliens              = {
  103.                 [0]             = {
  104.                     position    = {
  105.                         x       = 0x0B08,
  106.                         y       = 0x0B0C
  107.                     },
  108.                     velocity    = {
  109.                         x       = 0x0B10,
  110.                         y       = 0x0B14
  111.                     },
  112.                     active      = 0x0B1A
  113.                 },
  114.                 [1]             = {
  115.                     position    = {
  116.                         x       = 0x0B1C,
  117.                         y       = 0x0B20
  118.                     },
  119.                     velocity    = {
  120.                         x       = 0x0B24,
  121.                         y       = 0x0B28
  122.                     },
  123.                     active      = 0x0B2E
  124.                 },
  125.                 [2]             = {
  126.                     position    = {
  127.                         x       = 0x0B30,
  128.                         y       = 0x0B34
  129.                     },
  130.                     velocity    = {
  131.                         x       = 0x0B38,
  132.                         y       = 0x0B3C
  133.                     },
  134.                     active      = 0x0B42
  135.                 }
  136.             }
  137.         }
  138.     }
  139. };
  140.  
  141. local values                    = {
  142.     woody_state                 = {
  143.         [0x00]                  = "Stationary",
  144.         [0x01]                  = "Moving",
  145.         [0x02]                  = "Riding Rex",
  146.         [0x03]                  = "Crouching",
  147.         [0x04]                  = "Uncrouching",
  148.         [0x05]                  = "Hanging or Riding RC",
  149.         [0x06]                  = "Climbing",
  150.         [0x07]                  = "Swinging",
  151.         [0x08]                  = "Jumping",
  152.         [0x09]                  = "Jumping (from Moving)",
  153.         [0x0A]                  = "Falling",
  154.         [0x0B]                  = "Falling (from Moving)",
  155.         [0x0C]                  = "Falling (extended)",
  156.         [0x0D]                  = "Landing",
  157.         [0x0E]                  = "Landing (from Moving)",
  158.         [0x0F]                  = "Landing (from Falling)",
  159.         [0x10]                  = "Whipping",
  160.         [0x11]                  = "Crouch Whipping",
  161.         [0x12]                  = "Upward Whipping",
  162.         [0x13]                  = "Moving Mega Gulp",
  163.         [0x14]                  = "Stationary Mega Gulp",
  164.         [0x15]                  = "Riding Rollerbob",
  165.         [0x16]                  = "Air Whipping",
  166.         [0x17]                  = "Release Swinging",
  167.         [0x18]                  = "Tiptoe at Edge",
  168.         [0x19]                  = "Jumping (from Hanging)",
  169.         [0x1A]                  = "Playing Dead",
  170.         [0x1B]                  = "Burned",
  171.         [0x1C]                  = "Cooling Off",
  172.         [0x1D]                  = "Pushing Buzz",
  173.         [0x1E]                  = "Attacking with Buzz",
  174.         [0x1F]                  = "Pushing Buzz (Stationary)",
  175.         [0x20]                  = "Jumping (Riding Rex)",
  176.         [0x21]                  = "Falling (Riding Rex)",
  177.         [0x22]                  = "Looking over Shoulder",
  178.         [0xFFFF]                = ""
  179.     },
  180.     claw                        = {
  181.         [0xFFFF]                = "Scanning",
  182.         [0x0000]                = "Target Found",
  183.         [0x0001]                = "Target Aquired",
  184.     }
  185. };
  186. local starsCurrent              = 0;
  187.  
  188. local pokeFormState             = true;
  189. local pokeList                  = {
  190.     "Bonus Stars - Level",
  191.     "Bonus Stars - Total",
  192.     "Woody - X Position",
  193.     "Woody - Y Position",
  194.     "Woody - X Velocity",
  195.     "Woody - Y Velocity"
  196. };
  197.  
  198. -- Use these to define the base location of where text should appear in the form.
  199. -- i.e. 0, 0 is the top left.
  200. local x                         = 2;
  201. local y                         = 3;
  202.  
  203. -- 1286, 3193, 5017, 1824
  204. -- 21439 24632 26456
  205.  
  206. function mainForm()
  207.  
  208.     MAINFORM            = formNew(228, 315, "TS");
  209.    
  210.     -- General
  211.     level_value         = formLabel(MAINFORM, "", x + 27, y + 15, 40, 13, false);
  212.     stars_l_value       = formLabel(MAINFORM, "", x + 87, y + 15, 40, 13, false);
  213.     stars_t_value       = formLabel(MAINFORM, "", x + 87, y + 30, 40, 13, false);
  214.     stars_c_value       = formLabel(MAINFORM, "", x + 147, y + 15, 40, 13, false);
  215.    
  216.     general             = formLabel(MAINFORM, "General:", x, y, 200, 13, false);
  217.     level               = formLabel(MAINFORM, "#:", x + 5, y + 15, 17, 13, false);
  218.     stars_l             = formLabel(MAINFORM, "L*:", x + 65, y + 15, 25, 13, false);
  219.     stars_t             = formLabel(MAINFORM, "T*:", x + 65, y + 30, 25, 13, false);
  220.     stars_c             = formLabel(MAINFORM, "C*:", x + 125, y + 15, 25, 13, false);
  221.    
  222.     -- Woody
  223.     woody_x_value       = formLabel(MAINFORM, "", x + 27, y + 65, 40, 13, false);
  224.     woody_y_value       = formLabel(MAINFORM, "", x + 27, y + 80, 40, 13, false);
  225.     woody_vx_value      = formLabel(MAINFORM, "", x + 87, y + 65, 40, 13, false);
  226.     woody_vy_value      = formLabel(MAINFORM, "", x + 87, y + 80, 40, 13, false);
  227.     woody_hp_value      = formLabel(MAINFORM, "", x + 147, y + 65, 40, 13, false);
  228.     woody_lives_value   = formLabel(MAINFORM, "", x + 147, y + 80, 40, 13, false);
  229.     woody_state_value   = formLabel(MAINFORM, "", x + 41, y + 50, 200, 13, false);
  230.    
  231.     woody               = formLabel(MAINFORM, "Woody:", x, y + 50, 200, 13, false);
  232.     woody_x             = formLabel(MAINFORM, "X:", x + 5, y + 65, 17, 13, false);
  233.     woody_y             = formLabel(MAINFORM, "Y:", x + 5, y + 80, 17, 13, false);
  234.     woody_vx            = formLabel(MAINFORM, "VX:", x + 65, y + 65, 25, 13, false);
  235.     woody_vy            = formLabel(MAINFORM, "VY:", x + 65, y + 80, 25, 13, false);
  236.     woody_hp            = formLabel(MAINFORM, "HP:", x + 125, y + 65, 25, 13, false);
  237.     woody_lives         = formLabel(MAINFORM, "L:", x + 125, y + 80, 25, 13, false);
  238.    
  239.     -- Screen
  240.     screen_x_value      = formLabel(MAINFORM, "", x + 27, y + 115, 40, 13, false);
  241.     screen_y_value      = formLabel(MAINFORM, "", x + 27, y + 130, 40, 13, false);
  242.     screen_vx_value     = formLabel(MAINFORM, "", x + 87, y + 115, 40, 13, false);
  243.     screen_vy_value     = formLabel(MAINFORM, "", x + 87, y + 130, 40, 13, false);
  244.    
  245.     screen              = formLabel(MAINFORM, "Screen:", x, y + 100, 200, 13, false);
  246.     screen_x            = formLabel(MAINFORM, "X:", x + 5, y + 115, 17, 13, false);
  247.     screen_y            = formLabel(MAINFORM, "Y:", x + 5, y + 130, 17, 13, false);
  248.     screen_vx           = formLabel(MAINFORM, "VX:", x + 65, y +115, 25, 13, false);
  249.     screen_vy           = formLabel(MAINFORM, "VY:", x + 65, y + 130, 25, 13, false);
  250.    
  251.     -- Level Data 1
  252.     level1_1_value      = formLabel(MAINFORM, "", x + 27, y + 165, 40, 13, false);
  253.     level1_2_value      = formLabel(MAINFORM, "", x + 27, y + 180, 40, 13, false);
  254.     level1_3_value      = formLabel(MAINFORM, "", x + 87, y + 165, 40, 13, false);
  255.     level1_4_value      = formLabel(MAINFORM, "", x + 87, y + 180, 40, 13, false);
  256.     level1_5_value      = formLabel(MAINFORM, "", x + 147, y + 165, 40, 13, false);
  257.     level1_6_value      = formLabel(MAINFORM, "", x + 147, y + 180, 40, 13, false);
  258.    
  259.     level1              = formLabel(MAINFORM, "", x, y + 150, 200, 13, false);
  260.     level1_1            = formLabel(MAINFORM, "", x + 5, y + 165, 17, 13, false);
  261.     level1_2            = formLabel(MAINFORM, "", x + 5, y + 180, 17, 13, false);
  262.     level1_3            = formLabel(MAINFORM, "", x + 65, y + 165, 25, 13, false);
  263.     level1_4            = formLabel(MAINFORM, "", x + 65, y + 180, 25, 13, false);
  264.     level1_5            = formLabel(MAINFORM, "", x + 125, y + 165, 25, 13, false);
  265.     level1_6            = formLabel(MAINFORM, "", x + 125, y + 180, 25, 13, false);
  266.    
  267.     -- Level Data 2
  268.     level2_1_value      = formLabel(MAINFORM, "", x + 27, y + 215, 40, 13, false);
  269.     level2_2_value      = formLabel(MAINFORM, "", x + 27, y + 230, 40, 13, false);
  270.     level2_3_value      = formLabel(MAINFORM, "", x + 87, y + 215, 40, 13, false);
  271.     level2_4_value      = formLabel(MAINFORM, "", x + 87, y + 230, 40, 13, false);
  272.     level2_5_value      = formLabel(MAINFORM, "", x + 147, y + 215, 40, 13, false);
  273.     level2_6_value      = formLabel(MAINFORM, "", x + 147, y + 230, 40, 13, false);
  274.    
  275.     level2              = formLabel(MAINFORM, "", x, y + 200, 200, 13, false);
  276.     level2_1            = formLabel(MAINFORM, "", x + 5, y + 215, 17, 13, false);
  277.     level2_2            = formLabel(MAINFORM, "", x + 5, y + 230, 17, 13, false);
  278.     level2_3            = formLabel(MAINFORM, "", x + 65, y + 215, 25, 13, false);
  279.     level2_4            = formLabel(MAINFORM, "", x + 65, y + 230, 25, 13, false);
  280.     level2_5            = formLabel(MAINFORM, "", x + 125, y + 215, 25, 13, false);
  281.     level2_6            = formLabel(MAINFORM, "", x + 125, y + 230, 25, 13, false);
  282.    
  283.     poke_button         = formButton(MAINFORM, "Poke", pokeForm, x + 2, y + 247, 204, 22);
  284.    
  285. end
  286.  
  287. function pokeForm()
  288.     if (pokeFormState == true) then
  289.         pokeFormState = false;
  290.        
  291.         POKEFORM            = formNew(228, 318, "Poke");
  292.        
  293.         -- Enter Address
  294.         e_value_hex         = formTextbox(POKEFORM, "0", 86, 20, "HEX", 61, 48, false, false);
  295.         e_value_l           = formLabel(POKEFORM, "Value: 0x", 13, 51, 62, 13, false);
  296.         e_address_size      = formDroplist(POKEFORM, {"1 Byte", "2 Byte", "4 Byte"}, 152, 22, 55, 0);
  297.         e_address_hex       = formTextbox(POKEFORM, "0", 86, 20, "HEX", 61, 23, false, false);
  298.         e_address_l         = formLabel(POKEFORM, "Address: 0x", 2, 26, 62, 13, false);
  299.         e_address_cb_l      = formLabel(POKEFORM, "Enter an Address to Poke:", 18, 6, 140, 13, false);
  300.         e_address_cb        = formCheckbox(POKEFORM, "", 5, 1);
  301.        
  302.         -- Select Address
  303.         s_value_hex         = formTextbox(POKEFORM, "0", 86, 20, "HEX", 61, 128, false, false);
  304.         s_value_l           = formLabel(POKEFORM, "Value: 0x", 13, 131, 62, 13, false);
  305.         s_address_list      = formDroplist(POKEFORM, pokeList, 61, 102, 146, 20);
  306.         s_address_l         = formLabel(POKEFORM, "Address: 0x", 2, 106, 62, 13, false);
  307.         s_address_cb_l      = formLabel(POKEFORM, "Select an Address to Poke:", 18, 86, 140, 13, false);
  308.         s_address_cb        = formCheckbox(POKEFORM, "", 5, 81);
  309.        
  310.         forms.addclick(e_address_cb, function() pokeOption("e"); end);
  311.         forms.addclick(s_address_cb, function() pokeOption("s"); end);
  312.        
  313.         --list              = formDroplist(POKEFORM, pokeList, 5, 5, 142, 10);
  314.         --value_size        = formDroplist(POKEFORM, {"1 Byte", "2 Byte", "4 Byte"}, 152, 5, 55, 0);
  315.         --value_address     = formTextbox(POKEFORM, "0", 142, 20, "HEX", 5, 5, false, false);
  316.         --value_dec         = formTextbox(POKEFORM, "0", 99, 20, "UNSIGNED", 5, 31, false, false);
  317.         --value_hex         = formTextbox(POKEFORM, "0", 99, 20, "HEX", 108, 31, false, false);
  318.         --button            = formButton(POKEFORM, "Update", pokeValue, 4, 55, 204, 22);
  319.         --checkbox          = forms.checkbox(POKEFORM, "", 5, 82);
  320.        
  321.         -- Default Size to 2 byte.
  322.         formSetProperty(e_address_size, "SelectedIndex", 1);
  323.         formSetProperty(e_address_cb, "Checked", true);
  324.     end
  325. end
  326.  
  327. -- Format Textbox Values
  328. function pokeFormat()
  329.  
  330.     formSetText(value_hex, string.format("%08s", formGetText(value_hex)));
  331.  
  332. end
  333.  
  334. function pokeValue()
  335.  
  336.     -- Logic to read POKEFORM values and apply them.
  337.     --print(formGetProperty(list, "SelectedItem"));
  338.     --print(formGetText(list));
  339.    
  340.     local address   = tonumber(formGetText(value_address), 16);
  341.     local value     = tonumber(formGetText(value_dec));
  342.     local size      = formGetText(value_size);
  343.    
  344.     if (size == "1 Byte") then
  345.         writeByte(address, value);
  346.     elseif (size == "2 Byte") then
  347.         writeWord(address, value);
  348.     elseif (size == "4 Byte") then
  349.         writeDWord(address, value);
  350.     end
  351.    
  352.     -- Destroy the Form
  353.     formDestroy(POKEFORM);
  354.     pokeFormState = true;
  355.     gui.addmessage("Poked: 0x0000 to be 0x00");
  356.    
  357. end
  358.  
  359. -- Only allow one option to be selected.
  360. function pokeOption(source)
  361.  
  362.     if (source == "e" and formCheckboxChecked(e_address_cb)) then
  363.         formSetProperty(s_address_cb, "Checked", true);
  364.     elseif (source == "e" and formCheckboxChecked(e_address_cb) == false) then
  365.         formSetProperty(s_address_cb, "Checked", false);
  366.     elseif (source == "s" and formCheckboxChecked(s_address_cb)) then
  367.         formSetProperty(e_address_cb, "Checked", true);
  368.     elseif (source == "s" and formCheckboxChecked(s_address_cb) == false) then
  369.         formSetProperty(e_address_cb, "Checked", false);
  370.     end
  371.  
  372. end
  373.  
  374. function updateData()
  375.  
  376.     formSetText(level_value, string.format("%d", readWord(addrs.general.level)));
  377.     formSetText(stars_l_value, string.format("%d", readWord(addrs.general.bonus_stars.level)));
  378.     formSetText(stars_t_value, string.format("%d", readSWord(addrs.general.bonus_stars.total)));
  379.     formSetText(stars_c_value, string.format("%d", currentStars()));
  380.  
  381.     formSetText(woody_x_value, string.format("%d", readWord(addrs.woody.position.x)));
  382.     formSetText(woody_y_value, string.format("%d", readWord(addrs.woody.position.y)));
  383.     formSetText(woody_vx_value, string.format("%d", readSWord(addrs.woody.velocity.x)));
  384.     formSetText(woody_vy_value, string.format("%d", (readSWord(addrs.woody.velocity.y) * -1)));
  385.     formSetText(woody_hp_value, string.format("%d", readSWord(addrs.woody.health) + 1));
  386.     formSetText(woody_lives_value, string.format("%d", readSWord(addrs.woody.lives)));
  387.     formSetText(woody_state_value, string.format("%s", values.woody_state[readWord(addrs.woody.state)]));
  388.    
  389.     formSetText(screen_x_value, string.format("%d", readWord(addrs.screen.position.x)));
  390.     formSetText(screen_y_value, string.format("%d", readWord(addrs.screen.position.y)));
  391.     formSetText(screen_vx_value, string.format("%d", readSWord(addrs.screen.velocity.x)));
  392.     formSetText(screen_vy_value, string.format("%d", (readSWord(addrs.screen.velocity.y) * -1)));
  393.    
  394.     if (readWord(addrs.general.level) == 0x0008) then
  395.         -- get tire data
  396.         -- get buzz data
  397.     elseif (readWord(addrs.general.level) == 0x000C) then
  398.         formSetText(level1, "Buzz:");
  399.         formSetText(level1_1, "X:");
  400.         formSetText(level1_2, "Y:");
  401.         formSetText(level1_1_value, string.format("%d", readWord(addrs.level_data[12].buzz.position.x)));
  402.         formSetText(level1_2_value, string.format("%d", readWord(addrs.level_data[12].buzz.position.y)));
  403.     else
  404.         formSetText(level1, "");
  405.         formSetText(level1_1, "");
  406.         formSetText(level1_2, "");
  407.         formSetText(level1_1_value, "");
  408.         formSetText(level1_2_value, "");
  409.     end
  410.  
  411. end
  412.  
  413. function currentStars()
  414.  
  415.     local starsLevel = readWord(addrs.general.bonus_stars.level);
  416.     local starsTotal = readWord(addrs.general.bonus_stars.total);
  417.    
  418.     if (starsLevel < 50) then
  419.         starsCurrent = starsLevel + starsTotal;
  420.     elseif (starsLevel == 50) then
  421.         if (readWord(addrs.general.level) == 16) then
  422.             return starsCurrent + 2;
  423.         else
  424.             return starsCurrent + 1;
  425.         end
  426.     end
  427.        
  428.     return starsCurrent;
  429.  
  430. end
  431.  
  432. -- Initiate the Main Form Window.
  433. mainForm();
  434.  
  435. while true do
  436.  
  437.     updateData();
  438.     if (pokeFormState == false) then
  439.     --  pokeFormat();
  440.     end
  441.    
  442.     emu.frameadvance();
  443.    
  444. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement