Downloads containing ezlumin.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: IlluminationFeatured Download PurpleJazz Battle 9.6 Download file

File preview

  1. const bool MLLESetupSuccessful = MLLE::Setup(); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5.asc" ///@MLLE-Generated
  3. #pragma require "ezlumin-MLLE-Data-2.j2l" ///@MLLE-Generated
  4. #pragma require "ezlumin-MLLE-Data-1.j2l" ///@MLLE-Generated
  5. #pragma require "ezlumin.j2l" ///@MLLE-Generated
  6. #pragma name "Nail Gun"
  7. #pragma require "Nail.j2a"
  8. #pragma require "f_ar3.wav"
  9. #pragma require "SpringMushroom.j2a"
  10. #pragma require "S3K_87.wav"
  11.  
  12. bool gameIsActive() {
  13.         return jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME;
  14. }
  15.  
  16. void onLevelLoad() {
  17.         jjUseLayer8Speeds = true;
  18.         jjTexturedBGFadePositionY = 0.9;
  19.        
  20.         jjObjectPresets[OBJECT::APPLE].behavior = Glitter();
  21.         jjObjectPresets[OBJECT::STEADYLIGHT].behavior = Glow();
  22.        
  23.         jjAnimSets[ANIM::CUSTOM[0]].load(0, "SpringMushroom.j2a");
  24.         jjAnimSets[ANIM::CUSTOM[1]].load(0, "Nail.j2a");
  25.        
  26.         for (int i = 0; i < 8; i++) {
  27.                 jjAnimations[jjAnimSets[ANIM::SPRING] + i] = jjAnimations[jjAnimSets[ANIM::CUSTOM[0]] + i];
  28.         }
  29.        
  30.         jjAnimations[jjAnimSets[ANIM::AMMO] + 62] = jjAnimations[jjAnimSets[ANIM::CUSTOM[1]] + 4];
  31.         jjAnimations[jjAnimSets[ANIM::AMMO] + 61] = jjAnimations[jjAnimSets[ANIM::CUSTOM[1]] + 5];
  32.        
  33.         jjSampleLoad(SOUND::P2_CRUNCH, "f_ar3.wav");
  34.        
  35.         jjObjectPresets[OBJECT::BOUNCERBULLET].behavior = FixedBouncer();
  36.        
  37.         jjObjectPresets[OBJECT::FIREBALLBULLET].behavior = jjObjectPresets[OBJECT::FIREBALLBULLETPU].behavior = Nailgun();
  38.         jjObjectPresets[OBJECT::FIREBALLBULLET].var[6] = 16;
  39.         jjObjectPresets[OBJECT::FIREBALLBULLET].counterEnd = 58;
  40.         jjObjectPresets[OBJECT::FIREBALLBULLET].killAnim = jjObjectPresets[OBJECT::BLASTERBULLET].killAnim;
  41.         jjObjectPresets[OBJECT::FIREBALLBULLET].special = jjObjectPresets[OBJECT::FIREBALLBULLET].determineCurAnim(ANIM::CUSTOM[1], 0);
  42.         jjObjectPresets[OBJECT::FIREBALLBULLET].xSpeed = jjObjectPresets[OBJECT::RFBULLET].xSpeed;
  43.         jjObjectPresets[OBJECT::FIREBALLBULLET].ySpeed = jjObjectPresets[OBJECT::RFBULLET].ySpeed;
  44.         jjObjectPresets[OBJECT::FIREBALLBULLET].xAcc = jjObjectPresets[OBJECT::RFBULLET].xAcc;
  45.         jjObjectPresets[OBJECT::FIREBALLBULLET].yAcc = jjObjectPresets[OBJECT::RFBULLET].yAcc;
  46.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].var[6] = 8 + 16;
  47.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].counterEnd = 52;
  48.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].killAnim = jjObjectPresets[OBJECT::BLASTERBULLET].killAnim;
  49.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].special = jjObjectPresets[OBJECT::FIREBALLBULLETPU].determineCurAnim(ANIM::CUSTOM[1], 1);
  50.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].xSpeed = jjObjectPresets[OBJECT::RFBULLETPU].xSpeed;
  51.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].ySpeed = jjObjectPresets[OBJECT::RFBULLETPU].ySpeed;
  52.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].xAcc = jjObjectPresets[OBJECT::RFBULLETPU].xAcc;
  53.         jjObjectPresets[OBJECT::FIREBALLBULLETPU].yAcc = jjObjectPresets[OBJECT::RFBULLETPU].yAcc;
  54.         jjObjectPresets[OBJECT::FIREBALLBULLET].lightType = jjObjectPresets[OBJECT::FIREBALLBULLETPU].lightType = LIGHT::POINT;
  55.        
  56.         jjObjectPresets[OBJECT::GUN8AMMO3].lightType = LIGHT::POINT;
  57.        
  58.         jjObjectPresets[OBJECT::GUN8POWERUP].determineCurAnim(ANIM::CUSTOM[1], 3);
  59.         jjObjectPresets[OBJECT::GUN8POWERUP].determineCurFrame();
  60.        
  61.         jjWeapons[WEAPON::GUN8].spread = SPREAD::NORMAL;
  62.         jjWeapons[WEAPON::GUN8].style = WEAPON::NORMAL;
  63.         jjWeapons[WEAPON::GUN8].gradualAim = false;
  64.         jjWeapons[WEAPON::GUN8].defaultSample = false;
  65.        
  66.         jjANIMATION@ anim = jjAnimations[jjAnimSets[ANIM::AMMO] + 71];
  67.         for (uint i = 0; i < anim.frameCount; ++i) {
  68.                 jjANIMFRAME@ frame = jjAnimFrames[anim + i];
  69.                 jjPIXELMAP sprite(frame);
  70.                 for (uint x = 0; x < sprite.width; ++x)
  71.                         for (uint y = 0; y < sprite.height; ++y)
  72.                         if (sprite[x,y] != 0) sprite[x,y] = 0;
  73.                 sprite.save(frame);
  74.         }
  75.        
  76.         auto proposedLayerOrder = jjLayerOrderGet();
  77.         jjLAYER@ layer = jjLAYER(jjLayers[1]);
  78.         proposedLayerOrder.insertAt(0, layer);
  79.         jjLayerOrderSet(proposedLayerOrder);
  80.        
  81.         jjANIMATION@ animRain = jjAnimations[jjAnimSets[ANIM::COMMON] + 2];
  82.         for (uint j = 0; j < animRain.frameCount; j++) {
  83.                 jjANIMFRAME@ frameRain = jjAnimFrames[animRain + j];
  84.                 jjPIXELMAP sprite(frameRain);
  85.                 for (uint x = 0; x < sprite.width; ++x) {
  86.                         for (uint y = 0; y < sprite.height; ++y) {
  87.                                 sprite[x,y] = 0;
  88.                         }
  89.                 }
  90.                 sprite.save(frameRain);
  91.         }
  92.        
  93.         generateCustomSpringSprites(jjAnimSets[ANIM::CUSTOM[2]], array<uint> = {40});
  94.         turnIntoCustomSpring(jjObjectPresets[OBJECT::FROZENSPRING], 0, 19.f, false);
  95.        
  96.         jjObjectPresets[OBJECT::REDSPRING].behavior =
  97.         jjObjectPresets[OBJECT::GREENSPRING].behavior =
  98.         jjObjectPresets[OBJECT::BLUESPRING].behavior =
  99.         jjObjectPresets[OBJECT::FROZENSPRING].behavior = SpringMushroom();
  100. }
  101.  
  102. jjANIMSET@ customSpringSprite;
  103. array<int> fastCustomSpringSpeeds(jjLocalPlayerCount);
  104. bool generateCustomSpringSprites(jjANIMSET@ anim, const array<uint> &in colors) {
  105.         int length = colors.length();
  106.         bool success = (@customSpringSprite = anim).allocate(array<uint>(length * 3, 5)) !is null;
  107.         if (success) {
  108.                 uint srcSet = jjAnimSets[ANIM::SPRING];
  109.                 for (int i = 0; i < length; i++) {
  110.                         uint color = colors[i];
  111.                         uint destAnimOffset = anim + i * 3;
  112.                         for (int j = 0; j < 3; j++) {
  113.                                 uint srcAnim = jjAnimations[srcSet + j];
  114.                                 uint destAnim = jjAnimations[destAnimOffset + j];
  115.                                 for (int k = 0; k < 5; k++) {
  116.                                         jjPIXELMAP image(jjAnimFrames[destAnim + k] = jjAnimFrames[srcAnim + k]);
  117.                                         int width = image.width;
  118.                                         int height = image.height;
  119.                                         for (int l = 0; l < height; l++) {
  120.                                                 for (int m = 0; m < width; m++) {
  121.                                                         int pixel = image[m, l];
  122.                                                         if (pixel >= 32 && pixel < 40)
  123.                                                                 image[m, l] = color + (pixel & 7);
  124.                                                 }
  125.                                         }
  126.                                         if (!image.save(jjAnimFrames[destAnim + k]))
  127.                                                 return false;
  128.                                 }
  129.                         }
  130.                 }
  131.         }
  132.         return success;
  133. }
  134. void initializeCustomSpring(jjOBJ@ obj) {
  135.         int anim = obj.curAnim;
  136.         obj.behave(obj.behavior = BEHAVIOR::SPRING, false);
  137.         if (obj.curAnim != anim) {
  138.                 obj.curAnim = anim + 2;
  139.                 obj.determineCurFrame();
  140.         }
  141.         obj.draw();
  142. }
  143. void turnIntoCustomSpring(jjOBJ@ obj, uint color, float power, bool horizontal) {
  144.         if (horizontal) {
  145.                 obj.xSpeed = power;
  146.                 obj.ySpeed = 0.f;
  147.         } else {
  148.                 obj.xSpeed = 0.f;
  149.                 obj.ySpeed = -power;
  150.                 if (obj.state == STATE::START && obj.creatorType == CREATOR::LEVEL) {
  151.                         int x = int(obj.xPos) >> 5;
  152.                         int y = int(obj.yPos) >> 5;
  153.                         if (jjParameterGet(x, y, 0, 1) != 0) {
  154.                                 jjParameterSet(x, y, 0, 1, 0);
  155.                                 obj.yPos -= 4.f;
  156.                                 obj.ySpeed = power;
  157.                         }
  158.                 }
  159.         }
  160.         obj.behavior = initializeCustomSpring;
  161.         obj.curAnim = customSpringSprite + color * 3 + (horizontal ? 1 : 0);
  162.         obj.energy = obj.frameID = obj.freeze = obj.justHit = obj.light = obj.points = 0;
  163.         obj.isBlastable = obj.isTarget = obj.scriptedCollisions = obj.triggersTNT = false;
  164.         obj.deactivates = obj.isFreezable = true;
  165.         obj.bulletHandling = HANDLING::IGNOREBULLET;
  166.         obj.playerHandling = HANDLING::SPECIAL;
  167.         obj.lightType = LIGHT::NORMAL;
  168.         obj.determineCurFrame();
  169. }
  170.  
  171. void onLevelBegin() {
  172.         for (int i = 1; i < 255; i++) {
  173.                 jjOBJ@ preset = jjObjectPresets[i];
  174.                 if (preset.playerHandling == HANDLING::PICKUP && preset.eventID != OBJECT::CARROT) {
  175.                         preset.behavior = CannotBeShotDown(preset.behavior);
  176.                 } else if (preset.eventID == OBJECT::CARROT) {
  177.                         preset.behavior = CannotBeBuried();
  178.                 }
  179.         }
  180.         array<jjLAYER@> layers = jjLayerOrderGet();
  181.         singleColorLayer(layers[0], 10);
  182.        
  183.         jjSampleLoad(SOUND::COMMON_SPRING1, "S3K_87.wav");
  184. }
  185.  
  186. class CannotBeShotDown : jjBEHAVIORINTERFACE {
  187.         CannotBeShotDown(const jjBEHAVIOR &in behavior) {
  188.                 originalBehavior = behavior;
  189.         }
  190.         void onBehave(jjOBJ@ obj) {
  191.                 obj.behave(originalBehavior);
  192.                 if (obj.state == STATE::FLOATFALL)
  193.                         obj.state = STATE::FLOAT;
  194.         }
  195.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  196.                 if (bullet is null) {
  197.                         obj.behavior = originalBehavior;
  198.                         if (player.objectHit(obj, force, obj.playerHandling))
  199.                                 return true;
  200.                         obj.behavior = this;
  201.                 }
  202.                 return false;
  203.         }
  204.         private jjBEHAVIOR originalBehavior;
  205. }
  206.  
  207. class CannotBeBuried : jjBEHAVIORINTERFACE {
  208.         void onBehave(jjOBJ@ obj) {
  209.                 obj.behave(BEHAVIOR::PICKUP);
  210.                 if (jjMaskedPixel(int(obj.xPos), int(obj.yPos + 8))) {
  211.                         obj.state = STATE::FLOAT;
  212.                 }
  213.                 if (obj.state == STATE::FLOATFALL) {
  214.                         obj.var[1] = 1;
  215.                 }
  216.                 if (obj.var[1] == 0) {
  217.                         if (obj.xOrg > 75*32) {
  218.                                 obj.xPos = obj.xOrg + 16;
  219.                         }
  220.                         if (obj.yOrg < 25*32) {
  221.                                 obj.xPos = obj.xOrg + 16;
  222.                                 obj.yPos = obj.yOrg + 16;
  223.                         }
  224.                 }
  225.                 if (obj.ySpeed < -8) obj.ySpeed = -8;
  226.         }
  227. }
  228.  
  229. class Glitter : jjBEHAVIORINTERFACE {
  230.         void onBehave(jjOBJ@ obj) {
  231.                 obj.playerHandling = HANDLING::PARTICLE;
  232.                 obj.yPos = obj.yOrg + 32;
  233.         }
  234. }
  235.  
  236. class Glow : jjBEHAVIORINTERFACE {
  237.         void onBehave(jjOBJ@ obj) {
  238.                 obj.behave(BEHAVIOR::STEADYLIGHT);
  239.                 obj.lightType = jjLowDetail? LIGHT::NONE : LIGHT::BRIGHT;
  240.         }
  241. }
  242.  
  243. class FixedBouncer : jjBEHAVIORINTERFACE {
  244.         void onBehave(jjOBJ@ obj) {
  245.                 obj.behave(BEHAVIOR::BOUNCERBULLET);
  246.                 float xSpeed = obj.xSpeed;
  247.                 float ySpeed = obj.ySpeed;
  248.                 if (xSpeed * obj.xSpeed < 0.f && ySpeed * obj.ySpeed < 0.f) {
  249.                         if (!jjMaskedPixel(int(obj.xPos + obj.xSpeed), int(obj.yPos + ySpeed))) {
  250.                                 obj.var[0] = obj.var[0] - 1;
  251.                                 obj.ySpeed = ySpeed;
  252.                                 if (ySpeed > 0.f)
  253.                                         obj.yPos += ySpeed;
  254.                         }
  255.                 }
  256.         }
  257. }
  258.  
  259. class Nailgun : jjBEHAVIORINTERFACE {
  260.         void onBehave(jjOBJ@ obj) {
  261.                 obj.behave(obj.state == STATE::EXPLODE? BEHAVIOR::BULLET : BEHAVIOR::RFBULLET, obj.state == STATE::EXPLODE? true:false);
  262.                 jjPLAYER@ creator = jjPlayers[obj.creatorID];
  263.                
  264.                 obj.var[0] = int(atan2(-obj.ySpeed, obj.xSpeed) * (512.f * 0.318309886142228f));
  265.                
  266.                 obj.xAcc = (obj.eventID == OBJECT::FIREBALLBULLETPU? 0.4:0.35) * obj.direction;
  267.                 if (obj.ySpeed < 0 && obj.direction == 0 && obj.xSpeed == 0) obj.yAcc = -0.6;
  268.                
  269.                
  270.                 if (obj.state != STATE::EXPLODE) {
  271.                         if (obj.counter == 1 && creator.isLocal) {
  272.                                 jjSample(creator.xPos, creator.yPos, SOUND::P2_CRUNCH, 48, obj.eventID == OBJECT::FIREBALLBULLETPU? 19000:17500);
  273.                                 obj.var[2] = 0;
  274.                                 obj.playerHandling = HANDLING::PLAYERBULLET;
  275.                         }
  276.                        
  277.                         jjDrawRotatedSprite(obj.xPos, obj.yPos, ANIM::CUSTOM[1], obj.eventID == OBJECT::FIREBALLBULLETPU? 1:0, 0, obj.var[0], 1, 1, SPRITE::NORMAL);
  278.                        
  279.                         /*float dx = jjLocalPlayers[0].xPos - obj.xPos, dy = jjLocalPlayers[0].yPos - obj.yPos;
  280.                         if ((dx * dx + dy * dy < 64 * 24) && !creator.isLocal && jjLocalPlayers[0].blink == 0 && (jjLocalPlayers[0].team != creator.team || jjFriendlyFire || jjGameMode != GAME::CTF) && gameIsActive()) {
  281.                                 jjLocalPlayers[0].xPos = obj.xPos - (24 * obj.direction);
  282.                                 jjLocalPlayers[0].ySpeed = obj.ySpeed;
  283.                         }*/
  284.                        
  285.                         if (jjMaskedPixel(int(obj.xPos + obj.xSpeed + obj.var[7] / 65536.f), int(obj.yPos))) {
  286.                                 obj.xSpeed = 0;
  287.                                 obj.var[7] = 0;
  288.                                 obj.playerHandling = HANDLING::PARTICLE;
  289.                                 obj.bePlatform((obj.xPos - (18 * obj.direction)), obj.yPos, 36, 8);
  290.                                 if (obj.var[2] == 0) {
  291.                                         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 0, 0);
  292.                                         obj.counter = 1;
  293.                                         obj.counterEnd = obj.eventID == OBJECT::FIREBALLBULLETPU? 120:110;
  294.                                         obj.var[2] = 1;
  295.                                 }
  296.                         }
  297.                         else if (jjMaskedPixel(int(obj.xPos), int(obj.yPos + obj.ySpeed))) {
  298.                                 obj.ySpeed = 0;
  299.                                 obj.playerHandling = HANDLING::PARTICLE;
  300.                                 if (obj.var[2] == 0) {
  301.                                         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 0, 0);
  302.                                         obj.counter = 1;
  303.                                         obj.counterEnd = obj.eventID == OBJECT::FIREBALLBULLETPU? 120:110;
  304.                                         obj.var[2] = 1;
  305.                                 }
  306.                         }
  307.                 } else {
  308.                         obj.clearPlatform();
  309.                         obj.var[2] = 0;
  310.                         obj.counterEnd = obj.eventID == OBJECT::FIREBALLBULLETPU? 55:60;
  311.                 }
  312.         }
  313. }
  314.  
  315. class SpringMushroom : jjBEHAVIORINTERFACE {
  316.         void onBehave(jjOBJ@ obj) {
  317.                 obj.behave(BEHAVIOR::SPRING);
  318.                 if (obj.state == STATE::SPRING && !jjLowDetail) {
  319.                         jjPARTICLE@ spores = jjAddParticle(PARTICLE::FIRE);
  320.                         if (spores !is null) {
  321.                                 spores.xPos = int(obj.xPos - 14) + (jjRandom()%14)*2;
  322.                                 spores.yPos = int(obj.yPos - 14) + jjRandom()%14;
  323.                                 if (jjRandom()%2 > 0)
  324.                                         spores.ySpeed = -1;
  325.                                 else spores.ySpeed = -0.6;
  326.                                 spores.fire.color = 64;
  327.                                 spores.fire.colorStop = 72;
  328.                         }
  329.                 }
  330.         }
  331. }
  332.  
  333. void onMain() {
  334.         array<jjLAYER@> layers = jjLayerOrderGet();
  335.         layers[0].spriteMode = jjLowDetail || jjColorDepth == 8? SPRITE::INVISIBLE : SPRITE::BLEND_OVERLAY;
  336.         layers[0].spriteParam = int(abs(jjSin(jjGameTicks*5)*255));
  337.        
  338.         jjIsSnowing = !jjLowDetail;
  339.         jjSnowingType = jjGameTicks % 7 == 0? SNOWING::FLOWER : SNOWING::RAIN;
  340.         jjSnowingIntensity = 0;
  341.         jjIsSnowingOutdoorsOnly = true;
  342.        
  343.         for (int i = 0; i < 1024; i++) {
  344.                 jjPARTICLE@ particle = jjParticles[i];
  345.                 if (particle.type == PARTICLE::FLOWER) {
  346.                         particle.xSpeed = -0.25;
  347.                         particle.ySpeed = 1;
  348.                         particle.flower.petals = 3;
  349.                         particle.flower.color = 144;
  350.                         if (particle.flower.size > 48) particle.flower.size = 48;
  351.                 }
  352.                 if (particle.type == PARTICLE::RAIN) {
  353.                         particle.type = PARTICLE::INACTIVE;
  354.                 }
  355.         }
  356. }
  357.  
  358. void singleColorLayer(jjLAYER@ layer, int color) {
  359.         array<int> tileIDs, uniqueTileIDs;
  360.         for (int i = 0; i < layer.height; i++) {
  361.                 for (int j = 0; j < layer.width; j++) {
  362.                         int tileID = layer.tileGet(j, i);
  363.                         if (tileID != 0)
  364.                                 tileIDs.insertLast(tileID);
  365.                 }
  366.         }
  367.         int prev = 0;
  368.         tileIDs.sortAsc();
  369.         for (uint i = 0; i < tileIDs.length(); i++) {
  370.                 if (tileIDs[i] != prev)
  371.                         uniqueTileIDs.insertLast(prev = tileIDs[i]);
  372.         }
  373.         uint firstNewTile = jjTileCount;
  374.         jjTilesFromTileset(jjTilesetFileName, 1, uniqueTileIDs.length());
  375.         for (uint i = 0; i < uniqueTileIDs.length(); i++) {
  376.                 jjPIXELMAP tile(uniqueTileIDs[i]);
  377.                 for (int j = 0; j < 32; j++) {
  378.                         for (int k = 0; k < 32; k++) {
  379.                                 uint8 pixel = tile[k, j];
  380.                                 if (pixel != 0) {
  381.                                         tile[k, j] = color;
  382.                                 }
  383.                         }
  384.                 }
  385.                 tile.save(firstNewTile + i);
  386.         }
  387.         layer.generateSettableTileArea();
  388.         for (int i = 0; i < layer.height; i++) {
  389.                 for (int j = 0; j < layer.widthReal; j++) {
  390.                         int tileID = layer.tileGet(j, i);
  391.                         if (tileID != 0)
  392.                                 layer.tileSet(j, i, firstNewTile + uniqueTileIDs.find(tileID));
  393.                 }
  394.         }
  395. }