Downloads containing MLLE-Include-1.3.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 20 Levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: ELEKTREK PYRAMIDFeatured Download SmokeNC Battle 8.5 Download file
JJ2+ Only: Medieval Duels V2 Jelly Jam Battle N/A Download file

File preview

  1. //3796140386
  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.3.asc'
  9. namespace MLLE {
  10.     jjPAL@ Palette;
  11.     dictionary@ _layers;
  12.  
  13.     bool Setup() {
  14.         jjPAL palette = jjBackupPalette;
  15.         @Palette = @palette;
  16.         dictionary layers;
  17.         @_layers = @layers;
  18.  
  19.         jjSTREAM crcCheck('MLLE-Include-1.3.asc');
  20.         string crcLine;
  21.         if (crcCheck.isEmpty() || !crcCheck.getLine(crcLine)) {
  22.             jjDebug('MLLE::Setup: Include file has been renamed!');
  23.             return false;
  24.         }
  25.         array<string> regexResults;
  26.         if (!jjRegexMatch(crcLine, '\\/\\/(\\d+)\\r?', regexResults)) {
  27.             jjDebug('MLLE::Setup: Include file is improperly formatted!');
  28.             return false;
  29.         }
  30.         if (parseUInt(regexResults[1]) != jjCRC32(crcCheck)) {
  31.             jjDebug('MLLE::Setup: Include file has been damaged!');
  32.             return false;
  33.         }
  34.        
  35.         jjSTREAM level(jjLevelFileName);
  36.         level.discard(230);
  37.         array<uint> CompressedDataSizes(4, 0);
  38.         for (uint i = 0; i < CompressedDataSizes.length; ++i) {
  39.             level.pop(CompressedDataSizes[i]);
  40.             level.discard(4);
  41.         }
  42.         for (uint i = 0; i < CompressedDataSizes.length; ++i)
  43.             level.discard(CompressedDataSizes[i]);
  44.  
  45.         if (level.getSize() < 20) {
  46.             jjDebug('MLLE::Setup: Level file does not contain any additional data!');
  47.             return false;
  48.         }
  49.         string magic;
  50.         level.get(magic, 'MLLE'.length);
  51.         if (magic != 'MLLE') {
  52.             jjDebug('MLLE::Setup: Level was not saved by MLLE!');
  53.             return false;
  54.         }
  55.         uint levelDataVersion;
  56.         level.pop(levelDataVersion);
  57.         if (levelDataVersion != 0x103) {
  58.             jjDebug('MLLE::Setup: Level\'s Data5 section was saved in a different version of MLLE than this script!');
  59.             return false;
  60.         }
  61.  
  62.         uint csize, usize;
  63.         level.pop(csize); level.pop(usize);
  64.         jjSTREAM data5;
  65.         if (!jjZlibUncompress(level, data5, usize)) {
  66.             jjDebug('MLLE::Setup: Error during ZLIB uncompression!');
  67.             return false;
  68.         }
  69.  
  70.         bool pbool; uint8 pbyte; int8 pchar; float pfloat; int pint; uint puint, puint2;
  71.         data5.pop(pbool); jjIsSnowing = pbool;
  72.         data5.pop(pbool); jjIsSnowingOutdoorsOnly = pbool;
  73.         data5.pop(pbyte); jjSnowingIntensity = pbyte;
  74.         data5.pop(pbyte); jjSnowingType = SNOWING::Type(pbyte);
  75.  
  76.         if (jjIsSnowing) {
  77.             if (jjSnowingType == SNOWING::SNOW && jjAnimSets[ANIM::SNOW] == 0)
  78.                 jjAnimSets[ANIM::SNOW].load();
  79.             else if (jjSnowingType == SNOWING::LEAF && jjAnimSets[ANIM::PLUS_SCENERY] == 0)
  80.                 jjAnimSets[ANIM::PLUS_SCENERY].load();
  81.         }
  82.  
  83.         data5.pop(pbool); jjWarpsTransmuteCoins = pbool;
  84.         data5.pop(pbool); jjDelayGeneratedCrateOrigins = pbool;
  85.         data5.pop(pint);  jjEcho = pint;
  86.         data5.pop(puint); jjSetDarknessColor(_colorFromArgb(puint));
  87.         data5.pop(pfloat);jjWaterChangeSpeed = pfloat;
  88.         data5.pop(pbyte); jjWaterInteraction = WATERINTERACTION::WaterInteraction(pbyte);
  89.         data5.pop(pint);  jjWaterLayer = pint;
  90.         data5.pop(pbyte); jjWaterLighting = WATERLIGHT::wl(pbyte);
  91.         data5.pop(pfloat); if (int(pfloat) < jjLayerHeight[4] * 32) jjSetWaterLevel(pfloat, true);
  92.         data5.pop(puint); data5.pop(puint2); jjSetWaterGradient(_colorFromArgb(puint), _colorFromArgb(puint2));
  93.  
  94.         data5.pop(pbool); if (pbool) {
  95.             for (uint i = 0; i < 256; ++i) {
  96.                 data5.pop(palette.color[i].red);
  97.                 data5.pop(palette.color[i].green);
  98.                 data5.pop(palette.color[i].blue);
  99.             }
  100.             palette.apply();
  101.         }
  102.  
  103.         _recolorAnimationIf(data5, ANIM::PINBALL, 0, 4);
  104.         _recolorAnimationIf(data5, ANIM::PINBALL, 2, 4);
  105.         _recolorAnimationIf(data5, ANIM::CARROTPOLE, 0, 1);
  106.         _recolorAnimationIf(data5, ANIM::DIAMPOLE, 0, 1);
  107.         _recolorAnimationIf(data5, ANIM::PINBALL, 4, 8);
  108.         _recolorAnimationIf(data5, ANIM::JUNGLEPOLE, 0, 1);
  109.         _recolorAnimationIf(data5, ANIM::PLUS_SCENERY, 0, 17);
  110.         _recolorAnimationIf(data5, ANIM::PSYCHPOLE, 0, 1);
  111.         _recolorAnimationIf(data5, ANIM::SMALTREE, 0, 1);
  112.         _recolorAnimationIf(data5, ANIM::SNOW, 0, 8);
  113.         _recolorAnimationIf(data5, ANIM::COMMON, 2, 18);
  114.  
  115.         data5.pop(pbyte);
  116.         for (uint i = 0; i < pbyte; ++i) {
  117.             string tilesetFilename = _read7BitEncodedStringFromStream(data5);
  118.             uint16 tileStart, tileCount;
  119.             data5.pop(tileStart); data5.pop(tileCount);
  120.             array<uint8>@ colors = null;
  121.             data5.pop(pbool); if (pbool) {
  122.                 @colors = array<uint8>(256);
  123.                 for (uint j = 0; j < 256; ++j)
  124.                     data5.pop(colors[j]);
  125.             }
  126.             jjTilesFromTileset(tilesetFilename, tileStart, tileCount, colors);
  127.         }
  128.         if (pbyte != 0) {
  129.             array<uint> layersIDsWithTileMaps;
  130.             for (uint i = 1; i <= 8; ++i)
  131.                 if (jjLayers[i].hasTileMap)
  132.                     layersIDsWithTileMaps.insertLast(i);
  133.             jjLayersFromLevel(jjLevelFileName, layersIDsWithTileMaps);
  134.         }
  135.  
  136.         array<jjLAYER@> newLayerOrder, nonDefaultLayers;
  137.         data5.pop(puint);
  138.         for (uint i = 8; i < puint; i += 8) {
  139.             array<uint> layerIDsToGrab;
  140.             for (uint j = i; j < puint && j < i + 8; ++j) {
  141.                 layerIDsToGrab.insertLast((j & 7) + 1);
  142.             }
  143.             array<jjLAYER@> extraLayers = jjLayersFromLevel(jjLevelFileName.substr(0, jjLevelFileName.length() - 4) + '-MLLE-Data-' + (i/8) + '.j2l', layerIDsToGrab);
  144.             for (uint j = 0; j < extraLayers.length(); ++j)
  145.                 nonDefaultLayers.insertLast(extraLayers[j]);
  146.         }
  147.         uint nextNonDefaultLayerID = 0;
  148.         for (uint i = 0; i < puint; ++i) {
  149.             data5.pop(pchar);
  150.             jjLAYER@ layer;
  151.             if (pchar >= 0)
  152.                 @layer = jjLayers[pchar + 1];
  153.             else
  154.                 @layer = nonDefaultLayers[nextNonDefaultLayerID++];
  155.             string layerName = _read7BitEncodedStringFromStream(data5);
  156.             _layers.set(layerName, @layer);
  157.             data5.pop(pbool);
  158.             if (layer.hasTileMap)
  159.                 layer.hasTiles = !pbool;
  160.             data5.pop(pbyte);
  161.             layer.spriteMode = SPRITE::Mode(pbyte);
  162.             data5.pop(pbyte);
  163.             layer.spriteParam = pbyte;
  164.             data5.pop(pint);
  165.             layer.rotationAngle = pint;
  166.             data5.pop(pint);
  167.             layer.rotationRadiusMultiplier = pint;
  168.             newLayerOrder.insertLast(layer);
  169.         }
  170.         jjLayerOrderSet(newLayerOrder);
  171.  
  172.         uint16 numberOfImages; data5.pop(numberOfImages);
  173.         for (uint16 i = 0; i < numberOfImages; ++i) {
  174.             uint16 tileID; data5.pop(tileID);
  175.             jjPIXELMAP tile(32, 32);
  176.             for (int y = 0; y < 32; ++y)
  177.                 for (int x = 0; x < 32; ++x)
  178.                     data5.pop(tile[x,y]);
  179.             tile.save(tileID, true);
  180.         }
  181.         data5.pop(numberOfImages);
  182.         for (uint16 i = 0; i < numberOfImages; ++i) {
  183.             uint16 tileID; data5.pop(tileID);
  184.             jjMASKMAP tile;
  185.             for (int y = 0; y < 32; ++y)
  186.                 for (int x = 0; x < 32; ++x)
  187.                     data5.pop(tile[x,y]);
  188.             tile.save(tileID);
  189.         }
  190.  
  191.         if (!data5.isEmpty()) {
  192.             jjDebug('MLLE::Setup: Warning, Data5 longer than expected');
  193.         }
  194.        
  195.         return true;
  196.     }
  197.  
  198.     jjLAYER@ GetLayer(const string &in name) {
  199.         jjLAYER@ handle = null;
  200.         _layers.get(name, @handle);
  201.         return handle;
  202.     }
  203.  
  204.     jjPALCOLOR _colorFromArgb(uint Argb) {
  205.         return jjPALCOLOR(Argb >> 16, Argb >> 8, Argb >> 0);
  206.     }
  207.  
  208.     uint _read7BitEncodedUintFromStream(jjSTREAM@ stream) {
  209.         uint result = 0;
  210.         while (true) {
  211.             uint8 byteRead; stream.pop(byteRead);
  212.             result |= (byteRead & 0x7F);
  213.             if (byteRead >= 0x80)
  214.                 result <<= 7;
  215.             else
  216.                 break;
  217.         }
  218.         return result;
  219.     }
  220.     string _read7BitEncodedStringFromStream(jjSTREAM@ stream) {
  221.         string result;
  222.         stream.get(result, _read7BitEncodedUintFromStream(stream));
  223.         return result;
  224.     }
  225.  
  226.     void _recolorAnimationIf(jjSTREAM@ stream, ANIM::Set set, uint animID, uint frameCount) {
  227.         bool pbool; stream.pop(pbool); if (!pbool) return;
  228.  
  229.         if (jjAnimSets[set] == 0)
  230.             jjAnimSets[set].load();
  231.         const uint firstFrameID = jjAnimations[jjAnimSets[set] + animID];
  232.         array<uint8> colors(256);
  233.         for (uint i = 0; i < 256; ++i)
  234.             stream.pop(colors[i]);
  235.         for (uint i = 0; i < frameCount; ++i) {
  236.             jjANIMFRAME@ frame = jjAnimFrames[firstFrameID + i];
  237.             jjPIXELMAP image(frame);
  238.             for (uint x = 0; x < image.width; ++x)
  239.                 for (uint y = 0; y < image.height; ++y)
  240.                     image[x,y] = colors[image[x,y]];
  241.             image.save(frame);
  242.         }
  243.     }
  244. }