Downloads containing saldr.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Devan's Revenge (Intro)Featured Download sAlAmAnDeR Single player 9.6 Download file

File preview

  1. #include "SaLLiB-v2.0.asc"
  2.  
  3. void blackbg() {
  4.         for(uint i = 0; i < 8; i++)
  5.                 for(uint j = 0; j < 8; j++)
  6.                         jjTileSet(8,i,j,242);
  7. }
  8.  
  9. void normalbg() {
  10.         for(uint i = 0; i < 8; i++)
  11.                 for(uint j = 0; j < 8; j++)
  12.                         jjTileSet(8,i,j,821+10*j+i);
  13. }
  14.  
  15. void dark(bool layer1 = true) {
  16.         blackbg();
  17.         for(uint i = 1; i < 8; i++) {
  18.                 jjLayerHasTiles[i] = false;
  19.         }
  20.         jjLayerHasTiles[8] = true;
  21.         if(layer1)
  22.                 jjLayerHasTiles[1] = true;
  23. }
  24.  
  25. void warp() {
  26.         normalbg();
  27.         jjLayerYAutoSpeed[8] = -2;
  28.         jjPalette.gradient(0,0,0,160,0,200);
  29.         jjPalette.apply();
  30.         jjTexturedBGStyle = TEXTURE::TUNNEL;
  31.         jjTexturedBGUsed = true;
  32.         for(uint i = 0; i < 7; i++)
  33.                 jjLayerHasTiles[i] = false;
  34.         jjLayerHasTiles[8] = true;
  35. }
  36.  
  37. void hell() {
  38.         normalbg();
  39.         for(uint i = 0; i < 8; i++) {
  40.                 jjLayerHasTiles[i] = true;
  41.         }
  42. }
  43.  
  44. class Particle {
  45.   private float xPos, yPos, xSpeed, ySpeed;
  46.   private uint size, counter;
  47.  
  48.   Particle(float xPos, float yPos, float xSpeed, float ySpeed, uint size) {
  49.         this.counter = 0;
  50.     this.size = size + jjRandom() % 5;
  51.     this.xPos = xPos - size / 2;
  52.     this.yPos = yPos - size / 2;
  53.     this.xSpeed = xSpeed - 0.5f + jjRandom() % 100 / 100.f;
  54.     this.ySpeed = ySpeed - 1.f + jjRandom() % 200 / 100.f;
  55.   }
  56.  
  57.   void behavior() {
  58.     counter++;
  59.     xPos += xSpeed;
  60.     yPos += ySpeed;
  61.     if (counter > 120)
  62.       size /= 2;
  63.         uint color = 40 + (counter / 15);
  64.     if (color > 47)
  65.       color = 47;
  66.     jjDrawRectangle(xPos, yPos, size, size, color, SPRITE::TRANSLUCENT,0,2);
  67.   }
  68.  
  69.   bool exists() const {
  70.     return size > 1;
  71.   }
  72. }
  73.  
  74. class SpookyString : GAME::String {
  75.         private float xOsc, yOsc, xInit, yInit;
  76.        
  77.         SpookyString(float xPos, float yPos, string text, STRING::Size stringSize = STRING::MEDIUM, STRING::Mode stringMode = STRING::NORMAL, SPRITE::Mode spriteMode = SPRITE::NORMAL, int param = 0, float xOscillate = 32, float yOscillate = 32) {
  78.                 super(xPos, yPos, text, stringSize, stringMode, spriteMode, param);
  79.                 this.xOsc = xOscillate;
  80.                 this.yOsc = yOscillate;
  81.                 this.xInit = xPos;
  82.                 this.yInit = yPos;
  83.         }
  84.  
  85.         void behavior() {
  86.                 if(jjRandom() % 70 > 55) {
  87.                         float xRand = (jjRandom() % (xOsc*2)) - xOsc;
  88.                         float yRand = (jjRandom() % (yOsc*2)) - yOsc;
  89.                         xPos = xInit+xRand;
  90.                         yPos = yInit+yRand;
  91.                 }
  92.                 if(jjRandom() % 70 > 2) {
  93.                         draw();
  94.                 }
  95.         }
  96. }
  97.  
  98. string text1 = "For 16 years I`ve waited";
  99. string text2 = "They thought I was beaten";
  100.  
  101. int xCenter = (20*32)/2;
  102. int yCenter = (15*32)/2;
  103.  
  104. int warpDuration = 500;
  105.  
  106. array<int> lightning = {40,80,90,100,140,150,200,250};
  107.  
  108. GAME::Camera@ camera;
  109. array<CUSTOM::Object@> scene;
  110. array<Particle@> particles;
  111. SPRITE::Mode mode = SPRITE::NORMAL;
  112. int param = 0;
  113.  
  114. void updateParticles() {
  115.         for(uint i = 0; i < particles.length; i++) {
  116.                 particles[i].behavior();
  117.                 if(!particles[i].exists())
  118.                         particles.removeAt(i--);
  119.         }
  120. }
  121.  
  122. void clearObjects(array<CUSTOM::Object@> objects) {
  123.         for(int i = objects.length()-1; i >= 0; i--) {
  124.                 if(objects[i].isActive) objects[i].delete();
  125.                 objects.removeAt(i);
  126.         }
  127. }
  128.  
  129. void onLevelBegin() {
  130.         if(jjIsServer) jjChat("/allowmouseaim off");
  131.         jjChat("/mouseaim off");
  132.         if(jjGameMode != GAME::COOP && jjGameMode != GAME::SP) {
  133.                 jjChat("/gamemode coop");
  134.                 jjChat("/r");
  135.                 return;
  136.         }
  137.  
  138.         @camera = @GAME::Camera(jjLocalPlayers[0]);
  139.         CUSTOM::UI.drawAmmo = false;
  140.         CUSTOM::UI.drawLives = false;
  141.         CUSTOM::UI.drawScore = false;
  142.         CUSTOM::UI.drawHealth = false;
  143.         CUSTOM::UI.drawPlayerTimer = false;
  144.         jjLocalPlayers[0].xPos = -32;
  145.         jjLocalPlayers[0].yPos = -32;
  146.         jjLocalPlayers[0].xSpeed = -1;
  147.         jjLocalPlayers[0].ySpeed = -1;
  148.         jjLocalPlayers[0].spriteMode = SPRITE::Mode::INVISIBLE;//10;
  149.         dark();
  150. }
  151.  
  152. void onMain() {
  153.         p.ballTime = 1;
  154.         int ticks = jjGameTicks;// + 3000; // + 2119; //+ 1349; //Add ticks for testing
  155.         if(ticks < 280) {
  156.                 //Do Nothing
  157.         } else if(ticks == 280) {
  158.                 jjMusicLoad("scary1.mp3");
  159.                 SpookyString s1(xCenter/2,     yCenter,     text1,STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0);
  160.                 s1.moveLinear(-10*32,yCenter,xCenter/2,yCenter,210);
  161.                 SpookyString s2(xCenter/2-4*32,yCenter,     text1,STRING::LARGE, STRING::NORMAL,SPRITE::NEONGLOW,0);
  162.                 SpookyString s3(xCenter/2,     yCenter+5*32,text1,STRING::SMALL, STRING::NORMAL,SPRITE::NEONGLOW,0);
  163.                 SpookyString s4(xCenter/2,     yCenter-5*32,text1,STRING::SMALL, STRING::NORMAL,SPRITE::NEONGLOW,0);
  164.                 SpookyString s5(xCenter/2,     yCenter,     text1,STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0);
  165.                 scene.insertLast(s1);
  166.                 scene.insertLast(s2);
  167.                 scene.insertLast(s3);
  168.                 scene.insertLast(s4);
  169.                 scene.insertLast(s5);
  170.         } else if(ticks < 490) {
  171.                 //Do Nothing
  172.         } else if(ticks == 490) {
  173.                 jjMusicStop();
  174.                 clearObjects(scene);
  175.         } else if(ticks < 630) {
  176.                 //Do Nothing
  177.         } else if(ticks == 630) {
  178.                 jjMusicPlay();
  179.                 scene.insertLast(SpookyString(xCenter/2,     yCenter,     text2,  STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));
  180.                 scene.insertLast(SpookyString(xCenter/2-4*32,yCenter-5*32,text2,  STRING::LARGE, STRING::NORMAL,SPRITE::NEONGLOW,0));
  181.                 scene.insertLast(SpookyString(xCenter/2,     yCenter,     text2,STRING::SMALL, STRING::NORMAL,SPRITE::NEONGLOW,0));
  182.                 scene.insertLast(SpookyString(xCenter/2,     yCenter-5*32,text2,  STRING::SMALL, STRING::NORMAL,SPRITE::NEONGLOW,0));
  183.                 scene.insertLast(SpookyString(xCenter/2,     yCenter,     text2,  STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));
  184.                 scene.insertLast(SpookyString(xCenter/2-4*32,yCenter+5*32,text2, STRING::LARGE, STRING::NORMAL,SPRITE::NEONGLOW,0));
  185.                 scene.insertLast(SpookyString(xCenter/2-4*32,yCenter+3*32,text2, STRING::MEDIUM, STRING::NORMAL,SPRITE::NEONGLOW,0));
  186.         } else if(ticks > 630 && ticks < 840) {
  187.                 //Do Nothing
  188.         } else if(ticks == 840) {
  189.                 jjMusicStop();
  190.                 clearObjects(scene);
  191.         } else if(ticks < 990) {
  192.                 jjDrawResizedSprite(xCenter/2+32,yCenter,ANIM::DEVILDEVAN,9,5,8,8,SPRITE::NEONGLOW,0);
  193.         } else if(ticks >= 990 && ticks < 1350) {
  194.                 jjMusicPlay();
  195.                 if(ticks == 990)          {scene.insertLast(SpookyString(xCenter/2,      yCenter-5*32, "They", STRING::SMALL, STRING::NORMAL,SPRITE::NEONGLOW,0));}
  196.                 else if(ticks == 1060) scene.insertLast(SpookyString(xCenter/2,  yCenter,      "were", STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));
  197.                 else if(ticks == 1130) scene.insertLast(SpookyString(xCenter/2,  yCenter+5*32, "WRONG",STRING::LARGE, STRING::NORMAL,SPRITE::NEONGLOW,0));
  198.                 else if(ticks > 1200) {
  199.                         for(uint i = 0; i < 2; i++)
  200.                                 scene.insertLast(SpookyString(jjRandom() % 20*32,jjRandom() % 15*32,"WRONG",STRING::LARGE,STRING::NORMAL,SPRITE::NEONGLOW,0));
  201.                 }
  202.         } else if(ticks == 1350) {
  203.                 clearObjects(scene);
  204.                 jjMusicLoad("storm.xm");
  205.         } else if(ticks < 1500) {
  206.                 float frame = 1400 - ticks;
  207.                 float yOff  = frame/80 * 40*32;
  208.                 if(ticks - 1350 > 40) { hell(); }
  209.                 if(yOff > 0)
  210.                         for(uint i = 0; i < 40; i++)
  211.                                 particles.insertLast(Particle(i*16,yOff-6*32-5,0,-3.1,28));
  212.                 jjDrawResizedSprite(xCenter/2+32,int(yOff),ANIM::DEVILDEVAN,9,5,10,10,SPRITE::NORMAL,0,1);
  213.         } else if(ticks == 1500) {
  214.                 //p.cameraFreeze(xCenter,yCenter,true,true);
  215.                 camera.moveLinear(xCenter,yCenter,xCenter,yCenter+85*32,650);
  216.         } else if(ticks < 2150) {
  217.                 //Do Nothing
  218.         } else if(ticks == 2150) {
  219.                 dark(false);
  220.                 p.cameraFreeze(0,0,false,true);
  221.                 jjMusicLoad("scary1.mp3");
  222.         } else if(ticks < 2870) {
  223.                 if(ticks == 2190)          {scene.insertLast(SpookyString(xCenter/2,      yCenter-5*32,   "Did",    STRING::SMALL, STRING::NORMAL,SPRITE::NEONGLOW,0));}
  224.                 else if(ticks == 2250) {scene.insertLast(SpookyString(xCenter/2-3*32,yCenter,        "they",   STRING::SMALL,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  225.                 else if(ticks == 2300) {scene.insertLast(SpookyString(xCenter/2,          yCenter+5*32,   "really", STRING::SMALL,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  226.                 else if(ticks == 2350) {scene.insertLast(SpookyString(xCenter/2+8*32,yCenter,        "THINK",  STRING::SMALL,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  227.                 else if(ticks == 2400) {scene.insertLast(SpookyString(xCenter/2+1*32,yCenter+3*32,   "it",     STRING::SMALL,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  228.                 else if(ticks == 2450) {scene.insertLast(SpookyString(xCenter/2+8*32,yCenter+4*32,   "would",  STRING::SMALL,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  229.                 else if(ticks == 2500) {scene.insertLast(SpookyString(xCenter/2+4*32,yCenter+5*32,   "BE",     STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  230.                 else if(ticks == 2650) {scene.insertLast(SpookyString(xCenter/2+5*32,yCenter-4*32,   "SO",     STRING::LARGE,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  231.                 else if(ticks > 2800 && ticks % 4 == 0) {scene.insertLast(SpookyString(xCenter/2,     yCenter,        "EASY",   STRING::LARGE,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  232.         } else if(ticks == 2870) {
  233.                 clearObjects(scene);
  234.         } else if(ticks < 3300) {
  235.                 if(ticks == 3000)          {scene.insertLast(SpookyString(xCenter/2,     yCenter+5*32, "I",              STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  236.                 else if(ticks == 3050) {scene.insertLast(SpookyString(xCenter/2+4*32,yCenter+3*32, "had",                STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  237.                 else if(ticks == 3100) {scene.insertLast(SpookyString(xCenter/2+4*32,yCenter,      "a",                          STRING::MEDIUM,STRING::NORMAL,SPRITE::NEONGLOW,0));}
  238.                 else if(ticks > 3200 && ticks % 4 == 0) {scene.insertLast(SpookyString(xCenter/2-3*32,yCenter-2*32, "TIME MACHINE",  STRING::LARGE, STRING::BOUNCE,SPRITE::NEONGLOW,0));}
  239.         } else if(ticks == 3300) {
  240.                 clearObjects(scene);
  241.                 warp();
  242.                 CUSTOM::Palette().shiftHueLinear(jjBackupPalette,0,255,500,88,255,true);
  243.                 jjMusicStop();
  244.         } else if(ticks < 3300+warpDuration) {
  245.                 int frame = warpDuration-ticks+3300;
  246.                 int radius = 32*15*frame/warpDuration;
  247.                 float angle = 3*2*PI*frame/warpDuration;
  248.                 int xPos = int(radius*sin(angle)+(20*32)/2);
  249.                 int yPos = int(radius*cos(angle)+(15*32)/2);
  250.                 float size = 8*float(frame)/warpDuration;
  251.                
  252.                 if(lightning.find(frame) > 0) { mode = SPRITE::SINGLECOLOR; param = 255; }
  253.                 else if(lightning.find(frame+5) > 0) { mode = SPRITE::NORMAL; param = 0; }
  254.                
  255.                 jjDrawResizedSprite(xPos,yPos,ANIM::DEVAN,4,jjGameTicks/7,size,size,mode,param);
  256.         } else if(ticks == 3300+warpDuration) {
  257.                 GAME::String(2*32,-5*32,"DEVAN`S   REVENGE",STRING::LARGE).moveLinear(2*32,7*32,210);
  258.         } else if(ticks == 3300+warpDuration+210+140) {
  259.                 jjNxt("saldr2",false,true);
  260.         }
  261.        
  262.         updateParticles();
  263.         if(ticks > 3300) {
  264.                 jjTexturedBGFadePositionX = ((jjSin(jjGameTicks << 1) / 2)*0.2 + .5);
  265.                 jjTexturedBGFadePositionY = ((jjCos(jjGameTicks << 1) / 2)*0.2 + .5);
  266.         }
  267. }