Downloads containing MLLE-Include-1.5w.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Goliath WoodsFeatured Download PurpleJazz Capture the flag 8.9 Download file
TSF with JJ2+ Only: Hollow of the HauntedFeatured Download cooba Capture the flag 9.2 Download file
TSF with JJ2+ Only: street fight!!!!!!! cooba Battle N/A Download file
TSF with JJ2+ Only: The DARKEST Diamonds Killer NC Capture the flag 7.5 Download file
TSF with JJ2+ Only: Giant's StepsFeatured Download PurpleJazz Capture the flag 9.2 Download file
TSF with JJ2+ Only: Anniversary Bash 22 levels Jazz2Online Multiple N/A Download file
TSF with JJ2+ Only: The AbyssFeatured Download PurpleJazz Battle 9.8 Download file
TSF with JJ2+ Only: Facilis descensus Averno Loon Battle N/A Download file
TSF with JJ2+ Only: Umbral ThicketFeatured Download PurpleJazz Battle 9.5 Download file
JJ2+ Only: Tech Tree Violet CLM Capture the flag 7.8 Download file

File preview

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