Lint bios and the rom (#321)

We now use illuaminate[1]'s linting facilities to check the rom and
bios.lua for a couple of common bugs and other problems.

Right now this doesn't detect any especially important bugs, though it
has caught lots of small things (unused variables, some noisy code). In
the future, the linter will grow in scope and features, which should
allow us to be stricter and catch most issues.

As a fun aside, we started off with ~150 bugs, and illuaminate was able
to fix all but 30 of them, which is pretty neat.

[1]: https://github.com/SquidDev/illuaminate
This commit is contained in:
SquidDev 2019-12-03 23:26:13 +00:00
parent 0ae70fed13
commit 86e0330100
43 changed files with 173 additions and 145 deletions

View File

@ -11,5 +11,8 @@ insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[*.sexp]
indent_size = 2
[*.properties]
insert_final_newline = false

View File

@ -4,6 +4,7 @@ on: [push, pull_request]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
@ -16,3 +17,17 @@ jobs:
- name: Build with Gradle
run: ./gradlew build --no-daemon
lint-lua:
name: Lint Lua
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Lint Lua code
run: |
test -d bin || mkdir bin
test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/bin/illuaminate
chmod +x bin/illuaminate
GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} bin/illuaminate lint --github

25
illuaminate.sexp Normal file
View File

@ -0,0 +1,25 @@
; -*- mode: Lisp;-*-
(sources
/src/main/resources/assets/computercraft/lua/bios.lua
/src/main/resources/assets/computercraft/lua/rom/)
(at /
(linters
;; It'd be nice to avoid this, but right now there's a lot of instances of it.
-var:set-loop
;; It's useful to name arguments for documentation, so we allow this. It'd
;; be good to find a compromise in the future, but this works for now.
-var:unused-arg))
;; We disable the two global linters in bios.lua and the APIs. In the future
;; hopefully we'll get illuaminate to handle this.
(at
(/src/main/resources/assets/computercraft/lua/bios.lua
/src/main/resources/assets/computercraft/lua/rom/apis/)
(linters -var:set-global -var:unused-global))
;; These warnings are broken right now
(at completion.lua (linters -doc:malformed-type))
(at (bios.lua worm.lua) (linters -control:unreachable))

View File

@ -184,7 +184,7 @@ function sleep( nTime )
expect(1, nTime, "number", "nil")
local timer = os.startTimer( nTime or 0 )
repeat
local sEvent, param = os.pullEvent( "timer" )
local _, param = os.pullEvent( "timer" )
until param == timer
end
@ -233,7 +233,7 @@ function write( sText )
newLine()
end
term.write( text )
text = string.sub( text, (w-x) + 2 )
text = string.sub( text, w-x + 2 )
x,y = term.getCursorPos()
end
else
@ -332,7 +332,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
local _, cy = term.getCursorPos()
term.setCursorPos( sx, cy )
local sReplace = (_bClear and " ") or _sReplaceChar
local sReplace = _bClear and " " or _sReplaceChar
if sReplace then
term.write( string.rep( sReplace, math.max( #sLine - nScroll, 0 ) ) )
else
@ -544,7 +544,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
end
end
local cx, cy = term.getCursorPos()
local _, cy = term.getCursorPos()
term.setCursorBlink( false )
term.setCursorPos( w + 1, cy )
print()
@ -775,7 +775,7 @@ if http then
if not ok then return ok, err end
while true do
local event, url, ok, err = os.pullEvent( "http_check" )
local _, url, ok, err = os.pullEvent( "http_check" )
if url == _url then return ok, err end
end
end
@ -808,8 +808,8 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
expect(3, bIncludeFiles, "boolean", "nil")
expect(4, bIncludeDirs, "boolean", "nil")
bIncludeFiles = (bIncludeFiles ~= false)
bIncludeDirs = (bIncludeDirs ~= false)
bIncludeFiles = bIncludeFiles ~= false
bIncludeDirs = bIncludeDirs ~= false
local sDir = sLocation
local nStart = 1
local nSlash = string.find( sPath, "[/\\]", nStart )
@ -836,9 +836,9 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
end
if sDir ~= "" then
if sPath == "" then
table.insert( tResults, (bIncludeDirs and "..") or "../" )
table.insert( tResults, bIncludeDirs and ".." or "../" )
elseif sPath == "." then
table.insert( tResults, (bIncludeDirs and ".") or "./" )
table.insert( tResults, bIncludeDirs and "." or "./" )
end
end
local tFiles = fs.list( sDir )
@ -867,7 +867,7 @@ end
-- Load APIs
local bAPIError = false
local tApis = fs.list( "rom/apis" )
for n,sFile in ipairs( tApis ) do
for _,sFile in ipairs( tApis ) do
if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = fs.combine( "rom/apis", sFile )
if not fs.isDir( sPath ) then
@ -881,7 +881,7 @@ end
if turtle and fs.isDir( "rom/apis/turtle" ) then
-- Load turtle APIs
local tApis = fs.list( "rom/apis/turtle" )
for n,sFile in ipairs( tApis ) do
for _,sFile in ipairs( tApis ) do
if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = fs.combine( "rom/apis/turtle", sFile )
if not fs.isDir( sPath ) then
@ -896,7 +896,7 @@ end
if pocket and fs.isDir( "rom/apis/pocket" ) then
-- Load pocket APIs
local tApis = fs.list( "rom/apis/pocket" )
for n,sFile in ipairs( tApis ) do
for _,sFile in ipairs( tApis ) do
if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = fs.combine( "rom/apis/pocket", sFile )
if not fs.isDir( sPath ) then
@ -946,7 +946,7 @@ end
-- Set default settings
settings.set( "shell.allow_startup", true )
settings.set( "shell.allow_disk_startup", (commands == nil) )
settings.set( "shell.allow_disk_startup", commands == nil )
settings.set( "shell.autocomplete", true )
settings.set( "edit.autocomplete", true )
settings.set( "edit.default_extension", "lua" )

View File

@ -33,9 +33,9 @@ local tNonNBTJSONCommands = {
[ "title" ] = true
}
local tCommands = native.list()
for n,sCommandName in ipairs(tCommands) do
for _,sCommandName in ipairs(tCommands) do
if env[ sCommandName ] == nil then
local bJSONIsNBT = (tNonNBTJSONCommands[ sCommandName ] == nil)
local bJSONIsNBT = tNonNBTJSONCommands[ sCommandName ] == nil
env[ sCommandName ] = function( ... )
local sCommand = collapseArgs( bJSONIsNBT, sCommandName, ... )
return native.exec( sCommand )

View File

@ -62,7 +62,7 @@ end
function stopAudio( name )
if not name then
for n,sName in ipairs( peripheral.getNames() ) do
for _,sName in ipairs( peripheral.getNames() ) do
stopAudio( sName )
end
else

View File

@ -13,7 +13,7 @@ local function trilaterate( A, B, C )
local d = a2b:length()
local ex = a2b:normalize( )
local i = ex:dot( a2c )
local ey = (a2c - (ex * i)):normalize()
local ey = (a2c - ex * i):normalize()
local j = ey:dot( a2c )
local ez = ex:cross( ey )
@ -24,13 +24,13 @@ local function trilaterate( A, B, C )
local x = (r1*r1 - r2*r2 + d*d) / (2*d)
local y = (r1*r1 - r3*r3 - x*x + (x-i)*(x-i) + j*j) / (2*j)
local result = A.vPosition + (ex * x) + (ey * y)
local result = A.vPosition + ex * x + ey * y
local zSquared = r1*r1 - x*x - y*y
if zSquared > 0 then
local z = math.sqrt( zSquared )
local result1 = result + (ez * z)
local result2 = result - (ez * z)
local result1 = result + ez * z
local result2 = result - ez * z
local rounded1, rounded2 = result1:round( 0.01 ), result2:round( 0.01 )
if rounded1.x ~= rounded2.x or rounded1.y ~= rounded2.y or rounded1.z ~= rounded2.z then
@ -66,7 +66,7 @@ function locate( _nTimeout, _bDebug )
-- Find a modem
local sModemSide = nil
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
sModemSide = sSide
break

View File

@ -37,7 +37,7 @@ function topics()
for sPath in string.gmatch(sPath, "[^:]+") do
if fs.isDir( sPath ) then
local tList = fs.list( sPath )
for n,sFile in pairs( tList ) do
for _,sFile in pairs( tList ) do
if string.sub( sFile, 1, 1 ) ~= "." then
if not fs.isDir( fs.combine( sPath, sFile ) ) then
if #sFile > 4 and sFile:sub(-4) == ".txt" then
@ -52,7 +52,7 @@ function topics()
-- Sort and return
local tItemList = {}
for sItem, b in pairs( tItems ) do
for sItem in pairs( tItems ) do
table.insert( tItemList, sItem )
end
table.sort( tItemList )

View File

@ -147,8 +147,8 @@ function drawBox( startX, startY, endX, endY, nColour )
drawPixelInternal( x, maxY )
end
if (maxY - minY) >= 2 then
for y=(minY+1),(maxY-1) do
if maxY - minY >= 2 then
for y=minY+1,maxY-1 do
drawPixelInternal( minX, y )
drawPixelInternal( maxX, y )
end

View File

@ -4,12 +4,12 @@ local native = peripheral
function getNames()
local tResults = {}
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if native.isPresent( sSide ) then
table.insert( tResults, sSide )
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
local tRemote = native.call( sSide, "getNamesRemote" )
for n,sName in ipairs( tRemote ) do
for _,sName in ipairs( tRemote ) do
table.insert( tResults, sName )
end
end
@ -23,7 +23,7 @@ function isPresent( _sSide )
if native.isPresent( _sSide ) then
return true
end
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then
return true
@ -38,7 +38,7 @@ function getType( _sSide )
if native.isPresent( _sSide ) then
return native.getType( _sSide )
end
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then
return native.call( sSide, "getTypeRemote", _sSide )
@ -53,7 +53,7 @@ function getMethods( _sSide )
if native.isPresent( _sSide ) then
return native.getMethods( _sSide )
end
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then
return native.call( sSide, "getMethodsRemote", _sSide )
@ -69,7 +69,7 @@ function call( _sSide, _sMethod, ... )
if native.isPresent( _sSide ) then
return native.call( _sSide, _sMethod, ... )
end
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then
return native.call( sSide, "callRemote", _sSide, _sMethod, ... )
@ -84,7 +84,7 @@ function wrap( _sSide )
if peripheral.isPresent( _sSide ) then
local tMethods = peripheral.getMethods( _sSide )
local tResult = {}
for n,sMethod in ipairs( tMethods ) do
for _,sMethod in ipairs( tMethods ) do
tResult[sMethod] = function( ... )
return peripheral.call( _sSide, sMethod, ... )
end
@ -98,7 +98,7 @@ function find( sType, fnFilter )
expect(1, sType, "string")
expect(2, fnFilter, "function", "nil")
local tResults = {}
for n,sName in ipairs( peripheral.getNames() ) do
for _,sName in ipairs( peripheral.getNames() ) do
if peripheral.getType( sName ) == sType then
local wrapped = peripheral.wrap( sName )
if fnFilter == nil or fnFilter( sName, wrapped ) then

View File

@ -27,7 +27,7 @@ function close( sModem )
peripheral.call( sModem, "close", CHANNEL_BROADCAST )
else
-- Close all modems
for n,sModem in ipairs( peripheral.getNames() ) do
for _,sModem in ipairs( peripheral.getNames() ) do
if isOpen( sModem ) then
close( sModem )
end
@ -44,7 +44,7 @@ function isOpen( sModem )
end
else
-- Check if any modem is open
for n,sModem in ipairs( peripheral.getNames() ) do
for _,sModem in ipairs( peripheral.getNames() ) do
if isOpen( sModem ) then
return true
end
@ -79,10 +79,10 @@ function send( nRecipient, message, sProtocol )
sent = true
else
-- Send on all open modems, to the target and to repeaters
for n,sModem in ipairs( peripheral.getNames() ) do
for _,sModem in ipairs( peripheral.getNames() ) do
if isOpen( sModem ) then
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage );
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage );
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage )
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage )
sent = true
end
end

View File

@ -47,7 +47,7 @@ end
function getNames()
local result = {}
for k,v in pairs( tSettings ) do
for k in pairs( tSettings ) do
result[ #result + 1 ] = k
end
table.sort(result)

View File

@ -1,6 +1,6 @@
local expect = dofile("rom/modules/main/cc/expect.lua").expect
local native = (term.native and term.native()) or term
local native = term.native and term.native() or term
local redirectTarget = native
local function wrap( _sFunction )

View File

@ -16,7 +16,7 @@ function slowWrite( sText, nRate )
term.setCursorPos( x, y )
sleep( nSleep )
local nLines = write( string.sub( sText, 1, n ) )
local newX, newY = term.getCursorPos()
local _, newY = term.getCursorPos()
y = newY - nLines
end
end
@ -54,11 +54,11 @@ local function makePagedScroll( _term, _nFreeLines )
local nativeScroll = _term.scroll
local nFreeLines = _nFreeLines or 0
return function( _n )
for n=1,_n do
for _=1,_n do
nativeScroll( 1 )
if nFreeLines <= 0 then
local w,h = _term.getSize()
local _,h = _term.getSize()
_term.setCursorPos( 1, h )
_term.write( "Press any key to continue" )
os.pullEvent( "key" )
@ -123,7 +123,7 @@ local function tabulateCommon( bPaged, ... )
local nCols = math.floor( w / nMaxLen )
local nLines = 0
local function newLine()
if bPaged and nLines >= (h-3) then
if bPaged and nLines >= h-3 then
pagedPrint()
else
print()
@ -133,14 +133,14 @@ local function tabulateCommon( bPaged, ... )
local function drawCols( _t )
local nCol = 1
for n, s in ipairs( _t ) do
for _, s in ipairs( _t ) do
if nCol > nCols then
nCol = 1
newLine()
end
local cx, cy = term.getCursorPos()
cx = 1 + ((nCol - 1) * nMaxLen)
cx = 1 + (nCol - 1) * nMaxLen
term.setCursorPos( cx, cy )
term.write( s )
@ -148,7 +148,7 @@ local function tabulateCommon( bPaged, ... )
end
print()
end
for n, t in ipairs( tAll ) do
for _, t in ipairs( tAll ) do
if type(t) == "table" then
if #t > 0 then
drawCols( t )
@ -280,7 +280,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
nObjectSize = nObjectSize + 1
end
end
for n,v in ipairs(t) do
for _,v in ipairs(t) do
local sEntry = serializeJSONImpl( v, tTracking, bNBTStyle )
if nArraySize == 0 then
sArrayResult = sArrayResult .. sEntry

View File

@ -54,9 +54,9 @@ local vector = {
round = function( self, nTolerance )
nTolerance = nTolerance or 1.0
return vector.new(
math.floor( (self.x + (nTolerance * 0.5)) / nTolerance ) * nTolerance,
math.floor( (self.y + (nTolerance * 0.5)) / nTolerance ) * nTolerance,
math.floor( (self.z + (nTolerance * 0.5)) / nTolerance ) * nTolerance
math.floor( (self.x + nTolerance * 0.5) / nTolerance ) * nTolerance,
math.floor( (self.y + nTolerance * 0.5) / nTolerance ) * nTolerance,
math.floor( (self.z + nTolerance * 0.5) / nTolerance ) * nTolerance
)
end,
tostring = function( self )

View File

@ -49,7 +49,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
createEmptyLines( nWidth )
-- Setup
local bVisible = (bStartVisible ~= false)
local bVisible = bStartVisible ~= false
local nCursorX = 1
local nCursorY = 1
local bCursorBlink = false

View File

@ -172,7 +172,6 @@ local function resizeWindows()
end
for n=1,#tProcesses do
local tProcess = tProcesses[n]
local window = tProcess.window
local x,y = tProcess.window.getCursorPos()
if y > windowHeight then
tProcess.window.scroll( y - windowHeight )
@ -232,7 +231,7 @@ function multishell.launch( tProgramEnv, sProgramPath, ... )
expect(1, tProgramEnv, "table")
expect(2, sProgramPath, "string")
local previousTerm = term.current()
setMenuVisible( (#tProcesses + 1) >= 2 )
setMenuVisible( #tProcesses + 1 >= 2 )
local nResult = launchProcess( false, tProgramEnv, sProgramPath, ... )
redrawMenu()
term.redirect( previousTerm )
@ -299,7 +298,7 @@ while #tProcesses > 0 do
end
else
-- Passthrough to current process
resumeProcess( nCurrentProcess, sEvent, button, x, (bShowMenu and y-1) or y )
resumeProcess( nCurrentProcess, sEvent, button, x, bShowMenu and y-1 or y )
if cullProcess( nCurrentProcess ) then
setMenuVisible( #tProcesses >= 2 )
redrawMenu()
@ -319,7 +318,7 @@ while #tProcesses > 0 do
end
elseif not (bShowMenu and y == 1) then
-- Passthrough to current process
resumeProcess( nCurrentProcess, sEvent, p1, x, (bShowMenu and y-1) or y )
resumeProcess( nCurrentProcess, sEvent, p1, x, bShowMenu and y-1 or y )
if cullProcess( nCurrentProcess ) then
setMenuVisible( #tProcesses >= 2 )
redrawMenu()

View File

@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
local sDest = shell.resolve( tArgs[2] )
local tFiles = fs.find( sSource )
if #tFiles > 0 then
for n,sFile in ipairs( tFiles ) do
for _,sFile in ipairs( tFiles ) do
if fs.isDir( sDest ) then
fs.copy( sFile, fs.combine( sDest, fs.getName(sFile) ) )
elseif #tFiles == 1 then

View File

@ -8,7 +8,7 @@ end
for i = 1, args.n do
local files = fs.find(shell.resolve(args[i]))
if #files > 0 then
for n, file in ipairs(files) do
for _, file in ipairs(files) do
local ok, err = pcall(fs.delete, file)
if not ok then
printError((err:gsub("^pcall: ", "")))

View File

@ -10,9 +10,9 @@ if fs.exists( sPath ) then
write( fs.getDrive( sPath ) .. " (" )
local nSpace = fs.getFreeSpace( sPath )
if nSpace >= 1000 * 1000 then
print( (math.floor( nSpace / (100 * 1000) ) / 10) .. "MB remaining)" )
print( math.floor( nSpace / (100 * 1000) ) / 10 .. "MB remaining)" )
elseif nSpace >= 1000 then
print( (math.floor( nSpace / 100 ) / 10) .. "KB remaining)" )
print( math.floor( nSpace / 100 ) / 10 .. "KB remaining)" )
else
print( nSpace .. "B remaining)" )
end

View File

@ -95,7 +95,7 @@ local function save( _sPath )
local function innerSave()
file, fileerr = fs.open( _sPath, "w" )
if file then
for n, sLine in ipairs( tLines ) do
for _, sLine in ipairs( tLines ) do
file.write( sLine .. "\n" )
end
else
@ -287,7 +287,7 @@ local tMenuFuncs = {
if bReadOnly then
sStatus = "Access denied"
else
local ok, err, fileerr = save( sPath )
local ok, _, fileerr = save( sPath )
if ok then
sStatus="Saved to "..sPath
else
@ -357,7 +357,7 @@ local tMenuFuncs = {
term.redirect( printerTerminal )
local ok, error = pcall( function()
term.scroll()
for n, sLine in ipairs( tLines ) do
for _, sLine in ipairs( tLines ) do
print( sLine )
end
end )
@ -385,7 +385,7 @@ local tMenuFuncs = {
end,
Run = function()
local sTempPath = "/.temp"
local ok, err = save( sTempPath )
local ok = save( sTempPath )
if ok then
local nTask = shell.openTab( sTempPath )
if nTask then
@ -411,7 +411,7 @@ local function doMenuItem( _n )
end
local function setCursor( newX, newY )
local oldX, oldY = x, y
local _, oldY = x, y
x, y = newX, newY
local screenX = x - scrollX
local screenY = y - scrollY
@ -476,7 +476,6 @@ end
while bRunning do
local sEvent, param, param2, param3 = os.pullEvent()
if sEvent == "key" then
local oldX, oldY = x, y
if param == keys.up then
-- Up
if not bMenu then

View File

@ -186,8 +186,8 @@ local function drawInterface()
term.write("\127\127")
-- Left and Right Selected Colours
for i=18,18 do
term.setCursorPos(w-1, i)
do
term.setCursorPos(w-1, 18)
if leftColour ~= nil then
term.setBackgroundColour( leftColour )
term.write(" ")
@ -269,7 +269,7 @@ local function accessMenu()
for k,v in pairs(mChoices) do
if selection==k then
term.setTextColour(colours.yellow)
local ox,_ = term.getCursorPos()
local ox = term.getCursorPos()
term.write("["..string.rep(" ",#v).."]")
term.setCursorPos(ox+1,h)
term.setTextColour(colours.white)

View File

@ -66,8 +66,8 @@ local function printCentred( yc, stg )
end
local function centerOrgin()
XOrgin = math.floor((TermW/2)-(SizeW/2))
YOrgin = math.floor((TermH/2)-(SizeH/2))
XOrgin = math.floor(TermW/2-SizeW/2)
YOrgin = math.floor(TermH/2-SizeH/2)
end
local function reMap()
@ -177,7 +177,6 @@ local function loadLevel(nNum)
local sLevelD = sDir .. "/levels/" .. tostring(nNum)..".dat"
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : "..sLevelD) end
fLevel = fs.open(sLevelD,"r")
local Line = 0
local wl = true
Blocks = tonumber(string.sub(fLevel.readLine(),1,1))
local xSize = string.len(fLevel.readLine())+2
@ -557,7 +556,7 @@ function InterFace.render()
elseif p3 == TermH and p2 >= TermW-4 and p2 <= TermW-3 then
bPaused = not bPaused
fSpeedS = false
Speed = (bPaused and 0) or nSpeed
Speed = bPaused and 0 or nSpeed
if Speed > 0 then
Tick = os.startTimer(Speed)
else
@ -567,7 +566,7 @@ function InterFace.render()
elseif p3 == TermH and p2 >= TermW-1 then
bPaused = false
fSpeedS = not fSpeedS
Speed = (fSpeedS and fSpeed) or nSpeed
Speed = fSpeedS and fSpeed or nSpeed
Tick = os.startTimer(Speed)
InterFace.drawBar()
elseif p3-1 < YOrgin+SizeH+1 and p3-1 > YOrgin and
@ -596,7 +595,6 @@ local function startG(LevelN)
drawStars()
loadLevel(LevelN)
centerOrgin()
local create = true
drawMap()
InterFace.drawBar()
gRender("start")

View File

@ -342,7 +342,7 @@ local function getTimeOfDay()
end
local function isSunny()
return (getTimeOfDay() < 10)
return getTimeOfDay() < 10
end
local function getRoom( x, y, z, dontCreate )
@ -365,7 +365,7 @@ local function getRoom( x, y, z, dontCreate )
-- Add animals
if math.random(1,3) == 1 then
for n = 1,math.random(1,2) do
for _ = 1,math.random(1,2) do
local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ]
room.items[ sAnimal ] = items[ sAnimal ]
end
@ -478,7 +478,7 @@ local function findItem( _tList, _sQuery )
return sItem
end
if tItem.aliases ~= nil then
for n, sAlias in pairs( tItem.aliases ) do
for _, sAlias in pairs( tItem.aliases ) do
if sAlias == _sQuery then
return sItem
end
@ -613,7 +613,7 @@ local function doCommand( text )
end
for sCommand, t in pairs( tMatches ) do
for n, sMatch in pairs( t ) do
for _, sMatch in pairs( t ) do
local tCaptures = { string.match( text, "^" .. sMatch .. "$" ) }
if #tCaptures ~= 0 then
local fnCommand = commands[ sCommand ]
@ -679,7 +679,7 @@ function commands.look( _sTarget )
end
if tItem then
print( tItem.desc or ("You see nothing special about "..sItem..".") )
print( tItem.desc or "You see nothing special about "..sItem.."." )
else
print( "You don't see any ".._sTarget.." here." )
end
@ -752,7 +752,7 @@ function commands.dig( _sDir, _sTool )
tTool = inventory[ sTool ]
end
local bActuallyDigging = (room.exits[ _sDir ] ~= true)
local bActuallyDigging = room.exits[ _sDir ] ~= true
if bActuallyDigging then
if sTool == nil or tTool.toolType ~= "pick" then
print( "You need to use a pickaxe to dig through stone." )
@ -1021,7 +1021,7 @@ function commands.cbreak( _sItem, _sTool )
print( "The "..tItem.aliases[1].." dies." )
if tItem.drops then
for n, sDrop in pairs( tItem.drops ) do
for _, sDrop in pairs( tItem.drops ) do
if not room.items[sDrop] then
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
room.items[sDrop] = items[sDrop]
@ -1037,7 +1037,7 @@ function commands.cbreak( _sItem, _sTool )
end
if tItem.hitDrops then
for n, sDrop in pairs( tItem.hitDrops ) do
for _, sDrop in pairs( tItem.hitDrops ) do
if not room.items[sDrop] then
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
room.items[sDrop] = items[sDrop]
@ -1071,18 +1071,17 @@ function commands.craft( _sItem )
return
end
local room = getRoom( x,y,z )
local sItem = findItem( items, _sItem )
local tRecipe = (sItem and tRecipes[ sItem ]) or nil
local tRecipe = sItem and tRecipes[ sItem ] or nil
if tRecipe then
for n,sReq in ipairs( tRecipe ) do
for _,sReq in ipairs( tRecipe ) do
if inventory[sReq] == nil then
print( "You don't have the items you need to craft "..sItem.."." )
return
end
end
for n,sReq in ipairs( tRecipe ) do
for _,sReq in ipairs( tRecipe ) do
inventory[sReq] = nil
end
inventory[ sItem ] = items[ sItem ]
@ -1223,7 +1222,7 @@ local function simulate()
-- Spawn monsters
if room.nMonsters < 2 and
((h == 0 and not isSunny() and not room.items["a torch"]) or room.dark) and
(h == 0 and not isSunny() and not room.items["a torch"] or room.dark) and
math.random(1,6) == 1 then
local sMonster = tMonsters[ math.random(1,#tMonsters) ]
@ -1240,7 +1239,7 @@ local function simulate()
-- Burn monsters
if h == 0 and isSunny() then
for n,sMonster in ipairs( tMonsters ) do
for _,sMonster in ipairs( tMonsters ) do
if room.items[sMonster] and items[sMonster].nocturnal then
room.items[sMonster] = nil
if sx == 0 and sy == 0 and sz == 0 and not room.dark then
@ -1258,10 +1257,10 @@ local function simulate()
-- Make monsters attack
local room = getRoom( x, y, z )
if nTimeInRoom >= 2 and not bNewMonstersThisRoom then
for n,sMonster in ipairs( tMonsters ) do
for _,sMonster in ipairs( tMonsters ) do
if room.items[sMonster] then
if math.random(1,4) == 1 and
not (y == 0 and isSunny() and (sMonster == "a spider")) then
not (y == 0 and isSunny() and sMonster == "a spider") then
if sMonster == "a creeper" then
if room.dark then
print( "A creeper explodes." )

View File

@ -23,7 +23,7 @@ elseif sCommand == "play" or sCommand == nil then
if sName == nil then
-- No disc specified, pick one at random
local tNames = {}
for n,sName in ipairs( peripheral.getNames() ) do
for _,sName in ipairs( peripheral.getNames() ) do
if disk.isPresent( sName ) and disk.hasAudio( sName ) then
table.insert( tNames, sName )
end

View File

@ -2,15 +2,13 @@
-- Display the start screen
local w,h = term.getSize()
local titleColour, headingColour, textColour, wormColour, fruitColour
local headingColour, textColour, wormColour, fruitColour
if term.isColour() then
titleColour = colours.red
headingColour = colours.yellow
textColour = colours.white
wormColour = colours.green
fruitColour = colours.red
else
titleColour = colours.white
headingColour = colours.white
textColour = colours.white
wormColour = colours.white
@ -27,8 +25,6 @@ end
local xVel,yVel = 1,0
local xPos, yPos = math.floor(w/2), math.floor(h/2)
local pxVel, pyVel = nil, nil
local nLength = 1
local nExtraLength = 6
local bRunning = true
@ -103,7 +99,6 @@ local function drawMenu()
end
local function update( )
local x,y = xPos,yPos
if pxVel and pyVel then
xVel, yVel = pxVel, pyVel
pxVel, pyVel = nil, nil
@ -190,7 +185,7 @@ end
drawMenu()
drawFrontend()
while true do
local e,key = os.pullEvent( "key" )
local _,key = os.pullEvent( "key" )
if key == keys.up or key == keys.w then
-- Up
if nDifficulty > 1 then
@ -228,7 +223,7 @@ addFruit()
-- Play the game
local timer = os.startTimer(0)
while bRunning do
local event, p1, p2 = os.pullEvent()
local event, p1 = os.pullEvent()
if event == "timer" and p1 == timer then
timer = os.startTimer(nInterval)
update( false )

View File

@ -28,7 +28,7 @@ elseif sCommand == "host" then
-- Find a modem
local sModemSide = nil
for n,sSide in ipairs( rs.getSides() ) do
for _,sSide in ipairs( rs.getSides() ) do
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
sModemSide = sSide
break
@ -80,7 +80,7 @@ elseif sCommand == "host" then
-- Print the number of requests handled
nServed = nServed + 1
if nServed > 1 then
local x,y = term.getCursorPos()
local _,y = term.getCursorPos()
term.setCursorPos(1,y-1)
end
print( nServed.." GPS requests served" )

View File

@ -14,7 +14,7 @@ if sTopic == "index" then
end
local sFile = help.lookup( sTopic )
local file = ((sFile ~= nil) and io.open( sFile )) or nil
local file = sFile ~= nil and io.open( sFile ) or nil
if file then
local sContents = file:read("*a")
file:close()

View File

@ -18,7 +18,7 @@ local tFiles = {}
local tDirs = {}
local bShowHidden = settings.get( "list.show_hidden" )
for n, sItem in pairs( tAll ) do
for _, sItem in pairs( tAll ) do
if bShowHidden or string.sub( sItem, 1, 1 ) ~= "." then
local sPath = fs.combine( sDir, sItem )
if fs.isDir( sPath ) then

View File

@ -67,7 +67,7 @@ while bRunning do
local nForcePrint = 0
local func, e = load( s, "=lua", "t", tEnv )
local func2, e2 = load( "return _echo("..s..");", "=lua", "t", tEnv )
local func2 = load( "return _echo("..s..");", "=lua", "t", tEnv )
if not func then
if func2 then
func = func2
@ -84,7 +84,7 @@ while bRunning do
local tResults = table.pack( pcall( func ) )
if tResults[1] then
local n = 1
while n < tResults.n or (n <= nForcePrint) do
while n < tResults.n or n <= nForcePrint do
local value = tResults[ n + 1 ]
if type( value ) == "table" then
local metatable = getmetatable( value )

View File

@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
local sDest = shell.resolve( tArgs[2] )
local tFiles = fs.find( sSource )
if #tFiles > 0 then
for n,sFile in ipairs( tFiles ) do
for _,sFile in ipairs( tFiles ) do
if fs.isDir( sDest ) then
fs.move( sFile, fs.combine( sDest, fs.getName(sFile) ) )
elseif #tFiles == 1 then

View File

@ -424,7 +424,7 @@ local function playGame()
end
if #rows>0 then
for i=1,4 do
for _=1,4 do
sleep(.1)
for r=1,#rows do
r=rows[r]
@ -469,7 +469,6 @@ local function playGame()
end
local function blockFall()
local result = false
if testBlockAt(curBlock,curX,curY+1,curRot) then
pitBlock(curBlock,curX,curY,curRot)
--detect rows that clear
@ -524,16 +523,16 @@ local function playGame()
dropTimer=os.startTimer(dropSpeed)
end
if dx+dr~=0 then
if not testBlockAt(curBlock,curX+dx,curY+dy,(dr>0 and curRot%#curBlock+dr or curRot)) then
if not testBlockAt(curBlock,curX+dx,curY+dy,dr>0 and curRot%#curBlock+dr or curRot) then
eraseBlockAt(curBlock,curX,curY,curRot)
curX=curX+dx
curY=curY+dy
curRot=dr==0 and curRot or (curRot%#curBlock+dr)
curRot=dr==0 and curRot or curRot%#curBlock+dr
drawBlockAt(curBlock,curX,curY,curRot)
end
end
elseif e[1]=="term_resize" then
local w,h=term.getSize()
local _,h=term.getSize()
if h==20 then
heightAdjust=0
else
@ -617,7 +616,7 @@ local function runMenu()
level=math.max(level-1,1)
drawMenu()
elseif key>=keys.one and key<=keys.nine and selected==1 then
level=(key-keys.one) + 1
level=key-keys.one + 1
drawMenu()
elseif key==keys.up or key==keys.w then
selected=selected-1

View File

@ -9,7 +9,7 @@ end
local sOpenedModem = nil
local function openModem()
for n,sModem in ipairs( peripheral.getNames() ) do
for _,sModem in ipairs( peripheral.getNames() ) do
if peripheral.getType( sModem ) == "modem" then
if not rednet.isOpen( sModem ) then
rednet.open( sModem )
@ -94,7 +94,7 @@ if sCommand == "host" then
end
local function printUsers()
local x,y = term.getCursorPos()
local _,y = term.getCursorPos()
term.setCursorPos( 1, y - 1 )
term.clearLine()
if nUsers == 1 then
@ -108,7 +108,7 @@ if sCommand == "host" then
local ok, error = pcall( function()
parallel.waitForAny( function()
while true do
local sEvent, timer = os.pullEvent( "timer" )
local _, timer = os.pullEvent( "timer" )
local nUserID = tPingPongTimer[ timer ]
if nUserID and tUsers[ nUserID ] then
local tUser = tUsers[ nUserID ]
@ -148,7 +148,7 @@ if sCommand == "host" then
["users"] = function( tUser, sContent )
send( "* Connected Users:", tUser.nUserID )
local sUsers = "*"
for nUserID, tUser in pairs( tUsers ) do
for _, tUser in pairs( tUsers ) do
sUsers = sUsers .. " " .. tUser.sUsername
end
send( sUsers, tUser.nUserID )
@ -156,7 +156,7 @@ if sCommand == "host" then
["help"] = function( tUser, sContent )
send( "* Available commands:", tUser.nUserID )
local sCommands = "*"
for sCommand, fnCommand in pairs( tCommands ) do
for sCommand in pairs( tCommands ) do
sCommands = sCommands .. " /" .. sCommand
end
send( sCommands.." /logout", tUser.nUserID )
@ -297,8 +297,7 @@ elseif sCommand == "join" then
promptWindow.restoreCursor()
local function drawTitle()
local x,y = titleWindow.getCursorPos()
local w,h = titleWindow.getSize()
local w = titleWindow.getSize()
local sTitle = sUsername.." on "..sHostname
titleWindow.setTextColour( highlightColour )
titleWindow.setCursorPos( math.floor( w/2 - string.len(sTitle)/2 ), 1 )
@ -410,7 +409,7 @@ elseif sCommand == "join" then
term.redirect( parentTerm )
-- Print error notice
local w,h = term.getSize()
local _,h = term.getSize()
term.setCursorPos( 1, h )
term.clearLine()
term.setCursorBlink( false )

View File

@ -1,7 +1,7 @@
-- Find modems
local tModems = {}
for n,sModem in ipairs( peripheral.getNames() ) do
for _,sModem in ipairs( peripheral.getNames() ) do
if peripheral.getType( sModem ) == "modem" then
table.insert( tModems, sModem )
end
@ -59,7 +59,7 @@ local ok, error = pcall( function()
-- Log the event
nTransmittedMessages = nTransmittedMessages + 1
local x,y = term.getCursorPos()
local _,y = term.getCursorPos()
term.setCursorPos( 1, y - 1 )
term.clearLine()
if nTransmittedMessages == 1 then

View File

@ -17,7 +17,7 @@ if sCommand == "probe" then
local count = 0
local bundledCount = 0
for n,sSide in ipairs( redstone.getSides() ) do
for _,sSide in ipairs( redstone.getSides() ) do
if redstone.getBundledInput( sSide ) > 0 then
bundledCount = bundledCount + 1
end
@ -39,7 +39,7 @@ if sCommand == "probe" then
if bundledCount > 0 then
print()
print( "Bundled inputs:" )
for i,sSide in ipairs( redstone.getSides() ) do
for _,sSide in ipairs( redstone.getSides() ) do
local nInput = redstone.getBundledInput( sSide )
if nInput ~= 0 then
write( sSide..": " )
@ -69,7 +69,7 @@ elseif sCommand == "pulse" then
local sSide = tArgs[2]
local nCount = tonumber( tArgs[3] ) or 1
local nPeriod = tonumber( tArgs[4] ) or 0.5
for n=1,nCount do
for _=1,nCount do
redstone.setOutput( sSide, true )
sleep( nPeriod / 2 )
redstone.setOutput( sSide, false )

View File

@ -2,7 +2,7 @@
local tArgs = { ... }
if #tArgs == 0 then
-- "set"
local x,y = term.getCursorPos()
local _,y = term.getCursorPos()
local tSettings = {}
for n,sName in ipairs( settings.getNames() ) do
tSettings[n] = textutils.serialize(sName) .. " is " .. textutils.serialize(settings.get(sName))

View File

@ -9,10 +9,10 @@ if multishell then
end
local bExit = false
local sDir = (parentShell and parentShell.dir()) or ""
local sPath = (parentShell and parentShell.path()) or ".:/rom/programs"
local tAliases = (parentShell and parentShell.aliases()) or {}
local tCompletionInfo = (parentShell and parentShell.getCompletionInfo()) or {}
local sDir = parentShell and parentShell.dir() or ""
local sPath = parentShell and parentShell.path() or ".:/rom/programs"
local tAliases = parentShell and parentShell.aliases() or {}
local tCompletionInfo = parentShell and parentShell.getCompletionInfo() or {}
local tProgramStack = {}
local shell = {}
@ -287,7 +287,7 @@ function shell.programs( _bIncludeHidden )
-- Sort and return
local tItemList = {}
for sItem, b in pairs( tItems ) do
for sItem in pairs( tItems ) do
table.insert( tItemList, sItem )
end
table.sort( tItemList )
@ -304,7 +304,7 @@ local function completeProgram( sLine )
local tSeen = {}
-- Add aliases
for sAlias, sCommand in pairs( tAliases ) do
for sAlias in pairs( tAliases ) do
if #sAlias > #sLine and string.sub( sAlias, 1, #sLine ) == sLine then
local sResult = string.sub( sAlias, #sLine + 1 )
if not tSeen[ sResult ] then

View File

@ -81,7 +81,7 @@ textutils.slowWrite( "Preparing to get down." )
textutils.slowPrint( "..", 0.75 )
local sAudio = nil
for n,sName in pairs( peripheral.getNames() ) do
for _,sName in pairs( peripheral.getNames() ) do
if disk.hasAudio( sName ) then
disk.playAudio( sName )
print( "Jamming to "..disk.getAudioTitle( sName ) )
@ -95,7 +95,7 @@ print( "Press any key to stop the groove" )
parallel.waitForAny(
function()
while not bEnd do
local event, key = os.pullEvent("key")
local _, key = os.pullEvent("key")
if key ~= keys.escape then
return
end

View File

@ -81,7 +81,7 @@ local function collect()
if nTotalItems > collected then
collected = nTotalItems
if math.fmod(collected + unloaded, 50) == 0 then
print( "Mined "..(collected + unloaded).." items." )
print( "Mined "..collected + unloaded.." items." )
end
end
@ -98,9 +98,8 @@ function refuel( ammount )
return true
end
local needed = ammount or (xPos + zPos + depth + 2)
local needed = ammount or xPos + zPos + depth + 2
if turtle.getFuelLevel() < needed then
local fueled = false
for n=1,16 do
if turtle.getItemCount(n) > 0 then
turtle.select(n)
@ -292,7 +291,7 @@ local alternate = 0
local done = false
while not done do
for n=1,size do
for m=1,size-1 do
for _=1,size-1 do
if not tryForwards() then
done = true
break
@ -354,4 +353,4 @@ if reseal then
turtle.placeDown()
end
print( "Mined "..(collected + unloaded).." items total." )
print( "Mined "..collected + unloaded.." items total." )

View File

@ -23,7 +23,7 @@ end
if turtle.getFuelLevel() ~= "unlimited" then
for n = 1, 16 do
-- Stop if we've reached the limit, or are fully refuelled.
if (nLimit and nLimit <= 0) or turtle.getFuelLevel() >= turtle.getFuelLimit() then
if nLimit and nLimit <= 0 or turtle.getFuelLevel() >= turtle.getFuelLimit() then
break
end

View File

@ -15,8 +15,6 @@ if length < 1 then
print( "Tunnel length must be positive" )
return
end
local depth = 0
local collected = 0
local function collect()

View File

@ -31,7 +31,7 @@ while nArg <= #tArgs do
local fnHandler = tHandlers[string.lower(sDirection)]
if fnHandler then
for n=1,nDistance do
for _=1,nDistance do
fnHandler( nArg )
end
else

View File

@ -163,7 +163,7 @@ if settings.get( "shell.allow_startup" ) then
tUserStartups = findStartups( "/" )
end
if settings.get( "shell.allow_disk_startup" ) then
for n,sName in pairs( peripheral.getNames() ) do
for _,sName in pairs( peripheral.getNames() ) do
if disk.isPresent( sName ) and disk.hasData( sName ) then
local startups = findStartups( disk.getMountPath( sName ) )
if startups then