Downloads containing mo4a_2-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, SzmolWeaponPack::MeleeSword::Weapon(), DefaultWeapons::Blaster(), WeaponVMega::Backfire::Weapon(), null, DefaultWeapons::Blaster(), null, ArcaneWeapons::MortarLauncher::Weapon()}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "mo4a_2-3-MLLE-Data-1.j2l" ///@MLLE-Generated
  4. #pragma require "mo4a_2-3.j2l" ///@MLLE-Generated
  5. #include "ArcaneWeapon4.asc" ///@MLLE-Generated
  6. #pragma require "ArcaneWeapon4.asc" ///@MLLE-Generated
  7. #include "WeaponVMega5.asc" ///@MLLE-Generated
  8. #pragma require "WeaponVMega5.asc" ///@MLLE-Generated
  9. #include "MLLE-DefaultWeapons.asc" ///@MLLE-Generated
  10. #pragma require "MLLE-DefaultWeapons.asc" ///@MLLE-Generated
  11. #include "meleeSword.asc" ///@MLLE-Generated
  12. #pragma require "meleeSword.asc" ///@MLLE-Generated
  13. #include "Jazz1Enemies v05.asc"
  14. #include "Resize v11.asc"
  15. #include "TrueColor v13.asc"
  16. int CountlessDoubleJumps = 0;
  17.  
  18.  
  19. void onLevelLoad()  {
  20.         jjSetWaterGradient(0, 10, 10, 0, 20, 20);
  21.         jjSetWaterLevel(2020, true);
  22.         jjWaterLighting = WATERLIGHT::GLOBAL;
  23.         gem::restorePlayerGems();
  24.  
  25.         jjLevelName = ("@@@@@@@@@Castle");
  26.         jjObjectPresets[OBJECT::SAVEPOST].behavior = CheckpointWrapper;
  27.         jjObjectPresets[OBJECT::SAVEPOST].deactivates = false;
  28.  
  29.         jjObjectPresets[OBJECT::SONICPLATFORM].behavior = SpikeBump();
  30.         jjObjectPresets[OBJECT::SONICPLATFORM].deactivates = false;
  31.  
  32.         jjObjectPresets[OBJECT::SILVERCOIN].behavior = PlatinCoin();
  33.         jjObjectPresets[OBJECT::SILVERCOIN].scriptedCollisions = true;
  34.  
  35.         jjObjectPresets[OBJECT::MOTH].behavior = Magic;
  36.  
  37.         jjObjectPresets[OBJECT::FRUITPLATFORM].behavior = HeavyObjectHanging();
  38.  
  39.         jjObjectPresets[OBJECT::BIGROCK].behavior = HeavyObjectFallen;
  40.         jjObjectPresets[OBJECT::BIGROCK].state = STATE::FALL;
  41.  
  42.         jjObjectPresets[OBJECT::FENCER].behavior = Thief();
  43.         jjObjectPresets[OBJECT::FENCER].playerHandling = HANDLING::SPECIAL;
  44.         jjObjectPresets[OBJECT::FENCER].scriptedCollisions = true;
  45.         jjObjectPresets[OBJECT::FENCER].energy=1;
  46.  
  47.         jjObjectPresets[OBJECT::FATCHICK].bulletHandling = HANDLING::HURTBYBULLET;
  48.         jjObjectPresets[OBJECT::FATCHICK].playerHandling = HANDLING::ENEMY;
  49.         jjObjectPresets[OBJECT::FATCHICK].behavior = Thief2;
  50.         jjObjectPresets[OBJECT::FATCHICK].scriptedCollisions = true;
  51.         jjObjectPresets[OBJECT::FATCHICK].energy=2;
  52.  
  53.         jjObjectPresets[OBJECT::WEENIE].behavior = Lamp();
  54.         jjObjectPresets[OBJECT::WEENIE].scriptedCollisions = true;
  55.  
  56.         jjObjectPresets[OBJECT::FREEZEENEMIES].behavior = Key();
  57.         jjObjectPresets[OBJECT::FREEZEENEMIES].scriptedCollisions = true;
  58.  
  59.         jjObjectPresets[OBJECT::APPLE].behavior = Carpet();
  60.         jjObjectPresets[OBJECT::APPLE].scriptedCollisions = true;
  61.  
  62.         jjObjectPresets[OBJECT::FASTFEET].behavior = CountlessJumps();
  63.         jjObjectPresets[OBJECT::FASTFEET].scriptedCollisions = true;
  64.  
  65.                 jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::GEMBARREL].curAnim];
  66.                 anim.frameCount = 1;  
  67.                 jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  68.                 jjPIXELMAP vase(0, 6*32, 1*32, 1*32, 4);
  69.                 vase.save(frame);
  70. }
  71.  
  72. class Carpet : jjBEHAVIORINTERFACE {
  73.         void onBehave(jjOBJ@ obj) {
  74.                 obj.behave(BEHAVIOR::PICKUP, true);
  75.                 jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::APPLE].curAnim];
  76.                 anim.frameCount = 1;  
  77.                 jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  78.                 jjPIXELMAP vase(0, 14*32, 2*32, 1*32, 4);
  79.                 vase.save(frame);
  80.                 ++obj.counter;
  81.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  82.         }
  83.  
  84. }
  85.  
  86. class Thief : jjBEHAVIORINTERFACE {
  87.         void onBehave(jjOBJ@ obj) {
  88.  
  89.                 obj.behave(BEHAVIOR::FENCER, false);
  90.                         obj.determineCurAnim(ANIM::FENCER, 0);
  91.                         obj.determineCurFrame();
  92.                         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 48);
  93.        
  94.         }
  95. bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  96.         if(play !is null && bullet is null)
  97.                 {obj.playerHandling = HANDLING::ENEMY;}
  98.         else if(bullet !is null)
  99.                         {jjAddObject(OBJECT::FATCHICK, obj.xPos, obj.yPos-32);}
  100.                
  101.         if(force == -1 || force == 1)
  102.                 {obj.playerHandling = HANDLING::ENEMY;}
  103.  
  104.         return true;
  105.         }
  106.  
  107. }
  108.  
  109.  
  110. void Thief2(jjOBJ@ obj) {
  111.  
  112.                         obj.putOnGround();
  113.                         obj.behave(BEHAVIOR::WALKINGENEMY, false);
  114.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 48);
  115.                         obj.determineCurAnim(ANIM::FENCER, 0);
  116.                         obj.determineCurFrame();
  117.                         obj.xSpeed = 5*obj.direction;
  118.                         if (jjMaskedVLine(obj.xSpeed > 0 ? obj.xPos + 16 : obj.xPos - 16, obj.yPos, 1))
  119.                                 {obj.direction = obj.xSpeed = -obj.xSpeed;}
  120.                 if(obj.justHit==0)
  121.                 {jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 48);}
  122.                 else obj.draw();
  123.  
  124. }
  125.  
  126. int spring = 0;
  127. class SpikeBump : jjBEHAVIORINTERFACE {
  128.  
  129. void onBehave(jjOBJ@ obj) {
  130.         switch (obj.state) {
  131.                 case STATE::START:
  132.  
  133.                         obj.determineCurFrame();
  134.                         obj.direction = obj.xSpeed = 2;
  135.                         obj.playerHandling = HANDLING::SPECIAL;
  136.                         obj.beSolid();
  137.                         obj.state = STATE::FLY;
  138.  
  139.                 case STATE::FLY:
  140.                         obj.yPos = jjSin(obj.counter*3 + 5)*2 + obj.yOrg;
  141.                         obj.beSolid();
  142.                         obj.deactivates = false;
  143.                         if (jjMaskedVLine(obj.xSpeed > 0 ? obj.xPos + 16 : obj.xPos - 16, obj.yPos, 1)) {
  144.                                 obj.direction = obj.xSpeed = -obj.xSpeed;
  145.                         }
  146.  
  147.                         if(obj.xPos > p.xPos + 64 || obj.xPos < p.xPos - 64 || obj.yPos > p.yPos + 64 || obj.yPos < p.yPos - 64)
  148.                         {obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  149.                         jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 1, 1, SPRITE::PALSHIFT, -8);
  150.                         obj.determineCurFrame();}
  151.                         else {jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 1, 1, SPRITE::PALSHIFT, -24);}
  152.                         break;
  153.  
  154.         }
  155. }
  156.  
  157. bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  158.         if(bullet is null && play !is null && (force == -1 || force == 1))
  159.                         {obj.behave(BEHAVIOR::PLATFORM, false);
  160.                         obj.determineCurAnim(ANIM::BOLLPLAT, 0);
  161.                         jjDrawResizedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 2, 1, SPRITE::PALSHIFT, -24);
  162.                         obj.determineCurFrame();
  163.                         obj.frameID = obj.counter/5;
  164.                         obj.beSolid();
  165.                         spring = jjGameTicks + 1*61;
  166.                         obj.determineCurFrame();
  167.  
  168.                         jjSample(obj.xPos, obj.yPos, SOUND::PINBALL_BELL, 1000);}
  169.         if(play !is null && force == 0)
  170.                         {play.hurt();
  171.                         obj.determineCurAnim(ANIM::SPIKEBOLL, 0);  
  172.                         obj.determineCurFrame();
  173.                         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 1000);}
  174.  
  175.         if(play is null && force > -2) {
  176.                         obj.determineCurAnim(ANIM::BOLLPLAT, 0);  
  177.                         obj.determineCurFrame();}
  178.                 return true;
  179. }
  180.  
  181. }
  182.  
  183. class HeavyObjectHanging : jjBEHAVIORINTERFACE {
  184.  
  185.         void onBehave(jjOBJ@ obj) {
  186.  
  187.                         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::FRUITPLATFORM].curAnim];
  188.                         anim.frameCount = 1;
  189.                         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  190.                         jjPIXELMAP rope(0, 7*32, 2*32, 4*32, 4);
  191.                         rope.save(frame);
  192.                         frame.hotSpotX = -30;
  193.                         obj.behave(BEHAVIOR::PLATFORM);
  194.                         if(obj.xPos > p.xPos+64 || obj.xPos < p.xPos -64)
  195.                         {obj.scriptedCollisions = false;}
  196.                         else                    obj.scriptedCollisions = true;
  197.  
  198.         }
  199.  
  200.  
  201.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  202.         if(play !is null && bullet !is null && bullet.var[3]==WEAPON::ICE)
  203.                 {obj.delete();
  204.                 jjAddObject(OBJECT::BIGROCK, 162*32, 51*32);}
  205.  
  206.         else if(p !is null && bullet !is null)
  207.                 {obj.scriptedCollisions = false;
  208.                 p.showText("@@Clever! But maybe something sharper...");}
  209.                 return true;
  210.         }
  211. }
  212.  
  213.  
  214. void onLevelReload() {
  215.         gem::restorePlayerGems();
  216.         jjLocalPlayers[0].lives++;
  217.         jjSetWaterGradient(0, 10, 10, 0, 20, 20);
  218.         jjSetWaterLevel(2020, true);
  219.         jjWaterLighting = WATERLIGHT::GLOBAL;
  220.         p.jumpStrength = -10;
  221.         for (uint i = 0; i < 32; ++i)
  222.                 jjTriggers[i] = SavedTriggers[i];
  223. }
  224.  
  225.  
  226. void HeavyObjectFallen(jjOBJ@ obj) {
  227.  
  228.         obj.behave(BEHAVIOR::BIGOBJECT);
  229.                         jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BIGROCK].curAnim];
  230.                         anim.frameCount = 1;
  231.                         jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  232.                         jjPIXELMAP rope(0, 11*32, 4*32, 2*32, 4);
  233.                         rope.save(frame);
  234.  
  235.         if(obj.yPos >= 55*32)
  236.         {jjTriggers[0]=true;
  237.         jjAddObject(OBJECT::ELECTROBULLET, 162*32, 56*32);
  238.         obj.behavior = BEHAVIOR::EXPLOSION2;
  239.         obj.counter = 0;
  240.                 if(obj.behavior == BEHAVIOR::EXPLOSION2 && obj.counter > 10)
  241.                 {obj.delete();}
  242.         }
  243. }
  244.  
  245. void onMain() {
  246. gem::deleteCollectedGems();
  247. if(jjKey[9] && jjKey[0x51]) {
  248. p.morphTo(CHAR::JAZZ, false);
  249. }
  250. if(jjKey[9] && jjKey[0x57]) {
  251. p.morphTo(CHAR::SPAZ, false);
  252. }
  253. if(jjKey[9] && jjKey[0x45]) {
  254. p.morphTo(CHAR::LORI, false);
  255. }
  256. }
  257.  
  258. int killWitch = 0;
  259. class RedPotion : jjBEHAVIORINTERFACE {
  260.  
  261.         void onBehave(jjOBJ@ obj) {
  262.                 obj.determineCurFrame();
  263.         obj.behave(BEHAVIOR::PICKUP, false);
  264.                 ++obj.counter;
  265.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  266.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -40);
  267. }
  268.  
  269.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ play, int force) {
  270.  
  271.                 play.jumpStrength = -10;
  272.                 jjCharacters[CHAR::JAZZ].groundJump=GROUND::JAZZ;
  273.                 jjCharacters[CHAR::SPAZ].groundJump=GROUND::SPAZ;
  274.                 jjCharacters[CHAR::LORI].groundJump=GROUND::LORI;
  275.                 jjSample(obj.xPos, obj.yPos, SOUND::WITCH_MAGIC, 3000);
  276.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_DRINKSPAZZ2, 1000);
  277.                 obj.frameID = 0;
  278.                 killWitch = 1;
  279.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  280.  
  281.  
  282.                 return true;
  283.         }
  284. }
  285.  
  286. class CountlessJumps : jjBEHAVIORINTERFACE {
  287.         void onBehave(jjOBJ@ obj) {
  288.  
  289. obj.behave(BEHAVIOR::PICKUP, false);
  290. obj.determineCurAnim(ANIM::PICKUPS, 33);
  291. ++obj.counter;
  292.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  293.  
  294.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 16);
  295.  
  296. }
  297.  
  298.         bool onObjectHit(jjOBJ@ obj, jjOBJ@, jjPLAYER@ play, int force) {
  299.                 play.timerStart(1500);
  300.                 p.morphTo(CHAR::SPAZ);
  301.                 CountlessDoubleJumps = jjGameTicks + 25 * 61;
  302.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  303.                 obj.frameID = 0;
  304.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_PICKUP1, 6000);
  305.  
  306.                 return true;
  307.         }
  308.  
  309. }
  310.  
  311.  
  312. bool textdisplayed = false, rubtextdisplayed = false, swimtext = false, lockdisplay = false;
  313.  
  314. void onFunction0(jjPLAYER@ p) {
  315.         if(jjTriggers[4]==false && lockdisplay == false)
  316.         {p.showText("@@Locked.");
  317.         lockdisplay = true;}
  318.         }
  319.  
  320. void onFunction1(jjPLAYER@ p) {
  321.         if(jjTriggers[17]==false && textdisplayed == false)
  322.         {p.showText("@@Place all 4 coloured stones to the@alcoves above to unlock the gate.");
  323.         textdisplayed = true;}
  324.         }
  325.  
  326.  
  327. void Magic(jjOBJ@ obj) {
  328.         obj.behave(BEHAVIOR::MOTH,false);
  329.                 jjPARTICLE@ particle = jjAddParticle(PARTICLE::SPARK);
  330.                 particle.xPos = obj.xPos;
  331.                 particle.yPos = obj.yPos;
  332. }
  333.  
  334.  
  335. class Lamp : jjBEHAVIORINTERFACE {
  336.  
  337.         void onBehave(jjOBJ@ obj) {
  338.                 obj.behave(BEHAVIOR::PICKUP);
  339.                 obj.lightType = LIGHT::LASER;
  340.                 obj.light = 10;
  341.                 obj.deactivates = false;
  342.                 jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::WEENIE].curAnim];
  343.                 anim.frameCount = 1;  
  344.                 jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  345.                 jjPIXELMAP lamp(0, 5*32, 2*32, 1*32, 4);
  346.                 lamp.save(frame);
  347.                 frame.hotSpotY = -17;
  348. }
  349.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  350.                 if(jjTriggers[13]==false)
  351.                         {jjAddObject(OBJECT::MOTH, obj.xPos, obj.yPos);
  352.                         if(rubtextdisplayed == false)
  353.                                 {p.showText("@@@@@@@@@@@Press UP to rub.");
  354.                                 rubtextdisplayed = true;}
  355.                                 if(p.keyUp==true)
  356.                                         {p.warpToID(0);
  357.                                         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_HARP1, 1000);
  358.                                         }
  359.                         }
  360.                 if (jjTriggers[13]==true && swimtext == false)
  361.                         {p.showText("@@I really feel like I can swim.");
  362.                         swimtext = true;}
  363.                 return true;
  364.         }
  365. }
  366.  
  367.  
  368. bool keylock = false;
  369.  
  370. class Key: jjBEHAVIORINTERFACE {
  371.         void onBehave(jjOBJ@ obj) {
  372.                 if(jjTriggers[4] == true)
  373.                         {obj.delete();}
  374.                 obj.behave(BEHAVIOR::PICKUP, false);
  375.                 obj.determineCurAnim(ANIM::MENU, 5);
  376.                 ++obj.counter;
  377.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  378.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  379.  
  380. }
  381.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  382.                 jjTriggers[4] = true;
  383.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  384.                 p.cameraFreeze(231*32, 54*32, true, true);
  385.                 keylock= true;
  386.                 control = false;
  387.                 jjSample(obj.xPos, obj.yPos, SOUND::MENUSOUNDS_TYPEENTER, 1000);
  388.  
  389.                 return true;
  390.         }
  391. }
  392.  
  393.  
  394. bool startrush = false, readytorush = false, control = true, coin =false;
  395.  
  396. void onPlayer(jjPLAYER@ p) {
  397.        
  398.         if(control==false)
  399.                 {p.keyLeft = false;
  400.                 p.keyRight = false;
  401.                 p.keyDown = false;}
  402.  
  403.         if(p.xPos < 240*32) {
  404.                 if(p.idle > 100)
  405.                 {p.cameraUnfreeze(true);
  406.                 control=true;}
  407.                 else if ((p.idle > 5 && (p.keyLeft || p.keyRight || p.keyJump || p.keyFire)) || (p.curAnim - jjAnimSets[p.setID].firstAnim == RABBIT::LEDGEWIGGLE))
  408.                 {p.cameraUnfreeze(true);
  409.                 control=true;}
  410.         }
  411.  
  412.         if(coin==false && jjTriggers[5] == true && jjTriggers[7] == true && jjTriggers[8] == true && jjTriggers[15] == true)
  413.                         {p.cameraFreeze(107*32, 58*32,true, false);
  414.                         p.showText("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Coin unlocked.");
  415.                         coin = true;}
  416.  
  417.         gem::trackPlayerGems(p);
  418.         gem::upgradeHealth(p);
  419.         p.lightType = LIGHT::NONE;
  420.  
  421.                 jjANIMATION@ anim = jjAnimations[jjObjectPresets[OBJECT::BURGER].curAnim];
  422.                 anim.frameCount = 1;  
  423.                 jjANIMFRAME@ frame = jjAnimFrames[anim.firstFrame];
  424.                 jjPIXELMAP stone(0, 13*32, 1*32, 1*32, 4);
  425.                 stone.save(frame);
  426.                 frame.hotSpotY = -17;
  427.  
  428.         for (int i = 1; i < jjObjectCount; i++) {
  429.         jjOBJ@ o = jjObjects[i];
  430.                 if (o.isActive && o.eventID == OBJECT::SILVERCOIN && p.coins >= 3) {
  431.                 o.state = STATE::KILL;
  432.                 }
  433.  
  434.         }
  435.  
  436.  
  437.         if(p.food == 100 && jjKey[0x52] == false && startrush == false)
  438.                 {p.showText("@@@@@@@@@@@@@@@@Press 'R' when you need to use Sugar Rush!", STRING::MEDIUM);
  439.                 p.startSugarRush(0);
  440.                 startrush = true;
  441.                 readytorush = true;}
  442.  
  443.         if(readytorush == true)
  444.                 {p.food = 100;}
  445.  
  446.         if(p.food == 100 && jjKey[0x52])
  447.                 {p.startSugarRush(1400);
  448.                 p.food = 0;
  449.                 readytorush = false;
  450.                 startrush = false;
  451.         }
  452.  
  453.         if(p.xPos > 17*32 && p.xPos <20*32 && p.yPos > 58*32){
  454.                 if(p.coins < 3)
  455.                 p.testForCoins(3);
  456.                 else {
  457.                 jjNxt(false, true);
  458.                 gem::saveGemData();}
  459.         }
  460.  
  461.         exit = 0;
  462.         if(jjTriggers[5] == true)
  463.                 {exit += 1;}
  464.         if(jjTriggers[7] == true)
  465.                 {exit += 1;}
  466.         if(jjTriggers[8] == true)
  467.                 {exit += 1;}
  468.         if(jjTriggers[15] == true)
  469.                 {exit += 1;}
  470.  
  471.         if(p.xPos < 158*32 && p.xPos > 155*32 && p.yPos > 42*32 && p.yPos <44*32 && jjTriggers[5] == false)
  472.         {jjTriggers[5] = true;
  473.         exit += 1;
  474.         jjSample(p.xPos, p.yPos, SOUND::COMMON_PICKUP1, 1000);}
  475.  
  476.         if(p.xPos < 164 *32 && p.xPos > 161*32 && p.yPos > 60*32 && p.yPos <62*32 && jjTriggers[7] == false)
  477.         {jjTriggers[7] = true;
  478.         exit += 1;
  479.         jjSample(p.xPos, p.yPos, SOUND::COMMON_PICKUP1, 1000);}
  480.  
  481.         if(p.xPos < 236 *32 && p.xPos > 233*32 && p.yPos > 13*32 && p.yPos <15*32 && jjTriggers[8] == false)
  482.         {jjTriggers[8] = true;
  483.         exit += 1;
  484.         jjSample(p.xPos, p.yPos, SOUND::COMMON_PICKUP1, 1000);}
  485.  
  486.         if(p.xPos < 64 *32 && p.xPos > 61*32 && p.yPos > 4*32 && p.yPos <6*32 && jjTriggers[15] == false)
  487.         {jjTriggers[15] = true;
  488.         exit += 1;
  489.         jjSample(p.xPos, p.yPos, SOUND::COMMON_PICKUP1, 1000);}
  490.  
  491.         for (int i = 1; i < jjObjectCount; i++) {
  492.                 jjOBJ@ o = jjObjects[i];
  493.                 if (o.isActive && o.eventID == OBJECT::SEEKERAMMO3 && p.ammo[WEAPON::SEEKER] < 1) {
  494.                         o.state = STATE::KILL;}
  495.         }
  496.         for (int i = 1; i < jjObjectCount; i++) {
  497.                 jjOBJ@ o = jjObjects[i];
  498.                 if (o.isActive && o.eventID == OBJECT::RFAMMO3 && p.ammo[WEAPON::RF] < 1) {
  499.                         o.state = STATE::KILL;}
  500.         }
  501.         for (int i = 1; i < jjObjectCount; i++) {
  502.                 jjOBJ@ o = jjObjects[i];
  503.                 if (o.isActive && o.eventID == OBJECT::TNTAMMO3 && p.ammo[WEAPON::TNT] < 1) {
  504.                         o.state = STATE::KILL;}
  505.         }
  506.         for (int i = 1; i < jjObjectCount; i++) {
  507.                 jjOBJ@ o = jjObjects[i];
  508.                 if (o.isActive && o.eventID == OBJECT::GUN9AMMO3 && p.ammo[WEAPON::GUN9] < 1) {
  509.                         o.state = STATE::KILL;}
  510.         }
  511.         for (int i = 1; i < jjObjectCount; i++) {
  512.                 jjOBJ@ o = jjObjects[i];
  513.                 if (o.isActive && o.eventID == OBJECT::SEEKERPOWERUP && p.ammo[WEAPON::SEEKER] < 1) {
  514.                         o.state = STATE::KILL;}
  515.         }
  516.         for (int i = 1; i < jjObjectCount; i++) {
  517.                 jjOBJ@ o = jjObjects[i];
  518.                 if (o.isActive && o.eventID == OBJECT::RFPOWERUP && p.ammo[WEAPON::RF] < 1) {
  519.                         o.state = STATE::KILL;}
  520.         }
  521.         for (int i = 1; i < jjObjectCount; i++) {
  522.                 jjOBJ@ o = jjObjects[i];
  523.                 if (o.isActive && o.eventID == OBJECT::TNTPOWERUP && p.ammo[WEAPON::TNT] < 1) {
  524.                         o.state = STATE::KILL;}
  525.         }
  526.         for (int i = 1; i < jjObjectCount; i++) {
  527.                 jjOBJ@ o = jjObjects[i];
  528.                 if (o.isActive && o.eventID == OBJECT::GUN9POWERUP && p.ammo[WEAPON::GUN9] < 1) {
  529.                         o.state = STATE::KILL;}
  530.         }
  531.  
  532. if(spring > jjGameTicks)
  533.         {p.ySpeed = -10;}
  534.  
  535. if(jjTriggers[5]==true && jjTriggers[7]==true && jjTriggers[8]==true && jjTriggers[15]==true)
  536. {jjTriggers[17]=true;}
  537.  
  538. p.invisibility = false;
  539.  
  540.  
  541. if(p.keyFire && p.currWeapon == WEAPON::ICE)
  542. {p.invisibility = true;
  543. jjDrawSprite(p.xPos, p.yPos, p.setID, RABBIT::QUIT, p.curFrame, p.direction, SPRITE::PLAYER);
  544. }
  545.  
  546. if(p.xPos > 256*32){
  547.         jjTriggers[13]=true;
  548.         p.idle = 100;
  549.         p.cameraFreeze(261*32, 52*32, true, true);
  550.         p.lighting = 1;
  551.         p.noFire = true;
  552.         if(p.keyJump || p.keyFire)
  553.                 {p.warpToID(5);}
  554. }
  555.  
  556. if(p.coins == 0)
  557. {p.coins += 2;}
  558.         MLLE::WeaponHook.processPlayer(p);
  559. if(p.jumpStrength==-2){
  560. p.keyUp = false;
  561. }
  562.  
  563.  
  564. if (CountlessDoubleJumps > jjGameTicks && p.keyJump) {
  565.         p.doubleJumpCount = 0;}
  566. if (p.health == 0){
  567.         CountlessDoubleJumps  = 0;
  568. }
  569.  
  570.  
  571.  
  572. if (p.yPos > jjWaterLevel && jjTriggers[13]==false) {
  573.     p.health = 0;
  574.   }
  575.  
  576. }
  577.  
  578. void onFunction2(jjPLAYER@ play) {
  579.         p.cameraUnfreeze();
  580.         p.noFire = false;}
  581.  
  582. void onFunction3(jjPLAYER@ play) {
  583.         CountlessDoubleJumps  = 0;
  584.         play.timerStop();}
  585.  
  586. void onFunction4(jjPLAYER@ play) {
  587. if(jjTriggers[13]==false)
  588. {p.showText("@@Learn how to swim first.");}
  589. }
  590.  
  591. void onFunction6(jjPLAYER@ play) {
  592. keylock = false;}
  593.  
  594.                                                
  595.  
  596. class PlatinCoin : jjBEHAVIORINTERFACE {
  597.  
  598.         void onBehave(jjOBJ@ obj) {
  599.                 if(p.coins >= 3)
  600.                 {obj.delete();}
  601.                 obj.behave(BEHAVIOR::PICKUP, false);
  602.                 ++obj.counter;
  603.                 obj.deactivates = false;
  604.                 if(obj.xPos > 108*32)
  605.                 {obj.xPos = obj.xPos - 8;}
  606.                 obj.yPos = jjSin(obj.counter*15 + 5)*4 + obj.yOrg;
  607.                 jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, -8);
  608. }
  609.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  610.                 p.coins += 1;
  611.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  612.                 jjSample(obj.xPos, obj.yPos, SOUND::COMMON_COIN, 1000);
  613.  
  614.                 return true;
  615.         }
  616. }
  617.  
  618.  
  619. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  620.         return MLLE::WeaponHook.drawAmmo(player, canvas);
  621. }
  622.  
  623. int exit = 0;
  624.  
  625. bool onDrawHealth(jjPLAYER@ player, jjCANVAS@ canvas) {
  626. if(p.xPos < 256*32){
  627.     canvas.drawString(30, 585, formatInt(exit%5, "1") + "/4", STRING::SMALL, STRING::NORMAL);
  628.     canvas.drawSprite(20, 585, ANIM::PICKUPS, 11, jjGameTicks>>2, -1, SPRITE::NORMAL);
  629.         if(keylock == true && jjTriggers[4]==true)
  630.                 {canvas.drawSprite(90, 580, ANIM::MENU,5, jjGameTicks>>2, -1, SPRITE::PALSHIFT, 8);}
  631.     return false;}
  632.         else return true;
  633. }
  634.  
  635. bool onDrawLives(jjPLAYER@ player, jjCANVAS@ canvas) {     return true;}
  636.  
  637. jjTEXTAPPEARANCE SignTextAppearance = STRING::NORMAL;
  638. class Sign {
  639.         private int xPos, yPos; //These pixel-based positions will be generated from tile-based positions in the constructor by multiplying by 32
  640.         private string text;
  641.         private uint widthOfText;
  642.         Sign(){} //AngelScript requires any class that appears in any array to have an explicit default constructor, even if it's never called
  643.         Sign(int xTile, int yTile, const string &in t) {
  644.                 xPos = xTile * 32; //Since this is a constant operation, it could strictly be performed in the draw method instead of the constructor, but this way involves fewer multiplication instructions
  645.                 yPos = yTile * 32; //
  646.                 text = t;
  647.                 SignTextAppearance.newline = STRING::SPECIALSIGN; //Causes the drawString method to interpret instances of the \n character as signals to drop down to a new line, similar to the special effect of the @ character in the STRING::SPIN appearance.
  648.                 SignTextAppearance.spacing = -2; //int jjTEXTAPPEARANCE::spacing is new in 5.2, and this particular value is equivalent to prefixing the string with "ยง2". Make sure to check out bool jjTEXTAPPEARANCE::monospace too, though it didn't end up getting used in this level.
  649.                 widthOfText = jjGetStringWidth(text, STRING::SMALL, SignTextAppearance); //Used for determining how large of a dark rectangle should be drawn behind the text. A matching heightOfText value could of course be generated by counting the number of newline characters--for example, "heightOfText = text.split("\n").length * 20;"--but here the rectangles are constant height instead to limit the temptation to ramble on and on.
  650.         }
  651.         void draw(jjCANVAS@ layer, uint8 textIntensity) const { //Because this method will be called from an onDraw method, it's important to have a jjCANVAS@ passed among the arguments.
  652.                 layer.drawRectangle(xPos, yPos - 16, widthOfText + 8, 55, 0, SPRITE::TRANSLUCENT);
  653.                 layer.drawString(xPos, yPos, text, STRING::SMALL, SignTextAppearance, 0, SPRITE::BLEND_HARDLIGHT, textIntensity);
  654.         }
  655. }
  656. const array<Sign> Signs = {
  657.         Sign(58, 55, "The 40 Thieves killed the Sultan.\nThey're still here, looking for something."),
  658.         Sign(92, 51, "The Sultan is murdered, but his crown's\nstill lingering in the throne room."),
  659.         Sign(250, 56, "YOU: Hey what's going on?\nGENIE: Grand your three wishes,\nI shall make them come true!\nYOU: Hmm...I want Devan Shell captured.\nGENIE: No Devan Shell exist in this world.\nYOU: B-but...\nGEENIE: Grant your second wish."),
  660.         Sign(260, 56, "YOU:Then I'd like to locate the second Time Freezer.\nIt does exist in this timeline, right?\nGENIE: Look for it in the Magical Cave.\nYOU: Hey! Won't you bring it here?\nGENIE:You said locate, stranger. Grand your last wish!\nYOU:Oh well. At least you could teach me how to swim.\n\nHit |||||FIRE |to learn how to swim."),
  661.         Sign(202, 12, "Thieves are looking for the magic lamp.\nThankfully I am good at hiding stuff."),
  662. };
  663.  
  664. void onDrawLayer1(jjPLAYER@, jjCANVAS@ layer) {
  665.         if(jjKey[0x54] || p.xPos > 256*32){
  666.         const uint8 textIntensity = 200 + int(jjSin(jjGameTicks * 16) * 50);
  667.         for (uint signID = 0; signID < Signs.length; ++signID)
  668.                 Signs[signID].draw(layer, textIntensity);
  669. }
  670. }
  671.  
  672.  
  673. array<bool> SavedTriggers(32, false);
  674. //Extendable Checkpoints by VioletCLM
  675. void CheckpointWrapper(jjOBJ@ obj) {
  676.   if (obj.state == STATE::STOP) { //don't do anything anymore
  677.     jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  678.   } else if (obj.state == STATE::DEACTIVATE) { //due to death
  679.     obj.deactivate();
  680.   } else {
  681.     obj.behave(BEHAVIOR::CHECKPOINT);
  682.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 8);
  683.     if (obj.state == STATE::DONE) { //triggered by the player hitting it
  684.       obj.state = STATE::STOP;
  685.       //save the current state of some properties
  686.       for (uint i = 0; i < 32; ++i)
  687.         SavedTriggers[i] = jjTriggers[i];
  688.  
  689.       //OPTIONAL: this loop makes checkpoints reusable, so only the most recent checkpoint you touched is ever active
  690.       for (int i = jjObjectCount; --i > 0;) {
  691.         jjOBJ@ obj2 = jjObjects[i];
  692.         if (obj2.eventID == OBJECT::CHECKPOINT && i != obj.objectID && obj2.isActive) {
  693.           obj2.state = STATE::SLEEP;
  694.           obj2.var[0] = 0;
  695.         }
  696.       }
  697.     }
  698.   }
  699. }
  700.  
  701.  
  702. //HH18.savegems.asc
  703. // Had to copy the contents in here so that I could return DrawScore true during the cutscene.
  704.  
  705. namespace gem {
  706.         int gemsCollected, nextHealth, currAmount;
  707.        
  708.         int maxHealth() {
  709.                 return ((jjMaxHealth+1) - (jjDifficulty < 3? 5:3));
  710.         }
  711.        
  712.         array<int> gemTotals(4);
  713.         bool restoreGems;
  714.         bool draw = true;
  715.  
  716.         void upgradeHealth(jjPLAYER@ play) { //onPlayer
  717.                 switch (maxHealth()) {
  718.                         case 1: currAmount = 100; break;
  719.                         case 2: currAmount = 275; break;
  720.                         case 3: currAmount = 450; break;
  721.                         case 4: currAmount = 625; break;
  722.                         case 5: currAmount = 800; break;
  723.                 }
  724.        
  725.                 if (gemsCollected >= currAmount && nextHealth != maxHealth() && maxHealth() < 6) {
  726.                         jjChat("/smhealth " + (jjMaxHealth + 1));
  727.                         for (int i = 0; i < 8; ++i) {
  728.                                 jjAlert("");
  729.                         }
  730.                         nextHealth = jjMaxHealth;
  731.                         if (jjGameTicks > 7) {
  732.                                 jjSample(play.xPos, play.yPos, SOUND::COMMON_HARP1, 0, 0);
  733.                                 jjAlert("||||By the power of gems, your maximum health is increased!", false, STRING::MEDIUM);
  734.                                 if (maxHealth() == 6) jjAlert("|||Congratulations, your health is maximised!", false, STRING::MEDIUM);
  735.                         }
  736.                 }
  737.         }
  738.        
  739.         void trackPlayerGems(jjPLAYER@ play) { //onPlayer
  740.                 if (!restoreGems) {
  741.                         gemTotals[0] = play.gems[GEM::RED];
  742.                         gemTotals[1] = play.gems[GEM::GREEN] * 5;
  743.                         gemTotals[2] = play.gems[GEM::BLUE] * 10;
  744.                         gemTotals[3] = play.gems[GEM::PURPLE] * 20;
  745.                         gemsCollected = gemTotals[0] + gemTotals[1] + gemTotals[2] + gemTotals[3];
  746.                 } else {
  747.                         play.gems[GEM::RED] = jjGameTicks > 1? gemTotals[0] : play.lives;
  748.                         play.gems[GEM::GREEN] = gemTotals[1] / 5;
  749.                         play.gems[GEM::BLUE] = gemTotals[2] / 10;
  750.                         play.gems[GEM::PURPLE] = gemTotals[3] / 20;
  751.                         restoreGems = false;
  752.                 }
  753.         }
  754.        
  755.         void restorePlayerGems() { //onLevelLoad and onLevelReload
  756.                 restoreGems = true;
  757.         }
  758.        
  759.         void saveGemData() { //this needs to go in an AS function that also acts as the level exit
  760.                 jjLocalPlayers[0].lives = gemsCollected;
  761.         }
  762.        
  763.         void deleteCollectedGems() {
  764.                 for (int i = 1; i < jjObjectCount; i++) {
  765.                         jjOBJ@ obj = jjObjects[i];
  766.                         int playerID = obj.findNearestPlayer(200000);
  767.                         jjPLAYER@ play = jjPlayers[playerID];
  768.                        
  769.                         if (playerID > -1 &&
  770.                         (obj.eventID == OBJECT::REDGEM ||
  771.                         obj.eventID == OBJECT::GREENGEM ||
  772.                         obj.eventID == OBJECT::BLUEGEM ||
  773.                         obj.eventID == OBJECT::PURPLEGEM ||
  774.                         obj.eventID == OBJECT::RECTREDGEM ||
  775.                         obj.eventID == OBJECT::RECTGREENGEM ||
  776.                         obj.eventID == OBJECT::RECTBLUEGEM)) {
  777.                                 if (obj.creatorType == CREATOR::LEVEL) {
  778.                                         if (play.doesCollide(obj, true)) {
  779.                                                 jjEventSet(uint(obj.xOrg) >> 5, uint(obj.yOrg) >> 5, 0);
  780.                                         }
  781.                                 } else {
  782.                                         if (obj.creatorID == 0 && obj.state != STATE::FLOATFALL) {
  783.                                                 obj.playerHandling = HANDLING::PARTICLE;
  784.                                                 obj.delete();
  785.                                         }
  786.                                        
  787.                                 }
  788.                         }
  789.                        
  790.                         if (obj.eventID == OBJECT::GEMBARREL || obj.eventID == OBJECT::GEMCRATE) {
  791.                                 if (obj.state == STATE::EXPLODE) jjEventSet(uint(obj.xOrg) >> 5, uint(obj.yOrg) >> 5, 0);
  792.                         }
  793.                        
  794.                         if (obj.eventID == OBJECT::GEMRING) {
  795.                                 if (obj.state == STATE::HIT) jjEventSet(uint(obj.xOrg) >> 5, uint(obj.yOrg) >> 5, 0);
  796.                         }
  797.                        
  798.                         if (obj.eventID == OBJECT::SUPERGEM) {
  799.                                 if (obj.state == STATE::ACTION) jjEventSet(uint(obj.xOrg) >> 5, uint(obj.yOrg) >> 5, 0);
  800.                         }
  801.                        
  802.                         if (obj.eventID == OBJECT::BOMBCRATE || obj.eventID == OBJECT::ONEUPCRATE) {
  803.                                 if (obj.state == STATE::FALL && (obj.var[0] == OBJECT::REDGEM ||
  804.                                 obj.var[0] == OBJECT::GREENGEM ||
  805.                                 obj.var[0] == OBJECT::BLUEGEM ||
  806.                                 obj.var[0] == OBJECT::PURPLEGEM ||
  807.                                 obj.var[0] == OBJECT::RECTREDGEM ||
  808.                                 obj.var[0] == OBJECT::RECTGREENGEM ||
  809.                                 obj.var[0] == OBJECT::RECTBLUEGEM)) {
  810.                                         jjEventSet(uint(obj.xOrg) >> 5, uint(obj.yOrg) >> 5, 0);
  811.                                 }
  812.                         }
  813.                 }
  814.         }
  815. }
  816.  
  817. bool onCheat(string &in cheat) {
  818.         if (cheat == "jjnxt" || cheat == "jjnext") {
  819.                 gem::saveGemData();
  820.                 jjNxt(true, true);
  821.         } else if (cheat == "jjgems") {
  822.                 jjLocalPlayers[0].gems[GEM::RED] = jjLocalPlayers[0].gems[GEM::RED] + 100;
  823.         } else
  824.                 return false;
  825.         jjAlert(cheat, false, STRING::MEDIUM);
  826.         return true;
  827. }
  828.  
  829. bool onDrawScore(jjPLAYER@ play, jjCANVAS@ canvas) {
  830.  
  831.         if (gem::draw && p.xPos < 256*32) {
  832.                 canvas.drawSprite(20, 42, ANIM::PICKUPS, 22, jjGameTicks>>2, 0, SPRITE::GEM, 0);
  833.                 canvas.drawString(36, 42, "x " + gem::gemsCollected, STRING::MEDIUM, STRING::NORMAL);
  834.                 if (gem::maxHealth() < 6) {
  835.                         canvas.drawString(8, 70, "|" + gem::currAmount + " |||||for upgrade", STRING::SMALL, STRING::NORMAL);
  836.                 } else {
  837.                         canvas.drawString(8, 70, "||||Max!", STRING::SMALL, STRING::NORMAL);
  838.                 }
  839.        
  840.         return false;}
  841.         else return true;
  842. }