BizHawk/Assets/Lua/tasjudy.lua

139 lines
3.5 KiB
Lua

--
-- TASJudy - Judges so you don't have to.
-- Author: Raiscan
-- Timestamp: 201508041957
-- Version: 0.1
-- To change this template use File | Settings | File Templates.
--
local resultsFilePath = "F:\\competition\\results\\results.txt"
local gracePeriod = 10000
local gracePeriodCounter = 0
local separator = ","
local exitOnResults = true
local FAILURE_DOES_NOT_FINISH = "DNF"
local FAILURE_DISQUALIFIED = "DQ"
-- Main Function --
function judge()
if movie.startsfromsavestate() then
console.log("Movie starts from savestate, so disqualifying")
writeFailureToResults(FAILURE_DISQUALIFIED)
endScript()
return
end
while not hasCompletedGame() do
if movieHasFinished() then
if gracePeriodLimiter() then
console.log("Movie does not finish the game :(")
writeFailureToResults(FAILURE_DOES_NOT_FINISH)
endScript()
return
end
end
--The show must go on
emu.frameadvance()
end
--We must have finished!
console.log("Movie finished game.")
writeSuccessToResults(emu.framecount(), getInGameTime())
endScript()
end
-------- HELPER FUNCTIONS BELOW ---------
-- Edit this with game completion criteria as necessary --
function hasCompletedGame()
return mainmemory.read_s8(0x002C) == 1
end
-- Edit this with functionality for in game time --
function getInGameTime()
local millis = bizstring.hex(mainmemory.read_u8(0x0050)):reverse()
local seconds = bizstring.hex(mainmemory.read_u8(0x004F)):reverse()
local minutes = bizstring.hex(mainmemory.read_u8(0x004E)):reverse()
return minutes .. ":" .. seconds .. "." .. millis
end
-- Ends the script. If exitOnResults set, exits emulator.
function endScript()
client.pause()
if exitOnResults then
client.closerom()
client.exitCode(emu.framecount())
end
end
-- Parses the hash of the movie file calculated by RGamma's uploader.
function parseHash()
local moviePath = movie.filename()
local movieFile = moviePath:match("([^\\]+)$")
local hash = movieFile:match("^([^.]+)")
return hash
end
-- Alias for writing results; blanks out times with reason.
function writeFailureToResults(reason)
writeResults(parseHash(), movie.getheader()["Author"], reason, reason, reason)
end
-- Alias for writing results; takes in endFrame and in game time --
function writeSuccessToResults(endFrame, inGameTime)
writeResults(parseHash(), movie.getheader()["Author"], endFrame, movie.length(), inGameTime)
end
function movieHasFinished()
return movie.mode() == "FINISHED" or not movie.isloaded()
end
-- Opens results file and writes a single line of all information gathered --
function writeResults(hash, author, endFrame, length, inGameTime)
local resultsFile, err = io.open(resultsFilePath, "a")
if err then
console.log("Could not write results " .. err)
else
local hash = parseHash()
local resultsLine = hash ..
separator ..
author ..
separator ..
endFrame ..
separator ..
length ..
separator ..
inGameTime
resultsFile:write(resultsLine .. "\n")
resultsFile:close()
end
end
function gracePeriodLimiter()
if gracePeriodCounter < gracePeriod then
gracePeriodCounter = gracePeriodCounter + 1
end
return gracePeriodCounter >= gracePeriod
end
judge()