Downloads containing MLLE-Include-1.6w.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Starry Night Dragusela Capture the flag N/A Download file
TSF with JJ2+ Only: Star of the year V2 TreyLina Capture the flag N/A Download file
TSF with JJ2+ Only: Halle der Orgelpfeifen Loon Capture the flag N/A Download file
TSF with JJ2+ Only: Winterfrost Mountains Dragusela Battle N/A Download file
TSF with JJ2+ Only: Moon BaseFeatured Download Dragusela Capture the flag 9.5 Download file
TSF with JJ2+ Only: Malice in WonderlandFeatured Download Loon Battle 9.9 Download file
TSF with JJ2+ Only: Crown of ThornsFeatured Download PurpleJazz Battle 9.2 Download file

File preview

  1. //2170983298
  2. //This is a standard library created by MLLE to read some JJ2+ properties from a level file whose script includes this library. DO NOT MANUALLY MODIFY THIS FILE.
  3.  
  4.  
  5.  
  6.  
  7.  
  8. #pragma require 'MLLE-Include-1.6w.asc'
  9. namespace MLLE {
  10.     jjPAL@ Palette;
  11.     dictionary@ _layers, _palettes;
  12.     se::WeaponHook@ WeaponHook;
  13.     array<_offgridObject>@ _offGridObjects;
  14.  
  15.     bool Setup(array<MLLEWeaponApply@> w) {
  16.         jjPAL palette = jjBackupPalette;
  17.         @Palette = @palette;
  18.         dictionary layers;
  19.         @_layers = @layers;
  20.         dictionary palettes;
  21.         @_palettes = @palettes;
  22.  
  23.         jjSTREAM crcCheck('MLLE-Include-1.6w.asc');
  24.         string crcLine;
  25.         if (crcCheck.isEmpty() || !crcCheck.getLine(crcLine)) {
  26.             jjDebug('MLLE::Setup: Include file has been renamed!');
  27.             return false;
  28.         }
  29.         array<string> regexResults;
  30.         if (!jjRegexMatch(crcLine, '\\/\\/(\\d+)\\r?', regexResults)) {
  31.             jjDebug('MLLE::Setup: Include file is improperly formatted!');
  32.             return false;
  33.         }
  34.         if (parseUInt(regexResults[1]) != jjCRC32(crcCheck)) {
  35.             jjDebug('MLLE::Setup: Include file has been damaged!');
  36.             return false;
  37.         }
  38.        
  39.         jjSTREAM level(jjLevelFileName);
  40.         if (level.isEmpty()) {
  41.             jjDebug('MLLE::Setup: Error reading "' + jjLevelFileName + '"!');
  42.             return false;
  43.         }
  44.         level.discard(230);
  45.         array<uint> CompressedDataSizes(4, 0);
  46.         for (uint i = 0; i < CompressedDataSizes.length; ++i) {
  47.             level.pop(CompressedDataSizes[i]);
  48.             level.discard(4);
  49.         }
  50.         for (uint i = 0; i < CompressedDataSizes.length; ++i)
  51.             level.discard(CompressedDataSizes[i]);
  52.  
  53.         if (level.getSize() < 20) {
  54.             jjDebug('MLLE::Setup: Level file does not contain any additional data!');
  55.             return false;
  56.         }
  57.         string magic;
  58.         level.get(magic, 'MLLE'.length);
  59.         if (magic != 'MLLE') {
  60.             jjDebug('MLLE::Setup: Level was not saved by MLLE!');
  61.             return false;
  62.         }
  63.         uint levelDataVersion;
  64.         level.pop(levelDataVersion);
  65.         if (levelDataVersion != 0x106) {
  66.             jjDebug('MLLE::Setup: Level\'s Data5 section was saved in a different version of MLLE than this script!');
  67.             return false;
  68.         }
  69.  
  70.         uint csize, usize;
  71.         level.pop(csize); level.pop(usize);
  72.         jjSTREAM data5;
  73.         if (!jjZlibUncompress(level, data5, usize)) {
  74.             jjDebug('MLLE::Setup: Error during ZLIB uncompression!');
  75.             return false;
  76.         }
  77.  
  78.         bool pbool; uint8 pbyte; int8 pchar; int16 pshort; float pfloat; int pint; uint puint, puint2;
  79.         data5.pop(pbool); jjIsSnowing = pbool;
  80.         data5.pop(pbool); jjIsSnowingOutdoorsOnly = pbool;
  81.         data5.pop(pbyte); jjSnowingIntensity = pbyte;
  82.         data5.pop(pbyte); jjSnowingType = SNOWING::Type(pbyte);
  83.  
  84.         if (jjIsSnowing) {
  85.             if (jjSnowingType == SNOWING::SNOW && jjAnimSets[ANIM::SNOW] == 0)
  86.                 jjAnimSets[ANIM::SNOW].load();
  87.             else if (jjSnowingType == SNOWING::LEAF && jjAnimSets[ANIM::PLUS_SCENERY] == 0)
  88.                 jjAnimSets[ANIM::PLUS_SCENERY].load();
  89.         }
  90.  
  91.         data5.pop(pbool); jjWarpsTransmuteCoins = pbool;
  92.         data5.pop(pbool); jjDelayGeneratedCrateOrigins = pbool;
  93.         data5.pop(pint);  jjEcho = pint;
  94.         data5.pop(puint); jjSetDarknessColor(_colorFromArgb(puint));
  95.         data5.pop(pfloat);jjWaterChangeSpeed = pfloat;
  96.         data5.pop(pbyte); jjWaterInteraction = WATERINTERACTION::WaterInteraction(pbyte);
  97.         data5.pop(pint);  jjWaterLayer = pint;
  98.         data5.pop(pbyte); jjWaterLighting = WATERLIGHT::wl(pbyte);
  99.         data5.pop(pfloat); if (int(pfloat) < jjLayerHeight[4] * 32) jjSetWaterLevel(pfloat, true);
  100.         data5.pop(puint); data5.pop(puint2); jjSetWaterGradient(_colorFromArgb(puint), _colorFromArgb(puint2));
  101.  
  102.         data5.pop(pbool); if (pbool) {
  103.             _readPalette(data5, palette);
  104.             palette.apply();
  105.             data5.pop(pbool);
  106.         }
  107.  
  108.         data5.pop(pbyte);
  109.         array<uint8> mappingIndices(pbyte);
  110.         puint = 0;
  111.         while (pbyte-- != 0) {
  112.             jjPAL extra;
  113.             string paletteName = _read7BitEncodedStringFromStream(data5);
  114.             _readPalette(data5, extra);
  115.             int index = jjSpriteModeFirstFreeMapping();
  116.             if (index < 0) {
  117.                 jjDebug('MLLE::Setup: Not enough room for additional palette ' + paletteName);
  118.             } else {
  119.                 mappingIndices[puint++] = uint8(index);
  120.                 _palettes.set(paletteName, uint8(index));
  121.                 array<uint8> indexMapping(256);
  122.                 for (uint i = 0; i < 256; ++i)
  123.                     indexMapping[i] = jjPalette.findNearestColor(extra.color[i]);
  124.                 jjSpriteModeSetMapping(index, indexMapping, extra);
  125.             }
  126.         }
  127.  
  128.         _recolorAnimationIf(data5, ANIM::PINBALL, 0, 4);
  129.         _recolorAnimationIf(data5, ANIM::PINBALL, 2, 4);
  130.         _recolorAnimationIf(data5, ANIM::CARROTPOLE, 0, 1);
  131.         _recolorAnimationIf(data5, ANIM::DIAMPOLE, 0, 1);
  132.         _recolorAnimationIf(data5, ANIM::PINBALL, 4, 8);
  133.         _recolorAnimationIf(data5, ANIM::JUNGLEPOLE, 0, 1);
  134.         _recolorAnimationIf(data5, ANIM::PLUS_SCENERY, 0, 17);
  135.         _recolorAnimationIf(data5, ANIM::PSYCHPOLE, 0, 1);
  136.         _recolorAnimationIf(data5, ANIM::SMALTREE, 0, 1);
  137.         _recolorAnimationIf(data5, ANIM::SNOW, 0, 8);
  138.         _recolorAnimationIf(data5, ANIM::COMMON, 2, 18);
  139.         _recolorAnimationIf(data5, ANIM::BOLLPLAT, 0, 2);
  140.         _recolorAnimationIf(data5, ANIM::FRUITPLAT, 0, 2);
  141.         _recolorAnimationIf(data5, ANIM::GRASSPLAT, 0, 2);
  142.         _recolorAnimationIf(data5, ANIM::PINKPLAT, 0, 2);
  143.         _recolorAnimationIf(data5, ANIM::SONICPLAT, 0, 2);
  144.         _recolorAnimationIf(data5, ANIM::SPIKEPLAT, 0, 2);
  145.         _recolorAnimationIf(data5, ANIM::SPIKEBOLL, 0, 2);
  146.         _recolorAnimationIf(data5, ANIM::SPIKEBOLL3D, 0, 2);
  147.         _recolorAnimationIf(data5, ANIM::VINE, 1, 1);
  148.  
  149.         data5.pop(pbyte);
  150.         for (uint i = 0; i < pbyte; ++i) {
  151.             string tilesetFilename = _read7BitEncodedStringFromStream(data5);
  152.             uint16 tileStart, tileCount;
  153.             data5.pop(tileStart); data5.pop(tileCount);
  154.             array<uint8>@ colors = null;
  155.             data5.pop(pbool); if (pbool) {
  156.                 @colors = array<uint8>(256);
  157.                 for (uint j = 0; j < 256; ++j)
  158.                     data5.pop(colors[j]);
  159.             }
  160.             if (!jjTilesFromTileset(tilesetFilename, tileStart, tileCount, colors)) {
  161.                 jjDebug('MLLE::Setup: Error reading "' + tilesetFilename + '"!');
  162.                 return false;
  163.             }
  164.         }
  165.         if (pbyte != 0) {
  166.             array<uint> layersIDsWithTileMaps;
  167.             for (uint i = 1; i <= 8; ++i)
  168.                 if (jjLayers[i].hasTileMap)
  169.                     layersIDsWithTileMaps.insertLast(i);
  170.             if (jjLayersFromLevel(jjLevelFileName, layersIDsWithTileMaps).length == 0) {
  171.                 jjDebug('MLLE::Setup: Error reading "' + jjLevelFileName + '"!');
  172.             }
  173.         }
  174.  
  175.         array<jjLAYER@> newLayerOrder, nonDefaultLayers;
  176.         data5.pop(puint);
  177.         for (uint i = 8; i < puint; i += 8) {
  178.             array<uint> layerIDsToGrab;
  179.             for (uint j = i; j < puint && j < i + 8; ++j) {
  180.                 layerIDsToGrab.insertLast((j & 7) + 1);
  181.             }
  182.             const string extraLayersFilename = jjLevelFileName.substr(0, jjLevelFileName.length() - 4) + '-MLLE-Data-' + (i/8) + '.j2l';
  183.             array<jjLAYER@> extraLayers = jjLayersFromLevel(extraLayersFilename, layerIDsToGrab);
  184.             if (extraLayers.length == 0) {
  185.                 jjDebug('MLLE::Setup: Error reading "' + extraLayersFilename + '"!');
  186.                 return false;
  187.             }
  188.             for (uint j = 0; j < extraLayers.length(); ++j)
  189.                 nonDefaultLayers.insertLast(extraLayers[j]);
  190.         }
  191.         uint nextNonDefaultLayerID = 0;
  192.         for (uint i = 0; i < puint; ++i) {
  193.             data5.pop(pchar);
  194.             jjLAYER@ layer;
  195.             if (pchar >= 0)
  196.                 @layer = jjLayers[pchar + 1];
  197.             else
  198.                 @layer = nonDefaultLayers[nextNonDefaultLayerID++];
  199.             string layerName = _read7BitEncodedStringFromStream(data5);
  200.             _layers.set(layerName, @layer);
  201.             data5.pop(pbool);
  202.             if (layer.hasTileMap)
  203.                 layer.hasTiles = !pbool;
  204.             data5.pop(pbyte);
  205.             layer.spriteMode = SPRITE::Mode(pbyte);
  206.             data5.pop(pbyte);
  207.             layer.spriteParam = (layer.spriteMode == SPRITE::MAPPING || layer.spriteMode == SPRITE::TRANSLUCENTMAPPING) ? mappingIndices[pbyte] : pbyte;
  208.             data5.pop(pint);
  209.             layer.rotationAngle = pint;
  210.             data5.pop(pint);
  211.             layer.rotationRadiusMultiplier = pint;
  212.             data5.pop(pbyte);
  213.             layer.xSpeedModel = LAYERSPEEDMODEL::LayerSpeedModel(pbyte);
  214.             data5.pop(pbyte);
  215.             layer.ySpeedModel = LAYERSPEEDMODEL::LayerSpeedModel(pbyte);
  216.             data5.pop(pbyte);
  217.             layer.textureSurface = SURFACE::Surface(pbyte);
  218.             data5.pop(pbyte);
  219.             layer.reflection.tintColor = pbyte;
  220.             data5.pop(pfloat);
  221.             layer.reflection.fadePositionX = pfloat;
  222.             data5.pop(pfloat);
  223.             layer.reflection.top = pfloat;
  224.             data5.pop(pfloat);
  225.             layer.xInnerSpeed = pfloat;
  226.             data5.pop(pfloat);
  227.             layer.yInnerSpeed = pfloat;
  228.             data5.pop(pfloat);
  229.             layer.xInnerAutoSpeed = pfloat;
  230.             data5.pop(pfloat);
  231.             layer.yInnerAutoSpeed = pfloat;
  232.             data5.pop(pchar);
  233.             if (pchar >= 0)
  234.                 layer.texture = TEXTURE::Texture(pchar);
  235.             else {
  236.                 jjPIXELMAP texture(256, 256);
  237.                 for (uint y = 0; y < 256; ++y)
  238.                     for (uint x = 0; x < 256; ++x)
  239.                         data5.pop(texture[x,y]);
  240.                 texture.makeTexture(layer);
  241.             }
  242.             newLayerOrder.insertLast(layer);
  243.         }
  244.         jjLayerOrderSet(newLayerOrder);
  245.  
  246.         uint16 numberOfObjects; data5.pop(numberOfObjects);
  247.         while (numberOfObjects-- != 0) {
  248.             uint16 tileID; data5.pop(tileID);
  249.             jjPIXELMAP tile(32, 32);
  250.             for (int y = 0; y < 32; ++y)
  251.                 for (int x = 0; x < 32; ++x)
  252.                     data5.pop(tile[x,y]);
  253.             tile.save(tileID, true);
  254.         }
  255.         data5.pop(numberOfObjects);
  256.         while (numberOfObjects-- != 0) {
  257.             uint16 tileID; data5.pop(tileID);
  258.             jjMASKMAP tile;
  259.             for (int y = 0; y < 32; ++y)
  260.                 for (int x = 0; x < 32; ++x)
  261.                     data5.pop(tile[x,y]);
  262.             tile.save(tileID, true);
  263.         }
  264.  
  265.         data5.pop(pshort);
  266.         for (uint i = 1; i <= 9; ++i) {
  267.             jjWEAPON@ weapon = jjWeapons[i];
  268.             data5.pop(pbool);
  269.             data5.pop(pint); weapon.maximum = pint;
  270.             data5.pop(pbyte); weapon.comesFromBirds = pbyte != 0; weapon.comesFromBirdsPowerup = pbyte == 2;
  271.             data5.pop(pbyte); weapon.comesFromGunCrates = pbyte != 0;
  272.             data5.pop(pbyte); weapon.gemsLost = pbyte;
  273.             data5.pop(pbyte); weapon.gemsLostPowerup = pbyte;
  274.             data5.pop(pbyte); weapon.infinite = pbyte & 1 == 1; weapon.replenishes = pbyte & 2 == 2;
  275.             uint8 ammoCrateEventID = 0;
  276.             if (i >= 7) {
  277.                 data5.pop(ammoCrateEventID);
  278.                 if (ammoCrateEventID > 32) {
  279.                     jjOBJ@ preset = jjObjectPresets[ammoCrateEventID];
  280.                     preset.behavior = AmmoCrate(ammoCrateEventID);
  281.                     preset.playerHandling = HANDLING::SPECIAL;
  282.                     preset.scriptedCollisions = false;
  283.                     preset.direction = 1;
  284.                     preset.energy = 1;
  285.                     preset.curFrame = jjAnimations[preset.curAnim = (i == 7) ? (jjAnimSets[ANIM::PICKUPS] + 59) : (jjAnimSets[ANIM::PLUS_COMMON] + i - 8)] + (preset.frameID = 0);
  286.                     preset.killAnim = jjAnimSets[ANIM::AMMO] + 71;
  287.                     preset.eventID = OBJECT::ICEAMMO15;
  288.                     preset.var[2] = 31 + i;
  289.                     preset.var[3] = i - 1;
  290.                     preset.points = 300;
  291.                 }
  292.             }
  293.             if (pbool) {
  294.                 if (WeaponHook is null)
  295.                     @WeaponHook = pshort < 0 ? se::DefaultWeaponHook() :  se::DefaultWeaponHook(pshort);
  296.                 _read7BitEncodedStringFromStream(data5);
  297.                 jjSTREAM param;
  298.                 data5.pop(param);
  299.                 w[i-1].Apply(i, WeaponHook, param, ammoCrateEventID);
  300.             } else if (i == 8) {
  301.                 data5.pop(pbyte);
  302.                 if (pbyte == 0)
  303.                     weapon.spread = SPREAD::GUN8;
  304.                 else if (pbyte == 1)
  305.                     weapon.spread = SPREAD::PEPPERSPRAY;
  306.                 else if (pbyte >= 2)
  307.                     weapon.spread = SPREAD::NORMAL;
  308.                 if (pbyte == 2)
  309.                     weapon.gradualAim = false;
  310.             }
  311.         }
  312.  
  313.         data5.pop(numberOfObjects);
  314.         if (numberOfObjects != 0) {
  315.             if (jjGameConnection != GAME::LOCAL)
  316.                 jjObjectPresets[254].behavior = _replaceMe;
  317.             else
  318.                 jjObjectPresets[254].behavior = BEHAVIOR::INACTIVE;
  319.             @_offGridObjects = array<_offgridObject>();
  320.             array<uint8> animSetsToLoad(256, 0);
  321.             animSetsToLoad[OBJECT::BONUSPOST] = ANIM::BONUS;
  322.             animSetsToLoad[OBJECT::SWINGINGVINE] = ANIM::VINE;
  323.             animSetsToLoad[OBJECT::TUFTURT] = ANIM::TUFTUR;
  324.             animSetsToLoad[OBJECT::LABRAT] = ANIM::LABRAT;
  325.             animSetsToLoad[OBJECT::LIZARD] = ANIM::LIZARD;
  326.             animSetsToLoad[OBJECT::FLOATLIZARD] = ANIM::LIZARD;
  327.             animSetsToLoad[OBJECT::SUCKER] = ANIM::SUCKER;
  328.             animSetsToLoad[OBJECT::CATERPILLAR] = ANIM::CATERPIL;
  329.             animSetsToLoad[OBJECT::SMOKERING] = ANIM::CATERPIL;
  330.             animSetsToLoad[OBJECT::CHESHIRE1] = ANIM::CAT;
  331.             animSetsToLoad[OBJECT::CHESHIRE2] = ANIM::CAT2;
  332.             animSetsToLoad[OBJECT::HATTER] = ANIM::HATTER;
  333.             animSetsToLoad[OBJECT::SKELETON] = ANIM::SKELETON;
  334.             animSetsToLoad[OBJECT::DOGGYDOGG] = ANIM::DOG;
  335.             animSetsToLoad[OBJECT::NORMTURTLE] = ANIM::TURTLE;
  336.             animSetsToLoad[OBJECT::TURTLESHELL] = ANIM::TURTLE;
  337.             animSetsToLoad[OBJECT::DEMON] = ANIM::DEMON;
  338.             animSetsToLoad[OBJECT::STEAM] = ANIM::STEAM;
  339.             animSetsToLoad[OBJECT::ROTATINGROCK] = ANIM::ROCK;
  340.             animSetsToLoad[OBJECT::HELMUT] = ANIM::HELMUT;
  341.             animSetsToLoad[OBJECT::BILSY] = ANIM::BILSBOSS;
  342.             animSetsToLoad[OBJECT::BAT] = ANIM::BAT;
  343.             animSetsToLoad[OBJECT::BEE] = ANIM::BUMBEE;
  344.             animSetsToLoad[OBJECT::DRAGONFLY] = ANIM::DRAGFLY;
  345.             animSetsToLoad[OBJECT::FATCHICK] = ANIM::FATCHK;
  346.             animSetsToLoad[OBJECT::FENCER] = ANIM::FENCER;
  347.             animSetsToLoad[OBJECT::FISH] = ANIM::FISH;
  348.             animSetsToLoad[OBJECT::MOTH] = ANIM::MOTH;
  349.             animSetsToLoad[OBJECT::RAPIER] = ANIM::RAPIER;
  350.             animSetsToLoad[OBJECT::SPARK] = ANIM::SPARK;
  351.             animSetsToLoad[OBJECT::LEFTPADDLE] = ANIM::PINBALL;
  352.             animSetsToLoad[OBJECT::RIGHTPADDLE] = ANIM::PINBALL;
  353.             animSetsToLoad[OBJECT::FIVEHUNDREDBUMP] = ANIM::PINBALL;
  354.             animSetsToLoad[OBJECT::CARROTBUMP] = ANIM::PINBALL;
  355.             animSetsToLoad[OBJECT::QUEEN] = ANIM::QUEEN;
  356.             animSetsToLoad[OBJECT::FLOATSUCKER] = ANIM::SUCKER;
  357.             animSetsToLoad[OBJECT::BRIDGE] = ANIM::BRIDGE;
  358.             animSetsToLoad[OBJECT::MONKEY] = ANIM::MONKEY;
  359.             animSetsToLoad[OBJECT::STANDMONKEY] = ANIM::MONKEY;
  360.             animSetsToLoad[OBJECT::RAVEN] = ANIM::RAVEN;
  361.             animSetsToLoad[OBJECT::TUBETURTLE] = ANIM::TUBETURT;
  362.             animSetsToLoad[OBJECT::SMALLTREE] = ANIM::SMALTREE;
  363.             animSetsToLoad[OBJECT::DIAMONDUSPOLE] = ANIM::DIAMPOLE;
  364.             animSetsToLoad[OBJECT::PSYCHPOLE] = ANIM::PSYCHPOLE;
  365.             animSetsToLoad[OBJECT::CARROTUSPOLE] = ANIM::CARROTPOLE;
  366.             animSetsToLoad[OBJECT::JUNGLEPOLE] = ANIM::JUNGLEPOLE;
  367.             animSetsToLoad[OBJECT::UTERUS] = ANIM::UTERUS;
  368.             animSetsToLoad[OBJECT::UTERUSSPIKEBALL] = ANIM::UTERUS;
  369.             animSetsToLoad[OBJECT::CRAB] = ANIM::UTERUS;
  370.             animSetsToLoad[OBJECT::ROBOT] = ANIM::ROBOT;
  371.             animSetsToLoad[OBJECT::DEVANROBOT] = ANIM::DEVAN;
  372.             animSetsToLoad[OBJECT::FRUITPLATFORM] = ANIM::FRUITPLAT;
  373.             animSetsToLoad[OBJECT::BOLLPLATFORM] = ANIM::BOLLPLAT;
  374.             animSetsToLoad[OBJECT::GRASSPLATFORM] = ANIM::GRASSPLAT;
  375.             animSetsToLoad[OBJECT::PINKPLATFORM] = ANIM::PINKPLAT;
  376.             animSetsToLoad[OBJECT::SONICPLATFORM] = ANIM::SONICPLAT;
  377.             animSetsToLoad[OBJECT::SPIKEPLATFORM] = ANIM::SPIKEPLAT;
  378.             animSetsToLoad[OBJECT::SPIKEBOLL] = ANIM::SPIKEBOLL;
  379.             animSetsToLoad[OBJECT::SPIKEBOLL3D] = ANIM::SPIKEBOLL3D;
  380.             animSetsToLoad[OBJECT::EVA] = ANIM::EVA;
  381.             animSetsToLoad[OBJECT::WITCH] = ANIM::WITCH;
  382.             animSetsToLoad[OBJECT::ROCKETTURTLE] = ANIM::ROCKTURT;
  383.             animSetsToLoad[OBJECT::BUBBA] = ANIM::BUBBA;
  384.             animSetsToLoad[OBJECT::DEVILDEVAN] = ANIM::DEVILDEVAN;
  385.             animSetsToLoad[OBJECT::TUFBOSS] = ANIM::TUFBOSS;
  386.             animSetsToLoad[OBJECT::BIGROCK] = ANIM::BIGROCK;
  387.             animSetsToLoad[OBJECT::BIGBOX] = ANIM::BIGBOX;
  388.             animSetsToLoad[OBJECT::BOLLY] = ANIM::SONCSHIP;
  389.             animSetsToLoad[OBJECT::BUTTERFLY] = ANIM::BUTTERFLY;
  390.             animSetsToLoad[OBJECT::BEEBOY] = ANIM::BEEBOY;
  391.             animSetsToLoad[OBJECT::XMASNORMTURTLE] = ANIM::XTURTLE;
  392.             animSetsToLoad[OBJECT::XMASLIZARD] = ANIM::XLIZARD;
  393.             animSetsToLoad[OBJECT::XMASFLOATLIZARD] = ANIM::XLIZARD;
  394.             animSetsToLoad[OBJECT::XMASBILSY] = ANIM::XBILSY;
  395.             animSetsToLoad[OBJECT::CAT] = ANIM::ZDOG;
  396.             animSetsToLoad[OBJECT::PACMANGHOST] = ANIM::ZSPARK;
  397.             do {
  398.                 uint16 xPos; data5.pop(xPos);
  399.                 uint16 yPos; data5.pop(yPos);
  400.                 int32 params; data5.pop(params);
  401.                 _offGridObjects.insertLast(_offgridObject(xPos, yPos, params));
  402.                 uint8 eventID = params;
  403.                 if (eventID == OBJECT::GENERATOR) eventID = params >> 12;
  404.                 if (animSetsToLoad[eventID] != 0) {
  405.                     jjOBJ@ preset = jjObjectPresets[eventID];
  406.                     if (preset.curAnim < 100) {
  407.                         preset.curFrame = jjAnimations[preset.determineCurAnim(animSetsToLoad[eventID], preset.curAnim)] + preset.frameID;
  408.                         if ((eventID >= OBJECT::FRUITPLATFORM && eventID <= OBJECT::SPIKEBOLL3D) || eventID == OBJECT::WITCH)
  409.                             preset.killAnim += jjAnimSets[animSetsToLoad[eventID]];
  410.                         else if (eventID == OBJECT::CATERPILLAR && jjObjectPresets[OBJECT::SMOKERING].curAnim < 100)
  411.                             jjObjectPresets[OBJECT::SMOKERING].determineCurAnim(ANIM::CATERPIL, jjObjectPresets[OBJECT::SMOKERING].curAnim);
  412.                     }
  413.                     animSetsToLoad[eventID] = 0;
  414.                 }
  415.             } while (--numberOfObjects != 0);
  416.         }
  417.  
  418.         if (!data5.isEmpty()) {
  419.             jjDebug('MLLE::Setup: Warning, Data5 longer than expected');
  420.         }
  421.        
  422.         return true;
  423.     }
  424.  
  425.     jjLAYER@ GetLayer(const string &in name) {
  426.         jjLAYER@ handle = null;
  427.         _layers.get(name, @handle);
  428.         return handle;
  429.     }
  430.     uint8 GetPaletteMappingID(const string &in name) {
  431.         uint8 mappingID;
  432.         _palettes.get(name, mappingID);
  433.         return mappingID;
  434.     }
  435.     jjPAL@ GetPalette(const string &in name) {
  436.         if (name == 'Level Palette')
  437.             return Palette;
  438.         return jjSpriteModeGetColorMapping(GetPaletteMappingID(name));
  439.     }
  440.  
  441.     void ReapplyPalette() {
  442.         Palette.apply();
  443.     }
  444.  
  445.     class AmmoCrate : jjBEHAVIORINTERFACE {
  446.         uint8 realEventID;
  447.         AmmoCrate(uint8 r) { realEventID = r; }
  448.         bool onIsSolid(jjOBJ@) { return true; }
  449.         void onBehave(jjOBJ@ obj) {
  450.             if (obj.state == STATE::DEACTIVATE)
  451.                 obj.eventID = realEventID;
  452.             obj.behave(BEHAVIOR::AMMO15);
  453.         }
  454.     }
  455.  
  456.     void SpawnOffgrids() {
  457.         if (jjGameConnection == GAME::LOCAL) {
  458.             SpawnOffgridsLocal();
  459.             for (int y = 0; y < jjLayerHeight[4]; ++y)
  460.             for (int x = 0; x < jjLayerWidth[4]; ++x) {
  461.                 const int ev = jjParameterGet(x,y, -12,32);
  462.                 if (ev == 0)
  463.                     return;
  464.                 else if (ev == int(0xFFFFF3FE))
  465.                     jjParameterSet(x,y, -12,32, 0);
  466.             }
  467.         }
  468.     }
  469.     void SpawnOffgridsLocal() {
  470.         for (uint i = 0; i < _offGridObjects.length; ++i)
  471.             _spawnOffgrid(i);
  472.     }
  473.     class _offgridObject {
  474.         float xPos, yPos;
  475.         int32 params;
  476.         _offgridObject() {}
  477.         _offgridObject(uint16 x, uint16 y, int32 p) { xPos = x; yPos = y; params = p; }
  478.     }
  479.     void _spawnOffgrid(uint i) {
  480.         const _offgridObject@ og = _offGridObjects[i];
  481.         const int difficulty = og.params & 0x300;
  482.         if (difficulty != 0 && (jjGameMode == GAME::SP || jjGameMode == GAME::COOP || jjGameConnection == GAME::LOCAL)) {
  483.             if (difficulty == 0x100) {
  484.                 if (jjDifficulty > 0)
  485.                     return;
  486.             } else if (difficulty == 0x200) {
  487.                 if (jjDifficulty < 2)
  488.                     return;
  489.             } else {
  490.                 if (jjGameConnection == GAME::LOCAL && jjLocalPlayerCount == 1)
  491.                     return;
  492.             }
  493.         }
  494.         const uint xTile = uint(og.xPos) >> 5, yTile = uint(og.yPos) >> 5;
  495.         const int realEvent = jjParameterGet(xTile,yTile, -12,32);
  496.         jjParameterSet(xTile,yTile, -12,32, og.params);
  497.         jjOBJ@ obj = jjObjects[jjAddObject(og.params, og.xPos, og.yPos, 0, CREATOR::LEVEL)];
  498.         jjParameterSet(xTile,yTile, -12,32, realEvent);
  499.         if (jjGameConnection == GAME::LOCAL) {
  500.             obj.deactivates = false;
  501.             obj.creatorID = 1;
  502.         }
  503.     }
  504.     uint _replaceMeIndex = 0;
  505.     void _replaceMe(jjOBJ@ obj) {
  506.         jjParameterSet(uint(obj.xOrg)>>5, uint(obj.yOrg)>>5, -12,32, 0);
  507.         obj.delete();
  508.         _spawnOffgrid(_replaceMeIndex++);
  509.     }
  510.  
  511.     jjPALCOLOR _colorFromArgb(uint Argb) {
  512.         return jjPALCOLOR(Argb >> 16, Argb >> 8, Argb >> 0);
  513.     }
  514.  
  515.     void _readPalette(jjSTREAM& stream, jjPAL& palette) {
  516.         for (uint i = 0; i < 256; ++i) {
  517.             stream.pop(palette.color[i].red);
  518.             stream.pop(palette.color[i].green);
  519.             stream.pop(palette.color[i].blue);
  520.         }
  521.     }
  522.  
  523.     uint _read7BitEncodedUintFromStream(jjSTREAM& stream) {
  524.         uint result = 0;
  525.         while (true) {
  526.             uint8 byteRead; stream.pop(byteRead);
  527.             result |= (byteRead & 0x7F);
  528.             if (byteRead >= 0x80)
  529.                 result <<= 7;
  530.             else
  531.                 break;
  532.         }
  533.         return result;
  534.     }
  535.     string _read7BitEncodedStringFromStream(jjSTREAM& stream) {
  536.         string result;
  537.         stream.get(result, _read7BitEncodedUintFromStream(stream));
  538.         return result;
  539.     }
  540.  
  541.     void _recolorAnimationIf(jjSTREAM& stream, ANIM::Set set, uint animID, uint frameCount) {
  542.         bool pbool; stream.pop(pbool); if (!pbool) return;
  543.  
  544.         if (jjAnimSets[set] == 0)
  545.             jjAnimSets[set].load();
  546.         const uint firstFrameID = jjAnimations[jjAnimSets[set] + animID];
  547.         array<uint8> colors(256);
  548.         for (uint i = 0; i < 256; ++i)
  549.             stream.pop(colors[i]);
  550.         for (uint i = 0; i < frameCount; ++i) {
  551.             jjANIMFRAME@ frame = jjAnimFrames[firstFrameID + i];
  552.             jjPIXELMAP(frame).recolor(colors).save(frame);
  553.         }
  554.     }
  555. }
  556.  
  557. #include 'SEweapon.asc'
  558. #pragma require 'SEweapon.asc'
  559. shared interface MLLEWeaponApply { bool Apply(uint, se::WeaponHook@ = null, jjSTREAM@ = null, uint8 = 0); }