theoriginalbit

[PokeCC] Save/Load code

Jun 16th, 2014
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.29 KB | None | 0 0
  1. local function log2(colour)
  2.   return math.log(colour) / math.log(2)
  3. end
  4.  
  5. local function findLongest( t )
  6.   local l = #t[1]
  7.   for _,v in pairs( t ) do
  8.     l = math.max( l, #v )
  9.   end
  10.   return l
  11. end
  12.  
  13. local function buildByte( color, state )
  14.   --# in the high nibble we have 3 extra bits that could be used to store other small data
  15.   local high = bit.band( state == true and 1 or 0, 0xF )
  16.   local low = bit.band( log2( color ), 0xF )
  17.   return bit.bor( bit.blshift( high, 4 ), low )
  18. end
  19.  
  20. local function unpackByte( byte )
  21.   local high = bit.brshift( byte, 4)
  22.   local low = bit.band( byte, 0xF )
  23.   return { c = 2^low, s = high == 1 }
  24. end
  25.  
  26. function save(filename, map)
  27.   local file = fs.open(filename, "wb")
  28.   file.write(#map) --# height
  29.   file.write(findLongest(map)) --# width
  30.   for _,row in pairs(map) do
  31.     for _,col in pairs(row) do
  32.       file.write(buildByte(col.c, col.s))
  33.     end
  34.   end
  35.   file.close()
  36. end
  37.  
  38. function load(filename)
  39.   local map = {}
  40.   local file = fs.open(filename, "rb")
  41.   local width = file.read()
  42.   local height = file.read()
  43.   local row, col, bc = 0,0,0
  44.   for byte in file.read do
  45.     row, col = (bc % width) + 1, (bc % height) + 1
  46.     map[row] = map[row] or {}
  47.     map[row][col] = unpackByte(byte)
  48.     bc = bc + 1
  49.   end
  50.   return map, file.close()
  51. end
Advertisement
Add Comment
Please, Sign In to add comment