Advertisement
Guest User

Crash HA average speed hud v1.1

a guest
Mar 10th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.64 KB | None | 0 0
  1. --Position and average speed hud values v1.1 by ThunderAxe31 for GBA Crash Bandicoot - The Huge Adventure
  2. --If the script encounters a speed amount that goes over the known limit, it will show it in blue. Otherwise:
  3. local x_max    =  1224 --initial slide speed
  4. local x_middle =   512 --target walking speed
  5. local y_max    =  1536 --highest falling speed
  6. local y_low    = -1229 --initial jumping speed
  7.  
  8. local player_x_addr = 0x010A14
  9. local player_y_addr = 0x010A18
  10. local framecount = -1
  11. local player_x = 0
  12. local player_x_old = 0
  13. local speed_x_average = 0
  14. local player_y = 0
  15. local player_y_old = 0
  16. local speed_y_average = 0
  17. local speed_x_average_list = {}
  18. local speed_y_average_list = {}
  19. local pos_x_all = ""
  20. local pos_y_all = ""
  21. local frames_amount = 0
  22.  
  23. function decide_color_horizontal(speed, middle, maxi)
  24.     if speed == nil then
  25.         return
  26.     end
  27.    
  28.     speed = math.abs(speed)
  29.     maxi = math.abs(maxi)
  30.    
  31.     if speed > maxi then --in case we broke the limit, use blue color
  32.         color = 0x000000FF
  33.     elseif speed < middle then --if 0: red; if middle: white
  34.         local value = math.floor(0xFF*(speed/middle))
  35.         color = 0xFF0000 + value*0x101
  36.     else --if middle: white; if maxi: green
  37.         local value = math.floor(0xFF*(1-(speed-middle)/(maxi-middle)))
  38.         color = 0x00FF00 + value*0x10001
  39.     end
  40.     return color+0xFF000000
  41. end
  42.  
  43. function decide_color_vertical(speed, low, maxi)
  44.     if speed == nil then
  45.         return
  46.     end
  47.    
  48.     speed = tonumber(speed)
  49.    
  50.     if speed > y_max or speed < y_low then --in case we broke the limit, use blue color
  51.         color = 0x000000FF
  52.     elseif speed >= 0 then -- if 0: white; if low: green
  53.         local value = math.floor(0xFF*(1-speed/maxi))
  54.         color = 0x00FF00 + value*0x10001
  55.     else -- if 0: white; if maxi: green
  56.         local value = math.floor(0xFF*(1-(speed*-1)/(low*-1)))
  57.         color = 0x00FF00 + value*0x10001
  58.     end
  59.     return color+0xFF000000
  60. end
  61.  
  62. if memory.usememorydomain("EWRAM") then
  63. --  console.log("Starting script at frame: " .. emu.framecount() .. " with X: " .. player_x .. ", Y: " .. player_y)
  64.    
  65.     while true do
  66.         if framecount ~= emu.framecount()-1 then
  67.             pos_x_all = ""
  68.             pos_y_all = ""
  69.             speed_x_average_list = {}
  70.             speed_y_average_list = {}
  71.         end
  72.        
  73.         player_x_old = player_x
  74.         player_x = memory.read_u32_le(player_x_addr)
  75.         player_y_old = player_y
  76.         player_y = memory.read_u32_le(player_y_addr)
  77.        
  78.         pos_x_all = player_x .. "\n" .. pos_x_all
  79.         pos_y_all = player_y .. "\n" .. pos_y_all
  80.        
  81.         if framecount == emu.framecount()-1 then
  82.             frames_amount = frames_amount + 1
  83.            
  84.             speed_x_average = ( ( speed_x_average * ( frames_amount - 1 ) ) +player_x -player_x_old ) / frames_amount
  85.             speed_y_average = ( ( speed_y_average * ( frames_amount - 1 ) ) +player_y -player_y_old ) / frames_amount
  86.         end
  87.        
  88.         if speed_x_average >= 0 then
  89.             speed_x_average = string.sub(speed_x_average, 0, 6)
  90.         else
  91.             speed_x_average = string.sub(speed_x_average, 0, 8)
  92.         end
  93.         if speed_y_average >= 0 then
  94.             speed_y_average = string.sub(speed_y_average, 0, 6)
  95.         else
  96.             speed_y_average = string.sub(speed_y_average, 0, 8)
  97.         end
  98.        
  99.         for i=21, 1, -1 do
  100.             speed_x_average_list[i]=speed_x_average_list[i-1]
  101.             speed_y_average_list[i]=speed_y_average_list[i-1]
  102.            
  103.             gui.pixelText( 29, 7+i*7, speed_x_average_list[i], decide_color_horizontal(speed_x_average_list[i], x_middle, x_max))
  104.             gui.pixelText(211, 7+i*7, speed_y_average_list[i], decide_color_vertical(speed_y_average_list[i], y_low, y_max))
  105.         end
  106.        
  107.         local last_found = 0
  108.         local occurences = 0
  109.         while last_found ~= nil do
  110.             occurences = occurences + 1
  111.             if occurences > 22 then
  112.                 pos_x_all = string.sub(pos_x_all, 0, last_found)
  113.             end
  114.             last_found = string.find(pos_x_all, "\n", last_found+1)
  115.         end
  116.        
  117.         last_found = 0
  118.         occurences = 0
  119.         while last_found ~= nil do
  120.             occurences = occurences + 1
  121.             if occurences > 22 then
  122.                 pos_y_all = string.sub(pos_y_all, 0, last_found)
  123.             end
  124.             last_found = string.find(pos_y_all, "\n", last_found+1)
  125.         end
  126.        
  127.         if framecount == emu.framecount()-1 then
  128.             speed_x_average_list[0] = speed_x_average
  129.             speed_y_average_list[0] = speed_y_average
  130.         end
  131.        
  132.         gui.pixelText(82, 0, "Frames counted: " .. frames_amount)
  133.         gui.pixelText(  0, 0, "X Pos  AvSpeed")
  134.         gui.pixelText(183, 0, "Y Pos  AvSpeed")
  135.         gui.pixelText(  0, 7, pos_x_all)
  136.         gui.pixelText(182, 7, pos_y_all)
  137.         gui.pixelText( 29, 7, speed_x_average_list[0], decide_color_horizontal(speed_x_average_list[0], x_middle, x_max))
  138.         gui.pixelText(211, 7, speed_y_average_list[0], decide_color_vertical(speed_y_average_list[0], y_low, y_max))
  139.        
  140.         framecount = emu.framecount()
  141.        
  142.         emu.frameadvance()
  143.     end
  144. else
  145.     console.log("Error: failed to set EWRAM memory domain")
  146. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement