Advertisement
VGToolBox

Charity

Dec 18th, 2013
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 32.28 KB | None | 0 0
  1. --Read data from http and split into important data
  2. ----Amount earned
  3. ----Amount earned since last checked
  4. ----Number of Contributions
  5. ------Windows
  6. ------Mac
  7. ------Linux
  8.  
  9. --Outcomes:
  10. ----Show information on monitors
  11. ----Show Amount on Large pixel screen
  12. ----Show change amount on Large pixel screen
  13.  
  14. ----Trigger Fireworks
  15. ----Trigger Honeydew Image
  16.  
  17. --Two/Distinct elements
  18. ----Server
  19. ----Client
  20. ------LargeScreen Client
  21. ------SmallScreen Client
  22.  
  23. os.loadAPI("json")
  24.  
  25. --local HUMBLE_DATA = "https://rikkuness.net/humble/humble.php"
  26. local HUMBLE_DATA = "https://humble.pubnub.com/subscribe/6b5eeae3-796b-11df-8b2d-ef048cc31d2e/humbleyogscast/0/13874707882891360?uuid=59139447-7893-4b1e-81ff-b73fdac5f5eb&pnsdk=PubNub-JS-Web%2F3%2E5%2E4"
  27. local TRANSMIT_CHANNEL = 88
  28.  
  29. local WAIT_TIME = 15
  30.  
  31. local PIXEL_MAP = {}
  32.  
  33. local currentAmount = 0
  34. local prevAmount = 0
  35.  
  36. local difference = 0
  37.  
  38. local contributions = {}
  39. contributions.windows = 0
  40. contributions.mac = 0
  41. contributions.linux = 0
  42. contributions.total = function() return contributions.windows + contributions.mac + contributions.linux; end
  43.  
  44. local amounts = {}
  45. amounts.window = 0
  46. amounts.mac = 0
  47. amounts.linux = 0
  48. contributions.total = function() return currentAmount; end
  49.  
  50. local function round(n)
  51.   if n >= 0.5 then
  52.     return math.ceil(n)
  53.   end
  54.   return math.floor(n)
  55. end
  56.  
  57. local function applyValueToN(value, n)
  58.     n = n or 1
  59.     if n > 1 then
  60.         return value, applyValueToN(value, n - 1)
  61.     end
  62.     return value
  63. end
  64.  
  65.  
  66. local function pullEvent(eventType, time)
  67.     eventType = eventType or false
  68.     os.startTimer(time)
  69.     e, p1, p2, p3, p4, p5 = os.pullEvent()
  70.     if e == "timer" then
  71.         return false
  72.     elseif eventType and e == eventType then
  73.         return e, p1, p2, p3, p4, p5
  74.     elseif eventType == false then
  75.         return e, p1, p2, p3, p4, p5
  76.     end
  77.  
  78.     return false
  79. end
  80.  
  81. local function waitForEvent(eventType)
  82.     while true do
  83.         e, p1, p2, p3, p4, p5 = pullEvent(eventType, 5)
  84.         if e then
  85.             return e, p1, p2, p3, p4, p5
  86.         end
  87.     end
  88. end
  89.  
  90. local function clearEvents()
  91.     os.queueEvent("clear")
  92.     while true do
  93.         e = os.pullEvent()
  94.         if e == "clear" then
  95.             break
  96.         end
  97.     end
  98. end
  99.  
  100. local function pullData()
  101.     os.startTimer(5);
  102.     http.request(HUMBLE_DATA)
  103.     while true do
  104.         local e, url, data = os.pullEvent()
  105.         if e == "http_success" then
  106.             return data.readAll()
  107.         else
  108.             return false
  109.         end
  110.     end
  111. end
  112.  
  113. local function decodeData(v)
  114.     return json.decode(v)
  115. end
  116.  
  117. local function getNumberedPeripherals(type, startIndex, endIndex)
  118.     local output = {}
  119.     local c = 1
  120.     for i = startIndex, endIndex do
  121.         output[c] = peripheral.wrap(type.."_"..i)
  122.         c = c + 1
  123.     end
  124.     return output
  125. end
  126.  
  127. local function getAllPeripherals(p)
  128.     local output = {}
  129.     local periphs = peripheral.getNames()
  130.     for i,v in pairs(peripheral.getNames()) do
  131.         if peripheral.getType(v) == p then
  132.             table.insert(output, peripheral.wrap(v))
  133.         end
  134.     end
  135.  
  136.     return (table.getn(output) > 0) and output or false
  137. end
  138.  
  139. local function getPeripheral(p)
  140.     for i,v in ipairs(peripheral.getNames()) do
  141.         print(v)
  142.         if peripheral.getType(v,"getType") == p then
  143.             return peripheral.wrap(v)
  144.         end
  145.     end
  146.     return false
  147. end
  148.  
  149. local function getModem()
  150.     return getPeripheral("modem")
  151. end
  152.  
  153. local function getMonitor()
  154.     return getPeripheral("monitor")
  155. end
  156.  
  157. local function newPixelCanvas(width, height)
  158.     local output = {}
  159.     for x = 1, width do
  160.         output[x] = {}
  161.         for y = 1, height do
  162.             output[x][y] = false
  163.         end
  164.     end
  165.     return output
  166. end
  167.  
  168. local function newObject(width, height)
  169.     local output = {}
  170.     output.pixels = newPixelCanvas(width, height)
  171.     output.visible = true
  172.     output.dirty = false
  173.     output.dirtyPixels = {}
  174.     output.width = width
  175.     output.height = height
  176.     output.x = 1
  177.     output.y = 1
  178.  
  179.     return output
  180. end
  181.  
  182. local function newPlusSymbol(colour)
  183.     local output = newObject(3, 4)
  184.     --drawing the cross
  185.     output.pixels[2][2], output.pixels[1][3],
  186.     output.pixels[2][3], output.pixels[3][3],
  187.     output.pixels[2][4] = applyValueToN(colour, 5)
  188.  
  189.     return output
  190. end
  191.  
  192. local function newNumber(n, colour)
  193.     local output = newObject(4, 5)
  194.     if n == 0 then
  195.         output.pixels[2][1], output.pixels[3][1],
  196.         output.pixels[1][2], output.pixels[4][2],
  197.         output.pixels[1][3], output.pixels[4][3],
  198.         output.pixels[1][4], output.pixels[4][4],
  199.         output.pixels[2][5], output.pixels[3][5] = applyValueToN(colour, 10)
  200.     elseif n == 1 then
  201.         output.pixels[3][1], output.pixels[2][2],
  202.         output.pixels[3][2], output.pixels[3][3],
  203.         output.pixels[3][4], output.pixels[2][5],
  204.         output.pixels[3][5], output.pixels[4][5] = applyValueToN(colour, 8)
  205.     elseif n == 2 then
  206.         output.pixels[1][1], output.pixels[2][1],
  207.         output.pixels[3][1], output.pixels[4][2],
  208.         output.pixels[2][3], output.pixels[3][3],
  209.         output.pixels[1][4], output.pixels[1][5],
  210.         output.pixels[2][5], output.pixels[3][5],
  211.         output.pixels[4][5] = applyValueToN(colour, 11)
  212.     elseif n == 3 then
  213.         output.pixels[1][1], output.pixels[2][1],
  214.         output.pixels[3][1], output.pixels[4][2],
  215.         output.pixels[2][3], output.pixels[3][3],
  216.         output.pixels[4][4], output.pixels[1][5],
  217.         output.pixels[2][5], output.pixels[3][5] = applyValueToN(colour, 10)
  218.     elseif n == 4 then
  219.         output.pixels[1][1], output.pixels[1][2],
  220.         output.pixels[3][2], output.pixels[1][3],
  221.         output.pixels[1][3], output.pixels[3][3],
  222.         output.pixels[1][4], output.pixels[2][4],
  223.         output.pixels[3][4], output.pixels[4][4],
  224.         output.pixels[3][5] = applyValueToN(colour, 11)
  225.     elseif n == 5 then
  226.         output.pixels[1][1], output.pixels[2][1],
  227.         output.pixels[3][1], output.pixels[4][1],
  228.         output.pixels[1][2], output.pixels[1][3],
  229.         output.pixels[2][3], output.pixels[3][3],
  230.         output.pixels[4][4], output.pixels[1][5],
  231.         output.pixels[2][5], output.pixels[3][5] = applyValueToN(colour, 12)
  232.     elseif n == 6 then
  233.         output.pixels[2][1], output.pixels[3][1],
  234.         output.pixels[1][2], output.pixels[1][3],
  235.         output.pixels[2][3], output.pixels[3][3],
  236.         output.pixels[1][4], output.pixels[4][4],
  237.         output.pixels[2][5], output.pixels[3][5] = applyValueToN(colour, 10)
  238.     elseif n == 7 then
  239.         output.pixels[1][1], output.pixels[2][1],
  240.         output.pixels[3][1], output.pixels[4][1],
  241.         output.pixels[4][2], output.pixels[3][3],
  242.         output.pixels[2][4], output.pixels[2][5] = applyValueToN(colour, 8)
  243.     elseif n == 8 then
  244.         output.pixels[2][1], output.pixels[3][1],
  245.         output.pixels[1][2], output.pixels[4][2],
  246.         output.pixels[2][3], output.pixels[3][3],
  247.         output.pixels[1][4], output.pixels[4][4],
  248.         output.pixels[2][5], output.pixels[3][5] = applyValueToN(colour, 10)
  249.     elseif n == 9 then
  250.         output.pixels[2][1], output.pixels[3][1],
  251.         output.pixels[1][2], output.pixels[4][2],
  252.         output.pixels[2][3], output.pixels[3][3],
  253.         output.pixels[4][3], output.pixels[4][4],
  254.         output.pixels[2][5], output.pixels[3][5] = applyValueToN(colour, 10)
  255.     end
  256.     return output
  257. end
  258.  
  259.  
  260. local function newDisplayList(height, width)
  261.     local output = {}
  262.     output.pixels = {}
  263.     output.children = {}
  264.     output.dirty = false
  265.     output.dirtyPixels = {}
  266.     output.height = height
  267.     output.width = width
  268.     output.x = 0
  269.     output.y = 0
  270.  
  271.     for x = -width, width * 2 do
  272.         output.pixels[x] = output.pixels[x] or {}
  273.         for y = -height, height * 2 do
  274.             output.pixels[x][y] = 0x000000
  275.         end
  276.     end
  277.  
  278.     output.addChild = function(self, object)
  279.         object.parent = self
  280.         self:clearPixels(object.width, object.height, object.x, object.y)
  281.         if object.visible then
  282.             self.dirty = true
  283.             for x = 1, object.width do
  284.                 for y = 1, object.height do
  285.                     if object.pixels[x] and object.pixels[x][y] then
  286.                         self.pixels[object.x + x][object.y + y - 1] = object.pixels[x][y]
  287.                         table.insert(self.dirtyPixels, {x = x, y = y})
  288.                     end
  289.                 end
  290.             end
  291.         end
  292.     end
  293.  
  294.     output.clearPixels = function(self, width, height, x, y)
  295.         self.dirty = true
  296.         for x = x, width do
  297.             self.pixels[x] = self.pixels[x] or {}
  298.             for y = y, height do
  299.                 --print("self.pixels[x] "..self.pixels[x])
  300.                 self.pixels[x][y] = 0x000000
  301.                 table.insert(self.dirtyPixels, {x = x, y = y})
  302.             end
  303.         end
  304.     end
  305.     return output
  306. end
  307.  
  308. local function newYogsList(height, width)
  309.     local output = newDisplayList(height, width)
  310.  
  311.     for x = 1, width do
  312.         output.pixels[x] = output.pixels[x] or {}
  313.         for y = 1, height do
  314.             output.pixels[x][y] = 0x07294E
  315.         end
  316.     end
  317.     local y = 1
  318.     output.pixels[1][y], output.pixels[3][y], output.pixels[6][y],
  319.     output.pixels[10][y], output.pixels[11][y], output.pixels[14][y],
  320.     output.pixels[15][y], output.pixels[19][y], output.pixels[20][y],
  321.     output.pixels[23][y], output.pixels[27][y], output.pixels[28][y],
  322.     output.pixels[30][y], output.pixels[31][y], output.pixels[32][y],
  323.     output.pixels[34][y] = applyValueToN( 0xFFFFFF, 16)
  324.  
  325.     y = 2
  326.     output.pixels[1][y], output.pixels[3][y], output.pixels[5][y],
  327.     output.pixels[7][y], output.pixels[9][y], output.pixels[13][y],
  328.     output.pixels[18][y], output.pixels[22][y], output.pixels[24][y],
  329.     output.pixels[26][y], output.pixels[31][y], output.pixels[34][y] = applyValueToN( 0xDDDDDD, 12)
  330.  
  331.     y = 3
  332.     output.pixels[2][y], output.pixels[5][y], output.pixels[7][y],
  333.     output.pixels[9][y], output.pixels[11][y], output.pixels[14][y],
  334.     output.pixels[15][y], output.pixels[18][y], output.pixels[22][y],
  335.     output.pixels[23][y], output.pixels[24][y], output.pixels[27][y],
  336.     output.pixels[28][y], output.pixels[31][y], output.pixels[34][y] = applyValueToN( 0xBBBBBB, 15)
  337.  
  338.     y = 4
  339.     output.pixels[2][y], output.pixels[5][y], output.pixels[7][y],
  340.     output.pixels[9][y], output.pixels[11][y], output.pixels[16][y],
  341.     output.pixels[18][y], output.pixels[22][y], output.pixels[24][y],
  342.     output.pixels[29][y], output.pixels[31][y] = applyValueToN( 0x999999, 11)
  343.  
  344.     y = 5
  345.     output.pixels[2][y], output.pixels[6][y], output.pixels[10][y],
  346.     output.pixels[14][y], output.pixels[15][y], output.pixels[19][y],
  347.     output.pixels[20][y], output.pixels[22][y], output.pixels[24][y],
  348.     output.pixels[27][y], output.pixels[28][y], output.pixels[31][y],
  349.     output.pixels[34][y] = applyValueToN( 0x777777, 13)
  350.  
  351.     return output
  352.  
  353. end
  354.  
  355. local function newSLList(height, width)
  356.     local output = newDisplayList(height, width)
  357.  
  358.     for x = 1, width do
  359.         output.pixels[x] = output.pixels[x] or {}
  360.         for y = 1, height do
  361.             output.pixels[x][y] = 0x000000
  362.         end
  363.     end
  364.     -- Lewis Head
  365.  
  366. -- Row 1
  367. output.pixels[2][2] = applyValueToN( 0x392102)
  368. output.pixels[3][2] = applyValueToN( 0x3E2006)
  369. output.pixels[4][2] = applyValueToN( 0x381E01)
  370. output.pixels[5][2] = applyValueToN( 0x391E00)
  371. output.pixels[6][2] = applyValueToN( 0x361B00)
  372. output.pixels[7][2] = applyValueToN( 0x351A00)
  373. output.pixels[8][2] = applyValueToN( 0x391E00)
  374. output.pixels[9][2] = applyValueToN( 0x402000)
  375.  
  376. -- Row 2
  377. output.pixels[2][3] = applyValueToN( 0x391802)
  378. output.pixels[3][3] = applyValueToN( 0xFCDFBD)
  379. output.pixels[4][3] = applyValueToN( 0xFBE1C4)
  380. output.pixels[5][3] = applyValueToN( 0xFEDBC5)
  381. output.pixels[6][3] = applyValueToN( 0x351A00)
  382. output.pixels[7][3] = applyValueToN( 0xF9E7C5)
  383. output.pixels[8][3] = applyValueToN( 0x371C00)
  384. output.pixels[9][3] = applyValueToN( 0x3C1F02)
  385.  
  386. -- Row 3
  387. output.pixels[2][4] = applyValueToN( 0xFCE5C1)
  388. output.pixels[3][4] = applyValueToN( 0x2C1703)
  389. output.pixels[4][4] = applyValueToN( 0x281603)
  390. output.pixels[5][4] = applyValueToN( 0xF8DEB8)
  391. output.pixels[6][4] = applyValueToN( 0xFDDCC5)
  392. output.pixels[7][4] = applyValueToN( 0x2D1A03)
  393. output.pixels[8][4] = applyValueToN( 0x361B00)
  394. output.pixels[9][4] = applyValueToN( 0xFFE0BE)
  395.  
  396. -- Row 4
  397. output.pixels[2][5] = applyValueToN( 0xFFE6B9)
  398. output.pixels[3][5] = applyValueToN( 0xFFFCFF)
  399. output.pixels[4][5] = applyValueToN( 0x3559A7)
  400. output.pixels[5][5] = applyValueToN( 0xF8E9B6)
  401. output.pixels[6][5] = applyValueToN( 0xF7E9C1)
  402. output.pixels[7][5] = applyValueToN( 0x3658A7)
  403. output.pixels[8][5] = applyValueToN( 0xFFFCFF)
  404. output.pixels[9][5] = applyValueToN( 0xFBDBBE)
  405.  
  406. -- Simon's Head
  407.  
  408. -- Horns
  409. output.pixels[24][0], output.pixels[33][0] = applyValueToN( 0xB3A99D, 2)
  410. output.pixels[24][1], output.pixels[33][1],
  411. output.pixels[24][2], output.pixels[33][2] = applyValueToN( 0xDFD5C9, 4)
  412.  
  413. -- Row 1
  414. output.pixels[25][1], output.pixels[26][1],
  415. output.pixels[27][1], output.pixels[28][1],
  416. output.pixels[29][1], output.pixels[30][1],
  417. output.pixels[31][1], output.pixels[32][1] = applyValueToN( 0x636162, 8)
  418.  
  419. -- Row 2
  420. output.pixels[25][2], output.pixels[32][2] = applyValueToN( 0x463C32, 2)
  421. output.pixels[26][2], output.pixels[27][2],
  422. output.pixels[27][2], output.pixels[27][2],
  423. output.pixels[27][2], output.pixels[27][2] = applyValueToN( 0x25221F, 6)
  424.  
  425. -- Row 3
  426. output.pixels[25][3], output.pixels[27][3],
  427. output.pixels[28][3], output.pixels[29][3],
  428. output.pixels[30][3], output.pixels[32][3] = applyValueToN( 0xE3A588, 6)
  429. output.pixels[26][3], output.pixels[31][3] = applyValueToN( 0x4B4B4B, 2)
  430.  
  431. -- Row 4
  432. output.pixels[25][4], output.pixels[32][4] = applyValueToN( 0xFFD8B5, 2)
  433. output.pixels[26][4], output.pixels[31][4] = applyValueToN( 0x131313, 2)
  434. output.pixels[27][4], output.pixels[30][4] = applyValueToN( 0xE62F09, 2)
  435. output.pixels[28][4] = applyValueToN( 0xB2300E)
  436. output.pixels[29][4] = applyValueToN( 0xC34616)
  437.  
  438. -- Row 5
  439. output.pixels[25][5], output.pixels[27][5],
  440. output.pixels[30][5], output.pixels[32][5] = applyValueToN( 0xFFD8B5, 4)
  441. output.pixels[28][5], output.pixels[29][5] = applyValueToN( 0x4B4B4B, 2)
  442. output.pixels[26][5], output.pixels[31][5] = applyValueToN( 0xE62F09, 2)
  443.  
  444. output.pixels[12][1], output.pixels[15][1], output.pixels[19][1], output.pixels[20][1],
  445. output.pixels[12][2], output.pixels[15][2], output.pixels[18][2], output.pixels[21][2],
  446. output.pixels[13][3], output.pixels[14][3], output.pixels[15][3], output.pixels[18][3],
  447. output.pixels[15][4], output.pixels[18][4], output.pixels[21][4], output.pixels[12][5],
  448. output.pixels[13][5], output.pixels[14][5], output.pixels[19][5], output.pixels[20][5] = applyValueToN( 0xFF3333, 20)
  449.  
  450.  
  451.  
  452.     return output
  453.  
  454. end
  455.  
  456. local function newPigList(height, width)
  457.     local output = newDisplayList(height, width)
  458.  
  459.     for x = 1, width do
  460.         output.pixels[x] = output.pixels[x] or {}
  461.         for y = 1, height do
  462.             output.pixels[x][y] = 0x000000
  463.         end
  464.     end
  465.     local y = 1
  466.     output.pixels[2][y], output.pixels[3][y], output.pixels[4][y],
  467.     output.pixels[10][y] = applyValueToN( 0xFF7AE4, 4)
  468.  
  469.     output.pixels[11][y], output.pixels[12][y], output.pixels[16][y],
  470.     output.pixels[17][y], output.pixels[18][y], output.pixels[22][y],
  471.     output.pixels[23][y], output.pixels[24][y], output.pixels[28][y],
  472.     output.pixels[29][y], output.pixels[30][y], output.pixels[34][y] = applyValueToN( 0xFF0000, 12)
  473.  
  474.     y = 2
  475.     output.pixels[1][y], output.pixels[2][y], output.pixels[3][y],
  476.     output.pixels[4][y], output.pixels[5][y], output.pixels[6][y],
  477.     output.pixels[7][y], output.pixels[8][y], output.pixels[9][y] = applyValueToN( 0xFF7AE4, 9)
  478.  
  479.     output.pixels[10][y], output.pixels[11][y], output.pixels[12][y],
  480.     output.pixels[16][y], output.pixels[17][y], output.pixels[18][y],
  481.     output.pixels[22][y], output.pixels[23][y], output.pixels[24][y],
  482.     output.pixels[28][y], output.pixels[29][y], output.pixels[30][y],
  483.     output.pixels[34][y] = applyValueToN( 0xFF9900, 13)
  484.  
  485.     output.pixels[13][y], output.pixels[14][y], output.pixels[15][y],
  486.     output.pixels[19][y], output.pixels[20][y], output.pixels[21][y],
  487.     output.pixels[25][y], output.pixels[26][y], output.pixels[27][y],
  488.     output.pixels[31][y], output.pixels[32][y], output.pixels[33][y] = applyValueToN( 0xFF0000, 12)
  489.  
  490.     y = 3
  491.     output.pixels[2][y], output.pixels[3][y],
  492.     output.pixels[4][y], output.pixels[5][y], output.pixels[6][y],
  493.     output.pixels[7][y], output.pixels[8][y], output.pixels[9][y] = applyValueToN( 0xFF7AE4, 8)
  494.  
  495.     output.pixels[10][y], output.pixels[11][y], output.pixels[12][y],
  496.     output.pixels[16][y], output.pixels[17][y], output.pixels[18][y],
  497.     output.pixels[22][y], output.pixels[23][y], output.pixels[24][y],
  498.     output.pixels[28][y], output.pixels[29][y], output.pixels[30][y],
  499.     output.pixels[34][y] = applyValueToN( 0x00FF00, 13)
  500.  
  501.     output.pixels[13][y], output.pixels[14][y], output.pixels[15][y],
  502.     output.pixels[19][y], output.pixels[20][y], output.pixels[21][y],
  503.     output.pixels[25][y], output.pixels[26][y], output.pixels[27][y],
  504.     output.pixels[31][y], output.pixels[32][y], output.pixels[33][y] = applyValueToN( 0xFF9900, 12)
  505.  
  506.     y = 4
  507.     output.pixels[5][y], output.pixels[6][y],
  508.     output.pixels[7][y], output.pixels[8][y], output.pixels[9][y] = applyValueToN( 0xFF7AE4, 5)
  509.  
  510.     output.pixels[10][y], output.pixels[11][y], output.pixels[12][y],
  511.     output.pixels[16][y], output.pixels[17][y], output.pixels[18][y],
  512.     output.pixels[22][y], output.pixels[23][y], output.pixels[24][y],
  513.     output.pixels[28][y], output.pixels[29][y], output.pixels[30][y],
  514.     output.pixels[34][y] = applyValueToN( 0x0000FF, 13)
  515.  
  516.     output.pixels[13][y], output.pixels[14][y], output.pixels[15][y],
  517.     output.pixels[19][y], output.pixels[20][y], output.pixels[21][y],
  518.     output.pixels[25][y], output.pixels[26][y], output.pixels[27][y],
  519.     output.pixels[31][y], output.pixels[32][y], output.pixels[33][y] = applyValueToN( 0x00FF00, 12)
  520.  
  521.     y = 5
  522.     output.pixels[5][y], output.pixels[9][y] = applyValueToN( 0xFF7AE4, 2)
  523.  
  524.     output.pixels[13][y], output.pixels[14][y], output.pixels[15][y],
  525.     output.pixels[19][y], output.pixels[20][y], output.pixels[21][y],
  526.     output.pixels[25][y], output.pixels[26][y], output.pixels[27][y],
  527.     output.pixels[31][y], output.pixels[32][y], output.pixels[33][y] = applyValueToN( 0x0000FF, 12)
  528.  
  529.     return output
  530.  
  531. end
  532.  
  533.  
  534. local function newLargeScreen(height, width, displayList)
  535.     local output = {}
  536.     local pixels = getNumberedPeripherals("glowstone_illuminator", 0, 169)
  537.  
  538.     output.height = height
  539.     output.width = width
  540.     output.pixels = {}
  541.     output.displayList = displayList or newDisplayList(7, 36)
  542.     output.fullRefresh = false
  543.  
  544.     for x = 1, width do
  545.         output.pixels[x] = {}
  546.         for y = 1, height do
  547.             if PIXEL_MAP[x] and PIXEL_MAP[x][y] then
  548.                 output.pixels[PIXEL_MAP[x][y]] = pixels[x * y]
  549.             else
  550.                 output.pixels[x][y] = pixels[((x - 1) * height) + y]
  551.             end
  552.         end
  553.     end
  554.  
  555.     output.tick = function(self)
  556.         if self.fullRefresh then
  557.             self:drawAll()
  558.             return
  559.         end
  560.  
  561.         if self.displayList.dirty then
  562.             for i,v in ipairs(self.displayList.dirtyPixels) do
  563.                 output.pixels[v.x][v.x].setColor(self.displayList[v.x][v.y])
  564.             end
  565.         end
  566.     end
  567.  
  568.     output.drawAll = function(self)
  569.         for x = 1, self.width do
  570.             for y = 1, self.height do
  571.                 --sleep(1)
  572.                 if self.displayList.pixels[x + self.displayList.x] and self.displayList.pixels[x + self.displayList.x][y + self.displayList.y] then
  573.                     output.pixels[x][y].setColor(self.displayList.pixels[x + self.displayList.x][y + self.displayList.y])
  574.                 end
  575.             end
  576.         end
  577.     end
  578.     return output
  579. end
  580.  
  581. local function largeScreen()
  582.     local countDisplay = newDisplayList(5, 34)
  583.     local diffDisplay = newDisplayList(5, 34)
  584.     local yogsList = newYogsList(5,34)
  585.     local pigList = newPigList(5,34)
  586.     local faceList = newSLList(5,34)
  587.     local specialList = 0
  588.     local blankList = newDisplayList(5,34)
  589.  
  590.     local largeMonitor = newLargeScreen(5, 34, countDisplay)
  591.  
  592.     local nextSpecial = -1
  593.     local specialLevel = -1
  594.     local testSpecial = false
  595.  
  596.     local firstDot = peripheral.wrap("glowstone_illuminator_170")
  597.     local secondDot = peripheral.wrap("glowstone_illuminator_171")
  598.  
  599.     firstDot.setColor( 0x000000)
  600.     secondDot.setColor( 0x000000)
  601.  
  602.     local time = os.clock()
  603.  
  604.     largeMonitor:drawAll()
  605.  
  606.     rs.setBundledOutput("left", colours.black)
  607.  
  608.     local forceUpdate = true
  609.  
  610.     while true do
  611.  
  612.         print("getting data!")
  613.  
  614.         local e, side, sChan, rChan, message, distance = waitForEvent("modem_message", 1)
  615.         local data = textutils.unserialize(message)
  616.  
  617.         print("got Data!")
  618.  
  619.         prevAmount = currentAmount
  620.         currentAmount = data.currentAmount
  621.         difference = currentAmount - prevAmount
  622.         contributions = data.contributions
  623.         amounts = data.amounts
  624.  
  625.         if nextSpecial < 0 then
  626.             nextSpecial = math.ceil(currentAmount * 0.00001)
  627.             if nextSpecial - 0.5 > currentAmount * 0.00001 then
  628.                 nextSpecial = (nextSpecial - 0.5) * 100000
  629.                 specialLevel = 1
  630.             elseif nextSpecial % 10 == 0 then
  631.                 specialLevel = 3
  632.             else
  633.                 specialLevel = 2
  634.             end
  635.  
  636.             nextSpecial = nextSpecial * 100000
  637.             print("nextSpecial is "..nextSpecial)
  638.         end
  639.  
  640.        
  641.             --new display list, draw all the numbers to the display list
  642.  
  643.         if difference > 0  or forceUpdate then
  644.            
  645.             local currentAmountStr = tostring(currentAmount)
  646.             local prevAmountStr = tostring(prevAmount)
  647.             local differenceStr = tostring(difference)
  648.             local magnitudeDif = differenceStr:len()
  649.  
  650.             local runningX = largeMonitor.width
  651.  
  652.             --print("difference: "..differenceStr)
  653.  
  654.             --print(currentAmountStr.." "..prevAmountStr)
  655.             --print(currentAmountStr:len().." "..prevAmountStr:len())
  656.             --print(magnitudeDif)
  657.             --print(differenceStr)
  658.  
  659.             if currentAmountStr:len() == prevAmountStr:len() and not forceUpdate then
  660.                 for i = magnitudeDif, 0, -1 do
  661.                     local oldC = currentAmountStr:sub(currentAmountStr:len()-i, currentAmountStr:len()-i)
  662.                     local newC = prevAmountStr:sub(prevAmountStr:len()-i, prevAmountStr:len()-i)
  663.                     if oldC ~= newC then
  664.                         local newNumberObj = newNumber(tonumber(newC))
  665.                         newNumberObj.x = largeMonitor.width - ((i + 1) * 5)
  666.                         countDisplay:addChild(newNumberObj)
  667.                     end
  668.                 end
  669.             else --Clear the whole thing. Chances are every number has changed
  670.                 countDisplay = newDisplayList(7,36)
  671.                 for i = currentAmountStr:len(), 1, -1 do
  672.                     local newNumberObj = newNumber(tonumber(currentAmountStr:sub(i,i)), 0xFFFFFF)
  673.                     newNumberObj.x = runningX - newNumberObj.width
  674.                     runningX = newNumberObj.x - 1
  675.                     --print("Adding Char "..currentAmountStr:sub(i,i).." at "..newNumberObj.x.." x")
  676.                     newNumberObj.y = 1
  677.                     countDisplay:addChild(newNumberObj)
  678.                 end
  679.             end
  680.             runningX = largeMonitor.width
  681.             if difference > 0 then
  682.                 time = os.clock()
  683.                 diffDisplay = newDisplayList(5, 34)
  684.                 diffDisplay.y = 0 - diffDisplay.height
  685.                 firstDot.setColor( 0x000000)
  686.                 secondDot.setColor( 0x000000)
  687.                 for i = differenceStr:len(), 1, -1 do
  688.                     local newNumberObj = newNumber(tonumber(differenceStr:sub(i, i)), 0xFFFFFF)
  689.                     newNumberObj.x = runningX - newNumberObj.width
  690.                     runningX = newNumberObj.x - 1
  691.                     --print("Adding Char "..differenceStr:sub(i,i).." at "..newNumberObj.x.." x")
  692.                     diffDisplay:addChild(newNumberObj)
  693.                     if i == 1 then
  694.                         newNumberObj = newPlusSymbol( 0x33FF33 )
  695.                         newNumberObj.x = runningX - newNumberObj.width
  696.                         runningX = newNumberObj.x - 1
  697.                         newNumberObj.y = 1
  698.                         diffDisplay:addChild(newNumberObj)
  699.                     end
  700.                 end
  701.  
  702.                 for i = largeMonitor.displayList.y, largeMonitor.displayList.height do
  703.                     largeMonitor:drawAll()
  704.                     largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  705.                     sleep(0.1)
  706.                 end
  707.  
  708.                 largeMonitor.displayList = diffDisplay
  709.                 fullRefresh = true
  710.                 --largeMonitor:drawAll()
  711.  
  712.                 for i = diffDisplay.y, 0 do
  713.                     largeMonitor:drawAll()
  714.                     diffDisplay.y = diffDisplay.y + 1
  715.                     sleep(0.1)
  716.                 end
  717.  
  718.                 sleep(4)
  719.  
  720.                 diffDisplay.y = diffDisplay.y - 1
  721.                 for i = diffDisplay.y, 0 - diffDisplay.height, -1 do
  722.                     largeMonitor:drawAll()
  723.                     diffDisplay.y = diffDisplay.y - 1
  724.                     sleep(0.1)
  725.                 end
  726.  
  727.                 largeMonitor.displayList = countDisplay
  728.                 countDisplay.y = largeMonitor.displayList.height
  729.                 for i = largeMonitor.displayList.y, 0, -1 do
  730.                     largeMonitor:drawAll()
  731.                     largeMonitor.displayList.y = largeMonitor.displayList.y - 1
  732.                     sleep(0.1)
  733.                 end
  734.  
  735.                 largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  736.  
  737.             end
  738.  
  739.             if os.clock() - time > WAIT_TIME then
  740.  
  741.                 firstDot.setColor( 0x000000)
  742.                 secondDot.setColor( 0x000000)
  743.  
  744.                 rand = math.random(100)
  745.  
  746.                 if rand > 66 then
  747.  
  748.                     for i = largeMonitor.displayList.y, largeMonitor.displayList.height do
  749.                         largeMonitor:drawAll()
  750.                         largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  751.                         sleep(0.1)
  752.                     end
  753.  
  754.                     largeMonitor.displayList = yogsList
  755.                     yogsList.y = 0 - yogsList.height
  756.                     rs.setBundledOutput("left", 0)
  757.                    
  758.                     for i = yogsList.y, 0 do
  759.                         largeMonitor:drawAll()
  760.                         yogsList.y = yogsList.y + 1
  761.                         sleep(0.1)
  762.                     end
  763.  
  764.                     sleep(5)
  765.  
  766.                     for i = yogsList.y, yogsList.height do
  767.                         largeMonitor:drawAll()
  768.                         yogsList.y = yogsList.y + 1
  769.                         sleep(0.1)
  770.                     end
  771.  
  772.                     largeMonitor.displayList = countDisplay
  773.                     largeMonitor.displayList.y = 0 - countDisplay.height
  774.  
  775.                     for i = largeMonitor.displayList.y, -1 do
  776.                         largeMonitor:drawAll()
  777.                         largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  778.                         sleep(0.1)
  779.                     end
  780.                 elseif rand > 33 then
  781.  
  782.                     for i = largeMonitor.displayList.y, largeMonitor.displayList.height do
  783.                         largeMonitor:drawAll()
  784.                         largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  785.                         sleep(0.1)
  786.                     end
  787.  
  788.                     largeMonitor.displayList = pigList
  789.                     pigList.x = 0 - pigList.width
  790.                     rs.setBundledOutput("left", 0)
  791.  
  792.                     for i = pigList.x, pigList.width do
  793.                         largeMonitor:drawAll()
  794.                         pigList.x = pigList.x + 1
  795.                         sleep(0.1)
  796.                     end
  797.  
  798.                     largeMonitor.displayList = countDisplay
  799.                     largeMonitor.displayList.y = 0 - countDisplay.height
  800.  
  801.                     for i = largeMonitor.displayList.y, -1 do
  802.                         largeMonitor:drawAll()
  803.                         largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  804.                         sleep(0.1)
  805.                     end
  806.                 else
  807.                     rs.setBundledOutput("left", 0)
  808.                     for i = largeMonitor.displayList.y, largeMonitor.displayList.height do
  809.                     largeMonitor:drawAll()
  810.                     largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  811.                     sleep(0.1)
  812.                     end
  813.  
  814.                     largeMonitor.displayList = faceList
  815.                     fullRefresh = true
  816.                     faceList.y = 0 - faceList.height
  817.                     --largeMonitor:drawAll()
  818.  
  819.                     for i = faceList.y, 0 do
  820.                         largeMonitor:drawAll()
  821.                         faceList.y = faceList.y + 1
  822.                         sleep(0.1)
  823.                     end
  824.  
  825.                     sleep(4)
  826.  
  827.                     faceList.y = faceList.y - 1
  828.                     for i = faceList.y, 0 - faceList.height, -1 do
  829.                         largeMonitor:drawAll()
  830.                         faceList.y = faceList.y - 1
  831.                         sleep(0.1)
  832.                     end
  833.  
  834.                     largeMonitor.displayList = countDisplay
  835.                     countDisplay.y = largeMonitor.displayList.height
  836.                     for i = largeMonitor.displayList.y, 0, -1 do
  837.                         largeMonitor:drawAll()
  838.                         largeMonitor.displayList.y = largeMonitor.displayList.y - 1
  839.                         sleep(0.1)
  840.                     end
  841.  
  842.                     largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  843.  
  844.                 end
  845.            
  846.  
  847.                 rs.setBundledOutput("left", colours.black)
  848.  
  849.                 time = os.clock()
  850.  
  851.             end
  852.  
  853.             if nextSpecial <= currentAmount or testSpecial then
  854.  
  855.                 specialList = newDisplayList(7,36)
  856.                 runningX = largeMonitor.width
  857.  
  858.                 for i = tostring(nextSpecial):len(), 1, -1 do
  859.                     local newNumberObj = newNumber(tonumber(tostring(nextSpecial):sub(i,i)), 0xFFFFFF)
  860.                     newNumberObj.x = runningX - newNumberObj.width
  861.                     runningX = newNumberObj.x - 1
  862.                     --print("Adding Char "..currentAmountStr:sub(i,i).." at "..newNumberObj.x.." x")
  863.                     newNumberObj.y = 1
  864.                     specialList:addChild(newNumberObj)
  865.                 end
  866.  
  867.                 for i = largeMonitor.displayList.y, largeMonitor.displayList.height do
  868.                     largeMonitor:drawAll()
  869.                     largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  870.                     sleep(0.1)
  871.                 end
  872.  
  873.                 largeMonitor.displayList = specialList
  874.                 specialList.y = 0 - specialList.height
  875.  
  876.                 for i = specialList.y, 0 do
  877.                     largeMonitor:drawAll()
  878.                     specialList.y = specialList.y + 1
  879.                     sleep(0.1)
  880.                 end
  881.  
  882.                 specialList.y = specialList.y - 1
  883.  
  884.                 if specialLevel > 2 then
  885.                     rs.setBundledOutput("left", colours.red)
  886.                     largeMonitor.displayList = blankList
  887.                     largeMonitor:drawAll()
  888.                     sleep(0.5)
  889.                     rs.setBundledOutput("left", 0)
  890.                     largeMonitor.displayList = specialList
  891.                     largeMonitor:drawAll()
  892.                     sleep(0.5)
  893.                     rs.setBundledOutput("left", colours.red)
  894.                     largeMonitor.displayList = blankList
  895.                     largeMonitor:drawAll()
  896.                     sleep(0.5)
  897.                     rs.setBundledOutput("left", 0)
  898.                     largeMonitor.displayList = specialList
  899.                     largeMonitor:drawAll()
  900.                     sleep(0.5)
  901.                     rs.setBundledOutput("left", colours.red)
  902.                     largeMonitor.displayList = blankList
  903.                     largeMonitor:drawAll()
  904.                     sleep(0.5)
  905.                     largeMonitor.displayList = specialList
  906.                     largeMonitor.drawAll()
  907.                 elseif specialLevel > 1 then
  908.                     rs.setBundledOutput("left", colours.green)
  909.                     largeMonitor.displayList = blankList
  910.                     largeMonitor:drawAll()
  911.                     sleep(0.5)
  912.                     rs.setBundledOutput("left", 0)
  913.                     largeMonitor.displayList = specialList
  914.                     largeMonitor:drawAll()
  915.                     sleep(0.5)
  916.                     rs.setBundledOutput("left", colours.green)
  917.                     largeMonitor.displayList = blankList
  918.                     largeMonitor:drawAll()
  919.                     sleep(0.5)
  920.                     rs.setBundledOutput("left", 0)
  921.                     largeMonitor.displayList = specialList
  922.                     largeMonitor:drawAll()
  923.                     sleep(0.5)
  924.                     rs.setBundledOutput("left", colours.green)
  925.                     largeMonitor.displayList = blankList
  926.                     largeMonitor:drawAll()
  927.                     sleep(0.5)
  928.                     largeMonitor.displayList = specialList
  929.                     largeMonitor:drawAll()
  930.                 else
  931.                     rs.setBundledOutput("left", colours.blue)
  932.                     largeMonitor.displayList = blankList
  933.                     largeMonitor:drawAll()
  934.                     sleep(0.5)
  935.                     rs.setBundledOutput("left", 0)
  936.                     largeMonitor.displayList = specialList
  937.                     largeMonitor:drawAll()
  938.                     sleep(0.5)
  939.                     rs.setBundledOutput("left", colours.blue)
  940.                     largeMonitor.displayList = blankList
  941.                     largeMonitor:drawAll()
  942.                     sleep(0.5)
  943.                     rs.setBundledOutput("left", 0)
  944.                     largeMonitor.displayList = specialList
  945.                     largeMonitor:drawAll()
  946.                     sleep(0.5)
  947.                     rs.setBundledOutput("left", colours.blue)
  948.                     largeMonitor.displayList = blankList
  949.                     largeMonitor:drawAll()
  950.                     sleep(0.5)
  951.                     largeMonitor.displayList = specialList
  952.                     largeMonitor:drawAll()
  953.                 end
  954.  
  955.                 for i = specialList.y, specialList.height do
  956.                     largeMonitor:drawAll()
  957.                     yogsList.y = yogsList.y + 1
  958.                     sleep(0.1)
  959.                 end
  960.  
  961.                 largeMonitor.displayList = countDisplay
  962.                 largeMonitor.displayList.y = 0 - countDisplay.height
  963.  
  964.                 for i = largeMonitor.displayList.y, -1 do
  965.                     largeMonitor:drawAll()
  966.                     largeMonitor.displayList.y = largeMonitor.displayList.y + 1
  967.                     sleep(0.1)
  968.                 end
  969.  
  970.                 nextSpecial = -1
  971.  
  972.                 rs.setBundledOutput("left", colours.black)
  973.  
  974.             end
  975.  
  976.             largeMonitor.displayList = countDisplay
  977.             fullRefresh = true
  978.             largeMonitor:drawAll()
  979.  
  980.             if currentAmount >= 1000 then
  981.                 firstDot.setColor( 0xFFFFFF)
  982.             else
  983.                 firstDot.setColor( 0x000000)
  984.             end
  985.  
  986.             if currentAmount >= 1000000 then
  987.                 secondDot.setColor( 0xFFFFFF)
  988.             else
  989.                 secondDot.setColor( 0x000000)
  990.             end
  991.  
  992.             --forceUpdate = false
  993.         end
  994.     end
  995. end
  996.  
  997. local function smallScreen()
  998.  
  999.     monitor.setTextScale(1)
  1000.     local screenImage = paintutils.loadImage("screen")
  1001.  
  1002.     while true do
  1003.  
  1004.         local e, side, sChan, rChan, message, distance = pull("modem_message", 1)
  1005.         print("message: "..message)
  1006.         local data = textutils.unserialize(message)
  1007.  
  1008.         prevAmount = data.prevAmount
  1009.         currentAmount = data.currentAmount
  1010.         difference = data.difference
  1011.         contributions = data.contributions
  1012.         amounts = data.amounts
  1013.     end
  1014. end
  1015.  
  1016. local function clientMain()
  1017.     monitor = getMonitor()
  1018.     modem = peripheral.wrap("bottom")
  1019.  
  1020.     modem.open(TRANSMIT_CHANNEL)
  1021.  
  1022.     clearEvents() --Clear out the event list so that it's clean and ready to recieve messages
  1023.     sleep(0.5)
  1024.  
  1025.     term.clear()
  1026.     print("Large Screen?")
  1027.     local choice = read()
  1028.     if choice:sub(1,1):lower() == "y" then
  1029.         largeScreen()
  1030.     else
  1031.         smallScreen()
  1032.     end
  1033.  
  1034.     --sort out logic for different clients
  1035. end
  1036.  
  1037. local function serverMain()
  1038.     local newData
  1039.  
  1040.     while true do
  1041.         oldData = newData or oldData
  1042.         print("Getting Data")
  1043.         local newData = pullData()
  1044.        
  1045.         --print(textutils.serialize(newData))
  1046.         if newData then
  1047.             print("newData!")
  1048.             newData = decodeData(newData)
  1049.             newData = newData[1][1]
  1050.             prevAmount = currentAmount
  1051.             currentAmount = round(newData.stats.rawtotal)
  1052.             difference = currentAmount - prevAmount
  1053.             contributions = newData.stats.numberofcontributions
  1054.             amounts = newData.stats.rawplatformtotals
  1055.         else
  1056.             print("old Data!")
  1057.         end
  1058.             print(currentAmount)
  1059.             --print(difference)
  1060.  
  1061.         --local data =
  1062.         if newData or oldData then
  1063.             modem.transmit(88, 1, textutils.serialize({prevAmount = prevAmount, currentAmount = currentAmount, difference = difference, contributions = contributions, amounts = amounts}))
  1064.         else
  1065.             print("No Data!")
  1066.         end
  1067.  
  1068.         sleep(5)
  1069.     end
  1070. end
  1071.  
  1072. local function main()
  1073.     modem = getModem()
  1074.     --am I a client or a server?
  1075.     term.clear()
  1076.     print("Client or Server?")
  1077.     local choice = read()
  1078.     if choice:sub(1,1):lower() == "s" then
  1079.         --I'm a server
  1080.         serverMain()
  1081.     else
  1082.         --I'm a client
  1083.         clientMain()
  1084.     end
  1085. end
  1086.  
  1087. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement