-- Find a key in tab with the given value. function FindValue(tab, value) for key, name in tab do if value == name then return key end end return nil end -- Return the index of a true value in list. function FindSelection( list ) for index, on in list do if on then return index end end return nil end -- Look up each value in a table, returning a table with the resulting strings. function TableStringLookup( t, group ) local ret = { } for key, val in t do Trace(val) ret[key] = THEME:GetString(group,val) end return ret end function split( delimiter, text ) local list = {} local pos = 1 while 1 do local first,last = string.find( text, delimiter, pos ) if first then table.insert( list, string.sub(text, pos, first-1) ) pos = last+1 else table.insert( list, string.sub(text, pos) ) break end end return list end function join( delimiter, list ) local ret = list[1] for i = 2,table.getn(list) do ret = ret .. delimiter .. list[i] end return ret or "" end function wrap(val,n) local x = val Trace( "wrap "..x.." "..n ) if x<0 then x = x + (math.ceil(-x/n)+1)*n end Trace( "adjusted "..x ) local ret = math.mod(x,n) Trace( "ret "..ret ) return ret end function fapproach( val, other_val, to_move ) if val == other_val then return val -- already done! end local delta = other_val - val local sign = delta / math.abs(delta) local toMove = sign*to_move if math.abs(toMove) > math.abs(delta) then toMove = delta -- snap end val = val + toMove return val end function tableshuffle( t ) local ret = { } for i=1,table.getn(t) do table.insert( ret, math.random(i), t[i] ) end return ret end table.shuffle = tableshuffle function tableslice( t, num ) local ret = { } for i=1,table.getn(t) do table.insert( ret, i, t[i] ) end return ret end table.slice = tableslice -- add together the contents of a table function table.sum( t ) local sum = 0 for i=1,#t do sum = sum + t[i] end return sum end -- average of all table values function table.average( t ) return table.sum( t ) / #t end -- furthest value from the average of a given table function table.deviation( t ) local offset = math.abs(table.average(t)) for i=1,#t do offset = math.max(math.abs(t[i]), offset) end return offset end -- See if this exists function table.search( t, sFind ) for i=1,#t do if t[i] == sFind then return true end end end -- Retreive the entry that has this function table.find( t, sFind ) for i=1,#t do if t[i] == sFind then return i end end end function round(val, decimal) if (decimal) then return math.floor( (val * 10^decimal) + 0.5) / (10^decimal) else return math.floor(val+0.5) end end function GetRandomSongBackground() for i=0,50 do local song = SONGMAN:GetRandomSong() if song then local path = song:GetBackgroundPath() if path then return path end end end return THEME:GetPathG("", "_blank") end function GetSongBackground() local song = GAMESTATE:GetCurrentSong() if song then local path = song:GetBackgroundPath() if path then return path end end return THEME:GetPathG("Common","fallback background") end function StepsOrTrailToCustomDifficulty( stepsOrTrail ) if lua.CheckType("Steps", stepsOrTrail) then return StepsToCustomDifficulty( stepsOrTrail ) end if lua.CheckType("Trail", stepsOrTrail) then return TrailToCustomDifficulty( stepsOrTrail ) end end -- (c) 2005 Glenn Maynard, Chris Danford -- All rights reserved. -- -- 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, and/or sell copies of the Software, and to permit persons to -- whom the Software is furnished to do so, provided that the above -- copyright notice(s) and this permission notice appear in all copies of -- the Software and that both the above copyright notice(s) and this -- permission notice appear in supporting documentation. -- -- 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 OF -- THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS -- INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT -- OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -- PERFORMANCE OF THIS SOFTWARE.