Downloads containing mlhaunt.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Hollow of the HauntedFeatured Download cooba Capture the flag 9.2 Download file

File preview

  1. const bool MLLESetupSuccessful = MLLE::Setup(array<MLLEWeaponApply@> = {null, null, se::RollerMLLEWrapper(), null, null, null, null, se::EnergyBlastMLLEWrapper(), null}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "mlhaunt-MLLE-Data-1.j2l" ///@MLLE-Generated
  4. #pragma require "mlhaunt.j2l" ///@MLLE-Generated
  5. #include "SEenergyblast-mlle.asc" ///@MLLE-Generated
  6. #pragma require "SEenergyblast-mlle.asc" ///@MLLE-Generated
  7. #include "SEroller-mlle.asc" ///@MLLE-Generated
  8. #pragma require "SEroller-mlle.asc" ///@MLLE-Generated
  9.  
  10. #pragma require "Castle2E.j2t"
  11.  
  12. /*******************************
  13. A 2020 Mystic Legends Release!
  14. http://www.mysticlegends.org
  15. /******************************/
  16.  
  17. #include "MLLE-Weapons.asc"
  18. #pragma require "MLLE-Weapons.asc"
  19.  
  20. void onLevelLoad() {
  21.                 jjPAL eclipse;
  22.                 eclipse.load("Castle2E.j2t");
  23.                 jjPalette.copyFrom(24, 16, 24, eclipse, 0.75f);
  24.                 jjPalette.copyFrom(40, 1,  40, eclipse, 0.5f);
  25.                 jjPalette.copyFrom(41, 15, 41, eclipse, 0.75f);
  26.                 jjPalette.copyFrom(64, 8,  64, eclipse, 0.75f);
  27.                 jjPalette.copyFrom(72, 8,  72, eclipse, 1.f);
  28.                 jjPalette.copyFrom(80, 8,  80, eclipse, 0.5f);
  29.                 jjPalette.copyFrom(88, 8,  88, eclipse, 0.75f);
  30.                 jjPalette.apply();
  31.  
  32.                 jjTexturedBGTexture = TEXTURE::MEDIVO;
  33.                 jjUseLayer8Speeds = true;
  34.                
  35.                 jjObjectPresets[OBJECT::BOUNCERAMMO3].lightType =
  36.                 jjObjectPresets[OBJECT::ICEAMMO3].lightType =
  37.                 jjObjectPresets[OBJECT::SEEKERAMMO3].lightType =
  38.                 jjObjectPresets[OBJECT::RFAMMO3].lightType =
  39.                 jjObjectPresets[OBJECT::GUN8AMMO3].lightType =
  40.                 jjObjectPresets[OBJECT::GUN9AMMO3].lightType =
  41.                 jjObjectPresets[OBJECT::CTFBASE].lightType =
  42.                 jjObjectPresets[OBJECT::SHARD].lightType =
  43.                 jjObjectPresets[OBJECT::BOUNCERPOWERUP].lightType =
  44.                 jjObjectPresets[OBJECT::ICEPOWERUP].lightType =
  45.                 jjObjectPresets[OBJECT::RFPOWERUP].lightType = LIGHT::POINT2;
  46.                
  47.                 jjObjectPresets[OBJECT::FULLENERGY].lightType = LIGHT::BRIGHT;
  48.                 jjObjectPresets[OBJECT::FULLENERGY].light = 10;
  49.  
  50.                 for (int i = 33; i < 40; i++) {
  51.                         jjObjectPresets[i].behavior = CannotBeShotDown(jjObjectPresets[i].behavior);
  52.                 }
  53.                
  54.                 jjObjectPresets[OBJECT::STEADYLIGHT].behavior = ToggleableTorch;
  55.                
  56.                 jjObjectPresets[OBJECT::APPLE].behavior =
  57.                 jjObjectPresets[OBJECT::BANANA].behavior =
  58.                 jjObjectPresets[OBJECT::BURGER].behavior = Wisp;
  59.                
  60.                 jjObjectPresets[OBJECT::PRETZEL].behavior = WarpOrb();
  61.                 jjObjectPresets[OBJECT::PRETZEL].lightType = LIGHT::FLICKER;
  62.                 jjObjectPresets[OBJECT::PRETZEL].scriptedCollisions = true;
  63.                
  64.                 jjObjectPresets[OBJECT::GRASSPLATFORM].bulletHandling = HANDLING::IGNOREBULLET;
  65.                        
  66.                 jjObjectPresets[OBJECT::BOUNCERPOWERUP].direction = SPRITE::FLIPH;
  67.                
  68.                 //jjObjectPresets[OBJECT::TRIGGERCRATE].determineCurAnim(ANIM::CUSTOM[0], 2);
  69.                 //jjObjectPresets[OBJECT::TRIGGERCRATE].determineCurFrame();
  70.                 //jjObjectPresets[OBJECT::TRIGGERCRATE].behavior = ShittyBlastCrate;
  71.                
  72.                 for (int i = 3240; i < 3280; i++) {
  73.                         jjTileType[i] = 5;
  74.                 }
  75.                
  76.                 generateCustomSpringSprites(jjAnimSets[ANIM::CUSTOM[99]], array<uint> = {40, 16});
  77.                 turnIntoCustomSpring(jjObjectPresets[OBJECT::FROZENSPRING], 0, 29.f, false);
  78.                 turnIntoCustomSpring(jjObjectPresets[OBJECT::GREENSPRING],  1, 24.1f, false);
  79.                
  80.                 jjANIMFRAME@ frame = jjAnimFrames[jjAnimations[jjAnimSets[ANIM::SPIKEBOLL].firstAnim].firstFrame];
  81.                 jjPIXELMAP(0, 0, 32, 32, 4).save(frame);
  82.                 frame.hotSpotX = -frame.width/2;
  83.                 frame.hotSpotY = -frame.height + 14;
  84.                
  85.                 for (int x = 0; x < jjLayerWidth[1]; x++) {
  86.                         for (int y = 0; y < jjLayerHeight[1]; y++) {
  87.                                 uint16 myTile = jjTileGet(1, x, y);
  88.                                 if (myTile < 1350) {
  89.                                         jjTileSet(1, x, y, myTile + 1350);
  90.                                 }
  91.                         }
  92.                 }
  93.                
  94.                 jjANIMFRAME@ CircularGlow = jjAnimFrames[jjObjectPresets[OBJECT::ORANGE].curFrame];
  95.                 jjPIXELMAP circle(32, 32);
  96.                 for (uint x = 0; x < circle.width; ++x)
  97.                         for (uint y = 0; y < circle.height; ++y)
  98.                                 circle[x,y] = (sqrt(pow(16-int(x), 2) + pow(16-int(y), 2)) < 16) ? 234 : 0;
  99.                 circle.save(CircularGlow);
  100.                 CircularGlow.hotSpotX = -CircularGlow.width/2;
  101.                 CircularGlow.hotSpotY = -CircularGlow.height/2;
  102. }
  103.  
  104. void onLevelBegin() {
  105.                 jjAddObject(OBJECT::APPLE, 736, 736);           //bouncer powerup
  106.                 jjAddObject(OBJECT::APPLE, 1824, 608);          //full energy
  107.                 jjAddObject(OBJECT::APPLE, 1920, 1600);         //roller powerup
  108.                 jjAddObject(OBJECT::APPLE, 2976, 992);          //RF powerup
  109. }
  110.  
  111. void onMain() {
  112.                 jjLAYER@ shadows = MLLE::GetLayer("Ceiling Shadow Layer");
  113.                
  114.                 if (jjLowDetail || jjColorDepth == 8) {
  115.                         jjLayers[7].spriteParam = 0;
  116.                         jjLayers[7].hasTiles = false;
  117.                         shadows.hasTiles = false;
  118.                 }
  119.                 else {                 
  120.                         jjLayers[7].spriteParam = 96 + int(jjCos(jjGameTicks << 2) * 32);
  121.                         jjLayers[7].hasTiles = true;
  122.                         shadows.hasTiles = true;
  123.                 }
  124.                
  125.                 jjLAYER@ torches = MLLE::GetLayer("Torch Layer");
  126.                 jjLAYER@ vegs = MLLE::GetLayer("Vegitation Layer");
  127.                 jjLAYER@ owls = MLLE::GetLayer("Owl Layer");   
  128.                
  129.                 jjLayers[5].hasTiles = jjLayers[6].hasTiles = torches.hasTiles = vegs.hasTiles = owls.hasTiles = !jjLowDetail;
  130. }
  131.  
  132. class CannotBeShotDown : jjBEHAVIORINTERFACE {
  133.         jjBEHAVIOR originalBehavior;
  134.         CannotBeShotDown(jjBEHAVIOR behavior) {
  135.                 originalBehavior = behavior;
  136.         }
  137.         void onBehave(jjOBJ@ obj) override {
  138.                 obj.behave(originalBehavior);
  139.                 if (obj.state == STATE::FLOATFALL)
  140.                         obj.state = STATE::FLOAT;
  141.                 if (obj.eventID == OBJECT::FULLENERGY)
  142.                         obj.xPos = obj.xOrg - 16;
  143.         }
  144.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  145.                 obj.behavior = originalBehavior;
  146.                 if (bullet is null)
  147.                         player.objectHit(obj, force, obj.playerHandling);
  148.                 else
  149.                         bullet.objectHit(obj, obj.playerHandling);
  150.                 obj.behavior = CannotBeShotDown(obj.behavior);
  151.                 return true;
  152.         }
  153. }
  154.  
  155. //class OriginalBehavior : jjBEHAVIORINTERFACE {
  156.     //private jjBEHAVIOR nativeBehavior;
  157.     //OriginalBehavior(const jjBEHAVIOR &in nb) { nativeBehavior = nb; }
  158.  
  159.     //void onBehave(jjOBJ@ obj) {
  160.         //obj.behave(nativeBehavior);
  161.         //if (obj.state == STATE::FLOATFALL) obj.state = STATE::FLOAT;
  162.     //}
  163.    
  164.         //bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  165.                 //auto@ pickup = cast<se::AmmoPickup@>(cast<jjBEHAVIORINTERFACE@>(nativeBehavior));
  166.                 //if (pickup !is null)
  167.                         //return pickup.onObjectHit(obj, bullet, player, force);
  168.                 //else return false;
  169.         //}
  170. //}
  171.  
  172. void ToggleableTorch(jjOBJ@ obj) {
  173.                 if (!jjLowDetail)
  174.                         obj.lightType = LIGHT::POINT2;
  175.                 else
  176.                         obj.lightType = LIGHT::NONE;
  177.                        
  178.                 obj.behave(BEHAVIOR::STEADYLIGHT);
  179. }
  180.  
  181. void Wisp(jjOBJ@ obj) {
  182.                 if (obj.state == STATE::START) {
  183.                         obj.bulletHandling = HANDLING::IGNOREBULLET;
  184.                         obj.playerHandling = HANDLING::PARTICLE;
  185.                         obj.deactivates = obj.triggersTNT = obj.isTarget = obj.isBlastable = obj.isFreezable = false;
  186.                 }
  187.                
  188.                 switch (obj.eventID) {
  189.                         case OBJECT::APPLE:    
  190.                                 obj.xPos = obj.xOrg + int(jjSin(jjGameTicks << 2) * 64);
  191.                                 obj.yPos = obj.yOrg + int(jjSin(jjGameTicks << 1) * 32);
  192.                                 break;
  193.                         case OBJECT::BANANA:   
  194.                                 obj.xPos = obj.xOrg + int(jjSin(jjGameTicks * 5) * 48);
  195.                                 obj.yPos = obj.yOrg - int(jjSin(jjGameTicks << 2) * 48) + 24;
  196.                                 break;
  197.                         case OBJECT::BURGER:   
  198.                                 obj.xPos = obj.xOrg - int(jjSin(jjGameTicks << 1) * 48);
  199.                                 obj.yPos = obj.yOrg - int(jjSin(jjGameTicks << 2) * 32) + 80 + int(jjCos(jjGameTicks << 1) * 24);
  200.                                 break;
  201.                 }
  202.                
  203.                 obj.behave(BEHAVIOR::PICKUP, false);
  204.                 if (!jjLowDetail) {
  205.                         obj.lightType = LIGHT::POINT2;
  206.                         jjDrawTile(obj.xPos - 16, obj.yPos - 16, 176, TILE::ALLQUADRANTS, 3);
  207.                 }
  208.                 else obj.lightType = LIGHT::NONE;
  209. }
  210.  
  211. int fdim(int n) {
  212.         if (n > 0) return n;
  213.         else return 0; 
  214. }
  215.  
  216. int VeryCoolMathWizFunction(int n) {
  217.         return int(255 * tanh(jjSin(n << 2)*2)/tanh(2));
  218. }
  219.  
  220. class WarpOrb : jjBEHAVIORINTERFACE {
  221.         void onBehave(jjOBJ@ obj) {
  222.                 if (obj.state == STATE::START) {
  223.                         obj.xPos = obj.xOrg += 16;
  224.                         obj.yPos = obj.yOrg += 8;      
  225.                 }
  226.                 obj.behave(BEHAVIOR::PICKUP, false);
  227.                 if (obj.state == STATE::FLOATFALL) obj.state = STATE::FLOAT;
  228.         }
  229.         void onDraw(jjOBJ@ obj) {                      
  230.                 int frame = obj.objectID * 8 + jjGameTicks;
  231.                 frame = (frame + int(obj.xPos) + int(obj.yPos) * 256)*16;
  232.                
  233.                 jjDrawTile(obj.xPos- 16, (obj.yPos + jjSin(frame)*4) - 18, 8 + TILE::ANIMATED);
  234.                 jjDrawSprite(obj.xPos, obj.yPos + jjSin(frame)*4, ANIM::SPIKEBOLL, 0, 0, 0, SPRITE::TRANSLUCENT, 255);
  235.                 jjDrawSprite(obj.xPos, obj.yPos + jjSin(frame)*4, ANIM::SPIKEBOLL, 0, 0, 0, SPRITE::BLEND_COLOR, 255);
  236.                 jjDrawSprite(obj.xPos, obj.yPos + jjSin(frame)*4, ANIM::SPIKEBOLL, 0, 0, 0, SPRITE::TRANSLUCENT, 255);
  237.                
  238.                 jjDrawSpriteFromCurFrame(obj.xPos, (obj.yPos + jjSin(frame)*4) - 2,     jjObjectPresets[OBJECT::ORANGE].curFrame, 0, SPRITE::BLEND_COLOR, fdim(VeryCoolMathWizFunction(jjGameTicks)));
  239.                
  240.                 //jjDrawString(obj.xPos + 48, obj.yPos, "" + VeryCoolMathWizFunction(jjGameTicks));
  241.         }
  242.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  243.                 player.warpToID(0);
  244.                 jjSample(player.xPos, player.yPos, SOUND::COMMON_PICKUP1, 63, 17500);
  245.                 obj.frameID = 0;
  246.                 obj.behavior = BEHAVIOR::EXPLOSION2;
  247.                 return true;
  248.         }
  249. }
  250.  
  251. //void ShittyBlastCrate(jjOBJ@ obj) {
  252.         //if (obj.state == STATE::ACTION) {
  253.                 //for (int i = 0; i < 5; ++i) {
  254.                         //jjOBJ@ ExtraBlastAmmo = jjObjects[jjAddObject(OBJECT::ICEAMMO3, obj.xPos + jjRandom()%24, obj.yPos - 32 - jjRandom()%6, obj.objectID)];
  255.                         //ExtraBlastAmmo.xSpeed = ((jjRandom() & 30) - 7.5f) / 2.f;
  256.                         //ExtraBlastAmmo.ySpeed = -1.4f - ((jjRandom() & 5) / 2.f);
  257.                         //ExtraBlastAmmo.behavior = MLLEWeapons::AmmoPickupWithCrateAndCorpseSupport(
  258.                                 //jjAnimations[jjAnimSets[ANIM::CUSTOM[0]].firstAnim],
  259.                                 //jjAnimations[jjAnimSets[ANIM::CUSTOM[0]].firstAnim + 1],              //unused in the level
  260.                                 //5
  261.                         //);
  262.                         //ExtraBlastAmmo.counter = 560;
  263.                 //}
  264.         //}
  265.         //obj.behave(BEHAVIOR::CRATE);
  266. //}
  267.  
  268. void onPlayerInput(jjPLAYER@ play) {
  269.         MLLE::WeaponHook.processPlayerInput(play);
  270. }
  271.  
  272. bool onDrawAmmo(jjPLAYER@ play, jjCANVAS@ canvas) {
  273.         return MLLE::WeaponHook.drawAmmo(play, canvas);
  274. }
  275.  
  276. jjANIMSET@ customSpringSprite;
  277. array<int> fastCustomSpringSpeeds(jjLocalPlayerCount);
  278. bool generateCustomSpringSprites(jjANIMSET@ anim, const array<uint> &in colors) {
  279.         int length = colors.length();
  280.         bool success = (@customSpringSprite = anim).allocate(array<uint>(length * 3, 5)) !is null;
  281.         if (success) {
  282.                 uint srcSet = jjAnimSets[ANIM::SPRING];
  283.                 for (int i = 0; i < length; i++) {
  284.                         uint color = colors[i];
  285.                         uint destAnimOffset = anim + i * 3;
  286.                         for (int j = 0; j < 3; j++) {
  287.                                 uint srcAnim = jjAnimations[srcSet + j];
  288.                                 uint destAnim = jjAnimations[destAnimOffset + j];
  289.                                 for (int k = 0; k < 5; k++) {
  290.                                         jjPIXELMAP image(jjAnimFrames[destAnim + k] = jjAnimFrames[srcAnim + k]);
  291.                                         int width = image.width;
  292.                                         int height = image.height;
  293.                                         for (int l = 0; l < height; l++) {
  294.                                                 for (int m = 0; m < width; m++) {
  295.                                                         int pixel = image[m, l];
  296.                                                         if (pixel >= 32 && pixel < 40)
  297.                                                                 image[m, l] = color + (pixel & 7);
  298.                                                 }
  299.                                         }
  300.                                         if (!image.save(jjAnimFrames[destAnim + k]))
  301.                                                 return false;
  302.                                 }
  303.                         }
  304.                 }
  305.         }
  306.         return success;
  307. }
  308. void initializeCustomSpring(jjOBJ@ obj) {
  309.         int anim = obj.curAnim;
  310.         obj.behave(obj.behavior = BEHAVIOR::SPRING, false);
  311.         if (obj.curAnim != anim) {
  312.                 obj.curAnim = anim + 2;
  313.                 obj.determineCurFrame();
  314.         }
  315.         obj.draw();
  316. }
  317. void turnIntoCustomSpring(jjOBJ@ obj, uint color, float power, bool horizontal) {
  318.         if (horizontal) {
  319.                 obj.xSpeed = power;
  320.                 obj.ySpeed = 0.f;
  321.         } else {
  322.                 obj.xSpeed = 0.f;
  323.                 obj.ySpeed = -power;
  324.                 if (obj.state == STATE::START && obj.creatorType == CREATOR::LEVEL) {
  325.                         int x = int(obj.xPos) >> 5;
  326.                         int y = int(obj.yPos) >> 5;
  327.                         if (jjParameterGet(x, y, 0, 1) != 0) {
  328.                                 jjParameterSet(x, y, 0, 1, 0);
  329.                                 obj.yPos -= 4.f;
  330.                                 obj.ySpeed = power;
  331.                         }
  332.                 }
  333.         }
  334.         obj.behavior = initializeCustomSpring;
  335.         obj.curAnim = customSpringSprite + color * 3 + (horizontal ? 1 : 0);
  336.         obj.energy = obj.frameID = obj.freeze = obj.justHit = obj.light = obj.points = 0;
  337.         obj.isBlastable = obj.isTarget = obj.scriptedCollisions = obj.triggersTNT = false;
  338.         obj.deactivates = obj.isFreezable = true;
  339.         obj.bulletHandling = HANDLING::IGNOREBULLET;
  340.         obj.playerHandling = HANDLING::SPECIAL;
  341.         obj.lightType = LIGHT::NORMAL;
  342.         obj.determineCurFrame();
  343. }