Downloads containing mo4a_1-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, DefaultWeapons::Blaster(), DefaultWeapons::Blaster(), WeaponVMega::Backfire::Weapon(), null, DefaultWeapons::Blaster(), SzmolWeaponPack::PetrolBomb::Weapon(), DefaultWeapons::Blaster()}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "mo4a_1-4.j2l" ///@MLLE-Generated
  4. #include "petrolBomb.asc" ///@MLLE-Generated
  5. #pragma require "petrolBomb.asc" ///@MLLE-Generated
  6. #include "WeaponVMega5.asc" ///@MLLE-Generated
  7. #pragma require "WeaponVMega5.asc" ///@MLLE-Generated
  8. #include "MLLE-DefaultWeapons.asc" ///@MLLE-Generated
  9. #pragma require "MLLE-DefaultWeapons.asc" ///@MLLE-Generated
  10. #include "HH18savegems.asc"
  11. #include "Jazz1Enemies v05.asc"
  12. #include "Resize v11.asc"
  13. #include "TrueColor v13.asc"
  14. int frozen = 0;
  15. int CountlessDoubleJumps = 0;
  16. bool Boss=false, control = true;  
  17. jjOBJ@ stolenbullets;
  18.  
  19.  
  20. void onLevelLoad()  {  
  21.         jjWaterLighting = WATERLIGHT::GLOBAL;
  22.         gem::restorePlayerGems();
  23.         jjLevelName = ("@@@@@@@@@Temple of Sun");
  24.         jjObjectPresets[OBJECT::SAVEPOST].behavior = CheckpointWrapper;
  25.         jjObjectPresets[OBJECT::SAVEPOST].deactivates = false;
  26.  
  27.         jjObjectPresets[OBJECT::GRASSPLATFORM].scriptedCollisions = true;
  28.         jjObjectPresets[OBJECT::GRASSPLATFORM].behavior = SpikeBump();
  29.         jjObjectPresets[OBJECT::GRASSPLATFORM].deactivates = false;
  30.  
  31.         jjObjectPresets[OBJECT::BOLLPLATFORM].energy = 8;
  32.         jjObjectPresets[OBJECT::BOLLPLATFORM].behavior = Boulder();
  33.  
  34.         jjObjectPresets[OBJECT::ROTATINGROCK].behavior = FallingBoulder;
  35.         jjObjectPresets[OBJECT::ROTATINGROCK].scriptedCollisions = true;
  36.  
  37.         jjObjectPresets[OBJECT::SPARK].behavior = Flame;
  38.         jjObjectPresets[OBJECT::SPARK].bulletHandling = HANDLING::IGNOREBULLET;
  39.         jjObjectPresets[OBJECT::SPARK].playerHandling = HANDLING::ENEMYBULLET;
  40.         jjObjectPresets[OBJECT::SPARK].animSpeed = 1;
  41.         jjObjectPresets[OBJECT::SPARK].state = STATE::FLOAT;
  42.         jjObjectPresets[OBJECT::SPARK].lightType = LIGHT::POINT;
  43.         jjObjectPresets[OBJECT::SPARK].points =0;
  44.         jjObjectPresets[OBJECT::SPARK].light =55;
  45.         jjObjectPresets[OBJECT::SPARK].isTarget=false;
  46.         jjObjectPresets[OBJECT::SPARK].scriptedCollisions=true;
  47.        
  48.         jjObjectPresets[OBJECT::BILSY].energy = 100;
  49.         jjObjectPresets[OBJECT::BILSY].behavior = FlamingTotem();
  50.         jjObjectPresets[OBJECT::BILSY].bulletHandling = HANDLING::HURTBYBULLET;
  51.         jjObjectPresets[OBJECT::BILSY].state = STATE::FLOAT;
  52.         jjObjectPresets[OBJECT::BILSY].deactivates = false;
  53.         jjObjectPresets[OBJECT::BILSY].playerHandling = HANDLING::ENEMY;
  54.         jjObjectPresets[OBJECT::BILSY].scriptedCollisions = true;
  55.  
  56.         jjObjectPresets[OBJECT::TUFTURT].behavior = Tuf;
  57.         jjObjectPresets[OBJECT::TUFTURT].determineCurAnim(ANIM::TUFBOSS, 5);
  58.         jjObjectPresets[OBJECT::TUFTURT].playerHandling = HANDLING::ENEMY;
  59.         jjObjectPresets[OBJECT::TUFTURT].bulletHandling = HANDLING::HURTBYBULLET;
  60.         jjObjectPresets[OBJECT::TUFTURT].energy = 30;
  61.         jjObjectPresets[OBJECT::TUFTURT].deactivates = false;
  62.  
  63.         jjObjectPresets[OBJECT::TACO].behavior = Ammo();
  64.         jjObjectPresets[OBJECT::TACO].scriptedCollisions = true;
  65.  
  66.         jjObjectPresets[OBJECT::AIRBOARD].behavior = Key();
  67.         jjObjectPresets[OBJECT::AIRBOARD].scriptedCollisions = true;
  68.  
  69.         jjObjectPresets[OBJECT::WEENIE].behavior = Key2();
  70.         jjObjectPresets[OBJECT::WEENIE].scriptedCollisions = true;
  71.  
  72.         jjObjectPresets[OBJECT::TURTLESHELL].behavior = Key4();
  73.         jjObjectPresets[OBJECT::TURTLESHELL].scriptedCollisions = true;
  74.  
  75.         Jazz1::MakeEnemy(OBJECT::FLOATSUCKER, Jazz1::Enemies::Jungrock_RedBuzzer).SetUsesJJ2StyleDeathAnimation(true);
  76.         Jazz1::MakeEnemy(OBJECT::LIZARD, Jazz1::Enemies::Holidaius_SnowMonkey).SetUsesJJ2StyleDeathAnimation(true);
  77.         Jazz1::MakeEnemy(OBJECT::SUCKER, Jazz1::Enemies::Turtemple_ScorpWeenie).SetUsesJJ2StyleDeathAnimation(true);
  78.         Jazz1::MakeEnemy(OBJECT::HATTER, Jazz1::Enemies::Crysilis_LooGuard).SetUsesJJ2StyleDeathAnimation(true).SetBulletFireSound(SOUND::BUBBA_FROG2).SetBulletExplosionSound(SOUND::COMMON_GUNSM1);
  79.  
  80.         jjObjectPresets[OBJECT::BURGER].scriptedCollisions = true;
  81.         jjObjectPresets[OBJECT::BURGER].behavior = Fire();
  82.         jjObjectPresets[OBJECT::BURGER].playerHandling = HANDLING::SPECIAL;
  83.         jjObjectPresets[OBJECT::CHICKENLEG].scriptedCollisions = true;
  84.         jjObjectPresets[OBJECT::CHICKENLEG].behavior = Fire2();
  85.         jjObjectPresets[OBJECT::CHICKENLEG].playerHandling = HANDLING::SPECIAL;
  86.  
  87.  
  88.         jjObjectPresets[OBJECT::FASTFEET].behavior = CountlessJumps();
  89.         jjObjectPresets[OBJECT::FASTFEET].scriptedCollisions = true;
  90.  
  91.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::GEMBARREL].curAnim];
  92.         anim.frameCount = 1;
  93.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  94.         jjPIXELMAP vase(0, 5*32, 1*32, 1*32, 5);
  95.         vase.save(frame);
  96.  
  97.         jjObjectPresets[OBJECT::FREEZEENEMIES].behavior = TimeFreezer();
  98.         jjObjectPresets[OBJECT::FREEZEENEMIES].scriptedCollisions = true;
  99.  
  100. }
  101. bool fall = false;
  102. void FallingBoulder(jjOBJ@ obj) {
  103.         if(fall == true){
  104.                 obj.behave(BEHAVIOR::ROTATINGROCK, false);
  105.                 obj.beSolid();
  106.                 }
  107.         if(obj.ySpeed >0 && jjTriggers[3]==false)
  108.         {p.cameraFreeze(64*32, 50*32,true,false);
  109.         control = false;}
  110.         if(obj.yPos>49*32)
  111.                 {if(jjTriggers[3]==false)
  112.                         {jjAddObject(OBJECT::ELECTROBULLET, 62*32, 51*32);}
  113.                 jjTriggers[3] = true;
  114.                 control = true;
  115.                 p.cameraUnfreeze();
  116.                 obj.delete();
  117.                 jjSample(obj.xPos, obj.yPos, SOUND::ROCK_ROCK1, 1000);}
  118.         if(obj.xPos<52*32 && obj.yPos >46*32)
  119.                 {jjAddObject(OBJECT::BOLLPLATFORM, 1750, 849);
  120.                 obj.delete();
  121.                 jjTriggers[4] = false;}
  122.        
  123.         if(obj.yPos > 53*32)
  124.                 {obj.delete();
  125.                 obj.behave(BEHAVIOR::EXPLOSION2);}
  126.                 obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  127.                 obj.determineCurFrame();
  128.  
  129.                 jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 2, 2, SPRITE::PALSHIFT, 16);
  130.                
  131.                
  132. }
  133.  
  134. int spring = 0;
  135. bool spike = false;
  136. class SpikeBump : jjBEHAVIORINTERFACE {
  137.  
  138. void onBehave(jjOBJ@ obj) {
  139.  
  140.         switch (obj.state) {
  141.                 case STATE::START:
  142.                         obj.determineCurFrame();
  143.                         obj.state = STATE::FLY;
  144.                         obj.direction = obj.xSpeed = 2;
  145.  
  146.                 case STATE::FLY:
  147.                         obj.playerHandling = HANDLING::SPECIAL;
  148.                         obj.xPos = obj.xPos + obj.xSpeed;
  149.                         obj.deactivates = false;
  150.                         if (jjMaskedVLine(obj.xSpeed > 0 ? obj.xPos + 16 : obj.xPos - 16, obj.yPos, 1)) {
  151.                                 obj.direction = obj.xSpeed = -obj.xSpeed;
  152.                         }
  153.                        
  154.                         if(obj.xPos > p.xPos + 64 || obj.xPos < p.xPos - 64 || obj.yPos > p.yPos + 64 || obj.yPos < p.yPos - 64)
  155.                         {obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  156.                         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -8);
  157.                         obj.determineCurFrame();}
  158.                         else {jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);}
  159.                         break;
  160.  
  161.                
  162.         }
  163. }
  164.  
  165.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  166.                 if(bullet is null && play !is null && (force == -1 || force == 1))
  167.                         {spring = jjGameTicks + 1*61;
  168.                         obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  169.                         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -24);
  170.                         obj.determineCurFrame();
  171.                         p.buttstomp = 121;
  172.                         jjSample(obj.xPos, obj.yPos, SOUND::PINBALL_BELL, 1000);}
  173.                 if(force == 0 && spring < jjGameTicks)
  174.                         {play.hurt();
  175.                         obj.determineCurAnim(ANIM::SPIKEBOLL, 0);  
  176.                         obj.determineCurFrame();
  177.                         if(spike == false)
  178.                         {jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 1000);}
  179.                         spike = true;}
  180.                 return true;
  181.                 }
  182.  
  183. }
  184.  
  185.  
  186. class Boulder : jjBEHAVIORINTERFACE {
  187.  
  188.         void onBehave(jjOBJ@ obj) {
  189.                 if(jjTriggers[3]==true)
  190.                         {obj.delete();}
  191.                 obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  192.                 obj.bulletHandling = HANDLING::HURTBYBULLET;
  193.                 obj.beSolid();
  194.                 obj.determineCurFrame();
  195.                 obj.behave(BEHAVIOR::PLATFORM, false);
  196.                 if(obj.justHit == 0)
  197.                 {jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 2, 2, SPRITE::PALSHIFT, 16);}
  198.                 else {jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 2, 2, SPRITE::BRIGHTNESS, 200);}
  199.                 if(obj.energy == 0)
  200.                 {jjAddObject(OBJECT::ROTATINGROCK, obj.xPos, obj.yPos);
  201.                 jjTriggers[4] = true;
  202.                 p.showText("@@It's free.@Now it's needs one last push.");
  203.                 jjSample(obj.xPos, obj.yPos, SOUND::ROCK_ROCK1, 1000);
  204.                 fall = true;
  205.                 obj.behave(BEHAVIOR::EXPLOSION2);}
  206.  
  207.  
  208.         }
  209. }
  210.  
  211.  
  212. class Ammo : jjBEHAVIORINTERFACE {
  213.  
  214.         void onBehave(jjOBJ@ obj) {
  215.                 obj.behave(BEHAVIOR::PICKUP, false);
  216.                 obj.lightType = LIGHT::LASER;
  217.                 obj.light = 100;
  218.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::WEENIE].curAnim];
  219.         anim.frameCount = 1;
  220.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  221.         jjPIXELMAP pump(0, 3*32, 1*32, 1*32, 5);
  222.         pump.save(frame);
  223.                 ++obj.counter;
  224.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  225.                 obj.determineCurAnim(ANIM::AMMO, 22);
  226.                 obj.determineCurFrame();
  227.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  228. }
  229.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  230.                 p.noFire = false;
  231.                 jjTriggers[6] = true;
  232.                 obj.behave(BEHAVIOR::EXPLOSION2);
  233.                 obj.delete();
  234.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PICKUPW1, 1000);
  235.  
  236.                 return true;
  237.         }
  238. }
  239.  
  240. class TimeFreezer : jjBEHAVIORINTERFACE {
  241.  
  242.         void onBehave(jjOBJ@ obj) {
  243.                 obj.behave(BEHAVIOR::PICKUP);
  244.                 obj.lightType = LIGHT::LASER;
  245.                 obj.light = 100;
  246.  
  247. }
  248.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ p, int force) {          
  249.                 jjNxt();
  250.                 gem::saveGemData();
  251.                 jjTriggers[25] = true;
  252.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  253.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  254.  
  255.                 return true;
  256.         }
  257. }
  258.  
  259. class Fire2 : jjBEHAVIORINTERFACE{
  260.         void onBehave(jjOBJ@ enemy) {
  261.  
  262.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FIREBALLBULLET].curAnim];
  263.         anim.frameCount = 1;
  264.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  265.         jjPIXELMAP flame(0, 80*32, 1*32, 1*32, 5);
  266.         flame.save(frame);
  267.  
  268.         switch (enemy.state) {
  269.                 case STATE::START:
  270.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  271.                                 enemy.determineCurFrame();
  272.                         enemy.state = STATE::IDLE;
  273.                         break;
  274.                
  275.                 case STATE::IDLE:
  276.  
  277.                                 enemy.direction = -1;
  278.                         if ((jjRandom() & 91) == 0) {
  279.                                 enemy.state = STATE::ATTACK;
  280.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  281.                                 enemy.counter = 0;
  282.                                 enemy.frameID = 0;
  283.                                 jjSample(enemy.xPos, enemy.yPos, SOUND::COMMON_SWISH8);
  284.                         } else {
  285.                                 if (++enemy.counter > 4) {
  286.                                         enemy.counter = 0;
  287.                                         if (++enemy.frameID >= 91)
  288.                                                 enemy.frameID = 0;
  289.  
  290.                                 }
  291.                         }
  292.                         break;
  293.                 case STATE::ATTACK:
  294.  
  295.                         if (++enemy.counter > 6) {
  296.                                 enemy.counter = 0;
  297.                                 if (++enemy.frameID >= 91) {
  298.                                         enemy.state = STATE::IDLE;
  299.                                         enemy.frameID = 0;
  300.                                 } else if (enemy.frameID ==1) {
  301.                                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::FIREBALLBULLET)];
  302.                                                
  303.                                         frame.hotSpotX = -32;
  304.                                         obj.playerHandling = HANDLING::PLAYERBULLET;
  305.                                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  306.                                         obj.lightType = LIGHT::POINT;
  307.                                         obj.xPos = enemy.xPos-62;
  308.                                         obj.yPos = enemy.yPos-12;      
  309.                                         obj.xAcc = .12;
  310.                                         int xspeed = (jjRandom() & 3);
  311.                                         obj.xSpeed = -19 - xspeed;
  312.                                         int yspeed = (jjRandom() & 6);
  313.                                         obj.ySpeed = yspeed + 8* p.direction;
  314.                                         obj.counterEnd = 155;
  315.                                 }
  316.                                 enemy.determineCurFrame();
  317.                         }
  318.                         break;
  319.                 case STATE::FREEZE:
  320.                 enemy.playerHandling = HANDLING::PLAYERBULLET;
  321.                 enemy.behavior = BEHAVIOR::BURNING;
  322.                 enemy.delete();
  323.                 break;
  324.                 case STATE::DEACTIVATE:
  325.                 case STATE::KILL:
  326.                         enemy.delete();
  327.                         break;
  328.         }
  329.  
  330.                 jjDrawRotatedSpriteFromCurFrame(enemy.xPos-5, enemy.yPos, enemy.curFrame, 270, 1, -1, SPRITE::NORMAL);
  331.  
  332.         }
  333.        
  334.         bool onObjectHit(jjOBJ@ enemy, jjOBJ@ bullet, jjPLAYER@ p, int force) {
  335.                 if (force == 0 || force == -1)
  336.                 {p.hurt();}
  337.                 else if (bullet.var[3] == WEAPON::ICE)
  338.                 {enemy.behavior = BEHAVIOR::EXPLOSION;
  339.                 enemy.state = STATE::FREEZE;
  340.                 enemy.delete();
  341.                 bullet.delete();}
  342.         return true;
  343.         }
  344. }
  345.  
  346.  
  347. class Fire : jjBEHAVIORINTERFACE{
  348.         void onBehave(jjOBJ@ enemy) {
  349.  
  350.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FIREBALLBULLET].curAnim];
  351.         anim.frameCount = 1;
  352.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  353.         jjPIXELMAP flame(0, 80*32, 1*32, 1*32, 5);
  354.         flame.save(frame);
  355.  
  356.         switch (enemy.state) {
  357.                 case STATE::START:
  358.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  359.                                 enemy.determineCurFrame();
  360.                         enemy.state = STATE::IDLE;
  361.                         break;
  362.                
  363.                 case STATE::IDLE:
  364.  
  365.                                 enemy.direction = 1;
  366.                         if ((jjRandom() & 91) == 0) {
  367.                                 enemy.state = STATE::ATTACK;
  368.                                 enemy.determineCurAnim(ANIM::AMMO, 55);
  369.                                 enemy.counter = 0;
  370.                                 enemy.frameID = 0;
  371.                                 jjSample(enemy.xPos, enemy.yPos, SOUND::COMMON_SWISH8);
  372.                         } else {
  373.                                 if (++enemy.counter > 4) {
  374.                                         enemy.counter = 0;
  375.                                         if (++enemy.frameID >= 91)
  376.                                                 enemy.frameID = 0;
  377.  
  378.                                 }
  379.                         }
  380.                         break;
  381.                 case STATE::ATTACK:
  382.  
  383.                         if (++enemy.counter > 6) {
  384.                                 enemy.counter = 0;
  385.                                 if (++enemy.frameID >= 91) {
  386.                                         enemy.state = STATE::IDLE;
  387.                                         enemy.frameID = 0;
  388.                                 } else if (enemy.frameID ==1) {
  389.                                         jjOBJ@ obj = jjObjects[enemy.fireBullet(OBJECT::FIREBALLBULLET)];
  390.                                                
  391.                                         frame.hotSpotX = -32;
  392.                                         obj.playerHandling = HANDLING::PLAYERBULLET;
  393.                                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  394.                                         obj.lightType = LIGHT::POINT;
  395.                                         obj.xPos = enemy.xPos+62;
  396.                                         obj.yPos = enemy.yPos-12;      
  397.                                         obj.xAcc = .12;
  398.                                         int xspeed = (jjRandom() & 3);
  399.                                         obj.xSpeed = 19 + xspeed;
  400.                                         int yspeed = (jjRandom() & 6);
  401.                                         obj.ySpeed = yspeed -8* p.direction;
  402.                                         obj.counterEnd = 155;
  403.                                 }
  404.                                 enemy.determineCurFrame();
  405.                         }
  406.                         break;
  407.                 case STATE::FREEZE:
  408.                 enemy.playerHandling = HANDLING::PLAYERBULLET;
  409.                 enemy.behavior = BEHAVIOR::BURNING;
  410.                 enemy.delete();
  411.                 break;
  412.                 case STATE::DEACTIVATE:
  413.                 case STATE::KILL:
  414.                         enemy.delete();
  415.                         break;
  416.         }
  417.  
  418.                 jjDrawRotatedSpriteFromCurFrame(enemy.xPos-5, enemy.yPos, enemy.curFrame, 270, 1, -1, SPRITE::NORMAL);
  419.  
  420.         }
  421.        
  422.         bool onObjectHit(jjOBJ@ enemy, jjOBJ@ bullet, jjPLAYER@ p, int force) {
  423.                 if (force == 0 || force == -1)
  424.                 {p.hurt();}
  425.                 else if (bullet.var[3] == WEAPON::ICE)
  426.                 {enemy.behavior = BEHAVIOR::EXPLOSION;
  427.                 enemy.state = STATE::FREEZE;
  428.                 enemy.delete();
  429.                 bullet.delete();}
  430.         return true;
  431.         }
  432. }
  433.  
  434. class CountlessJumps : jjBEHAVIORINTERFACE {
  435.         void onBehave(jjOBJ@ obj) {
  436.                 obj.deactivates = true;
  437.                 obj.behave(BEHAVIOR::PICKUP, false);
  438.                 obj.determineCurAnim(ANIM::PICKUPS, 33);
  439.                 ++obj.counter;
  440.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  441.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 16);
  442.  
  443. }
  444.  
  445.         bool onObjectHit(jjOBJ@ obj, jjOBJ@, jjPLAYER@ play, int force) {
  446.                 play.timerStart(3000);
  447.                 p.morphTo(CHAR::SPAZ);
  448.                 CountlessDoubleJumps = jjGameTicks + 55 * 61;
  449.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  450.                 obj.frameID = 0;
  451.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PICKUP1, 6000);
  452.  
  453.                 return true;
  454.         }
  455.  
  456. }
  457.  
  458. class Key : jjBEHAVIORINTERFACE {
  459.  
  460.         void onBehave(jjOBJ@ obj) {
  461.                 obj.behave(BEHAVIOR::PICKUP, false);
  462.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::AIRBOARD].curAnim];
  463.         anim.frameCount = 1;
  464.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  465.         jjPIXELMAP pump(0, 0*32, 1*32, 1*32, 5);
  466.         pump.save(frame);
  467.                 ++obj.counter;
  468.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  469.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  470. }
  471.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  472.                 jjTriggers[9] = true;
  473.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  474.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  475.  
  476.                 return true;
  477.         }
  478. }
  479.  
  480.  
  481. class Key2 : jjBEHAVIORINTERFACE {
  482.  
  483.         void onBehave(jjOBJ@ obj) {
  484.                 obj.behave(BEHAVIOR::PICKUP, false);
  485. jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::WEENIE].curAnim];
  486.         anim.frameCount = 1;
  487.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  488.         jjPIXELMAP pump(0, 1*32, 1*32, 1*32, 5);
  489.         pump.save(frame);
  490.                 ++obj.counter;
  491.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  492.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  493. }
  494.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  495.                 jjTriggers[16] = true;
  496.                 jjTriggerRock(3);
  497.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  498.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  499.  
  500.                 return true;
  501.         }
  502. }
  503.  
  504. class Key4 : jjBEHAVIORINTERFACE {
  505.  
  506.         void onBehave(jjOBJ@ obj) {
  507.                 obj.behave(BEHAVIOR::PICKUP, false);
  508.  
  509. jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::TURTLESHELL].curAnim];
  510.         anim.frameCount = 1;
  511.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  512.         jjPIXELMAP pump(0, 3*32, 1*32, 1*32, 5);
  513.         pump.save(frame);
  514.                 ++obj.counter;
  515.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  516.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::NORMAL);
  517. }
  518.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  519.                 jjTriggers[30] = true;
  520.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  521.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  522.  
  523.                 return true;
  524.         }
  525. }
  526.  
  527.  
  528. void onFunction0(jjPLAYER@ p) {
  529.         if(jjTriggers[4]==false)
  530.         p.showText("@@Doesn't move.@It has chained.");
  531. }
  532.  
  533. void onFunction1(jjPLAYER@ p) {
  534.                 jjMusicLoad("mo4a_ The Lava Stream (Reprise 2).ogg");
  535.                 p.bossActivated = false;
  536.         for (int i = 1; i < jjObjectCount; i++) {
  537.                 jjOBJ@ o = jjObjects[i]; jjOBJ@ ob = jjObjects[i];
  538.                 if (o.isActive && o.eventID == OBJECT::DEMON){
  539.                         o.state = STATE::KILL;  o.delete();}
  540.                 if (ob.isActive && ob.eventID == OBJECT::FENCER){
  541.                         ob.state = STATE::KILL; ob.delete();}
  542.         }
  543. }
  544.  
  545. bool heavytext = false;
  546.  
  547. void onFunction2(jjPLAYER@ p) {
  548.         if(jjTriggers[3]==false && heavytext == false)
  549.                 {p.showText("@@No switches around...@Maybe I can break the trapdoor@with a heavy object.");
  550.                 heavytext = true;}
  551. }
  552.  
  553. void onFunction3(jjPLAYER@ p) {
  554.                 p.timerStop();
  555.                 CountlessDoubleJumps = 0;
  556.                 jjTriggers[1] = true;
  557. }
  558.  
  559.  
  560. void onFunction6(jjPLAYER@ p) {
  561.                 jjMusicLoad("mo4a_Doc's Cave.ogg");
  562.                 p.activateBoss();
  563.                 jjTriggers[13] = true;
  564.                 p.cameraFreeze(119*32, 88*32, true, false);
  565.                 jjEnabledASFunctions[6] = false;
  566. }
  567.  
  568. void onFunction5(jjPLAYER@ p) {
  569.                
  570.                 jjMusicLoad("mo4a_Doc's Cave.ogg");}
  571.  
  572. void onMain() {
  573. gem::deleteCollectedGems();
  574. if(jjKey[9] && jjKey[0x51]) {
  575. p.morphTo(CHAR::JAZZ, false);
  576. }
  577. if(jjKey[9] && jjKey[0x57]) {
  578. p.morphTo(CHAR::SPAZ, false);
  579. }
  580. if(jjKey[9] && jjKey[0x45]) {
  581. p.morphTo(CHAR::LORI, false);
  582. }
  583. }
  584.  
  585. bool startrush = false, readytorush = false;
  586.  
  587. void onPlayer(jjPLAYER@ p) {
  588.  
  589.                 if(control==false)
  590.                 {p.keyLeft = false;
  591.                 p.keyRight = false;
  592.                 p.keyDown = false;}
  593.  
  594.                 if(p.idle > 100 && p.xPos <40*32)
  595.                 {p.cameraUnfreeze(true);
  596.                 control=true;}
  597.                 else if (p.idle > 5 && p.xPos <40*32 && (p.keyLeft || p.keyRight || p.keyJump || p.keyFire))
  598.                 {p.cameraUnfreeze(true);
  599.                 control=true;
  600.                 spike = false;}
  601.  
  602.         gem::trackPlayerGems(p);
  603.         gem::upgradeHealth(p);
  604.         if(p.coins == 0)
  605.                 {p.coins += 3;}
  606.         if(spring > jjGameTicks)
  607.                 {p.ySpeed = -10;}
  608.  
  609.         for (int i = 1; i < jjObjectCount; i++) {
  610.                 jjOBJ@ o = jjObjects[i];
  611.                 if (o.isActive && o.eventID == OBJECT::SEEKERAMMO3 && p.ammo[WEAPON::SEEKER] < 1) {
  612.                         o.state = STATE::KILL;}
  613.         }
  614.         for (int i = 1; i < jjObjectCount; i++) {
  615.                 jjOBJ@ o = jjObjects[i];
  616.                 if (o.isActive && o.eventID == OBJECT::RFAMMO3 && p.ammo[WEAPON::RF] < 1) {
  617.                         o.state = STATE::KILL;}
  618.         }
  619.         for (int i = 1; i < jjObjectCount; i++) {
  620.                 jjOBJ@ o = jjObjects[i];
  621.                 if (o.isActive && o.eventID == OBJECT::TNTAMMO3 && p.ammo[WEAPON::TNT] < 1) {
  622.                         o.state = STATE::KILL;}
  623.         }
  624.         for (int i = 1; i < jjObjectCount; i++) {
  625.                 jjOBJ@ o = jjObjects[i];
  626.                 if (o.isActive && o.eventID == OBJECT::GUN9AMMO3 && p.ammo[WEAPON::GUN9] < 1) {
  627.                         o.state = STATE::KILL;}
  628.         }
  629.         for (int i = 1; i < jjObjectCount; i++) {
  630.                 jjOBJ@ o = jjObjects[i];
  631.                 if (o.isActive && o.eventID == OBJECT::SEEKERPOWERUP && p.ammo[WEAPON::SEEKER] < 1) {
  632.                         o.state = STATE::KILL;}
  633.         }
  634.         for (int i = 1; i < jjObjectCount; i++) {
  635.                 jjOBJ@ o = jjObjects[i];
  636.                 if (o.isActive && o.eventID == OBJECT::RFPOWERUP && p.ammo[WEAPON::RF] < 1) {
  637.                         o.state = STATE::KILL;}
  638.         }
  639.         for (int i = 1; i < jjObjectCount; i++) {
  640.                 jjOBJ@ o = jjObjects[i];
  641.                 if (o.isActive && o.eventID == OBJECT::TNTPOWERUP && p.ammo[WEAPON::TNT] < 1) {
  642.                         o.state = STATE::KILL;}
  643.         }
  644.         for (int i = 1; i < jjObjectCount; i++) {
  645.                 jjOBJ@ o = jjObjects[i];
  646.                 if (o.isActive && o.eventID == OBJECT::GUN9POWERUP && p.ammo[WEAPON::GUN9] < 1) {
  647.                         o.state = STATE::KILL;}
  648.         }
  649.  
  650. if(frozen > jjGameTicks)
  651. {p.direction =-1;
  652. p.keyUp = p.keyDown = p.keyLeft = p.keyRight = p.keyRun = false;}
  653.  
  654.  
  655.  
  656.  
  657. p.lightType = LIGHT::NONE;
  658. if (CountlessDoubleJumps > jjGameTicks && p.keyJump) {
  659.         p.doubleJumpCount = 0;}
  660. if (p.health == 0){
  661.         CountlessDoubleJumps  = 0;
  662. }
  663.  
  664.  
  665. if (p.yPos > jjWaterLevel) {
  666. p.health = 0;}
  667.  
  668.  
  669.         if(p.keyUp && p.xPos > 33*32 && p.xPos < 35*32 && p.yPos <38*32 && p.yPos >35*32) {
  670.                 if(jjTriggers[18]==false)
  671.                 {jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  672.                 jjTriggers[18] = true;
  673.                 p.cameraFreeze(64*32, 105*32, true, false);
  674.                 control = false;}
  675.                 }
  676.  
  677.         if(p.keyUp && p.xPos > 78*32 && p.xPos < 82*32 && p.yPos <28*32 && jjTriggers[5]==false) {
  678.                 jjTriggers[5] = true;
  679.                 jjSample(p.xPos, p.yPos, SOUND::INTRO_MONSTER2);
  680.                 }
  681.  
  682.                
  683.  
  684. }
  685. int i, c=0,u=0;
  686.  
  687.  
  688. void Tuf(jjOBJ@ enemy) {
  689.         if (enemy.energy <= 0) {
  690.                 enemy.state = STATE::KILL;
  691.                 p.showText("@@Wait! What?");
  692.                 jjTriggers[17] = true;
  693.                 enemy.delete();
  694.                 {p.boss=jjAddObject(OBJECT::BILSY, 119*32, 88*32);}
  695.                 jjOBJ@ boss = jjObjects[p.boss];
  696.                 }
  697.         else    {enemy.behave(BEHAVIOR::TUFBOSS);}
  698. }
  699.  
  700. class FlamingTotem : jjBEHAVIORINTERFACE {
  701.  
  702.         void onBehave(jjOBJ@ boss) {
  703.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BILSY].curAnim];
  704.         anim.frameCount = 1;
  705.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  706.         jjPIXELMAP totem(0, 6*32, 1*32, 2*32, 5);
  707.         totem.save(frame);
  708.         boss.lightType = LIGHT::FLICKER;
  709.  
  710.         if (boss.energy <=0)
  711.                 {boss.state = STATE::KILL;
  712.                 boss.delete();
  713.                 jjTriggers[20] = true;
  714.         }
  715.                         boss.xPos = jjSin(boss.counter*2)*170 + boss.xOrg;
  716.                         boss.yPos = jjSin(boss.counter*4)*40 + boss.yOrg;              
  717.  
  718.         if (boss.energy > 0) switch (boss.state) {
  719.                 case STATE::FLOAT:
  720.                         ++boss.counter;
  721.  
  722.  
  723.                         boss.determineCurFrame();      
  724.                         //if (boss.findNearestPlayer(4096*3040) > -1)
  725.                         if (++boss.counter > 900)
  726.                                 {boss.state = STATE::ATTACK;}
  727.                         break;
  728.  
  729.          case STATE::ATTACK:
  730.  
  731.          ++boss.counter;
  732.          if (boss.counter == 1)
  733.          {jjSample(boss.xPos, boss.yPos, SOUND::INTRO_GREN1);}
  734.          
  735.          boss.direction = (p.xPos < boss.xPos) ? -1 : 1;
  736.  
  737.                 if (jjRandom() & 1 == 0 && jjDifficulty<3) {
  738.  
  739.         jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::NORMAL);
  740.                 frame.hotSpotX = -1;
  741.                         jjOBJ@ obj = jjObjects[boss.fireBullet(OBJECT::SPARK)];
  742.                         obj.determineCurAnim(ANIM::AMMO,55);
  743.                          jjSample(obj.xPos, obj.yPos, SOUND::SONCSHIP_SHIPLOOP);
  744.                         obj.determineCurFrame();       
  745.                         obj.yPos = boss.yPos+50;
  746.                         obj.xPos = boss.xPos;
  747.                 }
  748.  
  749.  
  750.                 boss.determineCurFrame();
  751.                 boss.frameID = boss.counter/50;
  752.                 boss.counter += 5;
  753.                
  754.                 boss.xPos = jjSin(boss.counter/3*c)*3*c + boss.xPos;
  755.                 boss.yPos = jjCos(boss.counter/2*c)*c + boss.yPos;
  756.  
  757.        
  758.         if (++boss.counter > 3000)
  759.         {
  760.         boss.xAcc= boss.yAcc =0;
  761.         boss.state = STATE::ACTION;
  762.         boss.counter =0; }     
  763.                
  764.                
  765.         break; 
  766.        
  767.         case STATE::ACTION:
  768.                 if (++boss.counter < 100) {
  769.  
  770.         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BILSY].curAnim];
  771.         anim.frameCount = 1;
  772.         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  773.         jjPIXELMAP totem(0, 8*32, 1*32, 2*32, 5);
  774.         totem.save(frame);
  775.  
  776.         jjDrawSpriteFromCurFrame(boss.xPos, boss.yPos, boss.curFrame, boss.direction, SPRITE::TRANSLUCENTPALSHIFT, -8);
  777.         {jjSample(boss.xPos, boss.yPos, SOUND::COMMON_LOADJAZZ);}
  778.  
  779.                 boss.frameID = boss.counter / 20;
  780.                 boss.determineCurFrame();              
  781.                 boss.yPos = jjSin(boss.counter*9)*60 + boss.yOrg;}
  782.         else {
  783.                 {boss.state = STATE::FLOAT;}
  784.                 boss.counter=0;
  785.                 }
  786.                
  787.                 break;
  788.  
  789.         }
  790.         boss.draw();
  791.         }
  792.  
  793. }
  794.        
  795.         void Flame(jjOBJ@ enemy) {
  796.         if (enemy.state== STATE::FLOAT) {
  797.                 enemy.behave(BEHAVIOR::SPARK);
  798.                 ++enemy.counter;
  799.                 if (enemy.counter >200)
  800.                                 enemy.delete();
  801.         } else
  802.                 enemy.delete();
  803.        
  804.         }
  805.  
  806.  
  807.  
  808.  
  809.  
  810. array<bool> SavedTriggers(32, false);
  811. //Extendable Checkpoints by VioletCLM
  812. void CheckpointWrapper(jjOBJ@ obj) {
  813.   if (obj.state == STATE::STOP) { //don't do anything anymore
  814.     jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  815.   } else if (obj.state == STATE::DEACTIVATE) { //due to death
  816.     obj.deactivate();
  817.   } else {
  818.     obj.behave(BEHAVIOR::CHECKPOINT);
  819.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  820.     if (obj.state == STATE::DONE) { //triggered by the player hitting it
  821.       obj.state = STATE::STOP;
  822.       //save the current state of some properties
  823.       for (uint i = 0; i < 32; ++i)
  824.         SavedTriggers[i] = jjTriggers[i];
  825.  
  826.       //OPTIONAL: this loop makes checkpoints reusable, so only the most recent checkpoint you touched is ever active
  827.       for (int i = jjObjectCount; --i > 0;) {
  828.         jjOBJ@ obj2 = jjObjects[i];
  829.         if (obj2.eventID == OBJECT::CHECKPOINT && i != obj.objectID && obj2.isActive) {
  830.           obj2.state = STATE::SLEEP;
  831.           obj2.var[0] = 0;
  832.         }
  833.       }
  834.     }
  835.   }
  836. }
  837.  
  838. bool onDrawHealth(jjPLAYER@ player, jjCANVAS@ canvas) {
  839.  
  840.     return false;
  841. }
  842.  
  843. bool onDrawLives(jjPLAYER@ player, jjCANVAS@ canvas) {return true;}
  844.  
  845. void onLevelReload() {
  846.         gem::restorePlayerGems();
  847.         jjLocalPlayers[0].lives++;
  848.         jjEnabledASFunctions[20] = true;
  849.         jjWaterLighting = WATERLIGHT::GLOBAL;
  850.         jjEnabledASFunctions[6] = true;
  851.         for (uint i = 0; i < 32; ++i)
  852.         jjTriggers[i] = SavedTriggers[i]; //although this example uses jjTriggers, other things should work as well
  853.  
  854. }
  855. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  856.         return MLLE::WeaponHook.drawAmmo(player, canvas);
  857. }
  858.  
  859. void onReceive(jjSTREAM&in packet, int fromClientID) {
  860.         MLLE::WeaponHook.processPacket(packet, fromClientID);
  861. }
  862.