Downloads containing 1-Tweedle.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Tweedle WheedleFeatured Download Bloody_Body Single player 8.9 Download file

File preview

  1. //Hello, seems you're mad enough to open .j2as file! Let's see if you can read it to the end...
  2. //Unfortunately my English isn't perfect but I hope it's good enough so you will be able to understand my hints
  3. //I've spent some time learning how to use Angel Skript and actually, it's my first level.
  4. //I was inspired by the brilliant levels like Ozimandius, plusHeaven, plusEnscripted, ect- somehow I used some concepts from these levels, but I tried to adopt them to my own level
  5. //I also used some code snippets from JJ2 online. I wrote the names of their author near them, so as not to be accused of plagiarism. I'm sorry if I had forgotten someone.
  6. //Probably 60% of the features were created by some other levelmakers, but the remaining 40% are my ideas.
  7. //As for the layout of the level... I took someones (I'm sorry, I don't remember the author) level based on Far Out (unfinished official level) and developed it a lot more
  8. //Now it's really huge and full of secrets, different enemies and deadly pits (Yeah, I'm sadistic a bit :D)
  9. //This skript isn't finished though... I am planning to add several new things here like the menu which allows you to buy ammo and ammunition
  10. //instead of warping into the bonus area after paying the certain amount of coins, NPC (gunless Spaz if you play as Jazz or gunless Jazz otherwise)
  11. //Anyway, Tweedle kidnappes your bro, stoles his gun and uses it against you in the final fight. I also want to add chatting with bro and some enemies
  12. //(probably with an animation of your interlocutor, some similar concept was used in Ozimandius, remember?)
  13. //I also want to make bombs appear only when you release the fire button, and make Bubbas not to get stuck when being caught into the radius of explosion, and, well... Tweedle has the same problem if you set isBlastable to true.
  14. //I guess that the new version of JJ2+ allows to make vertically-rotated anim of Hatter's spittle (I wanna use it for spitgun)
  15. //I simply don't have time for that now, and it's difficult to create something like that alone, but I hope I'll make some update of this code when I am in a good mood and have some free time.
  16. //Now I'll have some rest from writing code and looking forward commentaries ;P
  17.  
  18. jjPAL myPal;
  19. const int UP  = 0x26;
  20. const int SHOOT  = 0x20;
  21. int i,g=0,z=0,v=0,x=0,b=0,u=1,shootpressed=0,m,lastTile = 0,killedBUBBAs=0, killedcats=0, killedbombs=0, killedsmallbombs=0,
  22. catgoal,bombgoal,smbombgoal;
  23. uint8 elapsed=0;
  24. jjOBJ@ spawnedObject;
  25. jjOBJ@ spawnedObject2;
  26. jjOBJ@ spawnedObject3;
  27. bool hueShift = false;
  28. bool normal = false;
  29. bool dark = false;
  30. bool bombs = false;
  31. bool cats = false;
  32. bool scene = true;
  33. bool boss = false;
  34. bool stoned = false;
  35. bool start = true;
  36. bool paused = false;
  37. jjPAL Twilight,FineDay,Golden,Bloody,Grim;
  38. const float cBombSpeed = 5; //xSpeed of the bomb
  39. const float cBombPlayerSpeed = 2; //xSpeed the bomb can gain by player speed (if a player is running full speed it will add 6 xSpeed)
  40. const int cBombLifeTime = 70*2;
  41.  
  42. const array<string> Shop = {
  43. "Great Carrot"
  44. "Ammo"
  45. };
  46.  
  47. const array<string> Hints = {
  48.         "Hint: Bubba's spirits are only affected by physical attacks",
  49.         "Hint: Blue ghosts aren't affected by physical attacks at all",
  50.         "Hint: The best weapon against Spiky balls are seeker missiles",
  51.         "Hint: You have to collect 200 coins to get access to the bonus area",
  52.         "Hint: Difficulty changes lots of things",
  53.         "Hint: Cheshire's flame won't chase you if you move vertically",
  54.         "Hint: Tweedle is immune to bombs",
  55.         "Hint: Fastfeet temporary makes your common jump higher than special jump",
  56. };
  57.  
  58. void onLevelLoad() {
  59. jjTileSet(4, 332, 28, jjTileGet(4, 332, 28) | TILE::VFLIPPED); 
  60. jjTileSet(4, 307, 28, jjTileGet(4, 307, 28) | TILE::VFLIPPED);
  61. jjTileSet(4, 426, 53, jjTileGet(4, 426, 53) | TILE::VFLIPPED);
  62. jjTileSet(4, 432, 53, jjTileGet(4, 432, 53) | TILE::VFLIPPED); 
  63. jjTileSet(4, 81, 19, jjTileGet(4, 81, 19) | TILE::VFLIPPED);           
  64. jjTileSet(4, 84, 19, jjTileGet(4, 84, 19) | TILE::VFLIPPED);   
  65. jjTileSet(4, 96, 19, jjTileGet(4, 96, 19) | TILE::VFLIPPED);   
  66. jjTileSet(4, 99, 19, jjTileGet(4, 99, 19) | TILE::VFLIPPED);   
  67. jjTileSet(4, 382, 23, jjTileGet(4, 382, 23) | TILE::VFLIPPED); 
  68. jjTileSet(4, 381, 24, jjTileGet(4, 381, 24) | TILE::VFLIPPED); 
  69. jjTileSet(4, 380, 25, jjTileGet(4, 380, 25) | TILE::VFLIPPED); 
  70. jjTileSet(4, 379, 26, jjTileGet(4, 379, 26) | TILE::VFLIPPED); 
  71. jjTileSet(4, 378, 27, jjTileGet(4, 378, 27) | TILE::VFLIPPED); 
  72. jjTileSet(4, 377, 26, jjTileGet(4, 377, 26) | TILE::VFLIPPED); 
  73. jjTileSet(4, 376, 25, jjTileGet(4, 376, 25) | TILE::VFLIPPED); 
  74. jjTileSet(4, 387, 23, jjTileGet(4, 387, 23) | TILE::VFLIPPED); 
  75. jjTileSet(4, 388, 24, jjTileGet(4, 388, 24) | TILE::VFLIPPED); 
  76. jjTileSet(4, 389, 25, jjTileGet(4, 389, 25) | TILE::VFLIPPED); 
  77. jjTileSet(4, 390, 26, jjTileGet(4, 390, 26) | TILE::VFLIPPED); 
  78. jjTileSet(4, 391, 27, jjTileGet(4, 391, 27) | TILE::VFLIPPED); 
  79. jjTileSet(4, 392, 26, jjTileGet(4, 392, 26) | TILE::VFLIPPED); 
  80. jjTileSet(4, 393, 25, jjTileGet(4, 393, 25) | TILE::VFLIPPED); 
  81.  
  82.                
  83. catgoal=4*(jjDifficulty+1);
  84. bombgoal=10*(jjDifficulty+1);
  85. smbombgoal=75*(jjDifficulty+1);
  86.  
  87.         FineDay.gradient(0, 0,0,             0, 0,0,         0, 10, 1.0);
  88.         FineDay.gradient(255, 255,255,             255, 255,255,         10, 6, 1.0);
  89.         FineDay.gradient(199, 255,0,             199, 255,0,         16, 1, 1.0);
  90.         FineDay.gradient(143, 219,0,             0, 11,0,         17, 7, 1.0);
  91.         FineDay.gradient(255, 0,0,             163, 0,0,         24, 4, 1.0);
  92.         FineDay.gradient(135, 0,0,             11, 0,0,         28, 4, 1.0);
  93.         FineDay.gradient(187, 227,255,             0, 139,255,         32, 4, 1.0);
  94.         FineDay.gradient(0, 107,203,             0, 7,11,         36, 4, 1.0);
  95.         FineDay.gradient(255, 255,0,             255, 199,0,         40, 2, 1.0);
  96.         FineDay.gradient(255, 147,0,             255, 95,0,         42, 2, 1.0);
  97.         FineDay.gradient(203, 55,0,             11, 0,0,         44, 4, 1.0);
  98.         FineDay.gradient(251, 139,183,       239, 0,99,         48, 4, 1.0);            
  99.         FineDay.gradient(191, 0,71,      55, 0,19,         52, 4, 1.0);
  100.         FineDay.gradient(220, 165,113,             154, 129,100,         56, 3, 1.0);
  101.         FineDay.gradient(219, 195,0,             11, 7,0,         59, 5, 1.0);
  102.         FineDay.gradient(255, 243,211,             255, 243,211,         64, 1, 1.0);
  103.         FineDay.gradient(219, 207,175,             11, 7,7,         65, 7, 1.0);
  104.         FineDay.gradient(211, 231,255,             211, 231,255,         72, 1, 1.0);
  105.         FineDay.gradient(171, 195,219,             107, 127,155,         73, 3, 1.0);
  106.         FineDay.gradient(75, 95,119,             7, 7,11,         76, 4, 1.0);
  107.         FineDay.gradient(0, 255,195,             0, 11,7,         80, 8, 1.0);
  108.         FineDay.gradient(231, 119,255,             11, 0,7,         88, 8, 1.0);
  109.        
  110.         FineDay.gradient(207, 235,23,             207, 235,23,         96, 1, 1.0);
  111.         FineDay.gradient(147, 207,15,             147, 207,15,         97, 1, 1.0);
  112.         FineDay.gradient(91, 179,7,               91, 179,7,           98, 1, 1.0);
  113.         FineDay.gradient(47, 151,0,               47, 151,0,           99, 1, 1.0);
  114.         FineDay.gradient(15, 127,0,               0, 43, 23,           100, 4, 1.0);
  115.         FineDay.gradient(243, 163, 95,                  43, 15, 7,                       104, 8, 1.0);
  116.         FineDay.gradient(255, 216, 59,                  199, 30, 0,              112, 8, 1.0);
  117.         FineDay.gradient(194, 26, 0,                        43, 0, 0,                120, 8, 1.0);
  118.         FineDay.gradient(229, 131, 11,            66, 8, 3,                      128, 8, 1.0);
  119.         FineDay.gradient(255, 220, 12,            122, 105, 6,         136, 8, 1.0);
  120.         FineDay.gradient(240, 240, 173,           179, 139, 59,        144, 8, 1.0);
  121.         FineDay.gradient(168, 119, 50,            64, 21, 0,           152, 8, 1.0);
  122.         FineDay.gradient(126, 242, 205,           0, 26, 25,           160, 16, 1.0);
  123.         FineDay.gradient(231, 251, 255,           51, 155, 203,        176, 16, 1.0);
  124.         FineDay.gradient(47, 147, 199,            0, 47, 115,          192, 16, 1.0);
  125.         FineDay.gradient(255, 199, 139,           91, 79, 7,           208, 16, 1.0);
  126.        
  127.         Golden.gradient(0, 0,0,             0, 0,0,         0, 10, 1.0);
  128.         Golden.gradient(255, 255,255,             255, 255,255,         10, 6, 1.0);
  129.         Golden.gradient(199, 255,0,             199, 255,0,         16, 1, 1.0);
  130.         Golden.gradient(143, 219,0,             0, 11,0,         17, 7, 1.0);
  131.         Golden.gradient(255, 0,0,             163, 0,0,         24, 4, 1.0);
  132.         Golden.gradient(135, 0,0,             11, 0,0,         28, 4, 1.0);
  133.         Golden.gradient(187, 227,255,             0, 139,255,         32, 4, 1.0);
  134.         Golden.gradient(0, 107,203,             0, 7,11,         36, 4, 1.0);
  135.         Golden.gradient(255, 255,0,             255, 199,0,         40, 2, 1.0);
  136.         Golden.gradient(255, 147,0,             255, 95,0,         42, 2, 1.0);
  137.         Golden.gradient(203, 55,0,             11, 0,0,         44, 4, 1.0);
  138.         Golden.gradient(251, 139,183,       239, 0,99,         48, 4, 1.0);            
  139.         Golden.gradient(191, 0,71,      55, 0,19,         52, 4, 1.0);
  140.         Golden.gradient(220, 165,113,             154, 129,100,         56, 3, 1.0);
  141.         Golden.gradient(219, 195,0,             11, 7,0,         59, 5, 1.0);
  142.         Golden.gradient(255, 243,211,             255, 243,211,         64, 1, 1.0);
  143.         Golden.gradient(219, 207,175,             11, 7,7,         65, 7, 1.0);
  144.         Golden.gradient(211, 231,255,             211, 231,255,         72, 1, 1.0);
  145.         Golden.gradient(171, 195,219,             107, 127,155,         73, 3, 1.0);
  146.         Golden.gradient(75, 95,119,             7, 7,11,         76, 4, 1.0);
  147.         Golden.gradient(0, 255,195,             0, 11,7,         80, 8, 1.0);
  148.         Golden.gradient(231, 119,255,             11, 0,7,         88, 8, 1.0);
  149.  
  150.         Golden.gradient(247, 102,23,             247, 102,23,            96, 1, 1.0);
  151.         Golden.gradient(199,88, 27,             40,17, 6,           97, 7, 1.0);
  152.         Golden.gradient(36,14, 41,             0,0, 15,           104, 8, 1.0);
  153.         Golden.gradient(242, 173,30,                    138, 27,55,              112, 8, 1.0);
  154.         Golden.gradient(93, 23, 38,                         7, 2, 2,                 120, 8, 1.0);
  155.         Golden.gradient(179, 73, 108,            50, 20, 30,              128, 8, 1.0);
  156.         Golden.gradient(44, 18, 27,            1, 0, 0,                   136, 8, 1.0);
  157.         Golden.gradient(255, 190, 23,                241, 172, 25,             144, 2, 1.0);
  158.         Golden.gradient(235, 158, 23,                186, 92, 37,             146, 6, 1.0);
  159.         Golden.gradient(173, 81, 42,                50, 7, 21,             152, 8, 1.0);
  160.         Golden.gradient(150, 174, 183,            107, 77, 56,         160, 8, 1.0);
  161.         Golden.gradient(98, 65, 47,            1, 1, 1,         168, 8, 1.0);
  162.         Golden.gradient(22, 30, 77,            0, 0, 3,           176, 32, 1.0);
  163.  
  164.         Bloody.gradient(0, 0,0,             0, 0,0,         0, 10, 1.0);
  165.         Bloody.gradient(255, 255,255,             255, 255,255,         10, 6, 1.0);
  166.         Bloody.gradient(199, 255,0,             199, 255,0,         16, 1, 1.0);
  167.         Bloody.gradient(143, 219,0,             0, 11,0,         17, 7, 1.0);
  168.         Bloody.gradient(255, 0,0,             163, 0,0,         24, 4, 1.0);
  169.         Bloody.gradient(135, 0,0,             11, 0,0,         28, 4, 1.0);
  170.         Bloody.gradient(187, 227,255,             0, 139,255,         32, 4, 1.0);
  171.         Bloody.gradient(0, 107,203,             0, 7,11,         36, 4, 1.0);
  172.         Bloody.gradient(255, 255,0,             255, 199,0,         40, 2, 1.0);
  173.         Bloody.gradient(255, 147,0,             255, 95,0,         42, 2, 1.0);
  174.         Bloody.gradient(203, 55,0,             11, 0,0,         44, 4, 1.0);
  175.         Bloody.gradient(251, 139,183,       239, 0,99,         48, 4, 1.0);            
  176.         Bloody.gradient(191, 0,71,      55, 0,19,         52, 4, 1.0);
  177.         Bloody.gradient(220, 165,113,             154, 129,100,         56, 3, 1.0);
  178.         Bloody.gradient(219, 195,0,             11, 7,0,         59, 5, 1.0);
  179.         Bloody.gradient(255, 243,211,             255, 243,211,         64, 1, 1.0);
  180.         Bloody.gradient(219, 207,175,             11, 7,7,         65, 7, 1.0);
  181.         Bloody.gradient(211, 231,255,             211, 231,255,         72, 1, 1.0);
  182.         Bloody.gradient(171, 195,219,             107, 127,155,         73, 3, 1.0);
  183.         Bloody.gradient(75, 95,119,             7, 7,11,         76, 4, 1.0);
  184.         Bloody.gradient(0, 255,195,             0, 11,7,         80, 8, 1.0);
  185.         Bloody.gradient(231, 119,255,             11, 0,7,         88, 8, 1.0);
  186.  
  187.         Bloody.gradient(255, 20,20,             255, 20,20,           96, 1, 1.0);
  188.         Bloody.gradient(240,14, 14,             64,0, 02,           97, 7, 1.0);
  189.         Bloody.gradient(55, 51, 50,                     10, 10, 9,                       104, 8, 1.0);
  190.         Bloody.gradient(255, 100,0,                     26, 10,0,                112, 8, 1.0);
  191.         Bloody.gradient(255, 255, 20,                       199, 84, 8,                      120, 8, 1.0);
  192.         Bloody.gradient(255, 19, 18,            12, 0, 0,                 128, 16, 1.0);
  193.         Bloody.gradient(255, 0, 0,                19, 0, 0,             144, 16, 1.0);
  194.         Bloody.gradient(155, 80, 103,            3, 0, 1,         160, 16, 1.0);
  195.         Bloody.gradient(255, 24, 18,            150, 12, 10,         176, 16, 1.0);
  196.         Bloody.gradient(144, 7, 7,            30, 0, 0,           192, 16, 1.0);
  197.         Bloody.gradient(247, 132, 20,             10, 5, 2,         208, 16, 1.0);
  198.  
  199.         Grim.gradient(0, 0,0,             0, 0,0,         0, 10, 1.0);
  200.         Grim.gradient(255, 255,255,             255, 255,255,         10, 6, 1.0);
  201.         Grim.gradient(199, 255,0,             199, 255,0,         16, 1, 1.0);
  202.         Grim.gradient(143, 219,0,             0, 11,0,         17, 7, 1.0);
  203.         Grim.gradient(255, 0,0,             163, 0,0,         24, 4, 1.0);
  204.         Grim.gradient(135, 0,0,             11, 0,0,         28, 4, 1.0);
  205.         Grim.gradient(187, 227,255,             0, 139,255,         32, 4, 1.0);
  206.         Grim.gradient(0, 107,203,             0, 7,11,         36, 4, 1.0);
  207.         Grim.gradient(255, 255,0,             255, 199,0,         40, 2, 1.0);
  208.         Grim.gradient(255, 147,0,             255, 95,0,         42, 2, 1.0);
  209.         Grim.gradient(203, 55,0,             11, 0,0,         44, 4, 1.0);
  210.         Grim.gradient(251, 139,183,       239, 0,99,         48, 4, 1.0);            
  211.         Grim.gradient(191, 0,71,      55, 0,19,         52, 4, 1.0);
  212.         Grim.gradient(220, 165,113,             154, 129,100,         56, 3, 1.0);
  213.         Grim.gradient(219, 195,0,             11, 7,0,         59, 5, 1.0);
  214.         Grim.gradient(255, 243,211,             255, 243,211,         64, 1, 1.0);
  215.         Grim.gradient(219, 207,175,             11, 7,7,         65, 7, 1.0);
  216.         Grim.gradient(211, 231,255,             211, 231,255,         72, 1, 1.0);
  217.         Grim.gradient(171, 195,219,             107, 127,155,         73, 3, 1.0);
  218.         Grim.gradient(75, 95,119,             7, 7,11,         76, 4, 1.0);
  219.         Grim.gradient(0, 255,195,             0, 11,7,         80, 8, 1.0);
  220.         Grim.gradient(231, 119,255,             11, 0,7,         88, 8, 1.0);
  221.  
  222.         Grim.gradient(24, 255,253,             0, 57, 56,           96, 8, 1.0);
  223.         Grim.gradient(0, 14, 71,                        0, 0, 15,                        104, 8, 1.0);
  224.         Grim.gradient(20, 253, 120,                     10, 137, 65,             112, 8, 1.0);
  225.         Grim.gradient(9, 132, 62,                           0, 49, 12,               120, 8, 1.0);
  226.         Grim.gradient(190, 255, 18,            5, 5, 0,                   128, 8, 1.0);
  227.         Grim.gradient(0, 11, 8,                0, 5, 0,             136, 8, 1.0);
  228.         Grim.gradient(25, 150, 123,            33, 238, 177,         144, 5, 1.0);
  229.         Grim.gradient(28, 225, 168,            24, 144, 117,         149, 3, 1.0);
  230.         Grim.gradient(23, 138, 112,            0, 22, 11,           152, 8, 1.0);
  231.         Grim.gradient(0, 255, 255,             10, 155, 155,         160, 8, 1.0);
  232.         Grim.gradient(8, 144, 144,             0, 2, 2,             168, 8, 1.0);
  233.         Grim.gradient(0, 0, 3,                 0, 83, 83,             176, 32, 1.0);
  234.         Grim.gradient(255, 199, 139,           91, 79, 7,           208, 16, 1.0);
  235.        
  236.     jjPalette.gradient(207, 235,23,             207, 235,23,         96, 1, 1.0);
  237.         jjPalette.gradient(147, 207,15,             147, 207,15,         97, 1, 1.0);
  238.         jjPalette.gradient(91, 179,7,               91, 179,7,           98, 1, 1.0);
  239.         jjPalette.gradient(47, 151,0,               47, 151,0,           99, 1, 1.0);
  240.         jjPalette.gradient(15, 127,0,               0, 43, 23,           100, 4, 1.0);
  241.         jjPalette.gradient(243, 163, 95,                        43, 15, 7,                       104, 8, 1.0);
  242.         jjPalette.gradient(255, 216, 59,                        199, 30, 0,              112, 8, 1.0);
  243.         jjPalette.gradient(194, 26, 0,                      43, 0, 0,                120, 8, 1.0);
  244.         jjPalette.gradient(229, 131, 11,            66, 8, 3,                    128, 8, 1.0);
  245.         jjPalette.gradient(255, 220, 12,            122, 105, 6,         136, 8, 1.0);
  246.         jjPalette.gradient(240, 240, 173,           179, 139, 59,        144, 8, 1.0);
  247.         jjPalette.gradient(168, 119, 50,            64, 21, 0,           152, 8, 1.0);
  248.         jjPalette.gradient(126, 242, 205,           0, 26, 25,           160, 16, 1.0);
  249.         jjPalette.gradient(231, 251, 255,           51, 155, 203,        176, 16, 1.0);
  250.         jjPalette.gradient(47, 147, 199,            0, 47, 115,          192, 16, 1.0);
  251.         jjPalette.gradient(255, 199, 139,           91, 79, 7,           208, 16, 1.0);
  252.         jjSetFadeColors(0,40,80);      
  253.        
  254.         jjWeapons[WEAPON::BOUNCER].maximum = 9999;//The thing that had always irritated me in JJ2
  255.         jjWeapons[WEAPON::TOASTER].maximum = 9999;//was that you can't collect more than 99 of ammo units.
  256.         jjWeapons[WEAPON::TNT].maximum = 9999;// Now ammo count is potentially unlimited.
  257.         jjWeapons[WEAPON::RF].maximum = 9999;//However it doesn't have any strong influence on gameplay, just for fun
  258.         jjWeapons[WEAPON::SEEKER].maximum = 9999;
  259.         jjWeapons[WEAPON::GUN9].maximum = 9999;
  260.         jjWeapons[WEAPON::GUN8].maximum = 9999;
  261.         jjWeapons[WEAPON::ICE].maximum = 9999;
  262.        
  263.         jjObjectPresets[OBJECT::BEES].behavior = NPC;
  264.         jjObjectPresets[OBJECT::BEES].bulletHandling = HANDLING::IGNOREBULLET;
  265.         jjObjectPresets[OBJECT::BEES].playerHandling = HANDLING::EXPLOSION;
  266.        
  267.         jjObjectPresets[OBJECT::APPLE].scriptedCollisions = true;
  268.         jjObjectPresets[OBJECT::APPLE].behavior = GreatCarrot;
  269.         jjObjectPresets[OBJECT::APPLE].light = 15;
  270.         jjObjectPresets[OBJECT::APPLE].lightType = LIGHT::LASER;
  271.         jjObjectPresets[OBJECT::APPLE].state=STATE::FLOAT;
  272.         jjObjectPresets[OBJECT::APPLE].bulletHandling = HANDLING::IGNOREBULLET;
  273.         jjObjectPresets[OBJECT::APPLE].playerHandling = HANDLING::SPECIAL;
  274.         jjObjectPresets[OBJECT::APPLE].isBlastable = false;
  275.        
  276.         jjObjectPresets[OBJECT::FRIES].scriptedCollisions = true;
  277.         jjObjectPresets[OBJECT::FRIES].behavior = Toadstool;
  278.         jjObjectPresets[OBJECT::FRIES].state=STATE::FLOAT;
  279.         jjObjectPresets[OBJECT::FRIES].bulletHandling = HANDLING::IGNOREBULLET;
  280.         jjObjectPresets[OBJECT::FRIES].playerHandling = HANDLING::SPECIAL;
  281.         jjObjectPresets[OBJECT::FRIES].points = 100;
  282.                
  283.         jjObjectPresets[OBJECT::GUN8AMMO3].determineCurAnim(ANIM::PICKUPS, 78, true);
  284.         jjObjectPresets[OBJECT::TNTAMMO3].determineCurAnim(ANIM::AMMO, 1, true);
  285.        
  286.         jjObjectPresets[OBJECT::SEEKERBULLETPU].determineCurAnim(ANIM::AMMO, 57);
  287.         jjObjectPresets[OBJECT::SEEKERBULLETPU].behavior=FlyingAmmo;
  288.         jjObjectPresets[OBJECT::SEEKERBULLETPU].playerHandling=HANDLING::PICKUP;
  289.        
  290.         jjObjectPresets[OBJECT::TOASTERBULLETPU].special = jjObjectPresets[OBJECT::TOASTERBULLETPU].determineCurAnim(ANIM::AMMO, 5);
  291.         jjObjectPresets[OBJECT::TOASTERBULLETPU].behavior = DragonBreath;
  292.         jjObjectPresets[OBJECT::TOASTERBULLETPU].animSpeed = 1;
  293.         jjObjectPresets[OBJECT::TOASTERBULLETPU].lightType= LIGHT::RING;
  294.         jjObjectPresets[OBJECT::TOASTERBULLETPU].light =1;
  295.        
  296.         jjObjectPresets[OBJECT::FIREBALLBULLET].determineCurAnim(ANIM::HATTER, 3);
  297.         jjObjectPresets[OBJECT::FIREBALLBULLET].behavior = SpitGun;
  298.         jjObjectPresets[OBJECT::FIREBALLBULLET].lightType= LIGHT::POINT;
  299.         jjObjectPresets[OBJECT::FIREBALLBULLET].light =55;
  300.         jjWeapons[WEAPON::GUN8].style = WEAPON::MISSILE;
  301.        
  302.     jjObjectPresets[OBJECT::DRAGONFLY].energy = 2+jjDifficulty;
  303.         jjObjectPresets[OBJECT::DRAGONFLY].special = 2+jjDifficulty;
  304.         jjObjectPresets[OBJECT::DRAGONFLY].behavior = DragonflyX;
  305.         jjObjectPresets[OBJECT::DRAGONFLY].points = 200;
  306.        
  307.         jjObjectPresets[OBJECT::FASTFEET].points = 100;
  308.         jjObjectPresets[OBJECT::FASTFEET].scriptedCollisions = true;
  309.                
  310.         jjObjectPresets[OBJECT::ROBOT].behavior = Tweedle;//Initially I used OBJECT::TWEEDLEBOSS but there was a small problem with it
  311.         jjObjectPresets[OBJECT::ROBOT].points = 5000;//Tweedle doesn't behave like other bosses, his original "objecthit" function (or anything else that is responsible for collisions with players and bullets in the original code of JJ2) is the same as the common enemies have:
  312.         jjObjectPresets[OBJECT::ROBOT].energy = 125;//He receives too much damage from the special attacks and buttstomps.
  313.         jjObjectPresets[OBJECT::ROBOT].isBlastable = false;//That wasn't good especially because I wanted him to steal player's ammo with a magnet so the player would be forced to use buttstomps and special attacks...
  314.         //jjObjectPresets[OBJECT::ROBOT].scriptedCollisions = true;//It would be too easy to defeat him this way and I wanted to make this level and this fight really challenging. And probably I was too lazy to write onObjecthit for him
  315.         jjObjectPresets[OBJECT::ROBOT].bulletHandling = HANDLING::HURTBYBULLET;//However, OBJECT::ROBOT had solved all of these problems
  316.         jjObjectPresets[OBJECT::ROBOT].playerHandling = HANDLING::SPECIAL;
  317.         jjObjectPresets[OBJECT::ROBOT].state = STATE::START;
  318.         jjObjectPresets[OBJECT::ROBOT].xSpeed = 2;
  319.        
  320.         jjObjectPresets[OBJECT::CUCUMB].behavior = EvilSpaz;
  321.         jjObjectPresets[OBJECT::CUCUMB].points = 1500;
  322.         jjObjectPresets[OBJECT::CUCUMB].energy = 16;
  323.         jjObjectPresets[OBJECT::CUCUMB].bulletHandling = HANDLING::HURTBYBULLET;
  324.         jjObjectPresets[OBJECT::CUCUMB].playerHandling = HANDLING::ENEMY;
  325.         jjObjectPresets[OBJECT::CUCUMB].state = STATE::START;
  326.         jjObjectPresets[OBJECT::CUCUMB].xSpeed = 1;
  327.        
  328.         jjObjectPresets[OBJECT::HATTER].energy = 3+jjDifficulty;
  329.         jjObjectPresets[OBJECT::HATTER].special = 3+jjDifficulty;
  330.         jjObjectPresets[OBJECT::HATTER].behavior = HatterX;
  331.         jjObjectPresets[OBJECT::HATTER].points = 500;
  332.         jjObjectPresets[OBJECT::HATTER].triggersTNT=true;
  333.  
  334.         jjObjectPresets[OBJECT::SPARK].behavior = Flame;
  335.         jjObjectPresets[OBJECT::SPARK].bulletHandling = HANDLING::IGNOREBULLET;
  336.         jjObjectPresets[OBJECT::SPARK].playerHandling = HANDLING::ENEMYBULLET;
  337.         jjObjectPresets[OBJECT::SPARK].state = STATE::FLOAT;
  338.         jjObjectPresets[OBJECT::SPARK].lightType = LIGHT::POINT;
  339.         jjObjectPresets[OBJECT::SPARK].light =55;
  340.         jjObjectPresets[OBJECT::SPARK].isTarget=false;
  341.        
  342.         jjObjectPresets[OBJECT::STRAWBERRY].behavior = PlatFlame;
  343.         jjObjectPresets[OBJECT::STRAWBERRY].bulletHandling = HANDLING::IGNOREBULLET;
  344.         jjObjectPresets[OBJECT::STRAWBERRY].playerHandling = HANDLING::EXPLOSION;
  345.         jjObjectPresets[OBJECT::STRAWBERRY].state = STATE::FLOAT;
  346.         jjObjectPresets[OBJECT::STRAWBERRY].lightType = LIGHT::POINT;
  347.        
  348.         jjObjectPresets[OBJECT::BUBBA].energy = 7+jjDifficulty;
  349.         jjObjectPresets[OBJECT::BUBBA].special = 7+jjDifficulty;
  350.         jjObjectPresets[OBJECT::BUBBA].behavior = SpittingBubba;
  351.         jjObjectPresets[OBJECT::BUBBA].points = 1000;
  352.         jjObjectPresets[OBJECT::BUBBA].xSpeed = 1;
  353.         jjObjectPresets[OBJECT::BUBBA].state = STATE::WALK;
  354.         jjObjectPresets[OBJECT::BUBBA].deactivates = false;
  355.         jjObjectPresets[OBJECT::BUBBA].isTarget = true;
  356.         //jjObjectPresets[OBJECT::BUBBA].isBlastable = false;
  357.  
  358.         jjObjectPresets[OBJECT::UTERUS].energy = 4+jjDifficulty;
  359.         jjObjectPresets[OBJECT::UTERUS].special = 4+jjDifficulty;
  360.         jjObjectPresets[OBJECT::UTERUS].points = 800;
  361.         jjObjectPresets[OBJECT::UTERUS].behavior = BubbaSpirit;
  362.         jjObjectPresets[OBJECT::UTERUS].light = 15;
  363.         jjObjectPresets[OBJECT::UTERUS].lightType = LIGHT::RING2;
  364.     jjObjectPresets[OBJECT::UTERUS].playerHandling = HANDLING::ENEMY;
  365.         jjObjectPresets[OBJECT::UTERUS].bulletHandling = HANDLING::IGNOREBULLET;
  366.         jjObjectPresets[OBJECT::UTERUS].isTarget = true;
  367.         jjObjectPresets[OBJECT::UTERUS].isBlastable = true;
  368.         //jjObjectPresets[OBJECT::UTERUS].scriptedCollisions = true;
  369.        
  370.         jjObjectPresets[OBJECT::BANANA].energy = 11+jjDifficulty;
  371.         jjObjectPresets[OBJECT::BANANA].special = 11+jjDifficulty;
  372.         jjObjectPresets[OBJECT::BANANA].behavior = JumpyBall;
  373.         jjObjectPresets[OBJECT::BANANA].points = 100;
  374.         jjObjectPresets[OBJECT::BANANA].bulletHandling = HANDLING::HURTBYBULLET;
  375.         jjObjectPresets[OBJECT::BANANA].isTarget = true;
  376.         jjObjectPresets[OBJECT::BANANA].isBlastable = true;
  377.         jjObjectPresets[OBJECT::BANANA].state = STATE::START;
  378.         jjObjectPresets[OBJECT::BANANA].scriptedCollisions = true;
  379.         jjObjectPresets[OBJECT::BANANA].playerHandling = HANDLING::SPECIAL;
  380.  
  381.         jjObjectPresets[OBJECT::MILK].energy = 1;
  382.         jjObjectPresets[OBJECT::MILK].behavior = SmallJumpyBall;
  383.         jjObjectPresets[OBJECT::MILK].points = 10;
  384.         jjObjectPresets[OBJECT::MILK].bulletHandling = HANDLING::HURTBYBULLET;
  385.         jjObjectPresets[OBJECT::MILK].isTarget = true;
  386.         jjObjectPresets[OBJECT::MILK].isBlastable = true;
  387.         jjObjectPresets[OBJECT::MILK].state = STATE::START;
  388.         jjObjectPresets[OBJECT::MILK].scriptedCollisions = true;
  389.         jjObjectPresets[OBJECT::MILK].playerHandling = HANDLING::SPECIAL;
  390.        
  391.         jjObjectPresets[OBJECT::PACMANGHOST].energy = 8+jjDifficulty;
  392.         jjObjectPresets[OBJECT::PACMANGHOST].special = 8+jjDifficulty;
  393.         jjObjectPresets[OBJECT::PACMANGHOST].behavior = BlueGhost;
  394.         jjObjectPresets[OBJECT::PACMANGHOST].points = 300;
  395.     jjObjectPresets[OBJECT::PACMANGHOST].playerHandling = HANDLING::SPECIAL;
  396.         jjObjectPresets[OBJECT::PACMANGHOST].bulletHandling = HANDLING::HURTBYBULLET;
  397.         jjObjectPresets[OBJECT::PACMANGHOST].isTarget = true;
  398.         jjObjectPresets[OBJECT::PACMANGHOST].isBlastable = true;
  399.         jjObjectPresets[OBJECT::PACMANGHOST].state = STATE::START;
  400.  
  401.         jjObjectPresets[OBJECT::CHESHIRE2].energy = 5+jjDifficulty;
  402.         jjObjectPresets[OBJECT::CHESHIRE2].special = 5+jjDifficulty;
  403.         jjObjectPresets[OBJECT::CHESHIRE2].behavior = FlamingCat;
  404.         jjObjectPresets[OBJECT::CHESHIRE2].points = 800;
  405.     jjObjectPresets[OBJECT::CHESHIRE2].playerHandling = HANDLING::ENEMY;
  406.         jjObjectPresets[OBJECT::CHESHIRE2].bulletHandling = HANDLING::HURTBYBULLET;
  407.         jjObjectPresets[OBJECT::CHESHIRE2].isTarget = true;
  408.         jjObjectPresets[OBJECT::CHESHIRE2].isBlastable = true;
  409.         jjObjectPresets[OBJECT::CHESHIRE2].state = STATE::FLOAT;
  410.        
  411.         jjObjectPresets[OBJECT::PINKPLATFORM].behavior = MovingPlatform;
  412.         jjObjectPresets[OBJECT::PINKPLATFORM].state = STATE::WAIT;
  413.         jjObjectPresets[OBJECT::PINKPLATFORM].determineCurAnim(ANIM::PINKPLAT,0);
  414.         jjObjectPresets[OBJECT::PINKPLATFORM].isFreezable = false;
  415.         jjObjectPresets[OBJECT::PINKPLATFORM].deactivates = false;
  416.        
  417.         //jjChat("/allowmouseaim on");
  418.         //jjChat("/mouseaim on");
  419.         jjChat("/fireball on");
  420. }
  421. const string MUSICFILENAME = "funkyg.j2b";
  422. void onLevelReload() {
  423.  jjAlert(Hints[jjRandom()%8]);
  424. elapsed=0;v=0;z=0;b=0;
  425. cats=false; bombs=false; boss=false; normal=true;
  426. killedcats=0; killedbombs=0;killedsmallbombs=0;
  427. jjMusicLoad(MUSICFILENAME);
  428.         jjPalette.gradient(207, 235,23,             207, 235,23,         96, 1, 1.0);
  429.         jjPalette.gradient(147, 207,15,             147, 207,15,         97, 1, 1.0);
  430.         jjPalette.gradient(91, 179,7,               91, 179,7,           98, 1, 1.0);
  431.         jjPalette.gradient(47, 151,0,               47, 151,0,           99, 1, 1.0);
  432.         jjPalette.gradient(15, 127,0,               0, 43, 23,           100, 4, 1.0);
  433.         jjPalette.gradient(243, 163, 95,                        43, 15, 7,                       104, 8, 1.0);
  434.         jjPalette.gradient(255, 216, 59,                        199, 30, 0,              112, 8, 1.0);
  435.         jjPalette.gradient(194, 26, 0,                      43, 0, 0,                120, 8, 1.0);
  436.         jjPalette.gradient(229, 131, 11,            66, 8, 3,                    128, 8, 1.0);
  437.         jjPalette.gradient(255, 220, 12,            122, 105, 6,         136, 8, 1.0);
  438.         jjPalette.gradient(240, 240, 173,           179, 139, 59,        144, 8, 1.0);
  439.         jjPalette.gradient(168, 119, 50,            64, 21, 0,           152, 8, 1.0);
  440.         jjPalette.gradient(126, 242, 205,           0, 26, 25,           160, 16, 1.0);
  441.         jjPalette.gradient(231, 251, 255,           51, 155, 203,        176, 16, 1.0);
  442.         jjPalette.gradient(47, 147, 199,            0, 47, 115,          192, 16, 1.0);
  443.         jjPalette.gradient(255, 199, 139,           91, 79, 7,           208, 16, 1.0);
  444.         jjSetFadeColors(0,40,80);
  445. }
  446.  
  447. void onMain() {
  448. jjPLAYER@ play = jjLocalPlayers[0];
  449. if (paused) {
  450. play.keyUp = play.keyDown = play.keyRight = play.keyLeft = play.keyFire = play.keyRun = play.keyJump = false;
  451. }
  452. if (play.powerup[1] ==true)
  453. {jjWeapons[1].spread == SPREAD::RFNORMAL;}
  454. if (play.currWeapon == WEAPON::GUN8&&play.fly==0)
  455. {play.keyUp=false;//This prevents you from shooting the spitgunbullets up. There is simply no animation of them flying vertically.
  456. if (jjKey[UP]&&jjKey[SHOOT]&&shootpressed<=1){
  457. shootpressed++;
  458. play.showText("@@I can't fire up @@with this weapon@@because of the @@damned lack of animations!");}
  459. }
  460. if (!play.noFire&&jjKey[SHOOT]&&play.currWeapon == WEAPON::TNT&&g<=210)
  461. {g++;
  462. float yPos = play.yPos - 25;
  463. float xPos = play.xPos - 30;
  464. for (int i = 0; i <= g/7; ++i) {
  465.                                                 jjDrawSprite(xPos, yPos, ANIM::BRIDGE, 0, 0, 0, SPRITE::RESIZED,16);
  466.                                         xPos += 3;
  467.                                 }
  468.                                
  469. }
  470. if(!play.noFire&&!jjKey[SHOOT]&&g>=0)
  471. {g--;
  472. float yPos = play.yPos - 25;
  473. float xPos = play.xPos - 30;
  474. for (int i = 0; i <= g/7; ++i) {
  475.                                                 jjDrawSprite(xPos, yPos, ANIM::BRIDGE, 0, 0, 0, SPRITE::RESIZED,16);
  476.                                         xPos += 3;
  477.                                 }
  478.                                 }
  479.                                
  480.  if (lastTile != play.currTile) { zoneExited(); }
  481.                 else if (dark) {
  482.                
  483.         jjSetFadeColors(x,-x/10,x/100);
  484. jjPalette.apply();                             
  485.                         }                                      
  486. if (!play.noFire&&jjKey[SHOOT]&&play.currWeapon ==WEAPON::TNT&&g==211)
  487.                         {
  488. float yPos = play.yPos - 25;
  489. float xPos = play.xPos - 30;
  490. for (int i = 0; i <= g/7; ++i) {
  491.                                                 jjDrawSprite(xPos, yPos, ANIM::BRIDGE, 0, 0, 0, SPRITE::RESIZED,16);
  492.                                         xPos += 3;
  493.                                 }
  494.                        
  495.                         }      
  496.   for (int i = 0;  i < jjObjectCount; i++)
  497.     if (jjObjects[i].isActive && jjObjects[i].creatorType == CREATOR::PLAYER) {
  498.       //Create bomb
  499.       if (jjObjects[i].eventID == OBJECT::TNT && jjObjects[i].state != STATE::EXPLODE) {//This snippet was written by Foly.
  500.         jjDeleteObject(i);                                                              //I modified it, though
  501.         CreateBomb(i);                                                                  
  502.         continue;
  503.       }
  504.    
  505.       //Destroy bomb
  506.       if (jjObjects[i].eventID == OBJECT::TACO ) {
  507.         jjObjects[i].age++;
  508.         if (jjObjects[i].age > cBombLifeTime)
  509.           DestroyBomb(i);
  510.         continue;
  511.       }
  512.     }
  513. //if ((elapsed & 70) == 0)
  514. //{jjAlert("g "+ formatInt(g, "1"));
  515. //jjAlert("jjGameTicks "+ formatInt(jjGameTicks, "1"));
  516. //jjAlert("elapsed "+ formatInt(elapsed, "1"));
  517. //}
  518. ++elapsed;
  519. if (start && //Switching from night to day at the very beginning of the level.
  520.         (jjGameTicks & 3) == 0) { //only update the palette every fourth tick, to avoid making JJ2 run ridiculously slow in the meantime
  521.                 jjPalette.reset();
  522.                 jjPalette.copyFrom(
  523.                         1,              //start
  524.                         254,            //length (It's best to leave colors 0 and 255 alone.)
  525.                         1,              //start2
  526.                         FineDay,        //source
  527.                         jjGameTicks / 1000.0    //opacity
  528.                 );
  529.                 jjPalette.apply();
  530.                 jjSetFadeColors(0,jjGameTicks/25,jjGameTicks/12.5);
  531.                 jjLocalPlayers[i].lighting = 80+jjGameTicks/50;
  532.                 if (jjGameTicks == 1000) { //End this scene.
  533.                         start = false;
  534.                         normal=true;
  535.                 }
  536.         }
  537.  
  538.  
  539.  
  540.   for(int i = 1; i < jjObjectCount; i++) {
  541.     if(jjObjects[i].isActive && jjObjects[i].eventID == OBJECT::SMOKERING&&boss&&jjDifficulty<4) { //If you play EASY, MEDIUM or HARD Tweedle fires smokerings and they behave themselves
  542.       jjObjects[i].ySpeed = 0;                                                                     //like common bullets not counting the fact that they make you dizzy instead of getting hurt and don't vanish after collision with player
  543.       jjObjects[i].xPos = jjObjects[i].xPos+(jjObjects[i].direction*2);                            //but if you play on TURBO mode smoke rings move back and forth like boomerang.
  544.        }                                                                                           //It is their initial way of motion and it is really hard to avoid them if there are lots of them
  545.          }                                                                                             //This effect doesn't influence Caterpillar's rings because it starts after you touch the ActivateBoss event
  546.                                                                                                    //Based on "Smoke Ring Gun" snippet written by szmol96
  547.  
  548. if (play.stoned!=0)
  549. { stoned=true;
  550. for (i = 0; i < 254; i++) {
  551.                                 jjPalette.color[i+1].setHSL(
  552.                                         myPal.color[i+1].getHue()/20 + jjGameTicks,
  553.                                         myPal.color[i+1].getSat()/20+ 240,//before the release of the new version of JJ2 (dated by 6 April 2015) this thing worked perfectly without adding anything to saturation
  554.                                         myPal.color[i+1].getLight()//but in the newest version there suddenly appeared some problems with it, so I had to add some number (240 seems to be the most suitable) to it otherwise half of colours stayed grey
  555.                                 );}
  556.                                 apply();
  557. }
  558. else if (play.stoned==0)
  559. {stoned=false;}
  560.                 if(bombs&&(killedbombs<bombgoal||killedsmallbombs<smbombgoal))
  561.                 {onBombfall();}
  562.                 //if(cats&&(killedcats<catgoal))
  563.                 //{onCatAttack();}
  564.                
  565.                  if(bombs&&killedbombs<bombgoal&&killedsmallbombs<smbombgoal&& scene&&(x & 3) == 0)     {
  566.                  normal=false;
  567.                  
  568.                         v++;
  569.                         jjPalette.copyFrom(
  570.                         1,              //start
  571.                         254,            //length (It's best to leave colors 0 and 255 alone.)
  572.                         1,              //start2
  573.                         Bloody, //source
  574.                         v/300.0 //opacity
  575.                                 );
  576.                 jjPalette.apply();
  577.                 if (v==300){
  578.                 scene=false;
  579.                 jjSetFadeColors(40,0,0);
  580. jjLocalPlayers[i].lighting = 80;}
  581.         }
  582.                                  if(cats && killedcats<catgoal&&scene&&(!bombs&&(jjGameTicks & 10) == 0)&&(play.stoned==0))     {
  583.         normal=false;
  584.         bombs=false;
  585.         if (z<=300)
  586.         {z++;}
  587.                         jjPalette.copyFrom(
  588.                         1,              //start
  589.                         254,            //length (It's best to leave colors 0 and 255 alone.)
  590.                         1,              //start2
  591.                         Golden, //source
  592.                         z/300.0 //opacity
  593.                        
  594.                 );
  595.                 jjSetFadeColors(0,40-z/7.5,80-z/3.75);
  596.                 jjPalette.apply();
  597.                         if (killedcats>=catgoal)        {scene=false;
  598. jjLocalPlayers[i].lighting = 80;}
  599.                 }
  600.                
  601.                                  if(boss&&(play.stoned==0))     {
  602.                                  jjObjectPresets[OBJECT::HATTER].isTarget==false;
  603.                                  jjObjectPresets[OBJECT::CHESHIRE2].isTarget==false;
  604.         normal=false;
  605.         cats=false;
  606.         bombs=false;
  607.         if (b<=1000)
  608.         {b++;}
  609.         if (b==100)
  610.         {play.boss=jjAddObject(OBJECT::ROBOT, 381*32, 35*32);}
  611.                         jjPalette.copyFrom(
  612.                         1,              //start
  613.                         254,            //length (It's best to leave colors 0 and 255 alone.)
  614.                         1,              //start2
  615.                         Grim,   //source
  616.                         b/1000.0        //opacity
  617.                        
  618.                 );
  619.                 jjLocalPlayers[i].lighting = 100-b/20;
  620.                 jjSetFadeColors(0,40-b/25,80-b/12.5);
  621.                 jjPalette.apply();
  622.                 }
  623.                
  624.         if(((killedcats>=catgoal && !bombs&&cats)||(killedbombs>=bombgoal&&killedsmallbombs>=smbombgoal&&bombs)))
  625.         //jjPalette.fill(255,255,255, elapsed/200);
  626.        
  627.         {cats=false;
  628.         bombs=false;}
  629.        
  630.        
  631.                                                  if((normal||(killedcats>=catgoal && !bombs)||(killedbombs>=bombgoal&&killedsmallbombs>=smbombgoal))&&(play.stoned==0)&&!boss&&jjGameTicks&70==0)       {
  632.                                                  stoned=false;
  633.                                                  z==0;
  634.         jjPAL newPal=jjPalette;
  635.                         newPal.copyFrom(
  636.                         1,              //start
  637.                         254,            //length (It's best to leave colors 0 and 255 alone.)
  638.                         1,              //start2
  639.                         FineDay,        //source
  640.                          elapsed/1000.0 //opacity
  641.                         );
  642.                         scene=true;
  643.                 bombs=false;
  644.                        
  645.                 newPal.apply();
  646.                 jjSetFadeColors(0,40,80);
  647. jjLocalPlayers[i].lighting = 100;
  648. jjMusicLoad("funkyg.j2b");
  649.                 }
  650.                 if (killedcats>=catgoal)
  651.                 {jjTriggers[1]=true;}
  652.                 }
  653.  
  654.                 void zoneExited() {
  655.         if (true) myPal = jjPalette;
  656.         else apply(myPal);
  657. }
  658.  
  659.                
  660. void apply(jjPAL pal = jjPalette) {
  661.         jjSetFadeColors(
  662.                 pal.color[207].red,
  663.                 pal.color[207].green,
  664.                 pal.color[207].blue
  665.         );
  666.         pal.apply();
  667. }
  668.  
  669. void DisplayHealth(jjOBJ@ enemy) {
  670.         int health = enemy.energy;
  671.         int sp = enemy.special;
  672.         float xPos = enemy.xPos - 0.5*(jjObjectPresets[enemy.eventID].energy);
  673.         float xPos2 = enemy.xPos - 0.5*(jjObjectPresets[enemy.eventID].energy)-6;
  674.         float yPos = enemy.yPos - 34;
  675.                 while (sp > 0) {
  676.                 jjDrawSprite(xPos2, yPos-6, ANIM::BRIDGE, 4, 0, 0,SPRITE::SINGLECOLOR, 0);//That's a pity that a sprite can't be
  677.                 xPos2 += 3;                                                               //singlecolor and resized at a same time.
  678.                 sp -= 1;}                                                                 //At least I failed to make it...
  679.         while (health > 0) {
  680.                 jjDrawSprite(xPos+1, yPos, ANIM::PICKUPS, 41, 0, 0, SPRITE::RESIZED,16);
  681.                 xPos += 3;
  682.                 health -= 1;
  683.         }
  684.         }
  685.        
  686. void GreatCarrot (jjOBJ@ obj)   {
  687. obj.behave(BEHAVIOR::PICKUP,false);
  688. //obj.yPos = obj.yPos + jjSin(jjGameTicks*10)/2;
  689. //obj.xPos = obj.xPos + jjCos(jjGameTicks*10)/5;
  690.         switch (obj.state) {
  691.                 case STATE::FLOAT:     
  692. jjDrawSprite(obj.xPos, obj.yPos, ANIM::PICKUPS, 21, 0, 0, SPRITE::RESIZED,54- abs(12*jjSin(jjGameTicks*5)));    
  693.                         break;
  694.                 case STATE::ACTION:                    
  695.                         obj.lightType = LIGHT::RING2;
  696.                         if (obj.light < 5) obj.light = 5;
  697.                         else obj.light += 2;
  698.                         if (obj.light % 15 == 0) jjSample(obj.xPos, obj.yPos, SOUND::COMMON_HARP1, 63 - obj.light, 4500 + (500*obj.light));
  699.                         if (obj.light > 100) obj.state = STATE::KILL;
  700.                         break;
  701.                 case STATE::KILL:
  702.                         obj.lightType = LIGHT::NONE;
  703.                         obj.light = 0;
  704.                         obj.delete();
  705.                         break;
  706.         }
  707. }
  708.         void CreateBomb(int objectID) { //The modified version of Foly's code snippet
  709.   int playerID = jjObjects[objectID].creator - 32768;//You can make bomb fly longer range by holding fire button. It also draws an indicator of strength above rabbit's head
  710.   int bombID = jjAddObject(OBJECT::TACO, jjPlayers[playerID].xPos, jjPlayers[playerID].yPos, jjPlayers[playerID].playerID, CREATOR::PLAYER);
  711.   jjObjects[bombID].objType = 10;
  712.   jjObjects[bombID].determineCurAnim(ANIM::AMMO, 1);
  713.   jjObjects[bombID].xPos = jjObjects[bombID].xPos + jjObjects[bombID].xSpeed+jjObjects[bombID].var[7]/65536;
  714.   jjObjects[bombID].yPos = jjObjects[bombID].yPos + jjObjects[bombID].ySpeed+jjObjects[bombID].var[7]/65536;
  715.   jjObjects[bombID].xSpeed = g/30*jjPlayers[playerID].direction+cBombSpeed*jjPlayers[playerID].direction;
  716.   jjObjects[bombID].ySpeed = -g/30+ cBombPlayerSpeed*jjPlayers[playerID].xSpeed/4;
  717. }
  718.  
  719. void DestroyBomb(int bombID) {
  720.   int explosionID = jjAddObject(OBJECT::TNT, jjObjects[bombID].xPos, jjObjects[bombID].yPos, jjObjects[bombID].creator, CREATOR::PLAYER);
  721.   jjDeleteObject(bombID);
  722.   jjObjects[explosionID].determineCurAnim(ANIM::AMMO, 1, true);
  723.   jjObjects[explosionID].killAnim = jjObjects[explosionID].determineCurAnim(ANIM::AMMO, 5, false);
  724.   jjObjects[explosionID].state = STATE::EXPLODE;
  725.   jjSample(jjObjects[explosionID].xPos, jjObjects[explosionID].yPos, SOUND::COMMON_EXPL_TNT);
  726. }
  727.  
  728. /*void onDrawLayer4(jjPLAYER@ p, jjCANVAS@ canvas) {
  729.         for (uint i = 0; i < Shop[curScreen].length; ++i) {
  730.                 canvas.drawString(
  731.                         p.cameraX + (jjResolutionWidth - 455),
  732.                        
  733.                                 p.cameraY + 192 + i*128 :
  734.                                 p.cameraY + 87  + i*32,
  735.                         "#" + Shop[curScreen][i],
  736.                         STRING::MEDIUM,
  737.                         (i == curString) ? STRING::SPIN : STRING::NORMAL,
  738.                         10
  739.                 );
  740.         }
  741.  
  742. }*/
  743.        
  744.         void Toadstool (jjOBJ@ obj)     {
  745. obj.behave(BEHAVIOR::PICKUP,false);
  746. obj.yPos = obj.yPos + 6*jjSin(jjGameTicks*10);
  747. //obj.xPos = obj.xPos + jjCos(jjGameTicks*10)*2;
  748. jjDrawTile(obj.xPos - 14, obj.yPos - 15, 133+4*abs(jjSin(jjGameTicks*10)));                    
  749.         }
  750.  
  751.         void JumpyBall(jjOBJ@ enemy)  {
  752.         switch (enemy.state){
  753.         case STATE::START: {
  754.                 enemy.state = STATE::FALL;
  755.                 enemy.xSpeed = ((jjRandom() & 15) - 8.5) / 3;
  756.                 enemy.ySpeed = 0;
  757.                 enemy.yAcc=0;
  758.                 break;
  759.                
  760.         }
  761.                 case STATE::FREEZE:
  762.                         if (enemy.freeze > 0) {
  763.                                 enemy.draw();
  764.                                 enemy.freeze -= 2;
  765.                         }
  766.                         if (enemy.freeze < 2) {
  767.                                 enemy.unfreeze(1);
  768.                                 enemy.state = enemy.oldState;
  769.                         }
  770.                         break;
  771.         case  STATE::DEACTIVATE: {
  772.                 enemy.deactivate();
  773.                 break;
  774.         } case STATE::KILL: {
  775.         killedbombs++;
  776.                 enemy.grantPickup(jjLocalPlayers[0], 1);
  777.                 enemy.deactivate();
  778.                 break;
  779.         } case STATE::FALL: {
  780.        
  781.         if (enemy.justHit != 0)
  782.                 @spawnedObject = jjObjects[jjAddObject(OBJECT::MILK, enemy.xPos, enemy.yPos)];
  783.                 enemy.determineCurAnim(ANIM::SPIKEBOLL,0);
  784.                 enemy.determineCurFrame();
  785.                 if (jjMaskedPixel(enemy.xPos + enemy.xSpeed, enemy.yPos)) {
  786.                         enemy.xSpeed = -1.01*enemy.xSpeed;
  787.                         enemy.xPos = enemy.xPos+enemy.xSpeed;
  788.                 } else if (jjMaskedPixel(enemy.xPos, enemy.yPos + enemy.ySpeed)) {
  789.                         enemy.ySpeed = -0.95*enemy.ySpeed;
  790.                         enemy.yPos = enemy.yPos+enemy.ySpeed;
  791.                         jjSample(enemy.xPos, enemy.yPos, SOUND::SPRING_BOING_DOWN);
  792.                 }
  793.                 else if (jjMaskedPixel(enemy.xPos+enemy.xSpeed, enemy.yPos + enemy.ySpeed)) {
  794.                         enemy.ySpeed = -0.95*enemy.ySpeed;
  795.                         enemy.xSpeed = -1.01*enemy.xSpeed;
  796.                         enemy.xPos = enemy.xPos+enemy.xSpeed;
  797.                         enemy.yPos = enemy.yPos+enemy.ySpeed;
  798.                         jjSample(enemy.xPos, enemy.yPos, SOUND::SPRING_BOING_DOWN);
  799.                 }
  800.                 enemy.xPos = enemy.xPos + enemy.xSpeed;
  801.                 enemy.yPos = enemy.yPos + enemy.ySpeed;
  802.                 enemy.ySpeed = enemy.ySpeed + .15;
  803.         }
  804. break;
  805.         }
  806.                 DisplayHealth(enemy);
  807.                 enemy.draw();
  808.         }
  809.        
  810.        
  811.         void SmallJumpyBall (jjOBJ@ enemy)  {
  812.                 switch (enemy.state){
  813.         case STATE::START: {
  814.                 enemy.state = STATE::FALL;
  815.                 enemy.xSpeed = ((jjRandom() & 15) - 7.5) / 3;
  816.  
  817.                 break;
  818.                        
  819.         }
  820.         case STATE::FREEZE:
  821.                         if (enemy.freeze > 0) {
  822.                                 enemy.draw();
  823.                                 enemy.freeze -= 2;
  824.                         }
  825.                         if (enemy.freeze < 2) {
  826.                                 enemy.unfreeze(3);
  827.                                 enemy.state = enemy.oldState;
  828.                         }
  829.                         break;
  830.         case  STATE::DEACTIVATE: {
  831.                 enemy.deactivate();
  832.                 break;
  833.         } case STATE::KILL: {
  834.         ++killedsmallbombs;
  835.                 enemy.deactivate();
  836.                 break;
  837.         } case STATE::FALL: {
  838.                 enemy.determineCurAnim(ANIM::ROBOT,0);
  839.                 enemy.determineCurFrame();
  840.                 if (jjMaskedPixel(enemy.xPos + enemy.xSpeed, enemy.yPos)) {
  841.                         enemy.xSpeed = -0.99*enemy.xSpeed;
  842.                 } else if (jjMaskedPixel(enemy.xPos, enemy.yPos + enemy.ySpeed)) {
  843.                         enemy.ySpeed = -0.99*enemy.ySpeed;
  844.                         jjSample(enemy.xPos, enemy.yPos, SOUND::SPRING_BOING_DOWN);
  845.                 }
  846.                 enemy.xPos = enemy.xPos + enemy.xSpeed;
  847.                 enemy.yPos = enemy.yPos + enemy.ySpeed;
  848.                 enemy.ySpeed = enemy.ySpeed + .5;
  849.        
  850.         }
  851.         break;
  852.         }
  853.                 enemy.draw();
  854.         }
  855.        
  856.        
  857.                 void BlueGhost (jjOBJ@ enemy)  {
  858.                 enemy.determineCurAnim(ANIM::ZSPARK,0);
  859.                 enemy.frameID = (jjGameTicks/10) & 31;
  860.                 enemy.determineCurFrame();     
  861.                 switch (enemy.state){
  862.         case STATE::START: {
  863.                 enemy.state = STATE::FLOAT;
  864.                 enemy.xSpeed=1;
  865.                 enemy.ySpeed = 0.1;
  866.                 break;
  867.                        
  868.         }
  869.         case STATE::FREEZE:
  870.                         if (enemy.freeze > 0) {
  871.                                 enemy.draw();
  872.                                 enemy.freeze -= 2;
  873.                         }
  874.                         if (enemy.freeze < 2) {
  875.                                
  876.                                 enemy.state = enemy.oldState;
  877.                         }
  878.                         break;
  879.         case  STATE::DEACTIVATE: {
  880.                 enemy.deactivate();
  881.                 break;
  882.         } case STATE::KILL: {
  883.         if (jjRandom() & 2 == 0)
  884.         {jjAddObject(OBJECT::TNTAMMO3, enemy.xPos, enemy.yPos, p.playerID, CREATOR::PLAYER);}
  885.                 enemy.delete();
  886.                 break;
  887.         } case STATE::FLOAT: {
  888.        
  889.                  if (jjLocalPlayers[0].xPos != enemy.xPos) {enemy.direction = -enemy.xSpeed;}
  890.                  else if (jjLocalPlayers[0].xPos == enemy.xPos) {enemy.direction =1;}  
  891.                 if (jjMaskedPixel(enemy.xPos + enemy.xSpeed, enemy.yPos)) {
  892.                         enemy.xSpeed = -enemy.xSpeed;
  893.                         enemy.putOnGround(true);
  894.                 } else if (jjMaskedPixel(enemy.xPos, enemy.yPos + enemy.ySpeed)) {
  895.                         enemy.ySpeed = -0.95*enemy.ySpeed;
  896.                         enemy.putOnGround(true);
  897.                         jjSample(enemy.xPos, enemy.yPos, SOUND::SPRING_BOING_DOWN);
  898.                 }
  899.                 else if (!jjMaskedPixel(enemy.xPos, enemy.yPos + enemy.ySpeed)) {
  900.                 enemy.putOnGround(false);
  901.                         enemy.ySpeed == 1;
  902.                 }
  903.                 enemy.xPos = enemy.xPos + enemy.xSpeed;
  904.                 enemy.yPos = enemy.yPos + enemy.ySpeed;
  905.                 enemy.ySpeed = enemy.ySpeed + .05;
  906.                
  907. if (enemy.justHit != 0 )
  908. {enemy.ySpeed = 1.1*enemy.ySpeed;
  909. enemy.xSpeed = 1.1*enemy.xSpeed;
  910. }
  911. if (jjLocalPlayers[0].xPos > enemy.xPos && jjMaskedPixel(enemy.xPos, enemy.yPos + enemy.ySpeed) ){enemy.xSpeed =abs(enemy.xSpeed); }
  912. else if (jjLocalPlayers[0].xPos < enemy.xPos && jjMaskedPixel(enemy.xPos, enemy.yPos + enemy.ySpeed) )
  913. {enemy.xSpeed = -abs(enemy.xSpeed);}
  914.                 if (jjRandom() & 1 == 0)        {
  915.                                
  916.                        
  917.                                 jjOBJ@ bullet = jjObjects[enemy.fireBullet(OBJECT::BOMB)];
  918.                                 bullet.playerHandling = HANDLING::ENEMYBULLET; 
  919.                                 bullet.animSpeed = 2;                          
  920.                                 bullet.xPos=enemy.xPos;
  921.                                 bullet.yPos=enemy.yPos;
  922.                                 if (bullet.age==0) {bullet.state = STATE::KILL;}
  923.                         }
  924.         }
  925.  
  926.         break;
  927.         }
  928.        
  929.         DisplayHealth(enemy);
  930.                 enemy.draw();
  931.         }
  932.        
  933.         void SpittingBubba(jjOBJ@ enemy) {
  934.         if (enemy.energy<=0)
  935.         {enemy.state=STATE::KILL;}
  936.         switch (enemy.state) {
  937.                 case STATE::WALK:
  938.                 enemy.behave(BEHAVIOR::WALKINGENEMY);
  939.                 enemy.determineCurAnim(ANIM::BUBBA, 5);
  940.                                                                                
  941.                          if (enemy.findNearestPlayer(64*800) > -1 && ++enemy.counter > 36) enemy.state = STATE::IDLE;
  942.                                 if (enemy.energy == 0)
  943.                                         enemy.state = STATE::KILL;
  944.                         break;
  945.                         case STATE::IDLE:
  946.                         enemy.frameID = enemy.counter/5;
  947.                         enemy.determineCurFrame();
  948.                        
  949.                         switch (jjRandom() & 3) {
  950.                                
  951.                                 case 0:  
  952.                                 case 1:
  953.                                
  954.                                         enemy.state = STATE::ACTION;
  955.                                         enemy.determineCurAnim(ANIM::BUBBA, 0);
  956.                                         enemy.counter = 0;
  957.                                         break;
  958.                                        
  959.                                 case 2:
  960.                                
  961.                                         enemy.state = STATE::WALK;
  962.                                         enemy.determineCurAnim(ANIM::BUBBA, 5);
  963.                                         enemy.counter = 0;
  964.                                        
  965.                                         break;
  966.                                        
  967.                                         }
  968.                         break;
  969.                        
  970.                        
  971.                 case STATE::ACTION:
  972.                 if (++enemy.counter < 36) {
  973.                         enemy.frameID = enemy.counter/5;
  974.                         enemy.determineCurFrame();
  975.                         enemy.direction = (jjLocalPlayers[0].xPos < enemy.xPos) ? -1 : 1;
  976.                                    if (enemy.justHit == 0)
  977.                         if (enemy.counter == 25-jjDifficulty*2+2*jjDifficulty*jjDifficulty||enemy.counter == 25 || enemy.counter == 25+jjDifficulty*2) {
  978.                         //if difficulty is easy Bubba spits once per every "state::action", if normal- twice, it hard or turbo- three times.
  979.                 jjOBJ@ bullet = jjObjects[enemy.fireBullet(OBJECT::BLASTERBULLET)];
  980.                                 bullet.determineCurAnim(ANIM::HATTER, 3);
  981.                                 bullet.killAnim = bullet.determineCurAnim(ANIM::AMMO, 4, false);
  982.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  983.                                 bullet.state = STATE::FLY;
  984.                                 bullet.xPos = enemy.xPos;
  985.                                 bullet.yPos = bullet.yPos - 12;
  986.                                 bullet.xSpeed = bullet.xSpeed*(jjDifficulty+1)/4;
  987.                                 bullet.ySpeed = (-(jjRandom() & 7)+2)*(jjDifficulty+1)/4;
  988.                                 bullet.animSpeed = 1;
  989.                                 jjSample(enemy.xPos, enemy.yPos, SOUND::HATTER_PTOEI);
  990.                                
  991.                                
  992.                                
  993.                         }
  994.                 } else {
  995.                         enemy.frameID = enemy.counter = 0;
  996.                         enemy.determineCurAnim(ANIM::BUBBA, 5);
  997.                         enemy.state = STATE::IDLE;
  998.                 }
  999.                 break;
  1000.        
  1001.                        
  1002.                 case STATE::FREEZE:
  1003.                         if (enemy.freeze > 0) {
  1004.                                 enemy.draw();
  1005.                                 enemy.freeze -= 4;
  1006.                         }
  1007.                         if (enemy.freeze < 4) {
  1008.                                 enemy.unfreeze(0);
  1009.                                 enemy.state = enemy.oldState;
  1010.                         }
  1011.                         break;
  1012.        
  1013.                        
  1014.                 case STATE::KILL:
  1015.                         killedBUBBAs++;
  1016.                         if (jjRandom() & 2 == 0)
  1017.                         {jjAddObject(OBJECT::GUN8AMMO3, enemy.xPos, enemy.yPos, p.playerID, CREATOR::PLAYER);}
  1018.                         enemy.particlePixelExplosion(2);
  1019.                         @spawnedObject = jjObjects[jjAddObject(OBJECT::UTERUS, enemy.xPos, enemy.yPos)];
  1020.                         spawnedObject.determineCurAnim(ANIM::BUBBA, 1);
  1021.                         jjSample(enemy.xPos, enemy.yPos, SOUND::RAPIER_GOSTRIP);
  1022.                         enemy.delete();
  1023.                         break;
  1024.                         }
  1025.                
  1026.                 enemy.draw();
  1027.                 DisplayHealth(enemy);
  1028.                
  1029.         }
  1030.        
  1031.                 void BubbaSpirit(jjOBJ@ enemy) {
  1032.                 enemy.determineCurAnim(ANIM::BUBBA, 1);
  1033.                 enemy.behave(BEHAVIOR::BEE);
  1034.                 DisplayHealth(enemy);
  1035.                 }
  1036.        
  1037. void NPC(jjOBJ@ obj) {
  1038.         if (obj.state == STATE::START) {
  1039.                
  1040.                                 if (jjIsTSF) obj.determineCurAnim(ANIM::SPAZ,101 );
  1041.                                 else obj.determineCurAnim(ANIM::SPAZ, 101);
  1042.                                 obj.xSpeed = 2.5;
  1043.        
  1044.                 obj.state = STATE::WALK;
  1045.         }
  1046.         obj.behave(BEHAVIOR::WALKINGENEMY);
  1047. }
  1048.  
  1049. void FlyingAmmo (jjOBJ@ obj) {
  1050. u=(jjRandom() & 5);
  1051. obj.behave(BEHAVIOR::SEEKERBULLET);
  1052. if (obj.state == STATE::START) {
  1053.                 obj.state = STATE::FLY;
  1054.         }
  1055.         if (u==0)
  1056.                 {obj.determineCurAnim(ANIM::AMMO, 57);}
  1057.                 if (u==1)
  1058.                 {obj.determineCurAnim(ANIM::AMMO, 49);}
  1059.                 if (u==2)
  1060.                 {obj.determineCurAnim(ANIM::AMMO, 1);}
  1061.                 if (u==3||u==4)
  1062.                 {obj.determineCurAnim(ANIM::PICKUPS, 78);}
  1063. }
  1064.        
  1065.         void onFunction0(jjPLAYER@ play) {
  1066.         jjPalette.gradient(255, 255,0,              42, 42, 4,           96, 8, 1.0);
  1067.         jjPalette.gradient(171, 171, 160,                       10, 10, 9,                       104, 8, 1.0);
  1068.         jjPalette.gradient(255, 191, 0,                         214, 94, 0,              112, 3, 1.0);
  1069.         jjPalette.gradient(180, 71, 0,                      27, 0, 0,                115, 5, 1.0);
  1070.         jjPalette.gradient(255, 255, 20,                        199, 84, 8,          120, 8, 1.0);
  1071.         jjPalette.gradient(255, 109, 48,             210, 100, 38,                       128, 3, 1.0);
  1072.         jjPalette.gradient(205, 79, 8,             0, 0, 0,                      131, 5, 1.0);
  1073.         jjPalette.gradient(128, 0, 0,              0, 0, 0,                      136, 8, 1.0);
  1074.         jjPalette.gradient(255, 0, 0,               19, 0, 0,            144, 16, 1.0);
  1075.         jjPalette.gradient(255, 204, 156,           3, 2, 2,             160, 16, 1.0);
  1076.         jjPalette.gradient(255, 0, 0,               30, 0, 0,            176, 32, 1.0);
  1077.         jjPalette.gradient(247, 132, 20,            4, 2, 0,             208, 16, 1.0);
  1078.         jjSetFadeColors(30,0,0);
  1079.         jjPalette.apply();
  1080.         jjLocalPlayers[i].lighting = 80;
  1081.         play.showText("@@@@Bloody", STRING::SMALL);
  1082.         }      
  1083.        
  1084.         void onFunction1(jjPLAYER@ play) {
  1085.         jjSetFadeColors(0,40,80);
  1086.         Twilight.apply();
  1087. jjLocalPlayers[i].lighting = 100;
  1088. play.showText("@@@@Fine Day", STRING::SMALL);
  1089.         }
  1090.                  
  1091.                 void onPlayerTimerEnd(jjPLAYER@ play) {
  1092.         play.jumpStrength = play.jumpStrength + 8;
  1093. }
  1094.         void onFunction2(jjPLAYER@ play) {
  1095.         jjPalette.gradient(247, 102,23,             40, 17, 6,           96, 8, 1.0);
  1096.         jjPalette.gradient(36, 14, 41,                  0, 0, 15,                        104, 8, 1.0);
  1097.         jjPalette.gradient(242, 173, 30,                        138, 27, 55,             112, 8, 1.0);
  1098.         jjPalette.gradient(93, 22, 38,                      7, 2, 2,                 120, 8, 1.0);
  1099.         jjPalette.gradient(179, 73, 108,            50, 20, 31,              128, 8, 1.0);
  1100.         jjPalette.gradient(44, 18, 27,              3, 1, 1,             136, 8, 1.0);
  1101.         jjPalette.gradient(255, 190, 23,            196, 92, 37,         144, 8, 1.0);
  1102.         jjPalette.gradient(183, 81, 42,             60, 7, 21,           152, 8, 1.0);
  1103.         jjPalette.gradient(150, 174, 182,           107, 77, 56,         160, 8, 1.0);
  1104.         jjPalette.gradient(98, 65, 47,              9, 0, 0,             168, 8, 1.0);
  1105.         jjPalette.gradient(22, 30, 77,              0, 1, 1,             176, 32, 1.0);
  1106.         jjPalette.gradient(255, 199, 139,           91, 79, 7,           208, 16, 1.0);
  1107.         jjSetFadeColors(0,0,0);
  1108. jjPalette.apply();      
  1109. jjLocalPlayers[i].lighting = 80;
  1110. play.showText("@@@@Gold Mine", STRING::SMALL);
  1111.         }
  1112.        
  1113.        
  1114.         void onFunction3(jjPLAYER@ play) {
  1115.         jjPAL newPal;
  1116.     newPal.load("Psych1.j2t");
  1117.         newPal.apply();
  1118.  
  1119.        
  1120.        
  1121.        
  1122.         jjSetFadeColors(40,0,20);
  1123.    
  1124.         jjLocalPlayers[i].lighting = 100;
  1125.         play.showText("@@@@Psych1", STRING::SMALL);
  1126.         }
  1127.        
  1128.         void onFunction4(jjPLAYER@ play) {
  1129.         jjPAL newPal;
  1130.     newPal.load("Psych2.j2t");
  1131.     newPal.apply();
  1132.         jjSetFadeColors(0,0,20);
  1133.         jjLocalPlayers[i].lighting = 67;
  1134.         play.showText("@@@@Psych2", STRING::SMALL);
  1135.         }
  1136.        
  1137.         void onFunction5(jjPLAYER@ play) {
  1138.         jjPalette.gradient(24, 255,253,             0, 57, 56,           96, 8, 1.0);
  1139.         jjPalette.gradient(0, 14, 71,                   0, 0, 15,                        104, 8, 1.0);
  1140.         jjPalette.gradient(20, 253, 120,                        10, 137, 65,             112, 8, 1.0);
  1141.         jjPalette.gradient(9, 132, 62,                      0, 49, 12,               120, 8, 1.0);
  1142.         jjPalette.gradient(190, 255, 18,            5, 5, 0,              128, 8, 1.0);
  1143.         jjPalette.gradient(0, 11, 8,                0, 5, 0,             136, 8, 1.0);
  1144.         jjPalette.gradient(25, 150, 123,            33, 238, 177,         144, 5, 1.0);
  1145.         jjPalette.gradient(28, 225, 168,            24, 144, 117,         149, 3, 1.0);
  1146.         jjPalette.gradient(23, 138, 112,            0, 22, 11,           152, 8, 1.0);
  1147.         jjPalette.gradient(0, 255, 255,             10, 155, 155,         160, 8, 1.0);
  1148.         jjPalette.gradient(8, 144, 144,             0, 2, 2,             168, 8, 1.0);
  1149.         jjPalette.gradient(0, 0, 3,                 0, 83, 83,             176, 32, 1.0);
  1150.         jjPalette.gradient(255, 199, 139,           91, 79, 7,           208, 16, 1.0);
  1151.         jjSetFadeColors(0,0,0);
  1152. jjPalette.apply();      
  1153. jjLocalPlayers[i].lighting = 40;
  1154. play.showText("@@@@Grim Night", STRING::SMALL);
  1155.         }
  1156.        
  1157.         void onFunction7(jjPLAYER@ play){
  1158.         bombs = true;
  1159.         jjSetFadeColors(30,0,0);
  1160.         jjLocalPlayers[i].lighting = 80;
  1161.         jjMusicLoad("Metal.mod");
  1162.        
  1163.         jjAddObject(OBJECT::BANANA,  180*32, 50*32);
  1164.        
  1165.                 if (killedbombs==0&&killedsmallbombs==0)       
  1166.                 {jjPARTICLE@ particle = jjAddParticle(PARTICLE::STRING);
  1167.                 if (particle !is null) {
  1168.                 particle.xPos = play.xPos;
  1169.                 particle.yPos = play.yPos;
  1170.                 particle.string.text = "|Alert!";
  1171.                 particle.ySpeed = -0.4;
  1172.                 play.showText("@@@BEWARE OF BOMBS!", STRING::SMALL);
  1173.                 }
  1174.         }
  1175.         }
  1176.  
  1177. void onFunction9(jjPLAYER@ play) {
  1178. if (killedcats==0) {
  1179. jjMusicLoad("Metal.mod");
  1180. cats = true;
  1181. play.showText("@@@@Kill enough cats @@@@to open the barrier", STRING::SMALL);}
  1182. }
  1183.  
  1184. void onFunction10(jjPLAYER@ play) {
  1185. play.kill();
  1186. }
  1187.        
  1188. void onFunction12(jjPLAYER@ play) {
  1189. boss=true;
  1190. //jjTexturedBGTexture = TEXTURE::WTF;
  1191. //jjTexturedBGStyle = TEXTURE::TUNNEL;
  1192. play.activateBoss();
  1193. if (jjRandom() & 2==0)
  1194. {jjMusicLoad("boss2.j2b");}
  1195. else
  1196. {jjMusicLoad("boss1.j2b");}
  1197. jjOBJ@ boss = jjObjects[play.boss];
  1198. }
  1199.         void onFunction13(jjPLAYER@ play) {
  1200.         dark = true;
  1201.         lastTile = play.currTile;
  1202.         Twilight.apply();
  1203.         play.showText("@@@@Dynamic", STRING::LARGE);
  1204. }
  1205.  
  1206. void onCatAttack() {
  1207.  
  1208.                         uint16 randomTargetX = (44 + (jjRandom()&14)) * 32;
  1209.                         uint16 randomTargetY = (15 + (jjRandom()&12)) * 32;
  1210.                         jjAddObject(OBJECT::CHESHIRE2, randomTargetX, randomTargetY);
  1211.                
  1212.                 }
  1213.  
  1214. void onBombfall() {
  1215. if (jjGameTicks % 350/((jjDifficulty+1)^(0.5) )== 0) {
  1216.                         uint16 randomTarget = (160 + (jjRandom()&35)) * 32;
  1217.                         jjAddObject(OBJECT::BANANA, randomTarget, 40*32);
  1218.                 }
  1219.                 }
  1220.                
  1221.  
  1222.         void onFunction15(jjPLAYER@ play) {
  1223.  jjTriggers[15]=true;
  1224. }
  1225.  
  1226.         void onFunction20(jjPLAYER@ play) {
  1227.  jjTriggers[20]=true;
  1228. }
  1229.  
  1230.         void onFunction27(jjPLAYER@ play) {
  1231.  if(bombs)
  1232.  {play.showText("@@Destroy bombs enough to@@ Activate this platform", STRING::SMALL);
  1233.  }
  1234. }
  1235.  
  1236.         void onFunction28(jjPLAYER@ play) {
  1237. jjTriggers[28]=true;
  1238. }
  1239.         void onFunction30(jjPLAYER@ play) {
  1240.  jjTriggers[30]=true;
  1241. }
  1242.  
  1243.         void onFunction31(jjPLAYER@ play) {
  1244.  jjTriggers[31]=true;
  1245. }
  1246.  
  1247.         void onFunction32(jjPLAYER@ play) {
  1248.  jjTriggers[32]=true;
  1249. }
  1250.  
  1251.  
  1252.  
  1253.         void onFunction34(jjPLAYER@ play) {
  1254.  jjTriggers[34]=true;
  1255. }
  1256.                                
  1257. void DragonBreath (jjOBJ@ flame) {
  1258.         if (flame.state == STATE::START)
  1259.         flame.state = STATE::FLY;
  1260.         jjPLAYER@ play = jjPlayers[flame.creatorID];
  1261.         flame.xPos = flame.xPos + flame.xSpeed/2+flame.var[7]/65536;;
  1262.         flame.yPos = flame.yPos + flame.ySpeed/2;
  1263.         if (jjMaskedPixel(flame.xPos, flame.yPos))
  1264.                 flame.state = STATE::EXPLODE;
  1265.         if (flame.state == STATE::EXPLODE) {
  1266.                 flame.behavior = BEHAVIOR::EXPLOSION2;
  1267.         }
  1268.         flame.frameID = (++flame.counter >> 1)/20 % 9;
  1269.         flame.determineCurFrame();
  1270.         flame.draw();
  1271.         jjDrawSpriteFromCurFrame(flame.xPos, flame.yPos, flame.curFrame, flame.direction, SPRITE::NEONGLOW,2);
  1272.         flame.light= ++flame.counter/70;
  1273.         if (flame.counter>350)
  1274.         {flame.state=STATE::EXPLODE;
  1275.         }
  1276. }
  1277.  
  1278. void SpitGun (jjOBJ@ spit) {
  1279.         if (spit.state == STATE::START)
  1280.         if (jjSoundEnabled)
  1281.         {jjSample(spit.xPos, spit.yPos, SOUND::HATTER_PTOEI);}
  1282.         spit.state = STATE::FLY;
  1283.         if (jjGameTicks %6==0)// Causes damage every sixth tick
  1284.         {spit.animSpeed=1;}//otherwise this weapon would be too powerful
  1285.         else//and it would be too easy to defeat Tweedle with it
  1286.         {spit.animSpeed=0;}
  1287.         jjPLAYER@ play = jjPlayers[spit.creatorID];
  1288.         spit.xPos = spit.xPos + spit.xSpeed/2+spit.var[7]/65536-abs(g/40)*play.direction;
  1289.         if (jjMaskedPixel(spit.xPos, spit.yPos)||spit.xSpeed==0)
  1290.                 spit.state = STATE::EXPLODE;
  1291.         if (spit.state == STATE::EXPLODE) {
  1292.                 spit.behavior = BEHAVIOR::EXPLOSION2;
  1293.         }
  1294.         spit.determineCurFrame();
  1295.         spit.draw();
  1296. }
  1297.  
  1298.         void DragonflyX(jjOBJ@ enemy) {
  1299.                 enemy.behave(BEHAVIOR::DRAGONFLY);
  1300.                 DisplayHealth(enemy);
  1301.                 }
  1302.                                
  1303.        
  1304.                
  1305.        
  1306.         void HatterX(jjOBJ@ enemy) {
  1307.                 enemy.behave(BEHAVIOR::HATTER);
  1308.             DisplayHealth(enemy);
  1309.                 if ((enemy.energy==0&&jjRandom() & 2 == 0)&&(boss=false))
  1310.                         {jjAddObject(OBJECT::GUN8AMMO3, enemy.xPos, enemy.yPos, p.playerID, CREATOR::PLAYER);}
  1311.             }
  1312.        
  1313.         void FlamingCat(jjOBJ@ enemy) {
  1314.         if (enemy.energy == 0) enemy.state = STATE::KILL;
  1315.        
  1316.                 switch (enemy.state) {
  1317.                 case STATE::FLOAT:
  1318.                 enemy.bulletHandling = HANDLING::IGNOREBULLET;
  1319.                 enemy.determineCurAnim(ANIM::CAT2, 3); 
  1320.                 enemy.determineCurFrame();     
  1321.                
  1322.                         if (enemy.findNearestPlayer(164*164) > -1)
  1323.                         {enemy.state = STATE::ATTACK;
  1324.                         int u=((jjRandom() & 19) - 9.5);}
  1325.                         break;
  1326.          case STATE::ATTACK:
  1327.          enemy.playerHandling = HANDLING::ENEMY;
  1328.          enemy.bulletHandling = HANDLING::HURTBYBULLET;
  1329.          ++enemy.counter;
  1330.          if (enemy.counter == 1)
  1331.          {jjSample(enemy.xPos, enemy.yPos, SOUND::INTRO_GREN1);}
  1332.          
  1333.          enemy.direction = (jjLocalPlayers[0].xPos < enemy.xPos) ? -1 : 1;
  1334.                 if (jjRandom() & 2 == 0 && jjDifficulty<3) {
  1335.                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::SPARK)];
  1336.                         obj.determineCurAnim(ANIM::AMMO,55);
  1337.                         obj.determineCurFrame();       
  1338.                         obj.yPos = enemy.yPos;
  1339.                         obj.xPos = enemy.xPos;
  1340.                 }
  1341.                 else if (jjRandom() & 2 == 0 && jjDifficulty>2){
  1342.          
  1343.                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::SPARK)];
  1344.                         obj.determineCurAnim(ANIM::AMMO,0);
  1345.                         obj.determineCurFrame();       
  1346.                         obj.yPos = enemy.yPos;
  1347.                         obj.xPos = enemy.xPos;
  1348.                 }
  1349.                 enemy.determineCurAnim(ANIM::CAT2,2);
  1350.                 enemy.determineCurFrame();
  1351.                 enemy.frameID = enemy.counter/50;
  1352.                 enemy.counter += 5;
  1353.                
  1354.                 enemy.xPos = jjSin(enemy.counter/u)*u + enemy.xPos;
  1355.                 enemy.yPos = jjCos(enemy.counter/3*u)*2*u + enemy.yPos ;//Lissajous figures :D
  1356.         if (++enemy.counter > 3300)
  1357.         {
  1358.         enemy.xAcc= enemy.yAcc =0;
  1359.         enemy.state = STATE::FADEOUT;
  1360.         enemy.counter =0;
  1361.        
  1362.                                                 }
  1363.                
  1364.                
  1365.                
  1366.                 DisplayHealth(enemy);
  1367.         break;
  1368.                 case STATE::FADEOUT:
  1369.                 enemy.playerHandling = HANDLING::PARTICLE;
  1370.                 enemy.bulletHandling = HANDLING::IGNOREBULLET;
  1371.         if (++enemy.counter < 100) {
  1372.                         enemy.determineCurAnim(ANIM::CAT2, 1);
  1373.                         enemy.frameID = enemy.counter / 20;
  1374.                         enemy.determineCurFrame();
  1375.                         }
  1376.                         else {
  1377.                         enemy.state = STATE::FADEIN;
  1378.                         enemy.determineCurAnim(ANIM::CAT2, 0);
  1379.                         if (enemy.findNearestPlayer(2000*2000) > -1)
  1380.                         {{jjPLAYER@ play = jjLocalPlayers[0];                    
  1381.                         enemy.xPos = play.xPos - (jjRandom() & 100)+50;
  1382.                         enemy.yPos = play.yPos - (jjRandom() & 100)+50;}
  1383.                         enemy.direction = (jjLocalPlayers[0].xPos < enemy.xPos) ? -1 : 1;
  1384.                         enemy.determineCurFrame();
  1385.                         enemy.counter = 0;
  1386.                         DisplayHealth(enemy);}
  1387.                         else {enemy.state = STATE::FLOAT;}
  1388.                 }
  1389.                 break;
  1390.                 case STATE::FADEIN:
  1391.                         enemy.bulletHandling = HANDLING::HURTBYBULLET;
  1392.                 u=((jjRandom() & 5)-2.5);
  1393.                 DisplayHealth(enemy);
  1394.                 if (++enemy.counter < 100) {
  1395.                         enemy.frameID = enemy.counter / 20;
  1396.                         enemy.determineCurFrame();
  1397.                 } else {
  1398.          {enemy.state = STATE::ATTACK;}
  1399.                                 enemy.counter=0;
  1400.                 }
  1401.                
  1402.                 break;
  1403.                
  1404.         case STATE::FREEZE:
  1405.                         if (enemy.freeze > 0) {
  1406.                                 enemy.draw();
  1407.                                 enemy.freeze -= 4;
  1408.                         }
  1409.                         if (enemy.freeze < 4) {
  1410.                                 enemy.unfreeze(0);
  1411.                                 enemy.state = enemy.oldState;
  1412.                         }DisplayHealth(enemy);
  1413.                         break;
  1414.         case STATE::DEACTIVATE:
  1415.                 enemy.deactivate();
  1416.                 break;         
  1417.         case STATE::KILL:
  1418.         if (cats==true)
  1419.         {onCatAttack();}
  1420.         if (jjRandom() & 2 == 0)
  1421.        
  1422.         {jjAddObject(OBJECT::TOASTERAMMO3, enemy.xPos, enemy.yPos, p.playerID, CREATOR::PLAYER);}
  1423.         killedcats++;
  1424.         enemy.delete();
  1425.                 break;
  1426.         }
  1427.         enemy.draw();
  1428.         }
  1429.        
  1430.         void Flame(jjOBJ@ enemy) {
  1431.         if (enemy.state== STATE::FLOAT)
  1432.                 enemy.behave(BEHAVIOR::SPARK);
  1433.                 ++enemy.counter;
  1434.                 if (enemy.counter >150*jjDifficulty+100)
  1435.                                 enemy.delete();
  1436.         }
  1437.        
  1438.                 void PlatFlame(jjOBJ@ flame) {
  1439.         if (flame.state== STATE::FLOAT)
  1440.                 flame.behave(BEHAVIOR::PICKUP);
  1441.                 ++flame.counter;
  1442.                 if (flame.counter >40)
  1443.                                 flame.delete();
  1444.         }
  1445.        
  1446.        
  1447.                 void EvilSpaz(jjOBJ@ boss) {
  1448.         if ( boss.energy ==0) {boss.state = STATE::KILL; boss.counter == 0;}                   
  1449.                 switch (boss.state) {
  1450.         case STATE::START:
  1451.                 boss.determineCurAnim(ANIM::SPAZ, 61);
  1452.                 boss.determineCurFrame();
  1453.                 boss.frameID = boss.counter/10;
  1454.                 if (boss.justHit == 0)
  1455.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1456.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1457.                 boss.putOnGround(false);       
  1458.                 if ((boss.findNearestPlayer(600*600) > -1) && ++boss.counter > 55) {boss.state = STATE::ATTACK; boss.counter == 0;}
  1459.                
  1460.                 break;
  1461.         case STATE::WALK:
  1462.                 if (++boss.counter < 60) {
  1463.                         boss.determineCurAnim(ANIM::SPAZ, 54);
  1464.                        
  1465.                         boss.behave(BEHAVIOR::WALKINGENEMY);
  1466.                        
  1467.                
  1468.                        
  1469.                 } else {
  1470.                         boss.frameID = boss.counter = 0;
  1471.                         boss.state = STATE::IDLE;
  1472.                 }
  1473.                 break;
  1474.         case STATE::FREEZE:
  1475.                         if (boss.freeze > 0) {
  1476.                                 boss.draw();
  1477.                                 boss.freeze -= 4;
  1478.                         }
  1479.                         if (boss.freeze < 4) {
  1480.                                 boss.unfreeze(0);
  1481.                                 boss.state = boss.oldState;
  1482.                         }
  1483.                         break;
  1484.         case STATE::DEACTIVATE:
  1485.                 boss.deactivate();
  1486.                 break;
  1487.         case STATE::KILL:
  1488.        
  1489.                                 boss.killAnim = boss.determineCurAnim(ANIM::SPAZ, 4);
  1490.                        
  1491.                 boss.determineCurFrame();
  1492.                 boss.frameID = boss.counter/10;
  1493.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1494.         boss.delete();
  1495.                 break;
  1496.  
  1497.         case STATE::IDLE:
  1498.                 boss.frameID = boss.counter/10;
  1499.                 boss.determineCurFrame();
  1500.                 if (boss.justHit == 0)
  1501.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1502.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1503.                  
  1504.                         if (boss.var[0] == 0) { boss.var[0] = 1; }
  1505.                         switch (jjRandom() & 3) {
  1506.                                 case 0:
  1507.                                
  1508.                                
  1509.                                
  1510.                                         boss.state = STATE::ATTACK;
  1511.                                         boss.direction = (jjLocalPlayers[0].xPos < boss.xPos) ? -1 : 1;
  1512.                                         boss.determineCurAnim(ANIM::SPAZ, 14);
  1513.                                         boss.counter = 0;
  1514.                                         break;
  1515.                                        
  1516.                                 case 1:
  1517.                                         boss.state = STATE::FADEOUT;
  1518.                                         boss.determineCurAnim(ANIM::SPAZ, 72);
  1519.                                        
  1520.                                         boss.counter = 0;
  1521.                                          {
  1522.                                                 jjPLAYER@ play = jjLocalPlayers[0];
  1523.                                                 boss.xAcc = play.xPos;
  1524.                                                 boss.yAcc = play.yPos;
  1525.                                         }
  1526.                                         break;
  1527.                                        
  1528.                                 case 2:case 3:
  1529.                                         boss.state = STATE::WALK;
  1530.                                         boss.determineCurAnim(ANIM::SPAZ, 54);
  1531.                                         boss.counter = 0;
  1532.                                         break;
  1533.                                        
  1534.                                
  1535.                                
  1536.                         }
  1537.                
  1538.                 break;
  1539.         case STATE::FADEOUT:
  1540.         if(++boss.counter == 1)
  1541.         {jjSample(boss.xPos, boss.yPos, SOUND::COMMON_TELPORT1);}
  1542.                 else if (++boss.counter < 50) {
  1543.                         boss.frameID = boss.counter / 10;
  1544.                        
  1545.                         jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1546.                        
  1547.                         boss.determineCurFrame();
  1548.                         }
  1549.                         else {
  1550.                         boss.frameID = boss.counter = 0;
  1551.                         boss.state = STATE::FADEIN;
  1552.                        
  1553.                         boss.determineCurAnim(ANIM::SPAZ, 76);
  1554.                         boss.xPos = boss.xAcc;
  1555.                         boss.yPos = boss.yAcc - 32;
  1556.                         boss.direction = (jjLocalPlayers[0].xPos < boss.xPos) ? -1 : 1;
  1557.                         boss.determineCurFrame();
  1558.                         boss.putOnGround(false);
  1559.                         return;
  1560.                 }
  1561.                 break;
  1562.         case STATE::FADEIN:
  1563.         if(++boss.counter == 1)
  1564.         {jjSample(boss.xPos, boss.yPos, SOUND::COMMON_TELPORT2);}
  1565.                 if (++boss.counter < 40) {
  1566.                         boss.frameID = boss.counter / 10;
  1567.                         boss.determineCurFrame();
  1568.                         jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1569.                 } else {
  1570.                         boss.frameID = boss.counter = 0;
  1571.                         boss.state = STATE::IDLE;
  1572.                         boss.yAcc=boss.xAcc=0;
  1573.                 }
  1574.                 break;
  1575.         case STATE::ATTACK:
  1576.                 if (++boss.counter < 36) {
  1577.                         boss.frameID = boss.counter / 10;
  1578.                         boss.determineCurFrame();
  1579.                         if (boss.justHit == 0)
  1580.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1581.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1582.                        
  1583.                         if (( boss.counter == 25||boss.counter == 30||boss.counter == 35))
  1584.                        
  1585.                 {jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::BLASTERBULLET)];
  1586.                                
  1587.                                 bullet.killAnim = bullet.determineCurAnim(ANIM::AMMO, 4, false);
  1588.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  1589.                                 bullet.state = STATE::FLY;
  1590.                                 bullet.xPos = boss.xPos;
  1591.                                 bullet.yPos = boss.yPos;        
  1592.                                 bullet.animSpeed = 1;
  1593.                                 jjSample(boss.xPos, boss.yPos, SOUND::AMMO_GUN3PLOP);}
  1594.                        
  1595.                        
  1596.        
  1597.                 } else {
  1598.                         boss.frameID = boss.counter = 0;
  1599.                         boss.determineCurAnim(ANIM::SPAZ, 61);
  1600.                         boss.state = STATE::IDLE;
  1601.                 }
  1602.                 break;
  1603.         }
  1604.         DisplayHealth(boss);
  1605. }
  1606.        
  1607.  
  1608.         void Tweedle(jjOBJ@ boss) {
  1609.         jjPLAYER@ play = jjLocalPlayers[0];
  1610.         if ( boss.energy <=0)
  1611.         {       boss.state = STATE::DONE;
  1612.         boss.counter == 0;}                    
  1613.                 switch (boss.state) {
  1614.         case STATE::START:
  1615.         u=(jjRandom() & 3);
  1616.                 boss.determineCurAnim(ANIM::TWEEDLE, 6);
  1617.                 boss.determineCurFrame();
  1618.                 boss.frameID = boss.counter/5;
  1619.                 if (boss.justHit == 0)
  1620.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1621.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1622.                 boss.putOnGround(true);
  1623.                 if (boss.energy < 125 && ++boss.counter <= 11*(jjDifficulty+2)) {
  1624.                 ++boss.energy;
  1625.                
  1626.                 jjSample(boss.xPos, boss.yPos, SOUND::BILSBOSS_ZIP);
  1627.                 boss.lightType = LIGHT::LASER;
  1628.                 boss.light =55;
  1629.  
  1630.                                 jjPARTICLE@ particle = jjAddParticle(PARTICLE::STRING);
  1631.                 if (particle !is null) {
  1632.                 particle.xPos = boss.xPos-20;
  1633.                 particle.yPos = boss.yPos;
  1634.                 particle.string.text = "HEAL";
  1635.                
  1636.                 particle.ySpeed = -0.4;
  1637.                 }
  1638.                
  1639.                 }
  1640.                 if (++boss.counter >= 50)
  1641.                 {boss.light =0;}
  1642.                
  1643.         if (++boss.counter == 55){
  1644.                 jjAlert("Tweedle heals himself by "+ formatInt(11*(jjDifficulty+1), "1"));
  1645.         }      
  1646.                 if ((boss.findNearestPlayer(600*600) > -1) && ++boss.counter > 55)
  1647.                 {boss.state = STATE::IDLE; boss.counter == 0;}
  1648.                 break;
  1649.         case STATE::WALK:
  1650.         boss.behave(BEHAVIOR::WALKINGENEMY);
  1651.         {
  1652.        
  1653.                 boss.counter++;
  1654.                 if (u==0||u==1)
  1655.                 {if (++boss.counter < 110){
  1656.                         boss.xSpeed= (jjDifficulty+3)*boss.direction;
  1657.                         boss.determineCurAnim(ANIM::TWEEDLE, 1);
  1658.                         if (boss.counter == 10){
  1659.                         jjSample(boss.xPos, boss.yPos, SOUND::INTRO_GREN3);}
  1660.                         }
  1661.                         else
  1662.                         {boss.frameID = boss.counter = 0;
  1663.                         boss.state = STATE::IDLE;}
  1664.                         }
  1665.                         else if (u==2||u==3)
  1666.                         {if (++boss.counter < 120){
  1667.                         boss.xSpeed= boss.direction;
  1668.                         boss.determineCurAnim(ANIM::TWEEDLE, 8);}
  1669.                         else
  1670.                         {boss.frameID = boss.counter = 0;
  1671.                         boss.state = STATE::IDLE;}
  1672.                         }
  1673.                         if (boss.justHit == 0)
  1674.                         {jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);}
  1675.                         boss.determineCurFrame();
  1676.                         boss.frameID = (boss.counter/10) & 63;
  1677.        
  1678.                 break;
  1679.                
  1680.                 }
  1681.         case STATE::FREEZE:
  1682.                         if (boss.freeze > 0) {
  1683.                                 boss.draw();
  1684.                                 boss.freeze -= 4;
  1685.                         }
  1686.                         if (boss.freeze < 4) {
  1687.                                 boss.unfreeze(0);
  1688.                                 boss.state = boss.oldState;
  1689.                         }
  1690.                         break;
  1691.         case STATE::DEACTIVATE:
  1692.                 boss.deactivate();
  1693.                 break;
  1694.         case STATE::DONE:
  1695.  
  1696.                 boss.determineCurAnim(ANIM::TWEEDLE, 5);
  1697.                 boss.determineCurFrame();
  1698.                 boss.frameID = boss.counter/20;
  1699.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1700.         ++boss.counter;
  1701.         if (++boss.counter>89) {
  1702.         boss.energy = 125;}
  1703.                         if (++boss.counter>90) {
  1704.         boss.state = STATE::START;
  1705.         boss.behavior = Tweedle2;
  1706.                 boss.counter==0;                       
  1707.                 //jjEventSet(p.xPos / 32, p.yPos / 32, AREA::EOL);
  1708.                 }
  1709.                 break;
  1710.  
  1711.         case STATE::IDLE:
  1712.                 boss.frameID = boss.counter/5;
  1713.                 boss.determineCurFrame();
  1714.                 if (boss.justHit == 0)
  1715.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1716.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1717.                  
  1718.                         if (boss.var[0] == 0) { boss.var[0] = 1; }
  1719.                         switch (jjRandom() & 3) {
  1720.                        
  1721.                                 case 0:
  1722.                                
  1723.                                         boss.state = STATE::ATTACK;
  1724.                                         boss.direction = (jjLocalPlayers[0].xPos < boss.xPos) ? -1 : 1;
  1725.                                         if (play.charCurr == CHAR::JAZZ)
  1726.                                         {boss.determineCurAnim(ANIM::TWEEDLE, 4);}
  1727.                                         else
  1728.                                         {boss.determineCurAnim(ANIM::TWEEDLE, 3);}
  1729.                                         boss.counter = 0;
  1730.                                         break;
  1731.        
  1732.                                
  1733.                                 case 1:
  1734.                                         boss.state = STATE::WALK;
  1735.                                         boss.counter = 0;
  1736.                                         break;
  1737.                                        
  1738.                                
  1739.                                 case 2:
  1740.                                         boss.state = STATE::START;
  1741.                                         boss.determineCurAnim(ANIM::TWEEDLE, 6);
  1742.                                         boss.counter = 0;
  1743.                                         break;
  1744.                         }
  1745.                
  1746.                 break;
  1747.  
  1748.         case STATE::ATTACK:
  1749.  
  1750.                 if (++boss.counter < 36) {
  1751.                         boss.frameID = boss.counter / 5;
  1752.                         boss.determineCurFrame();
  1753.                         if (boss.justHit == 0)
  1754.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1755.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1756.                         if ((u==0||u==1)&& ( boss.counter == 20|| boss.counter == 25||boss.counter == 30|| boss.counter == 35||boss.counter == 40))
  1757.                         {
  1758.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::BOUNCERBULLET)];
  1759.                                
  1760.                                 bullet.killAnim = bullet.determineCurAnim(ANIM::AMMO, 4, false);
  1761.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  1762.                                 bullet.state = STATE::FLY;
  1763.                                 bullet.ySpeed = (-(jjRandom() & 6)+3);
  1764.                                 bullet.xPos = boss.xPos;
  1765.                                 bullet.yPos = boss.yPos-7;      
  1766.                                 bullet.animSpeed = 1;
  1767.                                 jjSample(boss.xPos, boss.yPos, SOUND::AMMO_SPZBL1);
  1768.                         }
  1769.                         else if ((u==2) && (boss.counter == 22|| boss.counter == 26||boss.counter == 30||boss.counter == 34||boss.counter == 38))
  1770.                         {
  1771.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::BLASTERBULLET)];
  1772.                                
  1773.                                 bullet.killAnim = bullet.determineCurAnim(ANIM::AMMO, 4, false);
  1774.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  1775.                                 bullet.state = STATE::FLY;
  1776.                                 bullet.xPos = boss.xPos;
  1777.                                 bullet.yPos = boss.yPos-7;      
  1778.                                 bullet.animSpeed = 1;
  1779.                                 jjSample(boss.xPos, boss.yPos, SOUND::AMMO_GUN3PLOP);
  1780.                         }
  1781.                         else if (u==3 && ( boss.counter == 30))
  1782.                         {
  1783.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::ELECTROBULLETPU)];
  1784.                                
  1785.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  1786.                                 bullet.state = STATE::FLY;
  1787.                                 bullet.xPos = boss.xPos;
  1788.                                 bullet.yPos = boss.yPos-7;      
  1789.                                
  1790.                                 bullet.animSpeed = 3;
  1791.                                 jjSample(boss.xPos, boss.yPos, SOUND::AMMO_LASER2);
  1792.                         }
  1793.                        
  1794.                 } else {
  1795.                         boss.frameID = boss.counter = 0;
  1796.                         boss.determineCurAnim(ANIM::TWEEDLE, 6);
  1797.                         boss.state = STATE::IDLE;
  1798.                 }
  1799.                 break;
  1800.         }
  1801.        
  1802. }
  1803.  
  1804.         void Tweedle2(jjOBJ@ boss) {
  1805.        
  1806.         jjPLAYER@ play = jjLocalPlayers[0];
  1807.                                
  1808.                 switch (boss.state) {
  1809.         case STATE::START:
  1810.          if (++boss.counter >= 0&&++boss.counter <= 400)
  1811.                 {boss.determineCurFrame();
  1812.                         boss.frameID = boss.counter/60;}
  1813.         boss.determineCurAnim(ANIM::TWEEDLE, 0);
  1814.         boss.direction = (jjLocalPlayers[0].xPos < boss.xPos) ? -1 : 1;
  1815.          if (++boss.counter > 400&&++boss.counter <= 2000)
  1816. {paused=false;
  1817. boss.determineCurFrame();
  1818. boss.frameID = boss.counter/60;
  1819. boss.determineCurAnim(ANIM::TWEEDLE, 7);}      
  1820.         if (++boss.counter > 500&& ++boss.counter < 700&&jjGameTicks%5==0){
  1821.         play.noFire=true;
  1822.        
  1823.         jjSample(boss.xPos, boss.yPos, SOUND::COMMON_SWISH2);
  1824.                 @spawnedObject2 = jjObjects[jjAddObject(OBJECT::SEEKERBULLETPU, play.xPos, play.yPos)];
  1825.                 ++spawnedObject2.counter;              
  1826.                                 jjDrawSpriteFromCurFrame(spawnedObject2.xPos, spawnedObject2.yPos, spawnedObject2.curFrame, spawnedObject2.direction, SPRITE::NORMAL);
  1827.                         }
  1828.                
  1829.                 boss.determineCurFrame();
  1830.                 boss.frameID = boss.counter/5;
  1831.                 if (boss.justHit == 0)
  1832.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1833.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1834.                 boss.putOnGround(true);
  1835.                
  1836.                 if (++boss.counter > 690&&++boss.counter <= 700)
  1837.         {play.showText("@@#You are disarmed!@Use buttstomps @and special attacks!", STRING::SMALL);}
  1838.                 if (++boss.counter > 2000&&++boss.counter <= 2200) {
  1839.                 boss.determineCurAnim(ANIM::TWEEDLE, 2);
  1840.                 boss.determineCurFrame();
  1841.                 boss.frameID = -boss.counter/60;
  1842.                 }
  1843.                
  1844.                 if ((boss.findNearestPlayer(600*600) > -1) && ++boss.counter > 2200) {
  1845.                 boss.state = STATE::ATTACK;
  1846.                 boss.counter == 0;}
  1847.                 break;
  1848.                 case STATE::STILL:
  1849.                
  1850.         u=(jjRandom() & 3);
  1851. //      if (boss.counter >= 10&&boss.counter <= 12&&u==2)
  1852. //              {jjAddObject(OBJECT::HATTER,boss.xPos,boss.yPos);}
  1853.                 boss.determineCurAnim(ANIM::TWEEDLE, 6);
  1854.                 boss.determineCurFrame();
  1855.                 boss.frameID = boss.counter/5;
  1856.                 if (boss.justHit == 0)
  1857.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1858.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1859.                 boss.putOnGround(true);
  1860.                 if (boss.energy < 125 && ++boss.counter <= 5*(jjDifficulty)) {
  1861.                 ++boss.energy;
  1862.                
  1863.                 jjSample(boss.xPos, boss.yPos, SOUND::BILSBOSS_ZIP);
  1864.                 boss.lightType = LIGHT::LASER;
  1865.                 boss.light =55;
  1866.  
  1867.                                 jjPARTICLE@ particle = jjAddParticle(PARTICLE::STRING);
  1868.                 if (particle !is null) {
  1869.                 particle.xPos = boss.xPos-20;
  1870.                 particle.yPos = boss.yPos;
  1871.                 particle.string.text = "HEAL";
  1872.                
  1873.                 particle.ySpeed = -0.4;
  1874.                 }
  1875.                
  1876.                 }
  1877.                 if (++boss.counter >= 50)
  1878.                 {boss.light =0;}
  1879.         if (++boss.counter == 55){
  1880.                 jjAlert("Tweedle heals himself by "+ formatInt(3*(jjDifficulty), "1"));
  1881.         }      
  1882.                 if ((boss.findNearestPlayer(600*600) > -1) && ++boss.counter > 55)
  1883.                 {boss.state = STATE::IDLE;
  1884.                 boss.counter == 0;}
  1885.                 break;
  1886.         case STATE::WALK:
  1887.         boss.behave(BEHAVIOR::WALKINGENEMY);
  1888.                         if (u==0||u==1)
  1889.                 {if (++boss.counter < 110){
  1890.                         boss.xSpeed= (jjDifficulty+6)*boss.direction;
  1891.                         boss.determineCurAnim(ANIM::TWEEDLE, 1);
  1892.                         if (boss.counter == 10){
  1893.                         jjSample(boss.xPos, boss.yPos, SOUND::INTRO_GREN3);}
  1894.                         }
  1895.                         else
  1896.                         {boss.frameID = boss.counter = 0;
  1897.                         boss.state = STATE::IDLE;}
  1898.                         }
  1899.                         else if (u==2||u==3)
  1900.                         {if (++boss.counter < 120){
  1901.                         boss.xSpeed= boss.direction;
  1902.                         boss.determineCurAnim(ANIM::TWEEDLE, 8);}
  1903.                         else
  1904.                         {boss.frameID = boss.counter = 0;
  1905.                         boss.state = STATE::IDLE;}
  1906.                         }
  1907.                        
  1908.  
  1909.         else
  1910.         {
  1911.                         boss.frameID = boss.counter = 0;
  1912.                         boss.state = STATE::IDLE;
  1913.                         boss.playerHandling = HANDLING::SPECIAL;
  1914.                         boss.bulletHandling = HANDLING::HURTBYBULLET;
  1915.                 }
  1916.                 break;
  1917.         case STATE::FREEZE:
  1918.                         if (boss.freeze > 0) {
  1919.                                 boss.draw();
  1920.                                 boss.freeze -= 4;
  1921.                         }
  1922.                         if (boss.freeze < 4) {
  1923.                                 boss.unfreeze(0);
  1924.                                 boss.state = boss.oldState;
  1925.                         }
  1926.                         break;
  1927.         case STATE::DEACTIVATE:
  1928.                 boss.deactivate();
  1929.                 break;
  1930.         case STATE::KILL:
  1931.        
  1932.                         boss.determineCurAnim(ANIM::TWEEDLE, 5);
  1933.                 boss.determineCurFrame();
  1934.                 boss.frameID = boss.counter/20;
  1935.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1936.        
  1937.                
  1938.                         @spawnedObject3 = jjObjects[jjAddObject(OBJECT::BOUNCEONCE, boss.xPos, boss.yPos)];
  1939.                         jjSample(boss.xPos, boss.yPos, SOUND::MENUSOUNDS_SELECT0);
  1940.                         if (play.charCurr == CHAR::JAZZ)
  1941.                         {spawnedObject3.determineCurAnim(ANIM::AMMO, 19);}
  1942.                         else
  1943.                         {spawnedObject3.determineCurAnim(ANIM::AMMO, 18);}
  1944.                         boss.delete();
  1945.                         jjEventSet(play.xPos / 32, play.yPos / 32, AREA::EOL);
  1946.                
  1947.                 break;
  1948.  
  1949.         case STATE::IDLE:
  1950.                 boss.frameID = boss.counter/5;
  1951.                 boss.determineCurFrame();
  1952.                 if (boss.justHit == 0)
  1953.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  1954.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  1955.                  
  1956.                         if (boss.var[0] == 0) { boss.var[0] = 1; }
  1957.                         switch (jjRandom() & 3) {
  1958.                                 case 0:
  1959.                                
  1960.                                
  1961.                                
  1962.                                         boss.state = STATE::ATTACK;
  1963.                                         boss.direction = (jjLocalPlayers[0].xPos < boss.xPos) ? -1 : 1;
  1964.                                         if (play.charCurr == CHAR::JAZZ)
  1965.                                         {boss.determineCurAnim(ANIM::TWEEDLE, 4);}
  1966.                                         else
  1967.                                         {boss.determineCurAnim(ANIM::TWEEDLE, 3);}
  1968.                                         boss.counter = 0;
  1969.                                         break;
  1970.                                        
  1971.                                 case 1:
  1972.                                         boss.state = STATE::FADEOUT;
  1973.                                         boss.determineCurAnim(ANIM::TWEEDLE, 1);
  1974.                                        
  1975.                                         boss.counter = 0;
  1976.                                         if (jjDifficulty > 0) {
  1977.                                                 boss.playerHandling = HANDLING::PARTICLE;
  1978.                                                 boss.bulletHandling = HANDLING::IGNOREBULLET;
  1979.                                         } {
  1980.                                                 boss.xAcc = play.xPos;
  1981.                                                 boss.yAcc = play.yPos;
  1982.                                         }
  1983.                                         break;
  1984.                                        
  1985.                                 case 2:
  1986.                                 boss.state = STATE::STILL;
  1987.                                         boss.counter = 0;
  1988.                                         break;
  1989.                                 case 3:
  1990.                                         boss.state = STATE::WALK;
  1991.                                         boss.counter = 0;
  1992.                                         break;
  1993.                                
  1994.                         }
  1995.                
  1996.                 break;
  1997.         case STATE::FADEOUT:
  1998.        
  1999.         if(++boss.counter == 1)
  2000.         {jjSample(boss.xPos, boss.yPos, SOUND::DEVILDEVAN_VANISH1);}
  2001.                 else if (++boss.counter < 50) {
  2002.                         boss.frameID = boss.counter / 5;
  2003.                        
  2004.                         jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::TRANSLUCENT);
  2005.                        
  2006.                         boss.determineCurFrame();
  2007.                         }
  2008.                         else {
  2009.                         boss.frameID = boss.counter = 0;
  2010.                         boss.state = STATE::FADEIN;
  2011.                        
  2012.                         boss.determineCurAnim(ANIM::TWEEDLE, 1);
  2013.                         boss.xPos = play.xPos;
  2014.                         boss.yPos = play.yPos;
  2015.                         boss.direction = (jjLocalPlayers[0].xPos < boss.xPos) ? -1 : 1;
  2016.                         boss.determineCurFrame();
  2017.                         boss.putOnGround(true);
  2018.                         return;
  2019.                 }
  2020.                 break;
  2021.         case STATE::FADEIN:
  2022.                 if (++boss.counter < 40) {
  2023.                         boss.frameID = boss.counter / 5;
  2024.                         boss.determineCurFrame();
  2025.                         jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::TRANSLUCENT);
  2026.                 } else {
  2027.                         boss.frameID = boss.counter = 0;
  2028.                         boss.state = STATE::IDLE;
  2029.                         boss.playerHandling = HANDLING::SPECIAL;
  2030.                         boss.bulletHandling = HANDLING::HURTBYBULLET;
  2031.                         boss.yAcc=boss.xAcc=0;
  2032.                 }
  2033.                 break;
  2034.         case STATE::ATTACK:
  2035.  
  2036.                 if (++boss.counter < 36) {
  2037.                         boss.frameID = boss.counter / 5;
  2038.                         boss.determineCurFrame();
  2039.                         if (boss.justHit == 0)
  2040.                 jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  2041.                 else jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::SINGLECOLOR,15);
  2042.                                 if ((u==0)&& (jjGameTicks%2==0)&&( boss.counter >= 20&&boss.counter <= 40))
  2043.                         {
  2044.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::BOUNCERBULLETPU)];
  2045.                                 bullet.killAnim = bullet.determineCurAnim(ANIM::AMMO, 4, false);
  2046.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  2047.                                 bullet.state = STATE::FLY;
  2048.                                 bullet.ySpeed = (-(jjRandom() & 6)+3);
  2049.                                 bullet.xPos = boss.xPos;
  2050.                                 bullet.yPos = boss.yPos-7;      
  2051.                                 bullet.animSpeed = 1;
  2052.                                 jjSample(boss.xPos, boss.yPos, SOUND::AMMO_SPZBL1);
  2053.                         }
  2054.                 if ((u==1)&& (jjGameTicks%2==0)&&(  boss.counter >= 20&&boss.counter <= 40))
  2055.                         {
  2056.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::FIRESHIELDBULLET)];
  2057.                                 bullet.determineCurAnim(ANIM::BUBBA, 4);
  2058.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  2059.                                 bullet.state = STATE::FLY;
  2060.                                 bullet.ySpeed = (-(jjRandom() & 6)+3);
  2061.                                 bullet.xPos = boss.xPos;
  2062.                                 bullet.yPos = boss.yPos-7;      
  2063.                                 bullet.animSpeed = 2;
  2064.                                 if (boss.counter >= 20&&boss.counter <= 25)
  2065.                                 {jjSample(boss.xPos, boss.yPos, SOUND::BUBBA_SNEEZE2);}
  2066.                         }
  2067.                         if ((u==2)&&( boss.counter == 25||boss.counter == 30||boss.counter == 35))
  2068.                         {
  2069.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::SMOKERING)];
  2070.                     bullet.ySpeed = 0;
  2071.                                 bullet.yAcc = 0;
  2072.                                 bullet.xPos = boss.xPos;
  2073.                                 bullet.yPos = boss.yPos-7;      
  2074.                                 jjSample(boss.xPos, boss.yPos, SOUND::INTRO_BLOW);
  2075.                         }
  2076.                         if ((u==3)&&(boss.counter == 20|| boss.counter == 25||boss.counter == 30||boss.counter == 35||boss.counter == 40))
  2077.                                         {
  2078.                 jjOBJ@ bullet = jjObjects[boss.fireBullet(OBJECT::BLASTERBULLETPU)];
  2079.                                
  2080.                                 bullet.killAnim = bullet.determineCurAnim(ANIM::AMMO, 4, false);
  2081.                                 bullet.playerHandling = HANDLING::ENEMYBULLET;
  2082.                                 bullet.state = STATE::FLY;
  2083.                                 bullet.xPos = boss.xPos;
  2084.                                 bullet.yPos = boss.yPos-7;      
  2085.                                 bullet.animSpeed = 2;
  2086.                                 jjSample(boss.xPos, boss.yPos, SOUND::AMMO_GUN3PLOP);
  2087.                         }
  2088.                        
  2089.                 } else {
  2090.                         boss.frameID = boss.counter = 0;
  2091.                         boss.determineCurAnim(ANIM::TWEEDLE, 6);
  2092.                         boss.state = STATE::IDLE;
  2093.                 }
  2094.                 break;
  2095.         }
  2096.        
  2097. }
  2098.  
  2099. void MovingPlatform(jjOBJ@ plat) {// I had to use another behavior for horisontally-moving stone. If not, Jazz doesn't move with the platform and falls from it.
  2100.  
  2101. switch (plat.state){// I was inspired by a moving platform in "plusEnscripted"
  2102. case STATE::WAIT:
  2103. plat.state = STATE::FADEIN;
  2104. break;
  2105. case STATE::DEACTIVATE:
  2106.                 plat.xOrg = plat.xAcc;
  2107.                 plat.yOrg = plat.yAcc;
  2108. break;         
  2109. case STATE::FADEIN:
  2110. //if (abs(jjLocalPlayers[0].xPos-plat.xOrg)<12*32||abs(jjLocalPlayers[0].yPos-plat.yOrg)<12*32){
  2111. if (plat.yOrg>56*32&&plat.yOrg<58*32&&plat.xOrg>423*32&&plat.xOrg<446*32&&jjTriggers[15])
  2112.         plat.xOrg = (430.5*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*(7*32);
  2113. else if (plat.xOrg>23*32&&plat.xOrg<25*32)     
  2114.         plat.yOrg = (12*32) - jjSin(++plat.counter*((jjDifficulty+1)^0.5))*(5*32);
  2115. else if (plat.xOrg>352*32&&plat.xOrg<373*32&&plat.yOrg<66*32)  
  2116.         {plat.xOrg = (362*32) + jjCos(++plat.counter)*(9.5*32);
  2117.         plat.yOrg = (58*32) - jjCos(++plat.counter*2)*(4*32);}
  2118. else if (plat.xOrg>300*32&&plat.xOrg<340*32&&plat.yOrg<30*32&&jjTriggers[34])  
  2119.         {plat.xOrg = (320*32) - jjCos(++plat.counter/2)*(18.5*32);
  2120.         plat.yOrg = (16*32) + jjCos(++plat.counter*2)*(6*32);}
  2121. //else if (plat.yOrg>11*32&&plat.yOrg<13*32)   
  2122.         //plat.xOrg = (27*32) - jjSin(++plat.counter*((jjDifficulty+1)^0.5))*(5*32);
  2123. else if (plat.xOrg>43*32&&plat.xOrg<45*32&&jjTriggers[3])
  2124.         plat.yOrg = (62*32) - jjSin(++plat.counter*((jjDifficulty+1)^0.5))*(10*32);
  2125. else if (plat.yOrg>59*32&&plat.yOrg<61*32&&plat.xOrg>420*32&&plat.yOrg<485*32)
  2126.         plat.xOrg = (453*32) + jjSin(++plat.counter*((jjDifficulty+1)^0.5))*(29*32);
  2127. else if (plat.xOrg>249*32&&plat.xOrg<251*32&&plat.yOrg<32*32&&jjTriggers[31])
  2128.         plat.yOrg = (22.7*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*(7*32);
  2129. else if (plat.xOrg>264*32&&plat.xOrg<266*32)
  2130.         plat.yOrg = (48*32) + jjSin(0.9*++plat.counter*((jjDifficulty+1)^0.5))*(5*32);
  2131. else if (plat.xOrg>266*32&&plat.xOrg<268*32)
  2132.         plat.yOrg = (29*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*(15*32);
  2133. else if (plat.xOrg>268*32&&plat.xOrg<270*32)
  2134.         plat.yOrg = (9*32) + jjSin(0.9*++plat.counter*((jjDifficulty+1)^0.5))*(6*32);  
  2135. else if (plat.xOrg>409*32&&plat.xOrg<411*32)
  2136.         plat.yOrg = (50*32) + jjSin(++plat.counter*((jjDifficulty+1)^0.5))*(6*32);     
  2137. else if (plat.xOrg>140*32&&plat.xOrg<142*32&&jjTriggers[28])   
  2138.         plat.yOrg = (21*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*(15*32);
  2139. else if (plat.xOrg>176*32&&plat.xOrg<178*32&&killedbombs>=bombgoal&&killedsmallbombs>=smbombgoal)      
  2140.         plat.yOrg = (52*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*(10*32);    
  2141. else if (plat.xOrg>443*32&&plat.xOrg<445*32)   
  2142.         plat.yOrg = (51*32) + jjSin(0.9*++plat.counter*((jjDifficulty+1)^0.5))*(5*32); 
  2143. else if (plat.yOrg>84*32&&plat.yOrg<86*32&&plat.xOrg<341*32&&plat.xOrg>322*32&&jjTriggers[32]) 
  2144.         plat.xOrg = (332*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*(7.5*32);
  2145. else if (plat.xOrg>320*32&&plat.xOrg<322*32&&plat.yOrg>73*32)
  2146.         plat.yOrg = (79*32) + jjSin(0.9*++plat.counter*((jjDifficulty+1)^0.5))*(5*32);
  2147. else if (plat.xOrg>257*32&&plat.xOrg<259*32)
  2148.         plat.yOrg = (92*32) + jjSin(++plat.counter*((jjDifficulty+1)^0.5))*((jjDifficulty+3)*32);
  2149. else if (plat.xOrg>253*32&&plat.xOrg<255*32)
  2150.         plat.yOrg = (90*32) + jjCos(++plat.counter*((jjDifficulty+1)^0.5))*