From 888619ec34e04f3d330c687bf8b0ea55f92a8bcb Mon Sep 17 00:00:00 2001 From: equa Date: Sat, 24 Apr 2021 13:26:17 -0500 Subject: clean up --- .gitignore | 2 + LICENSE.txt | 21 +++ Makefile | 6 + NOTICE.txt | 8 + conf.lua | 1 + lib/game.fnl | 1 - lib/main.fnl | 16 +- lib/transition.fnl | 2 - main.lua | 4 +- vendor/ProFi.lua | 457 ----------------------------------------------------- 10 files changed, 42 insertions(+), 476 deletions(-) create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 NOTICE.txt delete mode 100644 vendor/ProFi.lua diff --git a/.gitignore b/.gitignore index a941931..65c1eed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ junk +lib/*.lua +release diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..997ccc1 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +soko + +Copyright (c) 2021 equa + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c3c9a3e --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +OUTLUA := $(patsubst %.fnl,%.lua,$(wildcard lib/*.fnl)) + +all: $(OUTLUA) + +%.lua: %.fnl + fennel --compile $< > $@ diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 0000000..78083f4 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,8 @@ +soko +copyright equa 2021 (LICENSE.txt) + +This software uses code from lume, released by rxi under the MIT license. For +more information, see vendor/lume.lua. + +This software uses fonts by the Montserrat Project authors under the SIL Open +Font License. For more information, see font/OFL.txt. diff --git a/conf.lua b/conf.lua index 97aec1f..233df48 100644 --- a/conf.lua +++ b/conf.lua @@ -3,4 +3,5 @@ function love.conf(t) t.window.title = "soko" t.window.vsync = 1 t.window.msaa = 1 + t.version = "11.3" end diff --git a/lib/game.fnl b/lib/game.fnl index 833de6b..bf4b857 100644 --- a/lib/game.fnl +++ b/lib/game.fnl @@ -5,7 +5,6 @@ (local entity (require :lib.entity)) (local player (require :lib.player)) (local transition (require :lib.transition)) -(local fv (require :fennel.view)) (local music-state (require :lib.music-state)) (fn lerp* [a b c d x] diff --git a/lib/main.fnl b/lib/main.fnl index b657d94..90048d5 100644 --- a/lib/main.fnl +++ b/lib/main.fnl @@ -4,8 +4,6 @@ (local game (require :lib.game)) (local music (require :lib.music)) (local font (require :lib.font)) -(local profi (require :vendor.ProFi)) -(local profi? false) ;; i am thinking we could actually do a really hacky thing (modules add themselves ;; to this list) with this later but @@ -26,9 +24,6 @@ (fn love.load [] (music.load) - (when profi? - (profi:start) - (set love.frame 0)) (love.keyboard.setKeyRepeat true) (global the-state (state.init game)) (global messages (or messages {}))) @@ -57,13 +52,6 @@ (fn love.update [] (music.pre-update) - (when profi? - (profi:startHooks) - (set love.frame (+ love.frame 1)) - (when (= (% love.frame 100) 0) - (profi:stop) - (profi:writeReport) - (os.exit))) ;; TODO: make state changes actually possible (match (pcall #(state.update the-state)) (true next) (global the-state next) @@ -73,9 +61,7 @@ (table.insert messages {:ticks 1 :msg (.. "update: \n" x)}))) - (music.update) - (when profi? - (profi:stopHooks))) + (music.update)) (fn love.mousepressed [x y button] (match (pcall #(state.mousepressed the-state x y button)) diff --git a/lib/transition.fnl b/lib/transition.fnl index c1a81a0..e48411d 100644 --- a/lib/transition.fnl +++ b/lib/transition.fnl @@ -105,9 +105,7 @@ scale (get-scale) x (/ (- x (/ width 2)) scale) y (/ (- y (/ height 2)) scale)] - (print x y) (when (and (= button 1) (. boxes self.type)) - (print :a) (each [i box (ipairs (. boxes self.type))] (when (and (>= x box.x) (< x (+ box.x box.width)) diff --git a/main.lua b/main.lua index d9b84cb..5cfbd0a 100644 --- a/main.lua +++ b/main.lua @@ -1,3 +1,5 @@ -table.insert(package.loaders or package.searchers, require("fennel").makeSearcher({correlate = true})) +if true then + table.insert(package.loaders or package.searchers, require("fennel").makeSearcher({correlate = true})) +end require("lib/main") diff --git a/vendor/ProFi.lua b/vendor/ProFi.lua deleted file mode 100644 index 989985f..0000000 --- a/vendor/ProFi.lua +++ /dev/null @@ -1,457 +0,0 @@ ---[[ -ProFi v1.3, by Luke Perkin 2012. MIT Licence http://www.opensource.org/licenses/mit-license.php. -Updated to v1.4 by Robert Machmer 2017 - - Example: - ProFi = require 'ProFi' - ProFi:start() - some_function() - another_function() - coroutine.resume( some_coroutine ) - ProFi:stop() - ProFi:writeReport( 'MyProfilingReport.txt' ) - - API: - *Arguments are specified as: type/name/default. - ProFi:start( string/once/nil ) - ProFi:stop() - ProFi:checkMemory( number/interval/0, string/note/'' ) - ProFi:writeReport( string/filename/'ProFi.txt' ) - ProFi:reset() - ProFi:setHookCount( number/hookCount/0 ) - ProFi:setGetTimeMethod( function/getTimeMethod/os.clock ) - ProFi:setInspect( string/methodName, number/levels/1 ) -]] - ------------------------ --- Locals: ------------------------ - -local ProFi = {} -local onDebugHook, sortByDurationDesc, sortByCallCount, getTime -local DEFAULT_DEBUG_HOOK_COUNT = 0 -local FORMAT_HEADER_LINE = "| %-50s: %-40s: %-20s: %-12s: %-12s: %-12s|\n" -local FORMAT_OUTPUT_LINE = "| %s: %-12s: %-12s: %-12s|\n" -local FORMAT_INSPECTION_LINE = "> %s: %-12s\n" -local FORMAT_TOTALTIME_LINE = "| TOTAL TIME = %f\n" -local FORMAT_MEMORY_LINE = "| %-20s: %-16s: %-16s| %s\n" -local FORMAT_HIGH_MEMORY_LINE = "H %-20s: %-16s: %-16sH %s\n" -local FORMAT_LOW_MEMORY_LINE = "L %-20s: %-16s: %-16sL %s\n" -local FORMAT_TITLE = "%-50.50s: %-40.40s: %-20s" -local FORMAT_LINENUM = "%4i" -local FORMAT_TIME = "%04.3f" -local FORMAT_RELATIVE = "%03.2f%%" -local FORMAT_COUNT = "%7i" -local FORMAT_KBYTES = "%7i Kbytes" -local FORMAT_MBYTES = "%7.1f Mbytes" -local FORMAT_MEMORY_HEADER1 = "\n=== HIGH & LOW MEMORY USAGE ===============================\n" -local FORMAT_MEMORY_HEADER2 = "=== MEMORY USAGE ==========================================\n" -local FORMAT_BANNER = [[ -############################################################################################################### -##### ProFi, a lua profiler. This profile was generated on: %s -##### ProFi is created by Luke Perkin 2012 under the MIT Licence, www.locofilm.co.uk -##### Version 1.3 Original gist can be found at https://gist.github.com/perky/2838755 -##### Version 1.4 Cleaned up code to work with luacheck https://gist.github.com/rm-code/383c98a6af04652ed9f39b7ae536bcc5 -############################################################################################################### - - -]] - ------------------------ --- Public Methods: ------------------------ - ---[[ -Starts profiling any method that is called between this and ProFi:stop(). -Pass the parameter 'once' to so that this methodis only run once. -Example: -ProFi:start( 'once' ) -]] -function ProFi:start( param ) - if param == 'once' then - if self:shouldReturn() then - return - else - self.should_run_once = true - end - end - self.has_started = true - self.has_finished = false - self:resetReports( self.reports ) - self:startHooks() - self.startTime = getTime() -end - ---[[ -Stops profiling. -]] -function ProFi:stop() - if self:shouldReturn() then - return - end - self.stopTime = getTime() - self:stopHooks() - self.has_finished = true -end - -function ProFi:checkMemory( ninterval, note ) - local time = getTime() - local interval = ninterval or 0 - if self.lastCheckMemoryTime and time < self.lastCheckMemoryTime + interval then - return - end - self.lastCheckMemoryTime = time - local memoryReport = { - ['time'] = time; - ['memory'] = collectgarbage('count'); - ['note'] = note or ''; - } - table.insert( self.memoryReports, memoryReport ) - self:setHighestMemoryReport( memoryReport ) - self:setLowestMemoryReport( memoryReport ) -end - ---[[ -Writes the profile report to a file. -Param: [filename:string:optional] defaults to 'ProFi.txt' if not specified. -]] -function ProFi:writeReport( filename ) - if #self.reports > 0 or #self.memoryReports > 0 then - filename = filename or 'ProFi.txt' - self:sortReportsWithSortMethod( self.reports, self.sortMethod ) - self:writeReportsToFilename( filename ) - print( string.format("[ProFi]\t Report written to %s", filename) ) - return true; - end -end - ---[[ -Resets any profile information stored. -]] -function ProFi:reset() - self.reports = {} - self.reportsByTitle = {} - self.memoryReports = {} - self.highestMemoryReport = nil - self.lowestMemoryReport = nil - self.has_started = false - self.has_finished = false - self.should_run_once = false - self.lastCheckMemoryTime = nil - self.hookCount = self.hookCount or DEFAULT_DEBUG_HOOK_COUNT - self.sortMethod = self.sortMethod or sortByDurationDesc - self.inspect = nil -end - ---[[ -Set how often a hook is called. -See http://pgl.yoyo.org/luai/i/debug.sethook for information. -Param: [hookCount:number] if 0 ProFi counts every time a function is called. -if 2 ProFi counts every other 2 function calls. -]] -function ProFi:setHookCount( hookCount ) - self.hookCount = hookCount -end - ---[[ -Set how the report is sorted when written to file. -Param: [sortType:string] either 'duration' or 'count'. -'duration' sorts by the time a method took to run. -'count' sorts by the number of times a method was called. -]] -function ProFi:setSortMethod( sortType ) - if sortType == 'duration' then - self.sortMethod = sortByDurationDesc - elseif sortType == 'count' then - self.sortMethod = sortByCallCount - end -end - ---[[ -By default the getTime method is os.clock (CPU time), -If you wish to use other time methods pass it to this function. -Param: [getTimeMethod:function] -]] -function ProFi:setGetTimeMethod( getTimeMethod ) - getTime = getTimeMethod -end - ---[[ -Allows you to inspect a specific method. -Will write to the report a list of methods that -call this method you're inspecting, you can optionally -provide a levels parameter to traceback a number of levels. -Params: [methodName:string] the name of the method you wish to inspect. -[levels:number:optional] the amount of levels you wish to traceback, defaults to 1. -]] -function ProFi:setInspect( methodName, levels ) - if self.inspect then - self.inspect.methodName = methodName - self.inspect.levels = levels or 1 - else - self.inspect = { - ['methodName'] = methodName; - ['levels'] = levels or 1; - } - end -end - ------------------------ --- Implementations methods: ------------------------ - -function ProFi:shouldReturn( ) - return self.should_run_once and self.has_finished -end - -function ProFi:getFuncReport( funcInfo ) - local title = self:getTitleFromFuncInfo( funcInfo ) - local funcReport = self.reportsByTitle[ title ] - if not funcReport then - funcReport = self:createFuncReport( funcInfo ) - self.reportsByTitle[ title ] = funcReport - table.insert( self.reports, funcReport ) - end - return funcReport -end - -function ProFi:getTitleFromFuncInfo( funcInfo ) - local name = funcInfo.name or 'anonymous' - local source = funcInfo.short_src or 'C_FUNC' - local linedefined = funcInfo.linedefined or 0 - linedefined = string.format( FORMAT_LINENUM, linedefined ) - return string.format(FORMAT_TITLE, source, name, linedefined) -end - -function ProFi:createFuncReport( funcInfo ) - local funcReport = { - ['title'] = self:getTitleFromFuncInfo( funcInfo ); - ['count'] = 0; - ['timer'] = 0; - } - return funcReport -end - -function ProFi:startHooks() - debug.sethook( onDebugHook, 'cr', self.hookCount ) -end - -function ProFi:stopHooks() - debug.sethook() -end - -function ProFi:sortReportsWithSortMethod( reports, sortMethod ) - if reports then - table.sort( reports, sortMethod ) - end -end - -function ProFi:writeReportsToFilename( filename ) - local file, err = io.open( filename, 'w' ) - assert( file, err ) - self:writeBannerToFile( file ) - if #self.reports > 0 then - self:writeProfilingReportsToFile( self.reports, file ) - end - if #self.memoryReports > 0 then - self:writeMemoryReportsToFile( self.memoryReports, file ) - end - file:close() -end - -function ProFi:writeProfilingReportsToFile( reports, file ) - local totalTime = self.stopTime - self.startTime - local totalTimeOutput = string.format(FORMAT_TOTALTIME_LINE, totalTime) - file:write( totalTimeOutput ) - local header = string.format( FORMAT_HEADER_LINE, "FILE", "FUNCTION", "LINE", "TIME", "RELATIVE", "CALLED" ) - file:write( header ) - for _, funcReport in ipairs( reports ) do - local timer = string.format(FORMAT_TIME, funcReport.timer) - local count = string.format(FORMAT_COUNT, funcReport.count) - local relTime = string.format(FORMAT_RELATIVE, (funcReport.timer / totalTime) * 100 ) - local outputLine = string.format(FORMAT_OUTPUT_LINE, funcReport.title, timer, relTime, count ) - file:write( outputLine ) - if funcReport.inspections then - self:writeInpsectionsToFile( funcReport.inspections, file ) - end - end -end - -function ProFi:writeMemoryReportsToFile( reports, file ) - file:write( FORMAT_MEMORY_HEADER1 ) - self:writeHighestMemoryReportToFile( file ) - self:writeLowestMemoryReportToFile( file ) - file:write( FORMAT_MEMORY_HEADER2 ) - for _, memoryReport in ipairs( reports ) do - local outputLine = self:formatMemoryReportWithFormatter( memoryReport, FORMAT_MEMORY_LINE ) - file:write( outputLine ) - end -end - -function ProFi:writeHighestMemoryReportToFile( file ) - local memoryReport = self.highestMemoryReport - local outputLine = self:formatMemoryReportWithFormatter( memoryReport, FORMAT_HIGH_MEMORY_LINE ) - file:write( outputLine ) -end - -function ProFi:writeLowestMemoryReportToFile( file ) - local memoryReport = self.lowestMemoryReport - local outputLine = self:formatMemoryReportWithFormatter( memoryReport, FORMAT_LOW_MEMORY_LINE ) - file:write( outputLine ) -end - -function ProFi:formatMemoryReportWithFormatter( memoryReport, formatter ) - local time = string.format(FORMAT_TIME, memoryReport.time) - local kbytes = string.format(FORMAT_KBYTES, memoryReport.memory) - local mbytes = string.format(FORMAT_MBYTES, memoryReport.memory/1024) - local outputLine = string.format(formatter, time, kbytes, mbytes, memoryReport.note) - return outputLine -end - -function ProFi:writeBannerToFile( file ) - local banner = string.format(FORMAT_BANNER, os.date()) - file:write( banner ) -end - -function ProFi:writeInpsectionsToFile( inspections, file ) - local inspectionsList = self:sortInspectionsIntoList( inspections ) - file:write('\n==^ INSPECT ^======================================================================================================== COUNT ===\n') - for _, inspection in ipairs( inspectionsList ) do - local line = string.format(FORMAT_LINENUM, inspection.line) - local title = string.format(FORMAT_TITLE, inspection.source, inspection.name, line) - local count = string.format(FORMAT_COUNT, inspection.count) - local outputLine = string.format(FORMAT_INSPECTION_LINE, title, count ) - file:write( outputLine ) - end - file:write('===============================================================================================================================\n\n') -end - -function ProFi:sortInspectionsIntoList( inspections ) - local inspectionsList = {} - for _, inspection in pairs(inspections) do - inspectionsList[#inspectionsList+1] = inspection - end - table.sort( inspectionsList, sortByCallCount ) - return inspectionsList -end - -function ProFi:resetReports( reports ) - for _, report in ipairs( reports ) do - report.timer = 0 - report.count = 0 - report.inspections = nil - end -end - -function ProFi:shouldInspect( funcInfo ) - return self.inspect and self.inspect.methodName == funcInfo.name -end - -function ProFi:getInspectionsFromReport( funcReport ) - local inspections = funcReport.inspections - if not inspections then - inspections = {} - funcReport.inspections = inspections - end - return inspections -end - -function ProFi:getInspectionWithKeyFromInspections( key, inspections ) - local inspection = inspections[key] - if not inspection then - inspection = { - ['count'] = 0; - } - inspections[key] = inspection - end - return inspection -end - -function ProFi:doInspection( inspect, funcReport ) - local inspections = self:getInspectionsFromReport( funcReport ) - local levels = 5 + inspect.levels - local currentLevel = 5 - while currentLevel < levels do - local funcInfo = debug.getinfo( currentLevel, 'nS' ) - if funcInfo then - local source = funcInfo.short_src or '[C]' - local name = funcInfo.name or 'anonymous' - local line = funcInfo.linedefined - local key = source..name..line - local inspection = self:getInspectionWithKeyFromInspections( key, inspections ) - inspection.source = source - inspection.name = name - inspection.line = line - inspection.count = inspection.count + 1 - currentLevel = currentLevel + 1 - else - break - end - end -end - -function ProFi:onFunctionCall( funcInfo ) - local funcReport = ProFi:getFuncReport( funcInfo ) - funcReport.callTime = getTime() - funcReport.count = funcReport.count + 1 - if self:shouldInspect( funcInfo ) then - self:doInspection( self.inspect, funcReport ) - end -end - -function ProFi:onFunctionReturn( funcInfo ) - local funcReport = ProFi:getFuncReport( funcInfo ) - if funcReport.callTime then - funcReport.timer = funcReport.timer + (getTime() - funcReport.callTime) - end -end - -function ProFi:setHighestMemoryReport( memoryReport ) - if not self.highestMemoryReport then - self.highestMemoryReport = memoryReport - else - if memoryReport.memory > self.highestMemoryReport.memory then - self.highestMemoryReport = memoryReport - end - end -end - -function ProFi:setLowestMemoryReport( memoryReport ) - if not self.lowestMemoryReport then - self.lowestMemoryReport = memoryReport - else - if memoryReport.memory < self.lowestMemoryReport.memory then - self.lowestMemoryReport = memoryReport - end - end -end - ------------------------ --- Local Functions: ------------------------ - -getTime = os.clock - -onDebugHook = function( hookType ) - local funcInfo = debug.getinfo( 2, 'nS' ) - if hookType == "call" then - ProFi:onFunctionCall( funcInfo ) - elseif hookType == "return" then - ProFi:onFunctionReturn( funcInfo ) - end -end - -sortByDurationDesc = function( a, b ) - return a.timer > b.timer -end - -sortByCallCount = function( a, b ) - return a.count > b.count -end - ------------------------ --- Return Module: ------------------------ - -ProFi:reset() -return ProFi -- cgit 1.3.0-6-gf8a5