Guest User

Tagpro MultiSpin

a guest
Apr 27th, 2015
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.51 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Tagpro MultiSpin
  3. // @description Spin for various shapes
  4. // @version 1.0
  5. // @include http://tagpro-*.koalabeast.com:*
  6. // @include http://tangent.jukejuice.com:*
  7. // @include http://*.newcompte.fr:*
  8. // @license 2015
  9. // @author Despair, browncoat(emitters)
  10. // ==/UserScript==
  11.  
  12. var browncoatEmit = true;
  13.  
  14. var drawShadows = true;
  15.  
  16. var randomShapes = false;
  17.  
  18. tagpro.ready(function (){
  19.  
  20. var tr = tagpro.renderer;
  21.  
  22. // - define sprites - //
  23.  
  24. var TEX = {};
  25. TEX.Source = PIXI.Texture.fromImage('http://i.imgur.com/t9lep44.png');
  26.  
  27. TEX.background = {
  28. red : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(0, 0, 60, 60)),
  29. blue : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(60, 0, 60, 60))
  30. };
  31. TEX.circle = {
  32. shadow : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(120, 0, 60, 60)),
  33. red : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(0, 60, 40, 40)),
  34. blue : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(40, 60, 40, 40)),
  35. green : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(80, 60, 40, 40))
  36. };
  37. TEX.square = {
  38. shadow : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(120, 60, 60, 60)),
  39. red : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(0, 100, 40, 40)),
  40. blue : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(40, 100, 40, 40)),
  41. green : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(80, 100, 40, 40))
  42. };
  43. TEX.triangle = {
  44. shadow : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(120, 120, 60, 60)),
  45. red : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(0, 140, 40, 40)),
  46. blue : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(40, 140, 40, 40)),
  47. green : new PIXI.Texture(TEX.Source, new PIXI.Rectangle(80, 140, 40, 40))
  48. };
  49.  
  50. // - define particle effects - //
  51.  
  52. tagpro.particleDefinitions.customTP = {
  53. "alpha": {"start": 0.75, "end": 0},
  54. "scale": {"start": 0.35, "end": 0.25, "minimumScaleMultiplier": 1},
  55. "color": {"start": "#00cc00", "end": "#7cf575"},
  56. "speed": {"start": 0, "end": 0},
  57. "acceleration": {"x": 0, "y": 0},
  58. "startRotation": {"min": 0, "max": 360},
  59. "rotationSpeed": {"min": 0, "max": 0},
  60. "lifetime": {"min": 0.1, "max": 0.9},
  61. "blendMode": "normal",
  62. "frequency": 0.01,
  63. "emitterLifetime": -1,
  64. "maxParticles": 50,
  65. "pos": {"x": 0, "y": 0},
  66. "addAtBack": true,
  67. "spawnType": "circle",
  68. "spawnCircle": {"x": 20, "y": 20, "r": 20}
  69. };
  70.  
  71. tagpro.particleDefinitions.customRB = {
  72. "alpha": {"start": 0.25, "end": 0},
  73. "scale": {"start": 0.5, "end": 0.2, "minimumScaleMultiplier": 1},
  74. "color": {"start": "#85888d", "end": "#100f0c"},
  75. "speed": {"start": 1, "end": 0},
  76. "acceleration": {"x": 0, "y": 0},
  77. "startRotation": {"min": 0, "max": 360},
  78. "rotationSpeed": {"min": 0, "max": 0},
  79. "lifetime": {"min": 0.5, "max": 2},
  80. "blendMode": "normal",
  81. "frequency": 0.025,
  82. "emitterLifetime": -1,
  83. "maxParticles": 50,
  84. "pos": {"x": 0, "y": 0},
  85. "addAtBack": false,
  86. "spawnType": "circle",
  87. "spawnCircle": {"x": 20, "y": 20, "r": 20}
  88. };
  89.  
  90. function createPlayerEmitterProperties(color){
  91. var props = {
  92. "alpha": {"start": 0.1,"end": 0},
  93. "scale": {"start": 1,"end": 1,"minimumScaleMultiplier": 1},
  94. "color": {"start": color,"end": color},
  95. "speed": {"start": 0,"end": 0},
  96. "acceleration": {"x": 0,"y": 0},
  97. "startRotation": {"min": 0,"max": 0},
  98. "rotationSpeed": {"min": 0,"max": 0},
  99. "lifetime": {"min": 1,"max": 1},
  100. "blendMode": "normal",
  101. "frequency": 0.02,
  102. "emitterLifetime": -1,
  103. "maxParticles": 100,
  104. "pos": {"x": 20,"y": 20},
  105. "addAtBack": false,
  106. "spawnType": "point"
  107. };
  108. return props;
  109. }
  110.  
  111. tagpro.particleDefinitions.customRedSpeed = createPlayerEmitterProperties('#D80000');
  112. tagpro.particleDefinitions.customBlueSpeed = createPlayerEmitterProperties('#0036D8');
  113.  
  114. if(browncoatEmit){
  115. tagpro.particleDefinitions.death = {
  116. "alpha": {"start": 0.6,"end": 0.3},
  117. "scale": {"start": 0.3,"end": 0.001,"minimumScaleMultiplier": 1},
  118. "color": {"start": "#ffffff","end": "#ffffff"},
  119. "speed": {"start": 300,"end": 300},
  120. "acceleration": {"x": 0,"y": 0},
  121. "startRotation": {"min": 0,"max": 360},
  122. "rotationSpeed": {"min": 0,"max": 0},
  123. "lifetime": {"min": 0.001,"max": 0.4},
  124. "blendMode": "normal",
  125. "frequency": 0.001,
  126. "emitterLifetime": 0.02,
  127. "maxParticles": 50,
  128. "pos": {"x": 0,"y": 0},
  129. "addAtBack": false,
  130. "spawnType": "circle",
  131. "spawnCircle": {"x": 0,"y": 0,"r": 0}
  132. };
  133. }
  134.  
  135. // - shapes and ploygons - //
  136.  
  137. function getShape(){
  138. var fakePlayer = {
  139. bomb:true, sprite:new PIXI.DisplayObjectContainer(), sprites:{ball:new PIXI.DisplayObjectContainer(),}
  140. };
  141. fakePlayer.sprite.addChild(fakePlayer.sprites.ball);
  142. tr.updateRollingBomb(fakePlayer);
  143. var wat = fakePlayer.sprites.bomb.graphicsData[0].type;
  144. if(wat === 0) wat = 'triangle';
  145. if(wat === 1) wat = 'square';
  146. if(wat == 2) wat = 'circle';
  147. return wat;
  148. }
  149.  
  150. var SHAPE = getShape();
  151.  
  152. function getRandomShape(){
  153. var validShapes = ['circle','square','triangle'];
  154. return validShapes[Math.floor(Math.random()*validShapes.length)];
  155. }
  156.  
  157. var cR = 13*Math.sqrt(3), cP = Math.PI/6,
  158. triPts = [cR*Math.cos(1*cP),cR*Math.sin(1*cP), cR*Math.cos(5*cP),cR*Math.sin(5*cP), cR*Math.cos(9*cP),cR*Math.sin(9*cP)];
  159. var TRIANGLE = new PIXI.Polygon(triPts[0],triPts[1], triPts[2],triPts[3], triPts[4],triPts[5]);
  160.  
  161. var invertedSquare = new PIXI.Polygon(
  162. -30,-30, -17,-30, -17,17, 17,17, 17,-17, -17,-17, -17,-30, 30,-30, 30,30, -30,30
  163. );
  164.  
  165. var invertedTriangle = new PIXI.Polygon(
  166. -40,triPts[3], triPts[0],triPts[1], triPts[4],triPts[5], triPts[2],triPts[3], -40,triPts[3], -40,-40, 40,-40, 40,40, -40,40
  167. );
  168.  
  169. // - emitter helpers - //
  170.  
  171. tr.addCustomEmitter = function(player, name, layer, texture, def){
  172. player.sprites[name] = new cloudkid.Emitter(
  173. (layer == "self") ? player.sprites.ball : tr.layers[layer],
  174. [tr[texture]], tagpro.particleDefinitions[def]);
  175. player.sprites[name].player = player.id;
  176. player.sprites[name].keep = true;
  177. player.sprites[name].emit = true;
  178. player.sprites[name].tileId = name;
  179. tr.emitters.push(player.sprites[name]);
  180. };
  181.  
  182. tr.updateCustomEmitter = function(player, name, condition, updatePos){
  183. var pse = player.sprites[name];
  184. updatePos = updatePos || false;
  185. if(condition){
  186. if(!pse.emit) pse.emit = true;
  187. if(updatePos) pse.updateSpawnPos(player.x, player.y);
  188. }else{
  189. if(pse.emit){
  190. pse.emit = false;
  191. if(updatePos) pse.resetPositionTracking();
  192. }
  193. }
  194. };
  195.  
  196. // - modify renderer - //
  197.  
  198. var upsp = tr.updatePlayerSpritePosition;
  199. tr.updatePlayerSpritePosition = function(player){
  200. if(!player.shape) player.shape = randomShapes ? getRandomShape() : SHAPE;
  201. if(player.sprites.actualBall.alpha !== 0) player.sprites.actualBall.alpha = 0;
  202. tr.updatePlayerBackground(player);
  203. tr.updatePlayerSpin(player);
  204. tr.updatePlayerTint(player);
  205. tr.updatePlayerEmitters(player);
  206. if(drawShadows) tr.updatePlayerShadow(player);
  207. upsp(player);
  208. };
  209.  
  210. var dp = tr.destroyPlayer;
  211. tr.destroyPlayer = function(player){
  212. var max = tr.emitters.length;
  213. for(var i = 0; i < max; i++){
  214. if(tr.emitters[i].player == player.id){
  215. if(tr.emitters[i].tileId){
  216. player.sprites[tr.emitters[i].tileId].destroy();
  217. player.sprites[tr.emitters[i].tileId] = null;
  218. tr.emitters.splice(i, 1);
  219. i--; max--;
  220. }
  221. }
  222. }
  223. dp(player);
  224. };
  225.  
  226. tr.createPlayerEmitter = function (player) {
  227. if (tr.options.disableParticles) {return;}
  228. var emitter = player.team == 1 ? tagpro.particleDefinitions.customRedSpeed : tagpro.particleDefinitions.customBlueSpeed;
  229. if(browncoatEmit){
  230. player.sprites.emitter = new cloudkid.Emitter(tr.layers.midground, [tr.particleTexture], emitter);
  231. player.sprites.emitter.tileId = player.team === 1 ? 'red' : 'blue';
  232. }else{
  233. player.sprites.emitter = new cloudkid.Emitter(
  234. tr.layers.midground, [tr.particleTexture, tr.particleFireTexture], tagpro.particleDefinitions.playerEmitter
  235. );
  236. }
  237. player.sprites.emitter.keep = true;
  238. tr.emitters.push(player.sprites.emitter);
  239. player.sprites.emitter.emit = false;
  240. };
  241.  
  242. var defaultStartDeathEmitter = tr.startDeathEmitter;
  243. tr.startDeathEmitter = function (startColor, stopColor, x, y) {
  244. var isRed = startColor == "ff0000";
  245. var color = isRed ? "D80000" : "0036D8";
  246. defaultStartDeathEmitter(color, stopColor, x, y);
  247. };
  248.  
  249. tr.updatePlayerPowerUps = function(player, context, drawPos){
  250. tr.updateGrip(player, context, drawPos);
  251. };
  252.  
  253. // - custom functions - //
  254.  
  255. tr.updatePlayerBackground = function(player){
  256. if(!player.sprites.base){
  257. player.sprites.base = new PIXI.DisplayObjectContainer();
  258. player.sprites.ball.addChild(player.sprites.base);
  259. }
  260. if(player.sprites.base){
  261. var team = player.team === 1 ? 'red' : 'blue', shape;
  262. if(!player.shape) shape = 'circle';
  263. else shape = TEX[player.shape] ? player.shape : 'circle';
  264. if(!player.sprites.background){
  265. player.sprites.background = new PIXI.Sprite(TEX.background[team]);
  266. player.sprites.base.addChild(player.sprites.background);
  267. player.sprites.background.x = -10;
  268. player.sprites.background.y = -10;
  269. player.sprites.background.tileId = team;
  270. }
  271. if(player.sprites.background){
  272. if(player.sprites.background.tileId !== team){
  273. player.sprites.background.setTexture(TEX.background[team]);
  274. player.sprites.background.tileId = team;
  275. }
  276. }
  277. if(!player.sprites.masker){
  278. player.sprites.masker = new PIXI.Graphics();
  279. player.sprites.masker.position = {x:20, y:20};
  280. player.sprites.masker.tileId = 'empty';
  281. player.sprites.base.addChild(player.sprites.masker);
  282. player.sprites.base.mask = player.sprites.masker;
  283. }
  284. if(player.sprites.masker){
  285. if(player.sprites.masker.tileId !== shape){
  286. player.sprites.masker.clear();
  287. player.sprites.masker.lineStyle(0).beginFill(0xffffff, 0.25);
  288. if(shape == 'circle') player.sprites.masker.drawCircle(0, 0, 19);
  289. else if(shape == 'square') player.sprites.masker.drawRect(-17, -17, 34, 34);
  290. else if(shape == 'triangle') player.sprites.masker.drawShape(TRIANGLE);
  291. player.sprites.masker.tileId = shape;//used as shape reference
  292. if(player.sprites.spin)player.sprites.spin.tileId = 'update';
  293. }
  294. player.sprites.masker.rotation = player.angle;
  295. }
  296. }
  297. };
  298.  
  299. tr.updatePlayerSpin = function(player){
  300. var color = player.team === 1 ? "red" : "blue";
  301. var shape = player.sprites.masker.tileId || 'circle';
  302. if(!player.sprites.spin){
  303. player.sprites.spin = new PIXI.Sprite(TEX[shape][color]);
  304. player.sprites.ball.addChild(player.sprites.spin);
  305. player.sprites.spin.x = 20;
  306. player.sprites.spin.y = 20;
  307. player.sprites.spin.anchor = {x:0.5, y:0.5};
  308. player.sprites.spin.tileId = {color:color, shape:'update'};
  309. }
  310. if(player.sprites.spin){
  311. if(player.tagpro) color = 'green';
  312. if(player.sprites.spin.tileId.color !== color || player.sprites.spin.tileId.shape !== shape){
  313. player.sprites.spin.setTexture(TEX[shape][color]);
  314. player.sprites.spin.tileId.color = color;
  315. player.sprites.spin.tileId.shape = shape;
  316. player.sprites.spin.anchor.y = (shape == 'triangle') ? 0.6 : 0.5;
  317. }
  318. player.sprites.spin.rotation = player.angle;
  319. }
  320. };
  321.  
  322. tr.updatePlayerTint = function(player){
  323. var state = 'empty', shape = player.sprites.masker.tileId || 'circle';
  324. if(player.bomb) state = 'rb';
  325. else if(player.tagpro) state = 'tp';
  326. if(!player.sprites.tint){
  327. player.sprites.tint = new PIXI.Graphics();
  328. player.sprites.tint.position = {x:20, y:20};
  329. player.sprites.tint.tileId = {state:'empty', shape:'update'};
  330. player.sprites.ball.addChild(player.sprites.tint);
  331. }
  332. if(player.sprites.tint){
  333. if(player.sprites.tint.tileId.state !== state || player.sprites.tint.tileId.shape !== shape){
  334. player.sprites.tint.clear();
  335. if(state !== 'empty'){
  336. if(state == 'rb') player.sprites.tint.beginFill(0xFFFF00, 0.6);
  337. else if(state == 'tp') player.sprites.tint.beginFill(0x00FF00, 0.25);
  338. if(shape == 'circle') player.sprites.tint.drawCircle(0, 0, 19);
  339. else if(shape == 'square') player.sprites.tint.drawRect(-17, -17, 34, 34);
  340. else if(shape == 'triangle') player.sprites.tint.drawShape(TRIANGLE);
  341. }
  342. player.sprites.tint.tileId.state = state;
  343. player.sprites.tint.tileId.shape = shape;
  344. }
  345. if(state !== 'empty'){
  346. player.sprites.tint.rotation = player.angle;
  347. player.sprites.tint.alpha = (state == 'tp') ? 1 : 0.1 + Math.abs(0.6 * Math.sin(performance.now() / 150));
  348. }
  349. }
  350. };
  351.  
  352. tr.updatePlayerEmitters = function(player){
  353. var color = player.team === 1 ? "red" : "blue";
  354. var canSee = player.draw && !player.dead, follow = false, browncoat, vanilla, a, index;
  355. if(browncoatEmit) follow = true;
  356. if(!tr.options.disableParticles){
  357. browncoat = {layer:'foreground', tpTex:'particleTexture', tpProp:'customTP', rbProp:'customRB'};
  358. vanilla = {layer:'self', tpTex:'particleFireTexture', tpProp:'tagproSparks', rbProp:'rollingBomb'};
  359. a = (browncoatEmit) ? browncoat : vanilla;
  360. if(!player.sprites.tagproSparks){tr.addCustomEmitter(player, "tagproSparks", a.layer, a.tpTex, a.tpProp);}
  361. if(!player.sprites.rollingBomb){tr.addCustomEmitter(player, "rollingBomb", a.layer, "particleTexture", a.rbProp);}
  362. }
  363. if(player.sprites.tagproSparks){tr.updateCustomEmitter(player, "tagproSparks", (player.tagpro && canSee), follow);}
  364. if(player.sprites.rollingBomb){tr.updateCustomEmitter(player, "rollingBomb", (player.bomb && canSee), follow);}
  365. // - default emitter
  366. if(browncoatEmit){
  367. if(player.sprites.emitter){
  368. if(player.sprites.emitter.tileId != color){
  369. index = tr.emitters.indexOf(player.sprites.emitter);
  370. player.sprites.emitter.destroy();
  371. player.sprites.emitter = null;
  372. tr.emitters.splice(index, 1);
  373. tr.createPlayerEmitter(player);
  374. }
  375. }
  376. }
  377. };
  378.  
  379. tr.updatePlayerShadow = function(player){
  380. var shape = player.sprites.masker.tileId || 'circle';
  381. if(!player.sprites.shade){
  382. player.sprites.shade = new PIXI.DisplayObjectContainer();
  383. player.sprites.ball.addChildAt(player.sprites.shade, 0);
  384. }
  385. if(player.sprites.shade){
  386. if(!player.sprites.shadow){
  387. player.sprites.shadow = new PIXI.Sprite(TEX[shape].shadow);
  388. player.sprites.shade.addChild(player.sprites.shadow);
  389. player.sprites.shadow.x = 15;
  390. player.sprites.shadow.y = 25;
  391. player.sprites.shadow.anchor = {x:0.5, y:0.5};
  392. player.sprites.shadow.tileId = shape;
  393. }
  394. if(player.sprites.shadow){
  395. if(player.sprites.shadow.tileId !== shape){
  396. player.sprites.shadow.setTexture(TEX[shape].shadow);
  397. player.sprites.shadow.tileId = shape;
  398. }
  399. player.sprites.shadow.rotation = (shape == 'circle') ? 0 : player.angle;
  400. }
  401. if(!player.sprites.shadowMask){
  402. player.sprites.shadowMask = new PIXI.Graphics();
  403. player.sprites.shadowMask.position = {x:20, y:20};
  404. player.sprites.shadowMask.tileId = 'empty';
  405. player.sprites.shade.addChild(player.sprites.shadowMask);
  406. player.sprites.shade.mask = player.sprites.shadowMask;
  407. }
  408. if(player.sprites.shadowMask){
  409. if(player.sprites.shadowMask.tileId !== shape){
  410. player.sprites.shadowMask.clear();
  411. if(shape != 'circle'){
  412. player.sprites.shadowMask.lineStyle(0).beginFill(0xffffff, 0.75);
  413. if(shape == 'square') player.sprites.shadowMask.drawShape(invertedSquare);
  414. if(shape == 'triangle') player.sprites.shadowMask.drawShape(invertedTriangle);
  415. }
  416. player.sprites.shadow.anchor.y = (shape == 'triangle') ? 0.6 : 0.5;
  417. player.sprites.shadowMask.tileId = shape;
  418. }
  419. player.sprites.shadowMask.rotation = player.angle;
  420. }
  421. }
  422. };
  423.  
  424. });
Advertisement
Add Comment
Please, Sign In to add comment