github rainmeter

github的雨滴效果

安装此脚本
作者推荐脚本

您可能也喜欢github maze

安装此脚本
  1. // ==UserScript==
  2. // @name github rainmeter
  3. // @author wusuluren
  4. // @description github的雨滴效果
  5. // @require http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js
  6. // @match *://github.com/*
  7. // @supportURL https://github.com/Wusuluren
  8. // @version 0.0.1
  9. // @grant None
  10. // @namespace https://greasyfork.org/users/194747
  11. // ==/UserScript==
  12. (function () {
  13. 'use strict';
  14. class Position {
  15. constructor(x, y) {
  16. this.x = x
  17. this.y = y
  18. }
  19. }
  20. class RainMeter extends Position {
  21. constructor(x, y, prev, next, expire, depth) {
  22. super(x, y)
  23. this.prev = prev
  24. this.next = next
  25. this.expire = expire
  26. this.passed = 0
  27. this.depth = depth
  28. }
  29. }
  30. var color_table = new Array()
  31. var Screen_Width, Screen_Height
  32. var map
  33. var rainmeter_head
  34. $(function(){
  35. get_color_table()
  36. clear_screen()
  37. init()
  38. var timer = setInterval(function() {
  39. update_rainmeter()
  40. }, 1000)
  41. })
  42. function clear_screen() {
  43. full(0)
  44. }
  45. function get_color_table () {
  46. var lis = $('.legend').children()
  47. for (var i = 0; i < lis.length; i++) {
  48. color_table[i] = lis[i].style.backgroundColor
  49. }
  50. }
  51. function draw_point(x, y, depth) {
  52. var gs = document.getElementsByTagName('g')
  53. if (x < gs.length) {
  54. var days = gs[x].getElementsByClassName('day')
  55. if (y < days.length) {
  56. days[y].setAttribute('fill', color_table[depth])
  57. }
  58. }
  59. }
  60. function draw_position(pos, depth) {
  61. var gs = document.getElementsByTagName('g')
  62. if (pos.x < gs.length) {
  63. var days = gs[pos.x].getElementsByClassName('day')
  64. if (pos.y < days.length) {
  65. days[pos.y].setAttribute('fill', color_table[depth])
  66. }
  67. }
  68. }
  69. function draw_rainmeter(rainmeter) {
  70. draw_position(rainmeter, rainmeter.depth)
  71. }
  72. function clear_rainmeter(rainmeter) {
  73. draw_position(rainmeter, 0)
  74. }
  75. function full (depth) {
  76. var gs = document.getElementsByTagName('g')
  77. if (gs === undefined)
  78. return false
  79. for (var x = 1; x < gs.length; x++) {
  80. for (var y = 0; y < 7; y++)
  81. draw_point(x, y, depth)
  82. }
  83. return true
  84. }
  85. function new_position() {
  86. var x = new_random(Screen_Width)
  87. var y = new_random(Screen_Height)
  88. if (map[y][x] === undefined || map[y][x] == 1)
  89. return undefined
  90. return new Position(x, y)
  91. }
  92. function new_random(max) {
  93. return Math.floor(Math.random() * max)
  94. }
  95. function same_position(a, b) {
  96. return a.x == b.x && a.y == b.y
  97. }
  98. function new_rainmeter() {
  99. var pos = new_position()
  100. if (pos === undefined) {
  101. return undefined
  102. }
  103. var expire = new_random(10) + 5
  104. var depth = new_random(4) + 1
  105. var rainmeter = new RainMeter(pos.x, pos.y, undefined, undefined, expire, depth)
  106. return rainmeter
  107. }
  108. function init() {
  109. var gs = document.getElementsByTagName('g')
  110. Screen_Width = gs.length
  111. Screen_Height = 7
  112. map = new Array()
  113. for (var y = 0; y < Screen_Height; y++) {
  114. map[y] = new Array()
  115. for (var x = 0; x < Screen_Width; x++)
  116. map[y][x] = 0
  117. }
  118. rainmeter_head = new_rainmeter()
  119. draw_rainmeter(rainmeter_head)
  120. map[rainmeter_head.y][rainmeter_head.x] = 1
  121. }
  122. function update_rainmeter() {
  123. var num = new_random(10) + 5
  124. for (var i = 0; i < num; i++) {
  125. var rainmeter = new_rainmeter()
  126. if (rainmeter !== undefined) {
  127. draw_rainmeter(rainmeter_head)
  128. map[rainmeter.y][rainmeter.x] = 1
  129.  
  130. rainmeter_head.prev = rainmeter
  131. rainmeter.next = rainmeter_head
  132. rainmeter_head = rainmeter
  133. }
  134. }
  135. rainmeter = rainmeter_head
  136. while (rainmeter !== undefined) {
  137. if (rainmeter.passed > rainmeter.expire) {
  138. clear_rainmeter(rainmeter)
  139. map[rainmeter.y][rainmeter.x] = 0
  140. if (rainmeter.next !== undefined && rainmeter.next.prev !== undefined)
  141. rainmeter.next.prev = rainmeter.prev
  142. if (rainmeter.prev !== undefined && rainmeter.prev.next !== undefined)
  143. rainmeter.prev.next = rainmeter.next
  144. }
  145. rainmeter.passed++
  146. rainmeter = rainmeter.next
  147. }
  148. }
  149. })();