Downloads containing mo4a_3-3.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Mystery of the Four... chandie Single player 6.6 Download file

File preview

  1. const bool MLLESetupSuccessful = MLLE::Setup(array<MLLEWeaponApply@> = {null, null, DefaultWeapons::Blaster(), DefaultWeapons::Blaster(), WeaponVMega::Backfire::Weapon(), null, ArcaneWeapons::FusionCannon::Weapon(), null, ArcaneWeapons::MortarLauncher::Weapon()}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "mo4a_3-3-MLLE-Data-1.j2l" ///@MLLE-Generated
  4. #pragma require "Damn2.j2t" ///@MLLE-Generated
  5. #pragma require "mo4a_3-3.j2l" ///@MLLE-Generated
  6. #include "ArcaneWeapon4.asc" ///@MLLE-Generated
  7. #pragma require "ArcaneWeapon4.asc" ///@MLLE-Generated
  8. #include "ArcaneWeapon9.asc" ///@MLLE-Generated
  9. #pragma require "ArcaneWeapon9.asc" ///@MLLE-Generated
  10. #include "WeaponVMega5.asc" ///@MLLE-Generated
  11. #pragma require "WeaponVMega5.asc" ///@MLLE-Generated
  12. #include "MLLE-DefaultWeapons.asc" ///@MLLE-Generated
  13. #pragma require "MLLE-DefaultWeapons.asc" ///@MLLE-Generated
  14. #include "Jazz1Enemies v05.asc"
  15. #include "Resize v11.asc"
  16. #include "TrueColor v13.asc"
  17. #include "HH18savegems.asc"
  18. #pragma require "mo4a_3.pal"
  19. int SpeedUpUntil = 0;
  20. bool passobtained = false;
  21.  
  22. bool onDrawHealth(jjPLAYER@ player, jjCANVAS@ canvas) {
  23.         if(passobtained == true && jjTriggers[3] == true)
  24.     {canvas.drawSprite(20, 585, ANIM::PICKUPS, 42, jjGameTicks>>2, 1, SPRITE::NORMAL);}
  25.     return false;
  26. }
  27.  
  28. bool onDrawLives(jjPLAYER@ player, jjCANVAS@ canvas) {return true;}
  29.  
  30. void onLevelLoad() {
  31.         jjIsSnowing = true;
  32.         jjSnowingType = SNOWING::RAIN;
  33.         jjSnowingIntensity = 22;
  34.         jjIsSnowingOutdoorsOnly = true;
  35. jjPIXELMAP rain(32,32);
  36.   for (uint x = 0; x < rain.width; ++x) {
  37.     for (uint y = 0; y < rain.height; ++y) {
  38.       if (x == 16) { //draw in the middle of the tile, xPixel 16
  39.         if (y <= 24) rain[x,y] = 75; //if at yPixel 24 or less, use color 75
  40.         else rain[x,y] = 74; //use color 74 for yPixels 25-32
  41.       } else {
  42.         rain[x,y] = 0;
  43.       }
  44.     }
  45.   }
  46.  
  47.   jjANIMATION@ anim = jjAnimations[jjAnimSets[ANIM::COMMON].firstAnim + 2];
  48.   for (uint frameID = 0; frameID < anim.frameCount; ++frameID) {
  49.     jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame + frameID];
  50.     rain.save(frame);
  51.     frame.hotSpotX = -frame.width/2;
  52.     frame.hotSpotY = -frame.height;
  53.   }
  54.  
  55.         jjWaterLighting = WATERLIGHT::GLOBAL;
  56.         jjSetWaterLevel(45*32, true);
  57.         jjLevelName = ("@@@@@@@@@Poseidon Island");
  58.         gem::restorePlayerGems();
  59.  
  60.         jjObjectPresets[OBJECT::SAVEPOST].behavior = CheckpointWrapper;
  61.         jjObjectPresets[OBJECT::SAVEPOST].deactivates = false;
  62.  
  63.         Jazz1::MakeEnemy(OBJECT::HATTER, Jazz1::Enemies::Megairbase_Doofusguard).SetUsesJJ2StyleDeathAnimation(true).SetBulletFireSound(SOUND::INTRO_SHOTGRN).SetBulletExplosionSound(SOUND::COMMON_GUNSM1);
  64.         Jazz1::MakeEnemy(OBJECT::DRAGONFLY, Jazz1::Enemies::Marbelara_Drageen).SetUsesJJ2StyleDeathAnimation(true);
  65.         Jazz1::MakeEnemy(OBJECT::FLOATSUCKER, Jazz1::Enemies::Marbelara_Firebomb).SetUsesJJ2StyleDeathAnimation(true);
  66.         Jazz1::MakeEnemy(OBJECT::NORMTURTLE, Jazz1::Enemies::Dreempipes_TerrapinSwimmer).SetUsesJJ2StyleDeathAnimation(true);
  67.  
  68.         jjObjectPresets[OBJECT::FRUITPLATFORM].scriptedCollisions = true;
  69.         jjObjectPresets[OBJECT::FRUITPLATFORM].behavior = Wheel();
  70.  
  71.         jjObjectPresets[OBJECT::BOLLPLATFORM].scriptedCollisions = true;
  72.         jjObjectPresets[OBJECT::PINKPLATFORM].behavior = Lava;
  73.         jjObjectPresets[OBJECT::PINKPLATFORM].playerHandling = HANDLING::SPECIAL;
  74.         jjObjectPresets[OBJECT::PINKPLATFORM].bulletHandling = HANDLING::IGNOREBULLET;
  75.         jjObjectPresets[OBJECT::PINKPLATFORM].deactivates = false;
  76.  
  77.         //jjObjectPresets[OBJECT::GRASSPLATFORM].xSpeed = 5;
  78.         jjObjectPresets[OBJECT::GRASSPLATFORM].scriptedCollisions = true;
  79.         jjObjectPresets[OBJECT::GRASSPLATFORM].behavior = PlatformH;
  80.  
  81.         jjObjectPresets[OBJECT::BIGBOX].behavior = Computer();
  82.         jjObjectPresets[OBJECT::BIGBOX].scriptedCollisions = true;
  83.  
  84.         jjObjectPresets[OBJECT::AIRBOARD].behavior = Key();
  85.         jjObjectPresets[OBJECT::AIRBOARD].scriptedCollisions = true;
  86.  
  87.         jjObjectPresets[OBJECT::TRIGGERCRATE].behavior = Junk();
  88.         jjObjectPresets[OBJECT::TRIGGERCRATE].scriptedCollisions = true;
  89.  
  90.         jjObjectPresets[OBJECT::FREEZEENEMIES].behavior = Pass();
  91.         jjObjectPresets[OBJECT::FREEZEENEMIES].scriptedCollisions = true;
  92.  
  93.         jjObjectPresets[OBJECT::SMALLTREE].determineCurAnim(ANIM::BIGTREE,0);
  94.  
  95.         jjObjectPresets[OBJECT::SILVERCOIN].behavior = PlatinCoin();
  96.         jjObjectPresets[OBJECT::SILVERCOIN].scriptedCollisions = true;
  97.  
  98.         jjObjectPresets[OBJECT::SONICPLATFORM].scriptedCollisions = true;
  99.         jjObjectPresets[OBJECT::SONICPLATFORM].behavior = SpikeBump();
  100.         jjObjectPresets[OBJECT::SONICPLATFORM].deactivates = false;
  101.        
  102.         jjObjectPresets[OBJECT::STOPWATCH].behavior = Fastrun();
  103.         jjObjectPresets[OBJECT::STOPWATCH].scriptedCollisions = true;
  104.  
  105.         jjObjectPresets[OBJECT::ROBOT].behavior = Robot();
  106.         jjObjectPresets[OBJECT::ROBOT].playerHandling = HANDLING::SPECIAL;
  107.         jjObjectPresets[OBJECT::ROBOT].scriptedCollisions = true;
  108.  
  109.         jjObjectPresets[OBJECT::CHICKENLEG].behavior = AntiCarrot();
  110.         jjObjectPresets[OBJECT::CHICKENLEG].scriptedCollisions = true;
  111.         jjObjectPresets[OBJECT::CHICKENLEG].determineCurAnim(ANIM::PICKUPS,82);
  112.  
  113.         jjObjectPresets[OBJECT::LIZARD].scriptedCollisions = true;
  114.         jjObjectPresets[OBJECT::LIZARD].determineCurAnim(ANIM::ROBOT,4);
  115.         jjObjectPresets[OBJECT::LIZARD].behavior = Robot2();
  116.  
  117.  
  118.  
  119. }
  120.  
  121. class Junk : jjBEHAVIORINTERFACE {
  122.  
  123.         void onBehave(jjOBJ@ obj) {
  124.                 obj.behave(BEHAVIOR::MONITOR, false);
  125.                 ++obj.counter;
  126.                 obj.playerHandling = HANDLING::SPECIAL;
  127.  
  128.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::INVISIBLE);
  129. }
  130.  
  131.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  132.                 if(bullet !is null && bullet.var[3] == WEAPON::GUN8)
  133.                 {jjTriggers[15] = true;
  134.                 obj.delete();}
  135.  
  136.  
  137.                 return true;
  138.         }
  139.  
  140. }
  141.  
  142.  
  143. class PlatinCoin : jjBEHAVIORINTERFACE {
  144.  
  145.         void onBehave(jjOBJ@ obj) {
  146.                 if(p.coins >=3)
  147.                         {obj.delete();}
  148.                 obj.behave(BEHAVIOR::PICKUP, false);
  149.                 ++obj.counter;
  150.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  151.                 if(itsraining == true)
  152.                 {jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -8);}
  153.                 else jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::TRANSLUCENTPALSHIFT, -8);
  154. }
  155.  
  156.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  157.                 if(itsraining == true)
  158.                 {p.coins += 1;
  159.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  160.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_COIN, 1000);}
  161.  
  162.  
  163.                 return true;
  164.         }
  165. }
  166.  
  167. class AntiCarrot: jjBEHAVIORINTERFACE {
  168.  
  169.         void onBehave(jjOBJ@ obj) {
  170.                 obj.determineCurFrame();
  171.                 obj.behave(BEHAVIOR::PICKUP, false);
  172.                 ++obj.counter;
  173.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  174.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);
  175.         }
  176.  
  177.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ p, int force) {
  178.                 p.health = 1;
  179.                 p.blink = 245; 
  180.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_EAT1, 1000);
  181.                 obj.frameID = 0;
  182.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  183.  
  184.                 return true;
  185.         }
  186. }
  187.  
  188. void onFunction0(jjPLAYER@ p) {
  189. if(lavarise==false)
  190. {p.showText("@@Hey! That must be the Library Pass@the girl has lost!");
  191. jjEnabledASFunctions[0] = false;}
  192. }
  193.  
  194. void onFunction1(jjPLAYER@ p) {
  195.         p.showText("@@@@@@@@@@@@@@@@@@@@@@@@@Mt. Poseidon", STRING::MEDIUM);
  196.         jjLayerOrderSet(array<jjLAYER@> = {jjLayers[1], jjLayers[2], jjLayers[3], jjLayers[4], jjLayers[5], jjLayers[7], jjLayers[8], jjLayers[6]});
  197.         jjEnabledASFunctions[1] = false;}
  198.  
  199. void onFunction2(jjPLAYER@ p) {
  200.         jjMusicLoad("mo4a_Doc's Cave.ogg");
  201.         p.showText("@@|||||||Intruder Alert on Facilty 3!@Destroy the target!");
  202.                 p.activateBoss();
  203.  
  204. }
  205.  
  206. void onFunction3(jjPLAYER@ p) {
  207.         jjMusicLoad("lwe_a7.mod");
  208.         p.bossActivated = false;
  209.  
  210. }
  211.  
  212. void onFunction4(jjPLAYER@ p) {
  213.         if(p.yPos >43*32)
  214.                 {p.lighting = 50;}
  215.         if(itsraining == false) {
  216.         jjSetWaterLevel(66*32, true);
  217.         jjPAL firePal;
  218.         firePal.load("mo4a_3.pal");
  219.         firePal.apply();}
  220. }
  221.  
  222. bool comptext = false, junktext = false;
  223. void onFunction5(jjPLAYER@ p) {
  224.         if(comptext == false) {
  225.         p.showText("@I can move the computer to plug it.");
  226.         comptext = true;
  227.         }
  228.  
  229. }
  230. void onFunction6(jjPLAYER@ p) {
  231.         if(junktext == false && jjTriggers[15] == false) {
  232.         p.showText("@@My weapons won't be able to@clear the path.");
  233.         junktext = true;
  234.         }
  235.  
  236. }
  237.  
  238. void onFunction7(jjPLAYER@ p)
  239.         {p.health = 0;}
  240.  
  241. void onFunction8(jjPLAYER@ p)  {
  242.         if(itsraining == false)
  243.         {p.cameraFreeze(190*32, 10*32, true, false);
  244.         jjEnabledASFunctions[8] = false;}
  245.         }
  246.  
  247. int spring = 0;
  248. bool spike = false;
  249. class SpikeBump : jjBEHAVIORINTERFACE {
  250.  
  251. void onBehave(jjOBJ@ obj) {
  252.  
  253.         switch (obj.state) {
  254.                 case STATE::START:
  255.                         obj.determineCurFrame();
  256.                         obj.state = STATE::FLY;
  257.  
  258.                 case STATE::FLY:
  259.                         obj.playerHandling = HANDLING::SPECIAL;
  260.                         obj.deactivates = false;
  261.                         if (jjMaskedVLine(obj.xSpeed > 0 ? obj.xPos + 16 : obj.xPos - 16, obj.yPos, 1)) {
  262.                                 obj.direction = obj.xSpeed = -obj.xSpeed;
  263.                         }
  264.                        
  265.                         if(obj.xPos > p.xPos + 64 || obj.xPos < p.xPos - 64 || obj.yPos > p.yPos + 64 || obj.yPos < p.yPos - 64)
  266.                         {obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  267.                         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -8);
  268.                         obj.determineCurFrame();}
  269.                         else {jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);}
  270.                         break;
  271.  
  272.                
  273.         }
  274. }
  275.  
  276.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  277.                 if(bullet is null && play !is null && (force == -1 || force == 1))
  278.                         {spring = jjGameTicks + 1*61;
  279.                         obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  280.                         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);
  281.                         obj.determineCurFrame();
  282.                         p.buttstomp = 121;
  283.                         jjSample(obj.xPos, obj.yPos, SOUND::PINBALL_BELL, 1000);}
  284.                 if(force == 0 && spring < jjGameTicks)
  285.                         {play.hurt();
  286.                         obj.determineCurAnim(ANIM::SPIKEBOLL, 0);  
  287.                         obj.determineCurFrame();
  288.                         if(spike == false)
  289.                         {jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 1000);}
  290.                         spike = true;}
  291.                 return true;
  292.                 }
  293.  
  294. }
  295.  
  296. void PlatformH (jjOBJ@ obj) {
  297.  
  298.         switch (obj.state) {
  299.                 case STATE::START:
  300.                         obj.direction = obj.xSpeed = -2;
  301.                         obj.playerHandling = HANDLING::SPECIAL;
  302.                         obj.state = STATE::FLY;
  303.                         obj.beSolid();
  304.                 case STATE::FLY:
  305.                         if(lavarise==true)
  306.                         {obj.xPos = obj.xPos + obj.xSpeed;}
  307.                         obj.beSolid();
  308.                         obj.deactivates = false;
  309.                         if (jjMaskedVLine(obj.xSpeed > 0 ? obj.xPos + 16 : obj.xPos - 16, obj.yPos, 1)) {
  310.                                 obj.direction = obj.xSpeed = -obj.xSpeed;
  311.                         }
  312.                         obj.determineCurAnim(ANIM::GRASSPLAT, 0);  
  313.                         obj.determineCurFrame();
  314.                         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 32);       
  315.                         break;
  316.         }
  317. }
  318.  
  319. class Wheel : jjBEHAVIORINTERFACE {
  320.         void onBehave(jjOBJ@ obj){
  321.  
  322.         obj.playerHandling = HANDLING::SPECIAL;
  323.                 obj.energy = 2;
  324.                 if(obj.energy == 0)
  325.                 {obj.energy += 1;}
  326.                 jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FRUITPLATFORM].curAnim];
  327.                 anim.frameCount = 1;
  328.                 jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  329.                 jjPIXELMAP lamp(0, 31*32, 2*32, 2*32, 5);
  330.                 lamp.save(frame);
  331.                 frame.hotSpotX = -32;
  332.                 obj.behave(BEHAVIOR::BUMP, false);
  333.         if(obj.justHit == 0)
  334.         {jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::BRIGHTNESS, 180);}
  335.         else    obj.draw();
  336.         }
  337.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  338.                 obj.bulletHandling = HANDLING::HURTBYBULLET;
  339.                 if(play !is null && bullet !is null && lavarise == true && jjTriggers[1] == false)
  340.                         {itsraining = true;
  341.                         jjPAL resPal;
  342.                         resPal.load("Atlantis Island-lite.j2t");
  343.                         resPal.apply();
  344.                         p.showText("@@Yay! Lava's under control.@I'll survive.");
  345.                         jjSample(p.xPos, p.yPos, SOUND::ROBOT_HYDROPUF);
  346.                         jjTriggers[1] = true;}
  347.                 if(passobtained == false && bullet.xPos > obj.xPos)
  348.                         {bullet.delete();
  349.                         p.showText("@@That wheel might release some water.@No point in doing that right now.");}
  350.                 return true;
  351.         }
  352. }
  353.  
  354. void Lava (jjOBJ@ obj) {
  355. jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::PINKPLATFORM].curAnim];
  356.         anim.frameCount = 1;
  357.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  358.         jjPIXELMAP lava(0, 45*32, 70*32, 11*32, 5);
  359.         lava.save(frame);
  360.         frame.hotSpotX = -60;
  361.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  362.                         if(p.yPos>obj.yPos-22 && p.xPos > 134*32 && itsraining == false)
  363.                                 {p.health = 0;}
  364. if(itsraining == true && lavarise == true && p.xPos < 130*32 && p.yPos > 28*32)
  365. {obj.delete();
  366. obj.behave(BEHAVIOR::EXPLOSION2);}
  367. if(itsraining == true && lavarise == true)
  368.                 {obj.state = STATE::FREEZE;
  369.                 obj.beSolid();
  370.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::SINGLEHUE, 59);}
  371. switch (obj.state) {
  372.                 case STATE::START:
  373.                         obj.state = STATE::FLY;
  374.  
  375.                 case STATE::FLY:
  376.                 ++obj.counter;
  377.                 obj.xPos = jjSin(obj.counter*4)*4 + obj.xOrg;
  378.                 if(lavarise == true && p.xPos >134*32)
  379.                        
  380.                         {obj.direction = obj.ySpeed = -0.2;
  381.                         obj.yPos = obj.yPos + obj.ySpeed;
  382.                         }
  383.                 obj.deactivates = false;
  384.                         if(p.xPos <  116*32)
  385.                         obj.deactivate();
  386.                
  387.  
  388.                         break;
  389.  
  390.         }
  391.  
  392. }
  393.  
  394.  
  395. void onMain() {
  396.  
  397. gem::deleteCollectedGems();
  398. if(jjKey[9] && jjKey[0x51]) {
  399. p.morphTo(CHAR::JAZZ, false);
  400. }
  401. if(jjKey[9] && jjKey[0x57]) {
  402. p.morphTo(CHAR::SPAZ, false);
  403. }
  404. if(jjKey[9] && jjKey[0x45]) {
  405. p.morphTo(CHAR::LORI, false);
  406. }
  407.  
  408.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::PEACH].curAnim];
  409.         anim.frameCount = 1;
  410.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  411.         jjPIXELMAP fruit(0, 30*32, 1*32, 1*32, 5);
  412.         fruit.save(frame);
  413.         frame.hotSpotX = -frame.width / 2;
  414. }
  415.  
  416. class Computer : jjBEHAVIORINTERFACE {
  417.         void onBehave(jjOBJ@ obj) {
  418.  
  419.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BIGBOX].curAnim];
  420.         anim.frameCount = 1;
  421.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  422.         jjPIXELMAP comp(0, 33*32, 3*32, 2*32, 5);
  423.         comp.save(frame);
  424.         frame.hotSpotX = -42;
  425.  
  426.         if(obj.xPos<78*32)
  427.         {jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BIGBOX].curAnim];
  428.         anim.frameCount = 1;
  429.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  430.         jjPIXELMAP comp(0, 23*32, 3*32, 2*32, 5);
  431.         comp.save(frame);
  432.         frame.hotSpotX = -32;
  433.         p.showText("@@@@@@@@@@@@@@@@@@@Robot control unit.@Hit 'A' and 'D' to walk.@Hit '0' to fire.");
  434.         obj.yPos = obj.yPos + 120;
  435.         electric = true;
  436.         jjTriggers[6]=true;
  437.         jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2, 1000);
  438.         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_ITEMTRE, 1000);}
  439.                         obj.behave(BEHAVIOR::BIGOBJECT);}
  440.  
  441. }
  442.  
  443. bool electric = false;
  444. class Robot : jjBEHAVIORINTERFACE {
  445.         void onBehave(jjOBJ@ obj) {
  446.                 if(obj.energy <= 0) {
  447.                         obj.state = STATE::KILL;
  448.                         p.boss = -1;
  449.                         jjTriggers[2] = true;
  450.                         jjAddObject(OBJECT::LIZARD, obj.xPos, obj.yPos);
  451.                         robotdefeated = true;
  452.                         obj.behave(BEHAVIOR::EXPLOSION2);
  453.                         obj.scriptedCollisions = true;
  454.                         p.activateBoss(false);
  455.                 }
  456.        
  457.                 else obj.behave(BEHAVIOR::ROBOT, false);
  458.                 if(obj.justHit == 0)   
  459.                 {jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -8);}
  460.                 else obj.draw();
  461.         }
  462.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  463.                 if(play !is null && bullet !is null)
  464.                 obj.bulletHandling = HANDLING::DETECTBULLET;
  465.                 obj.causesRicochet = true;
  466.                 if(play !is null && force == 0)
  467.                 play.hurt();
  468.                 if(play !is null && (force == -1 || force == 1))
  469.                 obj.playerHandling = HANDLING::ENEMY;
  470.                 return true;
  471.         }
  472.  
  473. }
  474.  
  475. class Robot2 : jjBEHAVIORINTERFACE {
  476.         void onBehave(jjOBJ@ obj) {
  477.         if(electric == true)
  478.         {p.cameraFreeze(obj.xPos, obj.yPos, true, true);}
  479.                 if((jjKey[0x30] || jjKey[0x60]) && electric==true && obj.xPos > 75*32 && obj.xPos < 88*32 && obj.yPos >59*32)
  480.                         {obj.determineCurAnim(ANIM::ROBOT,2);
  481.                                 jjOBJ@ o = jjObjects[obj.fireBullet(OBJECT::FIREBALLBULLET)];
  482.                                         o.behavior = BEHAVIOR::BULLET;
  483.                                         o.determineCurAnim(ANIM::ROBOT, 0);
  484.                                         o.killAnim = jjObjectPresets[OBJECT::BOUNCERBULLET].killAnim;
  485.                                         o.playerHandling = HANDLING::PLAYERBULLET;
  486.                                         o.bulletHandling = HANDLING::HURTBYBULLET;
  487.                                         o.lightType = LIGHT::POINT;
  488.                                         o.xPos = obj.xPos + 26*obj.direction;
  489.                                         o.xAcc = .2;
  490.                                         int xs = (jjRandom() & 49);
  491.                                         o.xSpeed = 0.2;
  492.                                         int ys = (jjRandom() & 46);
  493.                                         o.ySpeed = ys - 3;}
  494.  
  495.                 if(jjKey[0x44] && electric==true && obj.xPos < 88*32 && obj.yPos >59*32)
  496.                         {obj.xPos = obj.xPos + 10;
  497.                         obj.determineCurAnim(ANIM::ROBOT,15);
  498.                         obj.direction = 1;}
  499.                 if(jjKey[0x41] && electric==true && obj.xPos > 77*32 && obj.yPos >59*32)
  500.                         {obj.xPos = obj.xPos - 10;
  501.                         obj.determineCurAnim(ANIM::ROBOT,15);
  502.                         obj.direction = -1;}
  503.  
  504.                 if(jjTriggers[15] == true && electric == true)
  505.                         {jjPARTICLE@ particle = jjAddParticle(PARTICLE::SMOKE);
  506.                         particle.xPos = 91*32;
  507.                         particle.yPos = 59*32;
  508.                         jjTriggers[15]=true;
  509.                         electric = false;
  510.                         p.showText("@Mission accomplished!");
  511.                         jjSample(p.xPos, p.yPos, SOUND::INTRO_BOEM2);}
  512.  
  513.  
  514.  
  515.         else obj.behave(BEHAVIOR::ROBOT, true);
  516.         obj.determineCurAnim(ANIM::ROBOT,4);
  517.  
  518.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -8);
  519.         obj.playerHandling = HANDLING::PLAYERBULLET;
  520.         }
  521. }
  522.  
  523. class Key : jjBEHAVIORINTERFACE {
  524.  
  525.         void onBehave(jjOBJ@ obj) {
  526.                 obj.behave(BEHAVIOR::PICKUP, false);
  527.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::AIRBOARD].curAnim];
  528.         anim.frameCount = 1;
  529.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  530.                 jjPIXELMAP pump(0, 43*32, 1*32, 1*32, 5);
  531.         pump.save(frame);
  532.                 ++obj.counter;
  533.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  534.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  535. }
  536.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  537.                 jjTriggers[15] = true;
  538.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  539.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  540.  
  541.                 return true;
  542.         }
  543. }
  544.  
  545. bool itsraining = false;
  546. bool lavarise= false;
  547. class Pass : jjBEHAVIORINTERFACE {
  548.  
  549.         void onBehave(jjOBJ@ obj) {
  550.                 obj.behave(BEHAVIOR::PICKUP, false);
  551.                 if(passobtained == true)
  552.                         {obj.delete();}
  553.  
  554. jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FREEZEENEMIES].curAnim];
  555.         anim.frameCount = 1;
  556.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  557.         jjPIXELMAP pump(0, 44*32, 1*32, 1*32, 5);
  558.         pump.save(frame);
  559.                 ++obj.counter;
  560.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  561.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  562. }
  563.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  564.                 lavarise=true;
  565.                 //jjTriggers[3] = true;
  566.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  567.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  568.                 passobtained = true;
  569.                 return true;
  570.         }
  571. }
  572. class Fastrun : jjBEHAVIORINTERFACE {
  573.         void onBehave(jjOBJ@ obj) {
  574.  
  575. obj.behave(BEHAVIOR::PICKUP, false);
  576. obj.determineCurAnim(ANIM::PICKUPS, 33);
  577. ++obj.counter;
  578.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  579.  
  580.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);
  581.  
  582. }
  583.  
  584.         bool onObjectHit(jjOBJ@ obj, jjOBJ@, jjPLAYER@ play, int force) {
  585.         play.timerStart(800);
  586.                 SpeedUpUntil = jjGameTicks + 13 * 61;
  587.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  588.                 obj.frameID = 0;
  589.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PICKUP1, 6000);
  590.  
  591.                 return true;
  592.         }
  593.  
  594. }
  595.  
  596. bool startrush = false, readytorush = false, robotdefeated = false;
  597.  
  598. void onPlayer(jjPLAYER@ play) {
  599.  
  600.   for (int i = 0; i < 1024; i++) { //loop through the global array jjParticles[1024]
  601.     jjPARTICLE@ particle = jjParticles[i];
  602.     if (particle.type == PARTICLE::RAIN) {
  603.       particle.xSpeed = 0; //make rain fall straight down
  604.       particle.ySpeed = play.ySpeed < 0? 10 : int(10 + play.ySpeed); //the rain speed accounts for differences in the player speed, and so won't appear to fall more slowly when the player is falling
  605.     }
  606.   }
  607.  
  608. if (p.idle > 5 && p.xPos >180*32 && (p.keyLeft || p.keyRight || p.keyJump || p.keyFire))
  609.                 {spike = false;}
  610.  
  611. for (int i = 0; i < 1024; i++) { //loop through the global array jjParticles[1024]
  612.     jjPARTICLE@ particle = jjParticles[i];
  613.     if (particle.type == PARTICLE::RAIN) {
  614.       particle.xSpeed = 0; //make rain fall straight down
  615.       particle.ySpeed = play.ySpeed < 0? 10 : int(10 + play.ySpeed); //the rain speed accounts for differences in the player speed, and so won't appear to fall more slowly when the player is falling
  616.     }
  617.   }
  618.         if(electric==true)
  619.         {p.keyRight = false;
  620.         p.keyLeft = false;
  621.         p.keyDown = false;
  622.         p.keyUp = false;
  623.         p.keyJump = false;}
  624.  
  625.         if(electric==false && p.yPos > 15*32)
  626.         {p.cameraUnfreeze();}
  627.  
  628.         for (int i = 1; i < jjObjectCount; i++) {
  629.                 jjOBJ@ o = jjObjects[i];
  630.                 if (jjTriggers[15] == true && o.eventID == OBJECT::ROBOT) {
  631.                         o.delete();
  632.                 }
  633.         }
  634.  
  635.         for (int i = 1; i < jjObjectCount; i++) {
  636.                 jjOBJ@ obb = jjObjects[i];
  637.                 if (jjTriggers[15] == true && obb.eventID == OBJECT::DEVANROBOT) {
  638.                         obb.delete();
  639.                 }
  640.         }
  641.  
  642.         for (int i = 1; i < jjObjectCount; i++) {
  643.                 jjOBJ@ obb = jjObjects[i];
  644.                 if (jjTriggers[15] == true && obb.isActive && obb.eventID == OBJECT::DEVANROBOT) {
  645.                         obb.delete();
  646.                 }
  647.         }
  648.  
  649.         if(p.food == 100 && jjKey[0x52] == false && startrush == false)
  650.                 {p.showText("@@@@@@@@@@@@@@@@Press 'R' when you need to use Sugar Rush!", STRING::MEDIUM);
  651.                 p.startSugarRush(0);
  652.                 startrush = true;
  653.                 readytorush = true;}
  654.  
  655.         if(readytorush == true)
  656.                 {p.food = 100;}
  657.  
  658.         if(p.food == 100 && jjKey[0x52])
  659.                 {p.startSugarRush(1400);
  660.                 p.food = 0;
  661.                 readytorush = false;
  662.                 startrush = false;
  663.         }
  664.  
  665.  
  666.         gem::trackPlayerGems(p);
  667.         gem::upgradeHealth(p);
  668.         if(p.xPos > 136*32 && itsraining == false)
  669.         {jjMusicLoad("mo4a_Umber's Sacrifice.ogg");}
  670.  
  671.         if(itsraining == true)
  672.         {jjMusicLoad("mo4a_Riding the Shell.ogg");}
  673.  
  674.         for (int i = 1; i < jjObjectCount; i++) {
  675.                 jjOBJ@ o = jjObjects[i];
  676.                 if (o.isActive && o.eventID == OBJECT::SEEKERAMMO3 && p.ammo[WEAPON::SEEKER] < 1) {
  677.                         o.state = STATE::KILL;}
  678.         }
  679.         for (int i = 1; i < jjObjectCount; i++) {
  680.                 jjOBJ@ o = jjObjects[i];
  681.                 if (o.isActive && o.eventID == OBJECT::RFAMMO3 && p.ammo[WEAPON::RF] < 1) {
  682.                         o.state = STATE::KILL;}
  683.         }
  684.         for (int i = 1; i < jjObjectCount; i++) {
  685.                 jjOBJ@ o = jjObjects[i];
  686.                 if (o.isActive && o.eventID == OBJECT::TNTAMMO3 && p.ammo[WEAPON::TNT] < 1) {
  687.                         o.state = STATE::KILL;}
  688.         }
  689.         for (int i = 1; i < jjObjectCount; i++) {
  690.                 jjOBJ@ o = jjObjects[i];
  691.                 if (o.isActive && o.eventID == OBJECT::GUN9AMMO3 && p.ammo[WEAPON::GUN9] < 1) {
  692.                         o.state = STATE::KILL;}
  693.         }
  694.         for (int i = 1; i < jjObjectCount; i++) {
  695.                 jjOBJ@ o = jjObjects[i];
  696.                 if (o.isActive && o.eventID == OBJECT::SEEKERPOWERUP && p.ammo[WEAPON::SEEKER] < 1) {
  697.                         o.state = STATE::KILL;}
  698.         }
  699.         for (int i = 1; i < jjObjectCount; i++) {
  700.                 jjOBJ@ o = jjObjects[i];
  701.                 if (o.isActive && o.eventID == OBJECT::RFPOWERUP && p.ammo[WEAPON::RF] < 1) {
  702.                         o.state = STATE::KILL;}
  703.         }
  704.         for (int i = 1; i < jjObjectCount; i++) {
  705.                 jjOBJ@ o = jjObjects[i];
  706.                 if (o.isActive && o.eventID == OBJECT::TNTPOWERUP && p.ammo[WEAPON::TNT] < 1) {
  707.                         o.state = STATE::KILL;}
  708.         }
  709.         for (int i = 1; i < jjObjectCount; i++) {
  710.                 jjOBJ@ o = jjObjects[i];
  711.                 if (o.isActive && o.eventID == OBJECT::GUN9POWERUP && p.ammo[WEAPON::GUN9] < 1) {
  712.                         o.state = STATE::KILL;}
  713.         }
  714.  
  715.         if(p.coins == 0)
  716.                 {p.coins +=2;}
  717.         if(spring > jjGameTicks)
  718.                 {p.ySpeed = -10;}
  719.         if(p.coins<3 && p.xPos < 3*32 && p.yPos < 40*32 && p.yPos > 34*32)
  720.                 {p.testForCoins(3);}
  721.         if(p.coins>=3 && p.xPos < 3*32 && p.yPos < 40*32 && p.yPos > 34*32)
  722.                 {jjNxt(false, true);
  723.         gem::saveGemData();}
  724.  
  725.         if ((p.idle > 5 && p.xPos >170*32 && (p.keyLeft || p.keyRight || p.keyJump || p.keyFire))|| p.xPos < 170*32 || p.idle > 100)
  726.                 {p.cameraUnfreeze();}
  727.         p.lightType = LIGHT::NONE;
  728.         if (SpeedUpUntil > jjGameTicks) {
  729.                 play.invincibility = 10;
  730.                 play.keyRun = true;
  731.         if(play.keyRight)
  732.                 play.xSpeed = 30;
  733.         if(play.keyLeft)
  734.                 play.xSpeed = -30;
  735.                 jjTriggers[5] = true;
  736.         }
  737.  
  738.                 if(passobtained == true)
  739.                 {jjTriggers[3] = true;}
  740.  
  741.  
  742. if (SpeedUpUntil < jjGameTicks) {
  743.  
  744. play.jumpStrength = -10;
  745.                 jjTriggers[5] = false;
  746. }
  747. }
  748.  
  749. array<bool> SavedTriggers(32, false); //you will need some way to keep track of whatever information you want saved... a global variable is the simplest choice
  750.  
  751.  
  752. void CheckpointWrapper(jjOBJ@ obj) {
  753.   if (obj.state == STATE::STOP) { //don't do anything anymore
  754.     jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  755.   } else if (obj.state == STATE::DEACTIVATE) { //due to death
  756.     obj.deactivate();
  757.   } else {
  758.     obj.behave(BEHAVIOR::CHECKPOINT);
  759.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  760.     if (obj.state == STATE::DONE) { //triggered by the player hitting it
  761.       obj.state = STATE::STOP;
  762.       //save the current state of some properties
  763.       for (uint i = 0; i < 32; ++i)
  764.         SavedTriggers[i] = jjTriggers[i];
  765.  
  766.       //OPTIONAL: this loop makes checkpoints reusable, so only the most recent checkpoint you touched is ever active
  767.       for (int i = jjObjectCount; --i > 0;) {
  768.         jjOBJ@ obj2 = jjObjects[i];
  769.         if (obj2.eventID == OBJECT::CHECKPOINT && i != obj.objectID && obj2.isActive) {
  770.           obj2.state = STATE::SLEEP;
  771.           obj2.var[0] = 0;
  772.         }
  773.       }
  774.     }
  775.   }
  776. }
  777.  
  778. void onLevelReLoad(jjPLAYER@ play) {
  779.  
  780.   for (uint i = 0; i < 32; ++i)
  781.     jjTriggers[i] = SavedTriggers[i]; //although this example uses jjTriggers, other things should work as well
  782.         jjWaterLighting = WATERLIGHT::GLOBAL;
  783.         gem::restorePlayerGems();
  784.         jjLocalPlayers[0].lives++;
  785.         play.jumpStrength = -10;
  786.         jjTriggers[5] = false;
  787.         lavarise = false;      
  788.  
  789. }
  790. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  791.         return MLLE::WeaponHook.drawAmmo(player, canvas);
  792. }
  793.