Advertisement
Redxone

[CC] - CCMini Demo

Jul 19th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.95 KB | None | 0 0
  1. function bitToColor(bits)
  2.     if(type(bits) == "string" or type(bits) == "char")then
  3.       bits = string.byte(bits)
  4.     end
  5.     -- Returns resulting text and back color
  6.     return (2^( bit32.rshift(bits,4 ))), (2^(bit32.bxor(bits, bit32.lshift( bit32.rshift(bits,4),4))))
  7. end
  8.  
  9. function colorToBit(tc,bc)
  10.     local tBit = math.log(tc,2) / math.log(2)
  11.     local bBit = math.log(bc,2) / math.log(2)
  12.     local byte = bit32.lshift(tBit,4) + bBit
  13.     return string.char(byte)
  14. end
  15.  
  16. function getScreen()
  17.     local mini_screen = {
  18.         cursor = {
  19.             xpos = 1,
  20.             ypos = 1,
  21.         },
  22.         color = {
  23.             bcol = colors.black,
  24.             tcol = colors.white,
  25.         },
  26.         screen = {
  27.             color={},
  28.         },
  29.  
  30.         -- Bit logical stuff.
  31.  
  32.          SCBOffs = function(chr)
  33.             -- Convert to base 10 soooo easy
  34.             if(string.byte(chr) < 128)then
  35.                 error("SCB: Cannot generate offset on char: " .. chr)
  36.             end
  37.             local dec = string.byte(chr)-128
  38.             local bin = ""
  39.             local binkey = "01"
  40.             local rim
  41.             if(type(dec) == "string")then error("toBin -> Invalid type: " .. dec) end
  42.             while dec > 0 do
  43.                rim = math.floor(dec%2)
  44.                bin = binkey:sub(rim+1,rim+1) .. bin
  45.                dec = math.floor(dec/2)
  46.             end
  47.             if(#bin < 5)then
  48.               bin = string.rep("0",8-#bin) .. bin
  49.             end
  50.             return bin:reverse()
  51.         end,
  52.  
  53.         init = function(self)
  54.             -- Determine size of screen
  55.             local w, h = term.getSize()
  56.             for y = 1, h do
  57.                 -- Fill screen with mini chars
  58.                 self.screen[y] = string.rep(string.char(128),w)
  59.                 self.screen.color[y] = string.rep(string.char(15),w) -- Normal color
  60.             end
  61.         end,
  62.  
  63.         -- Ease of use.
  64.         clear = initialize,
  65.  
  66.         -- Screen functionality
  67.  
  68.         getSpecialChar = function(self,chbit)
  69.             -- Add 5 bit binary to the index start of the
  70.             -- "small" txt.
  71.             if(type(chbit) == "string")then
  72.                 chbit = tonumber(chbit,2)
  73.             end
  74.             if(chbit > 31)then
  75.               chbit = (64+(chbit * -1))-1
  76.             end
  77.             return string.char(128 + chbit)
  78.         end,
  79.  
  80.         _BitRenderChar = function(self,chbit)
  81.             local isMax = false
  82.             if(chbit > 31)then
  83.                 isMax = true
  84.             end
  85.             -- Determine draw position, and check to invert colors.
  86.             local tcol = self.color.tcol
  87.             local bcol = self.color.bcol
  88.             if(isMax)then
  89.                 tcol = self.color.bcol
  90.                 bcol = self.color.tcol
  91.             end
  92.             term.setCursorPos(self.cursor.xpos,self.cursor.ypos)
  93.             term.setTextColor(tcol)
  94.             term.setBackgroundColor(bcol)
  95.             write(self:getCharAtCursor())
  96.         end,   
  97.  
  98.         setCursorPos = function(self,x,y)
  99.             self.cursor.xpos = x
  100.             self.cursor.ypos = y
  101.         end,
  102.  
  103.         getCharAtCursor = function(self)
  104.             return self.screen[self.cursor.ypos]:sub(self.cursor.xpos,self.cursor.xpos)
  105.         end,
  106.  
  107.         blitPos = function(self,x,y,fnt,tc,bc)
  108.             self.cursor.xpos = x
  109.             self.cursor.ypos = y
  110.             self:blit(fnt,tc,bc)
  111.         end,
  112.  
  113.         writeScreen = function(self,x,y,chr)
  114.             self.screen[y] = self.screen[y]:sub(1,x-1)
  115.                 .. chr .. self.screen[y]:sub(x+1,-1)
  116.             self.screen.color[y] = self.screen.color[y]:sub(1,x-1)
  117.                 .. colorToBit(self.color.tcol,self.color.bcol) .. self.screen.color[y]:sub(x+1,-1)
  118.         end,
  119.  
  120.  
  121.         getCharAt = function(self,x,y)
  122.             return self.screen[y]:sub(x,x), self.screen.color[y]:sub(x,x)
  123.         end,
  124.  
  125.         drawScreenAt = function(self,x,y)
  126.             local chbit = tonumber(self.SCBOffs(self.screen[y]:sub(x,x)),2)
  127.             local isMax = false
  128.             if(chbit > 31)then
  129.                 isMax = true
  130.             end
  131.             -- Determine draw position, and check to invert colors.
  132.             local tcol, bcol = bitToColor(self.screen.color[y]:sub(x,x))
  133.             if(isMax)then
  134.                 local bcol, tcol = bitToColor(self.screen.color[y]:sub(x,x))
  135.             end
  136.             term.setCursorPos(x,y)
  137.             term.setTextColor(tcol)
  138.             term.setBackgroundColor(bcol)
  139.             write(self.screen[y]:sub(x,x))
  140.         end,
  141.  
  142.         blit = function(self,fnt,tc,bc)
  143.             local scrX = self.cursor.xpos
  144.             local scrY = self.cursor.ypos
  145.             if(tc)then self:setTextColor(tc) end
  146.             if(bc)then self:setBackColor(bc) end
  147.             local bChr = fnt
  148.             if(type(fnt) == "table")then
  149.                 -- Convert char to binary for bit level manip.
  150.                 bChr = self.SCBOffs(self:getCharAtCursor())
  151.                 for i = 1, #fnt do
  152.                     if( type(fnt[1]) == "number" )then
  153.                         local bit = bChr:sub(fnt[i],fnt[i])
  154.                         if(bit == "1")then bit = "0" else bit = "1" end
  155.                         bChr = (bChr:sub(1,fnt[i]-1)
  156.                           .. bit .. bChr:sub(fnt[i]+1,-1) )
  157.                     else
  158.                         error("Numbers must be used for toggle-able bits!")
  159.                     end
  160.                 end
  161.             end
  162.             -- Get char as ascii
  163.             local aChar = self:getSpecialChar(bChr:reverse())
  164.             -- Re-insert char into screen table
  165.             self:writeScreen(scrX,scrY,aChar)
  166.             self:_BitRenderChar(tonumber(bChr:reverse(),2))
  167.         end,
  168.  
  169.         blitBox = function(self,fx,fy,tx,ty,col)
  170.             local bw = (tx - fx)
  171.             local bh = (ty - fy) -2
  172.             self:setTextColor(col)
  173.             for y = 1, bh do
  174.                 self:blitPos(fx+1,fy+y,"101010")
  175.                 self:blitPos(fx+bw,fy+y,"010101")
  176.                 for x = 1, bw do
  177.                     self:blitPos(fx+x,fy,"110000")
  178.                     self:blitPos(fx+x,fy+bh,"000011")
  179.                 end
  180.             end
  181.             self:blitPos(fx+1,fy,"111010")    -- Upper left
  182.             self:blitPos(fx+bw,fy,"110101") -- Upper right
  183.             self:blitPos(fx+1,fy+bh,"101011") -- Lower left
  184.             self:blitPos(fx+bw,fy+bh,"010111") -- Lower right
  185.         end,
  186.  
  187.         blitFilledBox = function(self,fx,fy,tx,ty,col)
  188.             local bw = (tx - fx)
  189.             local bh = (ty - fy) -1
  190.             self:setTextColor(col)
  191.             for y = 1, bh do
  192.                 for x = 1, bw do
  193.                     self:blitPos(fx+x,fy+y-1,"111111")
  194.                 end
  195.             end
  196.         end,
  197.  
  198.         setTextColor = function(self,c)
  199.             self.color.tcol = c
  200.         end,
  201.  
  202.         setBackColor = function(self,c)
  203.             self.color.bcol = c
  204.         end,
  205.  
  206.         getTextColor = function(self)
  207.             return self.color.tcol
  208.         end,
  209.  
  210.         getBackColor = function(self)
  211.             return self.color.bcol
  212.         end,
  213.     }
  214.     mini_screen:init()
  215.     return mini_screen
  216. end
  217.  
  218. function ccmini_demo(num)
  219.     if(not num)then
  220.         error("Ussage: ccmini_demo (int number) - n/2")
  221.     end
  222.     if(num == 1)then
  223.     term.clear()
  224.     local myScr = getScreen()
  225.     myScr:setCursorPos(2,2)
  226.     myScr:blit({1},colors.blue,colors.black)
  227.     sleep(0.01)
  228.     myScr:blit({3},colors.blue,colors.black)
  229.     sleep(0.01)
  230.     myScr:blit({5},colors.blue,colors.black)
  231.     sleep(0.01)
  232.     myScr:blit({4},colors.blue,colors.black)
  233.     sleep(0.01)
  234.     myScr:setCursorPos(3,2)
  235.     myScr:blit({1},colors.blue,colors.black)
  236.     sleep(0.01)
  237.     myScr:blit({3},colors.blue,colors.black)
  238.     sleep(0.01)
  239.     myScr:blit({5},colors.blue,colors.black)
  240.     sleep(0.01)
  241.     myScr:setCursorPos(4,2)
  242.     myScr:blit({1},colors.red,colors.black)
  243.     sleep(0.01)
  244.     myScr:blit({3},colors.red,colors.black)
  245.     sleep(0.01)
  246.     myScr:blit({5},colors.red,colors.black)
  247.     sleep(0.01)
  248.     elseif(num == 2)then
  249.         term.clear()
  250.         myScr = getScreen()
  251.         myScr:setBackColor(colors.white)
  252.         local xdir = 1
  253.         local ydir = 1
  254.         local xvel = 1
  255.         local yvel = 1
  256.         local w,h = term.getSize()
  257.  
  258.         while true do
  259.                 term.current().setVisible(false)
  260.                 myScr:blitFilledBox(5+xdir,5+ydir,11+xdir,10+ydir,colors.white)
  261.                 myScr:blitBox(5+xdir,5+ydir,11+xdir,10+ydir,colors.green)
  262.                 myScr:blitPos(8+xdir,6+ydir,"001111",colors.red,colors.white)
  263.                 myScr:blitPos(8+xdir,7+ydir,"111100",colors.green)
  264.                 myScr:blitPos(9+xdir,6+ydir,"001111",colors.yellow)
  265.                 myScr:blitPos(9+xdir,7+ydir,"111100",colors.blue)
  266.                 term.current().setVisible(true)
  267.                 myScr:blitBox(math.floor(w/2)-9,math.floor(h/2)-1,math.floor(w/2)+8,math.floor(h/2)+3,colors.gray)
  268.                 term.setCursorPos((w/2)-7,(h/2))
  269.                 term.setTextColor(colors.black)
  270.                 term.setBackgroundColor(colors.white)
  271.                 write(" Hold any key. ")
  272.                 os.queueEvent("Tick")
  273.                 e = {os.pullEvent()}
  274.                 if(e[1] == "key")then
  275.                     term.setTextColor(colors.white)
  276.                     term.setBackgroundColor(colors.black)
  277.                     term.clear()
  278.                     term.setCursorPos(1,1)
  279.                     sleep(0.3)
  280.                     return
  281.                 end
  282.                 sleep(0.01)
  283.                 myScr:blitFilledBox(5+xdir,5+ydir,11+xdir,10+ydir,colors.black)
  284.                 -- Change velocity in direction
  285.                 if(11+xdir >= w or 5+xdir < 2)then
  286.                     xvel = xvel * -1
  287.                 end
  288.                 if(10+ydir >= h or 5+ydir < 2)then
  289.                     yvel = yvel * -1
  290.                 end
  291.                 xdir = xdir + xvel
  292.                 ydir = ydir + yvel
  293.         end
  294.     end
  295. end
  296.  
  297. ccmini_demo(2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement