Guest User

Untitled

a guest
Jan 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.81 KB | None | 0 0
  1. --How many frames ahead of the "action" to start savestates
  2. preFrames = 45
  3.  
  4. --Game-specific RAM addresses
  5. RAM = {
  6.     bytes = {
  7.         dead = 0x7e0D86, --101 if dead
  8.         inGame = 0x7e0040 --32 if in game
  9.     }
  10. }
  11.  
  12. --Locations to output text
  13. output = {
  14.     time = {
  15.         x = 0,
  16.         y = 190
  17.     },
  18.     gameInfo = {
  19.         x = 0,
  20.         y = 200
  21.     }  
  22. }
  23.  
  24. --Tells the script when to do nothing regarding savestates
  25. function DoNothing()
  26.     if not inGame() then
  27.         return true
  28.     end
  29.     return false
  30. end
  31.  
  32. function inGame()
  33.     local gameVal = memory.readbyte(RAM.bytes.inGame)
  34.     if gameVal == 32 then
  35.         return true
  36.     end
  37.     return false
  38. end
  39.  
  40. function GameActive()
  41.     if memory.readbyte(RAM.bytes.dead) ~= 101 and inGame() then
  42.         return true
  43.     end
  44.     return false
  45. end
  46.  
  47. --Tells the script that the attempt should continue
  48. function ContinueAttempt()
  49.     if GameActive() then
  50.         return true
  51.     end
  52.     return false
  53. end
  54.  
  55. --Tells the script that the last segment was okay (i.e. you didn't die)
  56. function SegmentOk()
  57.     if memory.readbyte(RAM.bytes.dead) ~= 101 then
  58.         return true
  59.     end
  60.     return false
  61. end
  62.  
  63. --Handles all the hotkey stuff
  64. function HandleKeys()
  65.     keys = input.get()
  66.  
  67.     if press('Q') then
  68.         segment.done = true
  69.     end
  70.    
  71.     if press('R') then
  72.         segment.failed = true
  73.     end
  74.  
  75.     if press('C') then
  76.         segment.failed = true
  77.         segment.bestTime = 999999
  78.     end
  79.    
  80.     if press('B') then
  81.         segment.done = true
  82.         segment.rollback = true
  83.     end
  84.  
  85.     last_keys = keys                                              
  86. end
  87.  
  88. --Nothing below this point should have to change between games (though it might anyway)
  89.  
  90. segment = {
  91.     prevStart = savestate.create(),
  92.     prevBest = savestate.create(),
  93.     start = savestate.create(),
  94.     best = savestate.create(),
  95.     bestTime = 999999,
  96.     lastTime = 0,
  97.     curTime = 0,
  98.     done = false,
  99.     actionStart = 0,
  100.     failed = false,
  101.     rollback = false
  102. }
  103.  
  104. firstSegment = true
  105. segment.curTime = 0
  106.  
  107. function press(button)
  108.     if keys[button] and not last_keys[button] then
  109.         return true
  110.     end
  111.     return false
  112. end
  113.  
  114. function StartSegment()
  115.     if firstSegment then
  116.         savestate.save(segment.prevStart)
  117.         firstSegment = false
  118.     end
  119.    
  120.     savestate.save(segment.start)
  121.     segment.done = false
  122.     segment.rollback = false
  123.     segment.bestTime = 999999
  124.     segment.lastTime = 0
  125.     segment.curTime = movie.framecount()
  126. end
  127.  
  128. function OutputTime()
  129.     gui.text(output.time.x,output.time.y,string.format("Last: %d  Best: %d", segment.lastTime, segment.bestTime))          
  130. end
  131.    
  132. while true do
  133.     StartSegment()
  134.    
  135.     local closerStart = false
  136.    
  137.     while not segment.done do
  138.         segment.failed = false
  139.         savestate.load(segment.start)        
  140.        
  141.         while not segment.done and not segment.failed and (DoNothing()) do
  142.             HandleKeys()
  143.             snes9x.frameadvance()
  144.            
  145.             --get a save state that's still in the transition, but close to the action for player control
  146.             if movie.framecount() == segment.actionStart - preFrames then
  147.                 savestate.save(segment.start)
  148.                 closerStart = true
  149.             end
  150.         end
  151.  
  152.         if not closerStart then
  153.             segment.actionStart = movie.framecount()
  154.         end
  155.  
  156.         while not segment.done and not segment.failed and ContinueAttempt() do
  157.             snes9x.frameadvance()
  158.             OutputTime()
  159.             HandleKeys()
  160.         end
  161.        
  162.         segment.lastTime = (movie.framecount() - segment.curTime)
  163.        
  164.         if (segment.bestTime > segment.lastTime) and (segment.lastTime > 10) and not segment.failed and not segment.done and SegmentOk() then
  165.             segment.bestTime = segment.lastTime
  166.             savestate.save(segment.best)
  167.         end
  168.     end
  169.    
  170.     if not segment.rollback then
  171.         savestate.save(segment.prevBest)
  172.         savestate.load(segment.best)
  173.         savestate.save(segment.prevStart)
  174.         segment.prevStart, segment.start = segment.start, segment.prevStart
  175.     else
  176.         savestate.load(segment.prevBest)
  177.         savestate.save(segment.best)
  178.         savestate.load(segment.prevStart)
  179.         savestate.save(segment.start)
  180.     end
  181. end
Add Comment
Please, Sign In to add comment