Downloads containing mo4a_4-4.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, WeaponVMega::IceCloud::Weapon(), WeaponVMega::Voranj::Weapon(), WeaponVMega::Backfire::Weapon(), null, ArcaneWeapons::FusionCannon::Weapon(), SzmolWeaponPack::PetrolBomb::Weapon(), ArcaneWeapons::MortarLauncher::Weapon()}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "mo4a_4-4-MLLE-Data-1.j2l" ///@MLLE-Generated
  4. #pragma require "mo4a_4-4.j2l" ///@MLLE-Generated
  5. #include "ArcaneWeapon4.asc" ///@MLLE-Generated
  6. #pragma require "ArcaneWeapon4.asc" ///@MLLE-Generated
  7. #include "petrolBomb.asc" ///@MLLE-Generated
  8. #pragma require "petrolBomb.asc" ///@MLLE-Generated
  9. #include "ArcaneWeapon9.asc" ///@MLLE-Generated
  10. #pragma require "ArcaneWeapon9.asc" ///@MLLE-Generated
  11. #include "WeaponVMega5.asc" ///@MLLE-Generated
  12. #pragma require "WeaponVMega5.asc" ///@MLLE-Generated
  13. #include "WeaponVMega8.asc" ///@MLLE-Generated
  14. #pragma require "WeaponVMega8.asc" ///@MLLE-Generated
  15. #include "WeaponVMega3.asc" ///@MLLE-Generated
  16. #pragma require "WeaponVMega3.asc" ///@MLLE-Generated
  17. #pragma require "petrolBomb.j2a"
  18. #include "Jazz1Enemies v05.asc"
  19. #include "Resize v11.asc"
  20. #include "TrueColor v13.asc"
  21. #include "HH18savegems.asc"
  22.  
  23. int SpeedUpUntil = 0, ElevatorUp = 0, CountlessDoubleJumps = 0, exit = 0;
  24. bool water = false, itsraining = false, copterfloat = false, control = true;
  25.  
  26. void onLevelLoad() {
  27.         gem::restorePlayerGems();
  28.         jjLevelName = ("@@@@@@@@@Temple of Buddha");
  29.         jjWaterLighting = WATERLIGHT::GLOBAL;
  30.  
  31.         jjObjectPresets[OBJECT::SAVEPOST].behavior = CheckpointWrapper;
  32.         jjObjectPresets[OBJECT::SAVEPOST].deactivates = false;
  33.  
  34.         jjObjectPresets[OBJECT::WEENIE].behavior = KeyFire();
  35.         jjObjectPresets[OBJECT::WEENIE].scriptedCollisions = true;
  36.  
  37.         jjObjectPresets[OBJECT::HAM].behavior = KeyEarth();
  38.         jjObjectPresets[OBJECT::HAM].scriptedCollisions = true;
  39.  
  40.         jjObjectPresets[OBJECT::PRETZEL].behavior = KeyWater();
  41.         jjObjectPresets[OBJECT::PRETZEL].scriptedCollisions = true;
  42.  
  43.         jjObjectPresets[OBJECT::SANDWICH].behavior = KeyAir();
  44.         jjObjectPresets[OBJECT::SANDWICH].scriptedCollisions = true;
  45.  
  46.         jjObjectPresets[OBJECT::FREEZEENEMIES].behavior = TimeFreezer();
  47.         jjObjectPresets[OBJECT::FREEZEENEMIES].scriptedCollisions = true;
  48.  
  49.         jjObjectPresets[OBJECT::AIRBOARD].scriptedCollisions = true;
  50.         jjObjectPresets[OBJECT::AIRBOARD].behavior = Fastrun();
  51.  
  52.         jjObjectPresets[OBJECT::GRASSPLATFORM].scriptedCollisions = true;
  53.         jjObjectPresets[OBJECT::GRASSPLATFORM].behavior = Air();
  54.  
  55.         jjObjectPresets[OBJECT::FRUITPLATFORM].scriptedCollisions = true;
  56.         jjObjectPresets[OBJECT::FRUITPLATFORM].behavior = AirT();
  57.  
  58.         jjObjectPresets[OBJECT::BURGER].scriptedCollisions = true;
  59.         jjObjectPresets[OBJECT::BURGER].behavior = Fire();
  60.         jjObjectPresets[OBJECT::BURGER].playerHandling = HANDLING::SPECIAL;
  61.         jjObjectPresets[OBJECT::CHICKENLEG].scriptedCollisions = true;
  62.         jjObjectPresets[OBJECT::CHICKENLEG].behavior = Fire2();
  63.         jjObjectPresets[OBJECT::CHICKENLEG].playerHandling = HANDLING::SPECIAL;
  64.  
  65.         jjObjectPresets[OBJECT::TURTLESHELL].xSpeed = 5;
  66.         jjObjectPresets[OBJECT::TURTLESHELL].scriptedCollisions = true;
  67.         jjObjectPresets[OBJECT::TURTLESHELL].behavior = MovingSpring();
  68.         jjObjectPresets[OBJECT::TURTLESHELL].determineCurAnim(ANIM::SPRING,7);
  69.  
  70.         jjObjectPresets[OBJECT::BEES].energy = 20;
  71.         jjObjectPresets[OBJECT::BEES].behavior = FallingIce;
  72.         jjObjectPresets[OBJECT::BEES].playerHandling = HANDLING::ENEMY;
  73.         jjObjectPresets[OBJECT::BEES].bulletHandling = HANDLING::HURTBYBULLET;
  74.         jjObjectPresets[OBJECT::BEES].isBlastable = true;
  75.         jjObjectPresets[OBJECT::BEES].determineCurFrame();     
  76.         jjObjectPresets[OBJECT::BEES].deactivates = false;
  77.  
  78.         jjObjectPresets[OBJECT::SONICPLATFORM].scriptedCollisions = true;
  79.         jjObjectPresets[OBJECT::SONICPLATFORM].behavior = Elevator;
  80.         jjObjectPresets[OBJECT::SONICPLATFORM].deactivates = false;
  81.  
  82.         jjObjectPresets[OBJECT::PINKPLATFORM].scriptedCollisions = true;
  83.         jjObjectPresets[OBJECT::PINKPLATFORM].behavior = AirTimer();
  84.        
  85.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BEES].curAnim];
  86.         anim.frameCount = 1;
  87.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  88.         jjPIXELMAP pump(0, 58*32, 2*32, 2*32, 5);
  89.         pump.save(frame);
  90.         frame.hotSpotX = -32;
  91.  
  92.         jjObjectPresets[OBJECT::BOLLPLATFORM].scriptedCollisions = true;
  93.         jjObjectPresets[OBJECT::BOLLPLATFORM].behavior = Lava;
  94.         jjObjectPresets[OBJECT::BOLLPLATFORM].playerHandling = HANDLING::SPECIAL;
  95.         jjObjectPresets[OBJECT::BOLLPLATFORM].bulletHandling = HANDLING::IGNOREBULLET;
  96.         jjObjectPresets[OBJECT::BOLLPLATFORM].deactivates = false;
  97.  
  98.         jjObjectPresets[OBJECT::FASTFEET].behavior = CountlessJumps();
  99.         jjObjectPresets[OBJECT::FASTFEET].scriptedCollisions = true;
  100.  
  101.         jjObjectPresets[OBJECT::ICECREAM].behavior = AntiCarrot();
  102.         jjObjectPresets[OBJECT::ICECREAM].scriptedCollisions = true;
  103.         jjObjectPresets[OBJECT::ICECREAM].determineCurAnim(ANIM::PICKUPS,82);
  104.  
  105.         Jazz1::MakeEnemy(OBJECT::RAVEN, Jazz1::Enemies::Holidaius_Devil).SetUsesJJ2StyleDeathAnimation(true).SetDeathSound(SOUND::BILSBOSS_THUNDER);
  106.         Jazz1::MakeEnemy(OBJECT::SKELETON, Jazz1::Enemies::Megairbase_Doofusguard).SetUsesJJ2StyleDeathAnimation(true).SetBulletFireSound(SOUND::INTRO_SHOTGRN).SetBulletExplosionSound(SOUND::COMMON_GUNSM1);
  107.         Jazz1::MakeEnemy(OBJECT::SPARK, Jazz1::Enemies::Scraparap_GunnerDrone).SetUsesJJ2StyleDeathAnimation(true).SetBulletFireSound(SOUND::ROBOT_SHOOT).SetBulletExplosionSound(SOUND::COMMON_GUNSM1);
  108. }
  109.  
  110. class MovingSpring : jjBEHAVIORINTERFACE {
  111.  
  112.         void onBehave(jjOBJ@ obj) {
  113.                 obj.behave(BEHAVIOR::WALKINGENEMY, false);
  114.                 obj.putOnGround();
  115.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 16);
  116.         }
  117.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int) {
  118.                 if(bullet is null) {
  119.                 player.direction = player.ySpeed = -62;
  120.                 obj.scriptedCollisions = true;
  121.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_SPRING1);}
  122.                 if(player !is null && bullet !is null)
  123.                 {obj.bulletHandling = HANDLING::DETECTBULLET;
  124.                 obj.causesRicochet = true;}
  125.                 return true;
  126.                 }
  127. }
  128.  
  129.  
  130.  
  131. class AntiCarrot: jjBEHAVIORINTERFACE {
  132.  
  133.         void onBehave(jjOBJ@ obj) {
  134.                 obj.determineCurFrame();
  135.                 obj.behave(BEHAVIOR::PICKUP, false);
  136.                 ++obj.counter;
  137.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  138.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);
  139.         }
  140.  
  141.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ p, int force) {
  142.                 p.health = 1;
  143.                 p.blink = 245; 
  144.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_EAT1, 1000);
  145.                 obj.frameID = 0;
  146.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  147.  
  148.                 return true;
  149.         }
  150. }
  151.  
  152. class CountlessJumps : jjBEHAVIORINTERFACE {
  153.         void onBehave(jjOBJ@ obj) {
  154.  
  155. obj.behave(BEHAVIOR::PICKUP, false);
  156. obj.determineCurAnim(ANIM::PICKUPS, 33);
  157. ++obj.counter;
  158.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  159.  
  160.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 16);
  161.  
  162. }
  163.  
  164.         bool onObjectHit(jjOBJ@ obj, jjOBJ@, jjPLAYER@ play, int force) {
  165.                 play.timerStart(3000);
  166.                 jjTriggers[26] = true;
  167.                 p.morphTo(CHAR::SPAZ);
  168.                 CountlessDoubleJumps = jjGameTicks + 55 * 61;
  169.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  170.                 obj.frameID = 0;
  171.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PICKUP1, 6000);
  172.  
  173.                 return true;
  174.         }
  175.  
  176. }
  177.  
  178. class AirTimer: jjBEHAVIORINTERFACE {
  179.         void onBehave(jjOBJ@ obj) {
  180.  
  181. obj.determineCurAnim(ANIM::PINKPLAT, 0);
  182. ++obj.counter;
  183.  
  184.  
  185.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::INVISIBLE);
  186.  
  187. }
  188.  
  189.         bool onObjectHit(jjOBJ@ obj, jjOBJ@, jjPLAYER@ play, int force) {
  190.         if(p.keyUp){
  191.                 play.timerStart(1200);
  192.                 p.cameraFreeze(198*32, 36*32, true, false);
  193.                 jjTriggers[7] = true;
  194.                 jjTriggers[8] = false;
  195.                 Switch7 = jjGameTicks + 21*61;
  196.                 obj.delete();
  197.                 //jjAddObject(OBJECT::FRUITPLATFORM, 5396, 1170);
  198.                 //jjAddObject(OBJECT::FRUITPLATFORM, 6346, 1170);
  199.                 jjSample(play.xPos, play.yPos, SOUND::INTRO_MONSTER2);}
  200.                 return true;
  201.         }
  202.  
  203. }
  204.  
  205. bool lavarise = false;
  206.  
  207. void Lava (jjOBJ@ obj) {
  208.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BOLLPLATFORM].curAnim];
  209.         anim.frameCount = 1;
  210.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  211.         jjPIXELMAP lava(0, 0*32, 43*32, 19*32, 8);
  212.         lava.save(frame);
  213.         frame.hotSpotX = -60;
  214.         if(lavarise == true) {
  215.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  216.         if(p.yPos>obj.yPos-22 && itsraining == false )
  217.                 {p.health = 0;}
  218.         if(itsraining == true)
  219.                 {obj.state = STATE::FREEZE;
  220.                 obj.beSolid();
  221.                 obj.deactivates = false;
  222.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::SINGLEHUE, 59);}
  223.         if(p.xPos<60*32 && p.yPos < 5*32)
  224.                 {obj.state = STATE::KILL;
  225.                 obj.delete();}
  226.  
  227.                 switch (obj.state) {
  228.                 case STATE::START:
  229.                         obj.ySpeed = 0;
  230.  
  231.                         obj.state = STATE::FLY;
  232.                         obj.beSolid();
  233.                 case STATE::FLY:
  234.                 ++obj.counter;
  235.                 obj.xPos = jjSin(obj.counter*4)*4 + obj.xOrg;
  236.                 if(p.xPos >74*32)
  237.                         {obj.direction = obj.ySpeed = -0.2;
  238.                         obj.yPos = obj.yPos + obj.ySpeed;}
  239.                         obj.beSolid();
  240.  
  241.  
  242.                         break;
  243.                 }
  244.         }
  245.  
  246. }
  247.  
  248. void Elevator (jjOBJ@ obj) {
  249.         switch (obj.state) {
  250.                 case STATE::START:
  251.                         obj.direction = obj.ySpeed = 2;
  252.                         obj.determineCurAnim(ANIM::SONICPLAT, 0);  
  253.                         obj.determineCurFrame();
  254.                         obj.playerHandling = HANDLING::SPECIAL;
  255.                         obj.state = STATE::FLY;
  256.                         obj.beSolid();
  257.                 case STATE::FLY:
  258.                         obj.beSolid();
  259.                         if(p.keyUp && ElevatorUp > jjGameTicks && p.xPos>obj.xPos-32 && p.xPos<obj.xPos+32) {
  260.                         obj.yPos = obj.yPos + obj.ySpeed;
  261.                         obj.direction = obj.ySpeed = -2;
  262.                          }
  263.                         if(p.keyDown && ElevatorUp > jjGameTicks && p.xPos>obj.xPos-32 && p.xPos<obj.xPos+32) {
  264.                         obj.yPos = obj.yPos + obj.ySpeed;
  265.                         p.ySpeed=3;
  266.                         obj.direction = obj.ySpeed = 2;
  267.                         if (jjMaskedVLine(obj.xSpeed > 0 ? obj.yPos + 36 : obj.xPos - 16, obj.yPos, 1)) {
  268.                                 obj.ySpeed = 0;
  269.                         }
  270.                         }
  271.                         obj.draw();
  272.                         break;
  273.  
  274.         }
  275. }
  276. class Fire2 : jjBEHAVIORINTERFACE{
  277.         void onBehave(jjOBJ@ enemy) {
  278.  
  279.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FIREBALLBULLET].curAnim];
  280.         anim.frameCount = 1;
  281.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  282.         jjPIXELMAP flame(0, 63*32, 1*32, 1*32, 5);
  283.         flame.save(frame);
  284.  
  285.         switch (enemy.state) {
  286.                 case STATE::START:
  287.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  288.                                 enemy.determineCurFrame();
  289.                         enemy.state = STATE::IDLE;
  290.                         break;
  291.                
  292.                 case STATE::IDLE:
  293.  
  294.                                 enemy.direction = -1;
  295.                         if ((jjRandom() & 91) == 0) {
  296.                                 enemy.state = STATE::ATTACK;
  297.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  298.                                 enemy.counter = 0;
  299.                                 enemy.frameID = 0;
  300.                                 jjSample(enemy.xPos, enemy.yPos, SOUND::COMMON_SWISH8);
  301.                         } else {
  302.                                 if (++enemy.counter > 4) {
  303.                                         enemy.counter = 0;
  304.                                         if (++enemy.frameID >= 91)
  305.                                                 enemy.frameID = 0;
  306.  
  307.                                 }
  308.                         }
  309.                         break;
  310.                 case STATE::ATTACK:
  311.  
  312.                         if (++enemy.counter > 6) {
  313.                                 enemy.counter = 0;
  314.                                 if (++enemy.frameID >= 91) {
  315.                                         enemy.state = STATE::IDLE;
  316.                                         enemy.frameID = 0;
  317.                                 } else if (enemy.frameID ==1) {
  318.                                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::FIREBALLBULLET)];
  319.                                                
  320.                                         frame.hotSpotX = -32;
  321.                                         obj.playerHandling = HANDLING::PLAYERBULLET;
  322.                                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  323.                                         obj.lightType = LIGHT::POINT;
  324.                                         obj.xPos = enemy.xPos-62;
  325.                                         obj.yPos = enemy.yPos-12;      
  326.                                         obj.xAcc = .12;
  327.                                         int xspeed = (jjRandom() & 3);
  328.                                         obj.xSpeed = -19 - xspeed;
  329.                                         int yspeed = (jjRandom() & 6);
  330.                                         obj.ySpeed = yspeed + 8* p.direction;
  331.                                         obj.counterEnd = 155;
  332.                                 }
  333.                                 enemy.determineCurFrame();
  334.                         }
  335.                         break;
  336.                 case STATE::FREEZE:
  337.                 enemy.playerHandling = HANDLING::PLAYERBULLET;
  338.                 enemy.behavior = BEHAVIOR::BURNING;
  339.                 enemy.delete();
  340.                 break;
  341.                 case STATE::DEACTIVATE:
  342.                 case STATE::KILL:
  343.                         enemy.delete();
  344.                         break;
  345.         }
  346.  
  347.                 jjDrawRotatedSpriteFromCurFrame(enemy.xPos-5, enemy.yPos, enemy.curFrame, 270, 1, -1, SPRITE::NORMAL);
  348.  
  349.         }
  350.        
  351.         bool onObjectHit(jjOBJ@ enemy, jjOBJ@ bullet, jjPLAYER@ p, int force) {
  352.                 if (force == 0 || force == -1)
  353.                 {p.hurt();}
  354.                 else if (bullet.var[3] == WEAPON::ICE)
  355.                 {enemy.behavior = BEHAVIOR::EXPLOSION;
  356.                 enemy.state = STATE::FREEZE;
  357.                 enemy.delete();
  358.                 bullet.delete();}
  359.         return true;
  360.         }
  361. }
  362.  
  363.  
  364. class Fire : jjBEHAVIORINTERFACE{
  365.         void onBehave(jjOBJ@ enemy) {
  366.  
  367.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FIREBALLBULLET].curAnim];
  368.         anim.frameCount = 1;
  369.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  370.         jjPIXELMAP flame(0, 63*32, 1*32, 1*32, 5);
  371.         flame.save(frame);
  372.  
  373.         switch (enemy.state) {
  374.                 case STATE::START:
  375.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  376.                                 enemy.determineCurFrame();
  377.                         enemy.state = STATE::IDLE;
  378.                         break;
  379.                
  380.                 case STATE::IDLE:
  381.  
  382.                                 enemy.direction = 1;
  383.                         if ((jjRandom() & 91) == 0) {
  384.                                 enemy.state = STATE::ATTACK;
  385.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  386.                                 enemy.counter = 0;
  387.                                 enemy.frameID = 0;
  388.                                 jjSample(enemy.xPos, enemy.yPos, SOUND::COMMON_SWISH8);
  389.                         } else {
  390.                                 if (++enemy.counter > 4) {
  391.                                         enemy.counter = 0;
  392.                                         if (++enemy.frameID >= 91)
  393.                                                 enemy.frameID = 0;
  394.  
  395.                                 }
  396.                         }
  397.                         break;
  398.                 case STATE::ATTACK:
  399.  
  400.                         if (++enemy.counter > 6) {
  401.                                 enemy.counter = 0;
  402.                                 if (++enemy.frameID >= 91) {
  403.                                         enemy.state = STATE::IDLE;
  404.                                         enemy.frameID = 0;
  405.                                 } else if (enemy.frameID ==1) {
  406.                                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::FIREBALLBULLET)];
  407.                                                
  408.                                         frame.hotSpotX = -32;
  409.                                         obj.playerHandling = HANDLING::PLAYERBULLET;
  410.                                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  411.                                         obj.lightType = LIGHT::POINT;
  412.                                         obj.xPos = enemy.xPos+62;
  413.                                         obj.yPos = enemy.yPos-12;      
  414.                                         obj.xAcc = .12;
  415.                                         int xspeed = (jjRandom() & 3);
  416.                                         obj.xSpeed = 19 + xspeed;
  417.                                         int yspeed = (jjRandom() & 6);
  418.                                         obj.ySpeed = yspeed -8* p.direction;
  419.                                         obj.counterEnd = 155;
  420.                                 }
  421.                                 enemy.determineCurFrame();
  422.                         }
  423.                         break;
  424.                 case STATE::FREEZE:
  425.                 enemy.playerHandling = HANDLING::PLAYERBULLET;
  426.                 enemy.behavior = BEHAVIOR::BURNING;
  427.                 enemy.delete();
  428.                 break;
  429.                 case STATE::DEACTIVATE:
  430.                 case STATE::KILL:
  431.                         enemy.delete();
  432.                         break;
  433.         }
  434.  
  435.                 jjDrawRotatedSpriteFromCurFrame(enemy.xPos-5, enemy.yPos, enemy.curFrame, 270, 1, -1, SPRITE::NORMAL);
  436.  
  437.         }
  438.        
  439.         bool onObjectHit(jjOBJ@ enemy, jjOBJ@ bullet, jjPLAYER@ p, int force) {
  440.                 if (force == 0 || force == -1)
  441.                 {p.hurt();}
  442.                 else if (bullet.var[3] == WEAPON::ICE)
  443.                 {enemy.behavior = BEHAVIOR::EXPLOSION;
  444.                 enemy.state = STATE::FREEZE;
  445.                 enemy.delete();
  446.                 bullet.delete();}
  447.         return true;
  448.         }
  449. }
  450.  
  451.  
  452.  
  453. class Air : jjBEHAVIORINTERFACE {
  454.  
  455.         void onBehave(jjOBJ@ obj) {
  456.                 obj.behave(BEHAVIOR::BURNING, false);
  457.                 obj.determineCurAnim(ANIM::AMMO,3);
  458.                 obj.determineCurFrame();
  459.                 ++obj.counter;
  460.                 obj.yPos = jjSin(obj.counter*3 + 5)*2 + obj.yOrg;
  461.                 jjDrawSpriteFromCurFrame(obj.xPos+14, obj.yPos, obj.curFrame, obj.direction, SPRITE::TRANSLUCENTSINGLEHUE, 64);
  462.         }
  463.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  464.                 if(bullet is null)
  465.                         {copterfloat = true;}
  466.                 return true;
  467.         }
  468. }
  469.  
  470. class AirT : jjBEHAVIORINTERFACE {
  471.  
  472.         void onBehave(jjOBJ@ obj) {
  473.         if(jjTriggers[7]==true) {
  474.                 obj.behave(BEHAVIOR::BURNING, false);
  475.                 obj.determineCurAnim(ANIM::AMMO,3);
  476.                 obj.determineCurFrame();
  477.                 ++obj.counter;
  478.                 obj.yPos = jjSin(obj.counter*3 + 5)*2 + obj.yOrg;
  479.                 jjDrawSpriteFromCurFrame(obj.xPos+14, obj.yPos+32, obj.curFrame, obj.direction, SPRITE::TRANSLUCENTSINGLEHUE, 64);
  480.                 }
  481.         }
  482.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  483.         if(jjTriggers[7]==true) {
  484.                 copterfloat = true;
  485.         }
  486.                 return true;
  487.         }
  488. }
  489.  
  490.  
  491. void FallingIce (jjOBJ@ enemy) {
  492.  
  493.         if (enemy.state == STATE::KILL || enemy.state == STATE::DEACTIVATE) {
  494.                 enemy.delete();
  495.  
  496.         } else          switch (enemy.state) {
  497.                 case STATE::START:
  498.         enemy.frameID = enemy.counter/8;
  499.  
  500.  
  501.         enemy.determineCurFrame();     
  502.  
  503.                 ++enemy.counter;
  504.  
  505.                 if (jjRandom() & 63 == 0) {
  506.                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::BULLET)];
  507.  
  508.                         obj.behavior = BEHAVIOR::BULLET;
  509.                         obj.determineCurAnim(ANIM::AMMO, 30);
  510.                         obj.lightType = LIGHT::POINT;
  511.                         jjSample(enemy.xPos, enemy.yPos, SOUND::COMMON_PLOP2);
  512.                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  513.                         obj.killAnim = jjObjectPresets[OBJECT::ICEBULLET].killAnim;
  514.                         obj.ySpeed = 6;
  515.                         obj.counterEnd = 100;
  516.  
  517.                 }
  518.                 else if (jjRandom() & 63 == 0) {
  519.                         jjOBJ@ objj = jjObjects[enemy.fireBullet(OBJECT::BULLET)];
  520.                         objj.xPos = enemy.xPos + 2;
  521.                         objj.behavior = BEHAVIOR::BULLET;
  522.                         objj.determineCurAnim(ANIM::AMMO, 30);
  523.                         objj.lightType = LIGHT::POINT;
  524.                         jjSample(enemy.xPos, enemy.yPos, SOUND::COMMON_PLOP2);
  525.                         objj.bulletHandling = HANDLING::IGNOREBULLET;
  526.                         objj.killAnim = jjObjectPresets[OBJECT::ICEBULLET].killAnim;
  527.                         objj.ySpeed = 6;
  528.                         objj.counterEnd = 100; }
  529.  
  530.         }
  531.         if (enemy.justHit == 0)
  532.  
  533.                 jjDrawSpriteFromCurFrame(enemy.xPos, enemy.yPos, enemy.curFrame, enemy.direction, SPRITE::TRANSLUCENT);
  534.         else
  535.                 enemy.draw();
  536.  
  537. }      
  538.  
  539.  
  540.  
  541. class KeyFire : jjBEHAVIORINTERFACE {
  542.  
  543.         void onBehave(jjOBJ@ obj) {
  544.                 if(jjTriggers[5] == true)
  545.                 {obj.delete();}
  546.                 obj.behave(BEHAVIOR::PICKUP, false);
  547.                 ++obj.counter;
  548.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  549.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  550. }
  551.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  552.                 jjTriggers[5] = true;
  553.                 jjAddObject(OBJECT::CHICKENLEG, 26*32, 33*32);
  554.                 jjAddObject(OBJECT::BURGER, 30*32, 33*32);
  555.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  556.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  557.  
  558.                 return true;
  559.         }
  560. }
  561.  
  562.  
  563. class Fastrun : jjBEHAVIORINTERFACE {
  564.         void onBehave(jjOBJ@ obj) {
  565.  
  566. obj.behave(BEHAVIOR::PICKUP, false);
  567. obj.determineCurAnim(ANIM::PICKUPS, 33);
  568. ++obj.counter;
  569.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  570.  
  571.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -32);
  572.  
  573. }
  574.  
  575.         bool onObjectHit(jjOBJ@ obj, jjOBJ@, jjPLAYER@ play, int force) {
  576.         play.timerStart(700);
  577.                 SpeedUpUntil = jjGameTicks + 11 * 61;
  578.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  579.                 obj.frameID = 0;
  580.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PICKUP1, 6000);
  581.  
  582.                 return true;
  583.         }
  584.  
  585. }
  586.  
  587. class KeyEarth : jjBEHAVIORINTERFACE {
  588.  
  589.         void onBehave(jjOBJ@ obj) {
  590.                 if(jjTriggers[6] == true)
  591.                 {obj.delete();}
  592.                 obj.behave(BEHAVIOR::PICKUP, false);
  593.                 ++obj.counter;
  594.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  595.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  596. }
  597.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  598.                 jjTriggers[6] = true;
  599.                 jjTriggerRock(4);
  600.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  601.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  602.  
  603.                 return true;
  604.         }
  605. }
  606.  
  607. class KeyWater : jjBEHAVIORINTERFACE {
  608.  
  609.         void onBehave(jjOBJ@ obj) {
  610.                 if(jjTriggers[9] == true)
  611.                 {obj.delete();}
  612.                 obj.behave(BEHAVIOR::PICKUP, false);
  613.                 ++obj.counter;
  614.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  615.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  616. }
  617.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  618.                 jjTriggers[9] = true;
  619.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  620.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  621.  
  622.                 return true;
  623.         }
  624. }
  625.  
  626. class KeyAir : jjBEHAVIORINTERFACE {
  627.  
  628.         void onBehave(jjOBJ@ obj) {
  629.                 if(jjTriggers[11] == true)
  630.                 {obj.delete();}
  631.                 obj.behave(BEHAVIOR::PICKUP, false);
  632.                 ++obj.counter;
  633.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  634.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  635. }
  636.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  637.                 jjTriggers[11] = true;
  638.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  639.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  640.  
  641.                 return true;
  642.         }
  643. }
  644.  
  645. class TimeFreezer : jjBEHAVIORINTERFACE {
  646.  
  647.         void onBehave(jjOBJ@ obj) {
  648.                 obj.behave(BEHAVIOR::PICKUP, false);
  649.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FREEZEENEMIES].curAnim];
  650.         anim.frameCount = 1;
  651.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  652.         jjPIXELMAP pump(0, 16*32, 1*32, 1*32, 5);
  653.         pump.save(frame);
  654.                 ++obj.counter;
  655.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  656.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  657. }
  658.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  659.                 jjTriggers[12] = true;
  660.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  661.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  662.  
  663.                 return true;
  664.         }
  665. }
  666.  
  667. int Switch1 = 0; int Switch2 = 0; int Switch3 = 0; int Switch4 = 0; int Switch7 = 0; int Switch18 = 0; int Switch19 = 0;
  668.  
  669.  
  670. void onFunction0(jjPLAYER@ p) {
  671.         if(jjTriggers[5] == true && jjTriggers[6] == true && jjTriggers[9] == true && jjTriggers[11] == true)
  672.         {jjTriggers[22] = true;}
  673.         else p.showText("@@Must collect all 4 element badges first.");
  674. }
  675.  
  676. void onFunction1(jjPLAYER@ p) {
  677.         jjNxt("mo4a_4-5_save", false, true);
  678.         gem::saveGemData();    
  679. }
  680.  
  681. void onFunction2(jjPLAYER@ p) {
  682.         lavarise = true;
  683.         jjEnabledASFunctions[2] = false;
  684.         jjEnabledASFunctions[3] = true;
  685. }
  686.  
  687. void onFunction3(jjPLAYER@ p) {
  688.         lavarise = false;
  689.         jjEnabledASFunctions[3] = false;
  690.         jjEnabledASFunctions[2] = true;
  691.  
  692. }
  693.  
  694. void onFunction5(jjPLAYER@ p){
  695. ElevatorUp = jjGameTicks + 21*61;}
  696.  
  697. void onFunction6(jjPLAYER@ p){
  698. if(p.keyDown==true)
  699. ElevatorUp = jjGameTicks + 100 *61;
  700. else ElevatorUp = 0;}
  701.  
  702. void onFunction7(jjPLAYER@ p) {
  703. Switch7 = jjGameTicks + 21* 61;
  704. }
  705.  
  706. void onFunction4(jjPLAYER@ p) {
  707.         p.timerStop();}
  708.  
  709.  
  710. void onFunction9(jjPLAYER@ p)
  711. {copterfloat = true;}
  712.  
  713. void onFunction10(jjPLAYER@ p)
  714. {copterfloat = false;}
  715.  
  716.  
  717. void onFunction26(jjPLAYER@ p) {
  718. p.hurt();}
  719.  
  720. void onFunction20(jjPLAYER@ p) {
  721. jjSetWaterLevel(1344, false);
  722. jjTriggers[20] = true;
  723. jjTriggers[21] = false;
  724. jjTriggers[23] = false;
  725. jjTriggers[24] = false;
  726. jjSample(p.xPos, p.yPos, SOUND::ROBOT_HYDROPUF);
  727. }
  728.  
  729. void onFunction21(jjPLAYER@ p) {
  730. jjSetWaterLevel(1856, false);
  731. jjTriggers[21] = true;
  732. jjTriggers[20] = false;
  733. jjTriggers[23] = false;
  734. jjTriggers[24] = false;
  735. jjSample(p.xPos, p.yPos, SOUND::ROBOT_HYDROPUF);
  736. }
  737.  
  738. void onFunction23(jjPLAYER@ p) {
  739. jjSetWaterLevel(2080, false);
  740. jjTriggers[23] = true;
  741. jjTriggers[20] = false;
  742. jjTriggers[21] = false;
  743. jjTriggers[24] = false;
  744. jjSample(p.xPos, p.yPos, SOUND::ROBOT_HYDROPUF);
  745. }
  746.  
  747. void onFunction24(jjPLAYER@ p) {
  748. jjSetWaterLevel(1568, false);
  749. jjTriggers[24] = true;
  750. jjTriggers[20] = false;
  751. jjTriggers[21] = false;
  752. jjTriggers[23] = false;
  753. jjSample(p.xPos, p.yPos, SOUND::ROBOT_HYDROPUF);
  754. }
  755.  
  756. void onLevelReload() {
  757.         gem::restorePlayerGems();
  758.         jjLocalPlayers[0].lives++;
  759.         jjWaterLighting = WATERLIGHT::GLOBAL;
  760.         for (uint i = 0; i < 32; ++i)
  761.                 jjTriggers[i] = SavedTriggers[i];
  762. }
  763.  
  764. bool doorunblocked = false, startrush = false, readytorush = false;
  765.  
  766. void onPlayer(jjPLAYER@ p) {
  767.  
  768.         if(p.xPos < 115*32 && p.yPos > 20*32) {
  769.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::WEENIE].curAnim];
  770.         anim.frameCount = 1;
  771.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  772.         jjPIXELMAP fire(0, 54*32, 1*32, 1*32, 5);
  773.         fire.save(frame);
  774.         }
  775.  
  776.         if(p.xPos < 115*32 && p.yPos < 20*32) {
  777.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::HAM].curAnim];
  778.         anim.frameCount = 1;
  779.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  780.         jjPIXELMAP earth(0, 55*32, 1*32, 1*32, 5);
  781.         earth.save(frame);
  782.         }
  783.  
  784.         if(p.xPos > 115*32) {
  785.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::PRETZEL].curAnim];
  786.         anim.frameCount = 1;
  787.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  788.         jjPIXELMAP water(0, 56*32, 1*32, 1*32, 5);
  789.         water.save(frame);
  790.         }
  791.  
  792.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::SANDWICH].curAnim];
  793.         anim.frameCount = 1;
  794.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  795.         jjPIXELMAP air(0, 57*32, 1*32, 1*32, 5);
  796.         air.save(frame);
  797.  
  798.         gem::trackPlayerGems(p);
  799.         gem::upgradeHealth(p);
  800.        
  801.         exit = 0;
  802.         if(jjTriggers[5] == true)
  803.                 {exit += 1;}
  804.         if(jjTriggers[6] == true)
  805.                 {exit += 1;}
  806.         if(jjTriggers[9] == true)
  807.                 {exit += 1;}
  808.         if(jjTriggers[11] == true)
  809.                 {exit += 1;}
  810.  
  811.                 if(control==false)
  812.                 {p.keyLeft = false;
  813.                 p.keyRight = false;
  814.                 p.keyDown = false;}
  815.  
  816.                 if(p.idle > 100 && p.xPos < 223*32)
  817.                 {p.cameraUnfreeze(true);
  818.                 control=true;}
  819.                 else if (p.idle > 5 && (p.keyLeft || p.keyRight || p.keyJump || p.keyFire))
  820.                 {p.cameraUnfreeze(true);
  821.                 control=true;}
  822.  
  823.         if(p.keyUp && p.xPos > 101*32 && p.xPos < 104*32 && p.yPos > 2*32 && p.yPos < 6*32 && water == false) {
  824.                 water = true;
  825.                 jjTriggers[10] = true;
  826.                 jjSample(p.xPos, p.yPos, SOUND::ROBOT_HYDROPUF);
  827.         }
  828.  
  829.         if(p.food == 100 && jjKey[0x52] == false && startrush == false)
  830.                 {p.showText("@@@@@@@@@@@@@@@@Press 'R' when you need to use Sugar Rush!", STRING::MEDIUM);
  831.                 p.startSugarRush(0);
  832.                 startrush = true;
  833.                 readytorush = true;}
  834.  
  835.         if(readytorush == true)
  836.                 {p.food = 100;}
  837.  
  838.         if(p.food == 100 && jjKey[0x52])
  839.                 {p.startSugarRush(1400);
  840.                 p.food = 0;
  841.                 readytorush = false;
  842.                 startrush = false;
  843.         }
  844.  
  845.  
  846.         if(doorunblocked == false && jjTriggers[5] == true && jjTriggers[6] == true && jjTriggers[9] == true && jjTriggers[11] == true)
  847.         {       p.showText("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Badges collected.");
  848.                 p.cameraFreeze(115*32, 36*32, true, false);
  849.                 doorunblocked = true;   }
  850.  
  851.         if(water == true) {
  852.         jjIsSnowing = true;
  853.         jjSnowingType = SNOWING::RAIN;
  854.         itsraining = true;
  855.         }
  856. if(copterfloat == true)
  857. {jjCharacters[CHAR::JAZZ].helicopterYSpeed= -2;
  858. jjCharacters[CHAR::LORI].helicopterYSpeed= -2;}
  859. if(copterfloat == false)
  860. {jjCharacters[CHAR::JAZZ].helicopterYSpeed= 1;
  861. jjCharacters[CHAR::LORI].helicopterYSpeed= 1;}
  862.  
  863. p.lightType = LIGHT::NONE;
  864. if (itsraining==true) {
  865. jjTriggers[29] = true;
  866. }
  867. if (CountlessDoubleJumps > jjGameTicks && p.keyJump) {
  868.         p.doubleJumpCount = 0;}
  869. if (p.health == 0){
  870.         CountlessDoubleJumps  = 0;
  871. }
  872.  
  873.         for (int i = 1; i < jjObjectCount; i++) {
  874.                 jjOBJ@ o = jjObjects[i];
  875.                 if (o.isActive && o.eventID == OBJECT::SEEKERAMMO3 && p.ammo[WEAPON::SEEKER] < 1) {
  876.                         o.state = STATE::KILL;}
  877.         }
  878.         for (int i = 1; i < jjObjectCount; i++) {
  879.                 jjOBJ@ o = jjObjects[i];
  880.                 if (o.isActive && o.eventID == OBJECT::RFAMMO3 && p.ammo[WEAPON::RF] < 1) {
  881.                         o.state = STATE::KILL;}
  882.         }
  883.         for (int i = 1; i < jjObjectCount; i++) {
  884.                 jjOBJ@ o = jjObjects[i];
  885.                 if (o.isActive && o.eventID == OBJECT::TNTAMMO3 && p.ammo[WEAPON::TNT] < 1) {
  886.                         o.state = STATE::KILL;}
  887.         }
  888.         for (int i = 1; i < jjObjectCount; i++) {
  889.                 jjOBJ@ o = jjObjects[i];
  890.                 if (o.isActive && o.eventID == OBJECT::GUN9AMMO3 && p.ammo[WEAPON::GUN9] < 1) {
  891.                         o.state = STATE::KILL;}
  892.         }
  893.         for (int i = 1; i < jjObjectCount; i++) {
  894.                 jjOBJ@ o = jjObjects[i];
  895.                 if (o.isActive && o.eventID == OBJECT::SEEKERPOWERUP && p.ammo[WEAPON::SEEKER] < 1) {
  896.                         o.state = STATE::KILL;}
  897.         }
  898.         for (int i = 1; i < jjObjectCount; i++) {
  899.                 jjOBJ@ o = jjObjects[i];
  900.                 if (o.isActive && o.eventID == OBJECT::RFPOWERUP && p.ammo[WEAPON::RF] < 1) {
  901.                         o.state = STATE::KILL;}
  902.         }
  903.         for (int i = 1; i < jjObjectCount; i++) {
  904.                 jjOBJ@ o = jjObjects[i];
  905.                 if (o.isActive && o.eventID == OBJECT::TNTPOWERUP && p.ammo[WEAPON::TNT] < 1) {
  906.                         o.state = STATE::KILL;}
  907.         }
  908.         for (int i = 1; i < jjObjectCount; i++) {
  909.                 jjOBJ@ o = jjObjects[i];
  910.                 if (o.isActive && o.eventID == OBJECT::GUN9POWERUP && p.ammo[WEAPON::GUN9] < 1) {
  911.                         o.state = STATE::KILL;}
  912.         }
  913.  
  914.         if(p.keyUp && p.xPos > 117*32 && p.xPos < 118*32 && p.yPos < 48*32 && p.yPos >45*32) {
  915.                 p.timerStart(660);
  916.                 Switch2 = 0;
  917.                 Switch19 = jjGameTicks + 11*61;
  918.                 p.cameraFreeze(164*32, 36*32, true, false);
  919.                 jjTriggers[19] = true;
  920.                 jjTriggers[1] = false;
  921.                 jjTriggers[2] = false;
  922.                 jjTriggers[18] = false;
  923.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  924.         }
  925.         if(Switch19 <jjGameTicks)
  926.                 {jjTriggers[19] = false;}
  927.  
  928.  
  929.         if(Switch7 < jjGameTicks) {
  930.                 jjTriggers[7] = false;
  931.                 for (int i = 1; i < jjObjectCount; i++) {
  932.                         jjOBJ@ o = jjObjects[i];
  933.                         if (o.isActive && o.eventID == OBJECT::FRUITPLATFORM)
  934.                                 {o.delete();}
  935.                 }                              
  936.         }
  937.        
  938.         if(p.keyUp && p.xPos > 112*32 && p.xPos < 113*32 && p.yPos < 48*32 && p.yPos >45*32) {
  939.                 p.timerStart(660);
  940.                 Switch1 = 0;
  941.                 Switch18 = jjGameTicks + 11*61;
  942.                 p.cameraFreeze(74*32, 38*32, true, false);
  943.                 jjTriggers[18] = true;
  944.                 jjTriggers[1] = false;
  945.                 jjTriggers[2] = false;
  946.                 jjTriggers[19] = false;
  947.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  948.                 }
  949.         if(Switch18 <jjGameTicks) {
  950.                 jjTriggers[18] = false;
  951.                 }
  952.         if(p.keyUp && p.xPos>16*32 && p.xPos<17*32 && p.yPos<31*32 && p.yPos >28*32) {
  953.                 p.timerStart(300);
  954.                 Switch4 = jjGameTicks + 5*61;
  955.                 p.cameraFreeze(18*32, 48*32, true, false);
  956.                 jjTriggers[4] = true;
  957.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  958.                 }      
  959.         if(Switch4 <jjGameTicks) {
  960.                 jjTriggers[4] = false;
  961.                 }
  962.         if(p.keyUp && p.xPos > 71*32 && p.xPos < 73*32 && p.yPos < 50*32 && p.yPos >45*32) {
  963.                 p.timerStart(660);
  964.                 Switch3 = jjGameTicks + 11*61;
  965.                 jjTriggers[3] = true;
  966.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  967.                 }
  968.         if(Switch3 <jjGameTicks) {
  969.                 jjTriggers[3] = false;
  970.                 }
  971.         if(p.keyUp && p.xPos > 119*32 && p.xPos < 120*32 && p.yPos < 48*32 && p.yPos >45*32) {
  972.                 p.timerStart(300);
  973.                 Switch19 = 0;
  974.                 Switch2 = jjGameTicks + 5*61;
  975.                 p.cameraFreeze(161*32, 52*32, true, false);
  976.                 jjTriggers[2] = true;
  977.                 jjTriggers[1] = false;
  978.                 jjTriggers[19] = false;
  979.                 jjTriggers[18] = false;
  980.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  981.                 }
  982.         if(Switch2 <jjGameTicks) {
  983.                 jjTriggers[2] = false;
  984.                 }
  985.         if(p.keyUp && p.xPos > 110*32 && p.xPos < 111*32 && p.yPos < 48*32 && p.yPos >45*32) {
  986.                 p.timerStart(300);
  987.                 Switch18 = 0;
  988.                 p.cameraFreeze(74*32, 54*32, true, false);
  989.                 Switch1 = jjGameTicks + 5*61;
  990.                 jjTriggers[1] = true;
  991.                 jjTriggers[18] = false;
  992.                 jjTriggers[2] = false;
  993.                 jjTriggers[19] = false;
  994.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  995.  
  996.                 }              
  997.         if(Switch1 <jjGameTicks) {
  998.                 jjTriggers[1] = false; 
  999.                 }
  1000.  
  1001. }
  1002.  
  1003.  
  1004. bool onDrawHealth(jjPLAYER@ player, jjCANVAS@ canvas) {
  1005.     canvas.drawSprite(20, 580, ANIM::PICKUPS, 80, jjGameTicks>>2, -1, SPRITE::NORMAL);
  1006.     canvas.drawString(30, 585, formatInt(exit%5, "1") + "/4", STRING::SMALL, STRING::NORMAL);
  1007.     return false;
  1008. }
  1009.  
  1010. bool onDrawLives(jjPLAYER@ player, jjCANVAS@ canvas) {return true;}
  1011.  
  1012.  
  1013. void onMain() {
  1014. gem::deleteCollectedGems();
  1015. if(jjKey[9] && jjKey[0x51]) {
  1016. p.morphTo(CHAR::JAZZ, false);
  1017. }
  1018. if(jjKey[9] && jjKey[0x57]) {
  1019. p.morphTo(CHAR::SPAZ, false);
  1020. }
  1021. if(jjKey[9] && jjKey[0x45]) {
  1022. p.morphTo(CHAR::LORI, false);
  1023. }
  1024. }
  1025.  
  1026. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  1027.         return MLLE::WeaponHook.drawAmmo(player, canvas);
  1028. }
  1029.  
  1030. void onReceive(jjSTREAM&in packet, int fromClientID) {
  1031.         MLLE::WeaponHook.processPacket(packet, fromClientID);
  1032. }
  1033.  
  1034. array<bool> SavedTriggers(32, false);
  1035. //Extendable Checkpoints by VioletCLM
  1036. void CheckpointWrapper(jjOBJ@ obj) {
  1037.   if (obj.state == STATE::STOP) { //don't do anything anymore
  1038.     jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  1039.   } else if (obj.state == STATE::DEACTIVATE) { //due to death
  1040.     obj.deactivate();
  1041.   } else {
  1042.     obj.behave(BEHAVIOR::CHECKPOINT);
  1043.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  1044.     if (obj.state == STATE::DONE) { //triggered by the player hitting it
  1045.       obj.state = STATE::STOP;
  1046.       //save the current state of some properties
  1047.       for (uint i = 0; i < 32; ++i)
  1048.         SavedTriggers[i] = jjTriggers[i];
  1049.  
  1050.       //OPTIONAL: this loop makes checkpoints reusable, so only the most recent checkpoint you touched is ever active
  1051.       for (int i = jjObjectCount; --i > 0;) {
  1052.         jjOBJ@ obj2 = jjObjects[i];
  1053.         if (obj2.eventID == OBJECT::CHECKPOINT && i != obj.objectID && obj2.isActive) {
  1054.           obj2.state = STATE::SLEEP;
  1055.           obj2.var[0] = 0;
  1056.         }
  1057.       }
  1058.     }
  1059.   }
  1060. }
  1061.