Advertisement
Jimmie1717

BizHawk: Majora's Mask (U) Camera Control

Jan 29th, 2017
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.82 KB | None | 0 0
  1. -- Majora's Mask (U): Camera Control Script
  2. -- by Jimmie1717
  3. -- BizHawk 1.11.8.2
  4.  
  5. -- Controls:
  6. --      Home:                       Toggle Camera Control.
  7. --                                  This also hides the game HUD and stops in-game time.
  8. --
  9. --      Page Up/Down:               Adjust the Camera's Zoom.
  10. --
  11. --      Arrow Keys:                 Move the Camera's Position on the X and Z Axis.
  12. --      Shift + Arrow Keys:         Move the Camera's Position on the X and Y Axis.
  13. --                                  This also moves the Camera's Target. (so the camera rotation doesn't change)
  14. --
  15. --      Ctrl + Arrow Keys:          Move the Camera's Target on the X and Z Axis.
  16. --      Ctrl + Shift + Arrow Keys:  Move the Camera's Target on the X and Y Axis.
  17. --                                  This will change the Camera's Rotation and distance of what it's looking at.
  18.  
  19. console.clear();
  20. gui.defaultTextBackground(0x00000000);
  21.  
  22. -- Global
  23. readWord                        = memory.read_u16_be;
  24. readDWord                       = memory.read_u32_be;
  25. readFloat                       = memory.readfloat;
  26. writeWord                       = memory.write_u16_be;
  27. writeDWord                      = memory.write_u32_be;
  28. writeFloat                      = memory.writefloat;
  29.  
  30. -- Addresses
  31. local time_speed_area           = 0x382502;
  32. local hud_tranparency           = {
  33.     [0]                         = 0x3FD76E,
  34.     [1]                         = 0x3FD770,
  35.     [2]                         = 0x3FD772,
  36.     [3]                         = 0x3FD774,
  37.     [4]                         = 0x3FD776,
  38.     [5]                         = 0x3FD778,
  39.     [6]                         = 0x3FD77A
  40. };
  41. local camera                    = {
  42.     mode                        = 0x3E6E82,
  43.     target                      = {
  44.         x                       = 0x3E6D90,
  45.         y                       = 0x3E6D94,
  46.         z                       = 0x3E6D98,
  47.     },
  48.     position                    = {
  49.         x                       = 0x3E6D9C,
  50.         y                       = 0x3E6DA0,
  51.         z                       = 0x3E6DA4,
  52.     },
  53.     zoom                        = 0x3E6E3C
  54. };
  55. local camera_data               = {
  56.     mode                        = nil,
  57.     target                      = {
  58.         x                       = nil,
  59.         y                       = nil,
  60.         z                       = nil,
  61.     },
  62.     position                    = {
  63.         x                       = nil,
  64.         y                       = nil,
  65.         z                       = nil,
  66.     },
  67.     zoom                        = nil
  68. };
  69.  
  70. local cameraEdit                = false;
  71. local isPressed                 = false;
  72.  
  73. -- Anchor and Tranparency for Text Display
  74. local x                         = 0;
  75. local y                         = 375;
  76. local transparency              = 0xFF000000;
  77.  
  78. -- Draw a String.
  79. function drawString(x, y, text, color)
  80.  
  81.     gui.drawText(x + 1, y + 1, string.format("%s", text), transparency + 0x000000);
  82.     gui.drawText(x, y, string.format("%s", text), transparency + color);
  83.  
  84. end
  85.  
  86. -- Draw a String formatted like a value.
  87. function drawStringValue(x, y, value, color)
  88.  
  89.     gui.drawText(x + 1, y + 1, string.format("% 8s", value), transparency + 0x000000);
  90.     gui.drawText(x, y, string.format("% 8s", value), transparency + color);
  91.  
  92. end
  93.  
  94. -- Draw an Integer formatted like a value.
  95. function drawIntegerValue(x, y, value, color)
  96.  
  97.     gui.drawText(x + 1, y + 1, string.format("% 8d", value), transparency + 0x000000);
  98.     gui.drawText(x, y, string.format("% 8d", value), transparency + color);
  99.  
  100. end
  101.  
  102. -- Draw a Float formatted like a value.
  103. function drawFloatValue(x, y, value, color)
  104.  
  105.     gui.drawText(x + 1, y + 1, string.format("% 8.1f", value), transparency + 0x000000);
  106.     gui.drawText(x, y, string.format("% 8.1f", value), transparency + color);
  107.  
  108. end
  109.  
  110. -- Draw Byte from supplied address.
  111. function drawByte(x, y, address, color)
  112.  
  113.     gui.drawText(x + 1, y + 1, string.format("% 8d", readByte(address)), transparency + 0x000000);
  114.     gui.drawText(x, y, string.format("% 8d", readByte(address)), transparency + color);
  115.  
  116. end
  117.  
  118. -- Draw Word from supplied address.
  119. function drawWord(x, y, address, color)
  120.  
  121.     gui.drawText(x + 1, y + 1, string.format("% 8d", readWord(address)), transparency + 0x000000);
  122.     gui.drawText(x, y, string.format("% 8d", readWord(address)), transparency + color);
  123.  
  124. end
  125.  
  126. -- Draw Double Word from supplied address.
  127. function drawDWord(x, y, address, color)
  128.  
  129.     gui.drawText(x + 1, y + 1, string.format("% 8d", readDWord(address)), transparency + 0x000000);
  130.     gui.drawText(x, y, string.format("% 8d", readDWord(address)), transparency + color);
  131.  
  132. end
  133.  
  134. -- Draw Float from supplied address.
  135. function drawFloat(x, y, address, color)
  136.  
  137.     gui.drawText(x + 1, y + 1, string.format("% 8.1f", readFloat(address, true)), transparency + 0x000000);
  138.     gui.drawText(x, y, string.format("% 8.1f", readFloat(address, true)), transparency + color);
  139.  
  140. end
  141.  
  142. -- Draw Byte from supplied address in hexadecimal.
  143. function drawHexByte(x, y, address, color)
  144.  
  145.     gui.drawText(x + 46, y + 1, string.format("%02s", bizstring.hex(readByte(address))), transparency + 0x000000);
  146.     gui.drawText(x + 45, y, string.format("%02s", bizstring.hex(readByte(address))), transparency + color);
  147.  
  148. end
  149.  
  150. -- Draw Word from supplied address in hexadecimal.
  151. function drawHexWord(x, y, address, color)
  152.  
  153.     gui.drawText(x + 31, y + 1, string.format("%04s", bizstring.hex(readWord(address))), transparency + 0x000000);
  154.     gui.drawText(x + 30, y, string.format("%04s", bizstring.hex(readWord(address))), transparency + color);
  155.  
  156. end
  157.  
  158. -- Draw Double Word from supplied address in hexadecimal.
  159. function drawHexDWord(x, y, address, color)
  160.  
  161.     gui.drawText(x + 1, y + 1, string.format("%08s", bizstring.hex(readDWord(address))), transparency + 0x000000);
  162.     gui.drawText(x, y, string.format("%08s", bizstring.hex(readDWord(address))), transparency + color);
  163.  
  164. end
  165.  
  166. -- Text Display
  167. function textDisplay()
  168.    
  169.     drawString(x, y - 18, "Zoom:", 0xFFFFFF);
  170.     drawFloat(x + 100, y - 18, camera.zoom, 0x80FFFF);
  171.    
  172.     ---
  173.    
  174.     drawString(x, y, "Position:", 0xFFFFFF);
  175.    
  176.     drawString(x, y + 12, " X:", 0xFFFFFF);
  177.     drawFloat(x + 100, y + 12, camera.position.x, 0x80FFFF);
  178.    
  179.     drawString(x, y + 24, " Y:", 0xFFFFFF);
  180.     drawFloat(x + 100, y + 24, camera.position.y, 0xFF80FF);
  181.    
  182.     drawString(x, y + 36, " Z:", 0xFFFFFF);
  183.     drawFloat(x + 100, y + 36, camera.position.z, 0xFFFF80);
  184.    
  185.     ---
  186.    
  187.     drawString(x, y + 54, "Target:", 0xFFFFFF);
  188.    
  189.     drawString(x, y + 66, " X:", 0xFFFFFF);
  190.     drawFloat(x + 100, y + 66, camera.target.x, 0x80FFFF);
  191.    
  192.     drawString(x, y + 78, " Y:", 0xFFFFFF);
  193.     drawFloat(x + 100, y + 78, camera.target.y, 0xFF80FF);
  194.    
  195.     drawString(x, y + 90, " Z:", 0xFFFFFF);
  196.     drawFloat(x + 100, y + 90, camera.target.z, 0xFFFF80);
  197.    
  198.    
  199. end
  200.  
  201. -- Hide/Show HUD
  202. function hideHUD(type)
  203.  
  204.     local transparency          = nil;
  205.    
  206.     if (type == true) then
  207.         transparency            = 0x0000;
  208.         writeWord(time_speed_area, 0x0000);
  209.     elseif (type == false) then
  210.         transparency            = 0x00FF;
  211.         writeWord(time_speed_area, 0x0003);
  212.     end
  213.    
  214.     for i = 0, 6, 1 do
  215.         writeWord(hud_tranparency[i], transparency);
  216.     end
  217.  
  218. end
  219.  
  220. -- Disable Camera Control on Load Savestate.
  221. -- I call this instead of "toggleCamera()" from loading a state
  222. -- because apparently "event.onloadstate()" calls the funtion several times???
  223. function disableCamera()
  224.  
  225.     cameraEdit                  = false;
  226.    
  227.     setCamera(false);
  228.  
  229. end
  230.  
  231. -- Enable/Disable Camera Control
  232. function toggleCamera()
  233.  
  234.     isPressed                   = true;
  235.  
  236.     if (cameraEdit == true) then
  237.         cameraEdit              = false;
  238.         gui.addmessage("Camera Control Disabled.");
  239.     elseif (cameraEdit == false) then
  240.         cameraEdit              = true;
  241.         gui.addmessage("Camera Control Enabled.");
  242.     end
  243.    
  244.     setCamera(true);
  245.  
  246. end
  247.  
  248. -- Set the Camera mode and Save/Load it's Position when Enabled/Disabled.
  249. function setCamera(disable)
  250.    
  251.     if (cameraEdit == true) then
  252.         camera_data.mode        = readWord(camera.mode);
  253.         camera_data.target.x    = readFloat(camera.target.x, true);
  254.         camera_data.target.y    = readFloat(camera.target.y, true);
  255.         camera_data.target.z    = readFloat(camera.target.z, true);
  256.         camera_data.position.= readFloat(camera.position.x, true);
  257.         camera_data.position.= readFloat(camera.position.y, true);
  258.         camera_data.position.= readFloat(camera.position.z, true);
  259.         camera_data.zoom        = readFloat(camera.zoom, true);
  260.         writeWord(camera.mode, 0x0006);
  261.     elseif (cameraEdit == false and disable ~= false) then
  262.         writeWord(camera.mode, camera_data.mode);
  263.         writeFloat(camera.target.x, camera_data.target.x, true);
  264.         writeFloat(camera.target.y, camera_data.target.y, true);
  265.         writeFloat(camera.target.z, camera_data.target.z, true);
  266.         writeFloat(camera.position.x, camera_data.position.x, true);
  267.         writeFloat(camera.position.y, camera_data.position.y, true);
  268.         writeFloat(camera.position.z, camera_data.position.z, true);
  269.         writeFloat(camera.zoom, camera_data.zoom, true);
  270.         hideHUD(false);
  271.     end
  272.  
  273. end
  274.  
  275. -- Update Camera Position/Target.
  276. function moveCamera(address, value)
  277.  
  278.     local newLocation           = readFloat(address, true) + value;
  279.    
  280.     if (cameraEdit == true) then
  281.         writeFloat(address, newLocation, true);
  282.     end
  283.  
  284. end
  285.  
  286. -- Update Camera Zoom.
  287. function zoomCamera(value)
  288.  
  289.     local newZoom           = readFloat(camera.zoom, true) + value;
  290.    
  291.     if (cameraEdit == true) then
  292.         writeFloat(camera.zoom, newZoom, true);
  293.     end
  294.  
  295. end
  296.  
  297. -- Core Loop
  298. while true do
  299.  
  300.     -- Disable if a Savestate is loaded.
  301.     event.onloadstate(disableCamera);
  302.  
  303.     -- Toggle Camera Control
  304.     if (input.get().Home == true and isPressed == false) then
  305.         toggleCamera();
  306.     -- Zoom Camera
  307.     elseif (input.get().PageUp == true) then
  308.         zoomCamera(1);
  309.     elseif (input.get().PageDown == true) then
  310.         zoomCamera(-1);
  311.     -- Move Camera Position
  312.     elseif (input.get().Ctrl == nil and isPressed == false) then
  313.         if (input.get().LeftArrow == true) then
  314.             moveCamera(camera.position.x, 10.0);
  315.             moveCamera(camera.target.x, 10.0);
  316.         elseif (input.get().RightArrow == true) then
  317.             moveCamera(camera.position.x, -10.0);
  318.             moveCamera(camera.target.x, -10.0);
  319.         elseif (input.get().UpArrow == true and input.get().Shift == true) then
  320.             moveCamera(camera.position.y, 10.0);
  321.             moveCamera(camera.target.y, 10.0);
  322.         elseif (input.get().DownArrow == true and input.get().Shift == true) then
  323.             moveCamera(camera.position.y, -10.0);
  324.             moveCamera(camera.target.y, -10.0);
  325.         elseif (input.get().UpArrow == true and input.get().Shift == nil) then
  326.             moveCamera(camera.position.z, 10.0);
  327.             moveCamera(camera.target.z, 10.0);
  328.         elseif (input.get().DownArrow == true and input.get().Shift == nil) then
  329.             moveCamera(camera.position.z, -10.0);
  330.             moveCamera(camera.target.z, -10.0);
  331.         end
  332.     -- Move Camera Target
  333.     elseif (input.get().Ctrl == true and isPressed == false) then
  334.         if (input.get().LeftArrow == true) then
  335.             moveCamera(camera.target.x, 10.0);
  336.         elseif (input.get().RightArrow == true) then
  337.             moveCamera(camera.target.x, -10.0);
  338.         elseif (input.get().UpArrow == true and input.get().Shift == true) then
  339.             moveCamera(camera.target.y, 10.0);
  340.         elseif (input.get().DownArrow == true and input.get().Shift == true) then
  341.             moveCamera(camera.target.y, -10.0);
  342.         elseif (input.get().UpArrow == true and input.get().Shift == nil) then
  343.             moveCamera(camera.target.z, 10.0);
  344.         elseif (input.get().DownArrow == true and input.get().Shift == nil) then
  345.             moveCamera(camera.target.z, -10.0);
  346.         end
  347.     elseif (input.get().Home == nil and
  348.             input.get().PageUp == nil and
  349.             input.get().PageDown == nil and
  350.             input.get().Shift == nil and
  351.             input.get().Ctrl == nil and
  352.             input.get().UpArrow == nil and
  353.             input.get().DownArrow == nil and
  354.             input.get().LeftArrow == nil and
  355.             input.get().RightArrow == nil) then
  356.         isPressed = false;
  357.     end
  358.    
  359.     -- Display Camera Info
  360.     if (cameraEdit == true) then
  361.         textDisplay();
  362.         hideHUD(true);
  363.     end
  364.    
  365.     emu.frameadvance();
  366.        
  367. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement