Downloads containing MLLE-Include-1.5.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Percolator cooba Capture the flag N/A Download file
JJ2+ Only: Byzantine BluesFeatured Download Jelly Jam Capture the flag 8.2 Download file
TSF with JJ2+ Only: Pot PlantFeatured Download Loon Battle 9.1 Download file
TSF with JJ2+ Only: RagnarokFeatured Download Loon Capture the flag 8.5 Download file
TSF with JJ2+ Only: Galeloch CastleFeatured Download PurpleJazz Capture the flag 9.5 Download file
TSF with JJ2+ Only: Riparius Ridge Laro B. Capture the flag 7.9 Download file
TSF with JJ2+ Only: Ivankiv RaionFeatured Download Loon Capture the flag 8.7 Download file
TSF with JJ2+ Only: Relic ValleyFeatured Download FireSworD Battle 8.9 Download file

File preview

  1. //1617554964
  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.5.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.5.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.         if (level.isEmpty()) {
  37.             jjDebug('MLLE::Setup: Error reading "' + jjLevelFileName + '"!');
  38.             return false;
  39.         }
  40.         level.discard(230);
  41.         array<uint> CompressedDataSizes(4, 0);
  42.         for (uint i = 0; i < CompressedDataSizes.length; ++i) {
  43.             level.pop(CompressedDataSizes[i]);
  44.             level.discard(4);
  45.         }
  46.         for (uint i = 0; i < CompressedDataSizes.length; ++i)
  47.             level.discard(CompressedDataSizes[i]);
  48.  
  49.         if (level.getSize() < 20) {
  50.             jjDebug('MLLE::Setup: Level file does not contain any additional data!');
  51.             return false;
  52.         }
  53.         string magic;
  54.         level.get(magic, 'MLLE'.length);
  55.         if (magic != 'MLLE') {
  56.             jjDebug('MLLE::Setup: Level was not saved by MLLE!');
  57.             return false;
  58.         }
  59.         uint levelDataVersion;
  60.         level.pop(levelDataVersion);
  61.         if (levelDataVersion != 0x105) {
  62.             jjDebug('MLLE::Setup: Level\'s Data5 section was saved in a different version of MLLE than this script!');
  63.             return false;
  64.         }
  65.  
  66.         uint csize, usize;
  67.         level.pop(csize); level.pop(usize);
  68.         jjSTREAM data5;
  69.         if (!jjZlibUncompress(level, data5, usize)) {
  70.             jjDebug('MLLE::Setup: Error during ZLIB uncompression!');
  71.             return false;
  72.         }
  73.  
  74.         bool pbool; uint8 pbyte; int8 pchar; float pfloat; int pint; uint puint, puint2;
  75.         data5.pop(pbool); jjIsSnowing = pbool;
  76.         data5.pop(pbool); jjIsSnowingOutdoorsOnly = pbool;
  77.         data5.pop(pbyte); jjSnowingIntensity = pbyte;
  78.         data5.pop(pbyte); jjSnowingType = SNOWING::Type(pbyte);
  79.  
  80.         if (jjIsSnowing) {
  81.             if (jjSnowingType == SNOWING::SNOW && jjAnimSets[ANIM::SNOW] == 0)
  82.                 jjAnimSets[ANIM::SNOW].load();
  83.             else if (jjSnowingType == SNOWING::LEAF && jjAnimSets[ANIM::PLUS_SCENERY] == 0)
  84.                 jjAnimSets[ANIM::PLUS_SCENERY].load();
  85.         }
  86.  
  87.         data5.pop(pbool); jjWarpsTransmuteCoins = pbool;
  88.         data5.pop(pbool); jjDelayGeneratedCrateOrigins = pbool;
  89.         data5.pop(pint);  jjEcho = pint;
  90.         data5.pop(puint); jjSetDarknessColor(_colorFromArgb(puint));
  91.         data5.pop(pfloat);jjWaterChangeSpeed = pfloat;
  92.         data5.pop(pbyte); jjWaterInteraction = WATERINTERACTION::WaterInteraction(pbyte);
  93.         data5.pop(pint);  jjWaterLayer = pint;
  94.         data5.pop(pbyte); jjWaterLighting = WATERLIGHT::wl(pbyte);
  95.         data5.pop(pfloat); if (int(pfloat) < jjLayerHeight[4] * 32) jjSetWaterLevel(pfloat, true);
  96.         data5.pop(puint); data5.pop(puint2); jjSetWaterGradient(_colorFromArgb(puint), _colorFromArgb(puint2));
  97.  
  98.         data5.pop(pbool); if (pbool) {
  99.             for (uint i = 0; i < 256; ++i) {
  100.                 data5.pop(palette.color[i].red);
  101.                 data5.pop(palette.color[i].green);
  102.                 data5.pop(palette.color[i].blue);
  103.             }
  104.             palette.apply();
  105.         }
  106.  
  107.         _recolorAnimationIf(data5, ANIM::PINBALL, 0, 4);
  108.         _recolorAnimationIf(data5, ANIM::PINBALL, 2, 4);
  109.         _recolorAnimationIf(data5, ANIM::CARROTPOLE, 0, 1);
  110.         _recolorAnimationIf(data5, ANIM::DIAMPOLE, 0, 1);
  111.         _recolorAnimationIf(data5, ANIM::PINBALL, 4, 8);
  112.         _recolorAnimationIf(data5, ANIM::JUNGLEPOLE, 0, 1);
  113.         _recolorAnimationIf(data5, ANIM::PLUS_SCENERY, 0, 17);
  114.         _recolorAnimationIf(data5, ANIM::PSYCHPOLE, 0, 1);
  115.         _recolorAnimationIf(data5, ANIM::SMALTREE, 0, 1);
  116.         _recolorAnimationIf(data5, ANIM::SNOW, 0, 8);
  117.         _recolorAnimationIf(data5, ANIM::COMMON, 2, 18);
  118.         _recolorAnimationIf(data5, ANIM::BOLLPLAT, 0, 2);
  119.         _recolorAnimationIf(data5, ANIM::FRUITPLAT, 0, 2);
  120.         _recolorAnimationIf(data5, ANIM::GRASSPLAT, 0, 2);
  121.         _recolorAnimationIf(data5, ANIM::PINKPLAT, 0, 2);
  122.         _recolorAnimationIf(data5, ANIM::SONICPLAT, 0, 2);
  123.         _recolorAnimationIf(data5, ANIM::SPIKEPLAT, 0, 2);
  124.         _recolorAnimationIf(data5, ANIM::SPIKEBOLL, 0, 2);
  125.         _recolorAnimationIf(data5, ANIM::SPIKEBOLL3D, 0, 2);
  126.         _recolorAnimationIf(data5, ANIM::VINE, 1, 1);
  127.  
  128.         data5.pop(pbyte);
  129.         for (uint i = 0; i < pbyte; ++i) {
  130.             string tilesetFilename = _read7BitEncodedStringFromStream(data5);
  131.             uint16 tileStart, tileCount;
  132.             data5.pop(tileStart); data5.pop(tileCount);
  133.             array<uint8>@ colors = null;
  134.             data5.pop(pbool); if (pbool) {
  135.                 @colors = array<uint8>(256);
  136.                 for (uint j = 0; j < 256; ++j)
  137.                     data5.pop(colors[j]);
  138.             }
  139.             if (!jjTilesFromTileset(tilesetFilename, tileStart, tileCount, colors)) {
  140.                 jjDebug('MLLE::Setup: Error reading "' + tilesetFilename + '"!');
  141.                 return false;
  142.             }
  143.         }
  144.         if (pbyte != 0) {
  145.             array<uint> layersIDsWithTileMaps;
  146.             for (uint i = 1; i <= 8; ++i)
  147.                 if (jjLayers[i].hasTileMap)
  148.                     layersIDsWithTileMaps.insertLast(i);
  149.             if (jjLayersFromLevel(jjLevelFileName, layersIDsWithTileMaps).length == 0) {
  150.                 jjDebug('MLLE::Setup: Error reading "' + jjLevelFileName + '"!');
  151.             }
  152.         }
  153.  
  154.         array<jjLAYER@> newLayerOrder, nonDefaultLayers;
  155.         data5.pop(puint);
  156.         for (uint i = 8; i < puint; i += 8) {
  157.             array<uint> layerIDsToGrab;
  158.             for (uint j = i; j < puint && j < i + 8; ++j) {
  159.                 layerIDsToGrab.insertLast((j & 7) + 1);
  160.             }
  161.             const string extraLayersFilename = jjLevelFileName.substr(0, jjLevelFileName.length() - 4) + '-MLLE-Data-' + (i/8) + '.j2l';
  162.             array<jjLAYER@> extraLayers = jjLayersFromLevel(extraLayersFilename, layerIDsToGrab);
  163.             if (extraLayers.length == 0) {
  164.                 jjDebug('MLLE::Setup: Error reading "' + extraLayersFilename + '"!');
  165.                 return false;
  166.             }
  167.             for (uint j = 0; j < extraLayers.length(); ++j)
  168.                 nonDefaultLayers.insertLast(extraLayers[j]);
  169.         }
  170.         uint nextNonDefaultLayerID = 0;
  171.         for (uint i = 0; i < puint; ++i) {
  172.             data5.pop(pchar);
  173.             jjLAYER@ layer;
  174.             if (pchar >= 0)
  175.                 @layer = jjLayers[pchar + 1];
  176.             else
  177.                 @layer = nonDefaultLayers[nextNonDefaultLayerID++];
  178.             string layerName = _read7BitEncodedStringFromStream(data5);
  179.             _layers.set(layerName, @layer);
  180.             data5.pop(pbool);
  181.             if (layer.hasTileMap)
  182.                 layer.hasTiles = !pbool;
  183.             data5.pop(pbyte);
  184.             layer.spriteMode = SPRITE::Mode(pbyte);
  185.             data5.pop(pbyte);
  186.             layer.spriteParam = pbyte;
  187.             data5.pop(pint);
  188.             layer.rotationAngle = pint;
  189.             data5.pop(pint);
  190.             layer.rotationRadiusMultiplier = pint;
  191.             newLayerOrder.insertLast(layer);
  192.         }
  193.         jjLayerOrderSet(newLayerOrder);
  194.  
  195.         uint16 numberOfImages; data5.pop(numberOfImages);
  196.         for (uint16 i = 0; i < numberOfImages; ++i) {
  197.             uint16 tileID; data5.pop(tileID);
  198.             jjPIXELMAP tile(32, 32);
  199.             for (int y = 0; y < 32; ++y)
  200.                 for (int x = 0; x < 32; ++x)
  201.                     data5.pop(tile[x,y]);
  202.             tile.save(tileID, true);
  203.         }
  204.         data5.pop(numberOfImages);
  205.         for (uint16 i = 0; i < numberOfImages; ++i) {
  206.             uint16 tileID; data5.pop(tileID);
  207.             jjMASKMAP tile;
  208.             for (int y = 0; y < 32; ++y)
  209.                 for (int x = 0; x < 32; ++x)
  210.                     data5.pop(tile[x,y]);
  211.             tile.save(tileID, true);
  212.         }
  213.  
  214.         for (uint i = 1; i <= 9; ++i) {
  215.             jjWEAPON@ weapon = jjWeapons[i];
  216.             data5.pop(pbool);
  217.             data5.pop(pint); weapon.maximum = pint;
  218.             data5.pop(pbyte); weapon.comesFromBirds = pbyte != 0; weapon.comesFromBirdsPowerup = pbyte == 2;
  219.             data5.pop(pbyte); weapon.comesFromGunCrates = pbyte != 0;
  220.             data5.pop(pbyte); weapon.gemsLost = pbyte;
  221.             data5.pop(pbyte); weapon.gemsLostPowerup = pbyte;
  222.             data5.pop(pbyte); weapon.infinite = pbyte & 1 == 1; weapon.replenishes = pbyte & 2 == 2;
  223.             uint8 ammoCrateEventID = 0;
  224.             if (i >= 7) {
  225.                 data5.pop(ammoCrateEventID);
  226.                 if (ammoCrateEventID > 32) {
  227.                     jjOBJ@ preset = jjObjectPresets[ammoCrateEventID];
  228.                     preset.behavior = function(obj) { if (obj.state == STATE::DEACTIVATE) obj.eventID = obj.counterEnd; obj.behave(BEHAVIOR::AMMO15); };
  229.                     preset.playerHandling = HANDLING::SPECIAL;
  230.                     preset.scriptedCollisions = false;
  231.                     preset.direction = 1;
  232.                     preset.energy = 1;
  233.                     preset.curFrame = jjAnimations[preset.curAnim = (i == 7) ? (jjAnimSets[ANIM::PICKUPS] + 59) : (jjAnimSets[ANIM::PLUS_COMMON] + i - 8)] + (preset.frameID = 0);
  234.                     preset.killAnim = jjAnimSets[ANIM::AMMO] + 71;
  235.                     preset.eventID = OBJECT::ICEAMMO15;
  236.                     preset.counterEnd = ammoCrateEventID;
  237.                     preset.var[2] = 31 + i;
  238.                     preset.var[3] = i - 1;
  239.                     preset.points = 300;
  240.                 }
  241.             }
  242.             if (i == 8) {
  243.                 data5.pop(pbyte);
  244.                 if (pbyte == 0)
  245.                     weapon.spread = SPREAD::GUN8;
  246.                 else if (pbyte == 1)
  247.                     weapon.spread = SPREAD::PEPPERSPRAY;
  248.                 else if (pbyte >= 2)
  249.                     weapon.spread = SPREAD::NORMAL;
  250.                 if (pbyte == 2)
  251.                     weapon.gradualAim = false;
  252.             }
  253.         }
  254.  
  255.         if (!data5.isEmpty()) {
  256.             jjDebug('MLLE::Setup: Warning, Data5 longer than expected');
  257.         }
  258.        
  259.         return true;
  260.     }
  261.  
  262.     jjLAYER@ GetLayer(const string &in name) {
  263.         jjLAYER@ handle = null;
  264.         _layers.get(name, @handle);
  265.         return handle;
  266.     }
  267.  
  268.     jjPALCOLOR _colorFromArgb(uint Argb) {
  269.         return jjPALCOLOR(Argb >> 16, Argb >> 8, Argb >> 0);
  270.     }
  271.  
  272.     uint _read7BitEncodedUintFromStream(jjSTREAM@ stream) {
  273.         uint result = 0;
  274.         while (true) {
  275.             uint8 byteRead; stream.pop(byteRead);
  276.             result |= (byteRead & 0x7F);
  277.             if (byteRead >= 0x80)
  278.                 result <<= 7;
  279.             else
  280.                 break;
  281.         }
  282.         return result;
  283.     }
  284.     string _read7BitEncodedStringFromStream(jjSTREAM@ stream) {
  285.         string result;
  286.         stream.get(result, _read7BitEncodedUintFromStream(stream));
  287.         return result;
  288.     }
  289.  
  290.     void _recolorAnimationIf(jjSTREAM@ stream, ANIM::Set set, uint animID, uint frameCount) {
  291.         bool pbool; stream.pop(pbool); if (!pbool) return;
  292.  
  293.         if (jjAnimSets[set] == 0)
  294.             jjAnimSets[set].load();
  295.         const uint firstFrameID = jjAnimations[jjAnimSets[set] + animID];
  296.         array<uint8> colors(256);
  297.         for (uint i = 0; i < 256; ++i)
  298.             stream.pop(colors[i]);
  299.         for (uint i = 0; i < frameCount; ++i) {
  300.             jjANIMFRAME@ frame = jjAnimFrames[firstFrameID + i];
  301.             jjPIXELMAP image(frame);
  302.             for (uint x = 0; x < image.width; ++x)
  303.                 for (uint y = 0; y < image.height; ++y)
  304.                     image[x,y] = colors[image[x,y]];
  305.             image.save(frame);
  306.         }
  307.     }
  308. }