Downloads containing ab22btl03.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 22 levels Jazz2Online Multiple N/A Download file

File preview

  1. const bool MLLESetupSuccessful = MLLE::Setup(); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5.asc" ///@MLLE-Generated
  3. #pragma require "ab22btl03.j2l" ///@MLLE-Generated
  4. #pragma require "SEenergyblast.asc"
  5. #pragma require "SEfirework.asc"
  6. #pragma require "SEroller.asc"
  7. #include "SEenergyblast.asc"
  8. #include "SEfirework.asc"
  9. #include "SEroller.asc"
  10. #pragma require "Nail.j2a"
  11. #pragma require "f_ar3.wav"
  12. #pragma require "BubbleGun.j2a"
  13.  
  14. bool gameIsActive() {
  15.         return jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME;
  16. }
  17.  
  18. jjANIMSET@ customSpringSprite;
  19. bool generateCustomSpringSprites(jjANIMSET@ anim, const array<uint> &in colors) {
  20.         int length = colors.length();
  21.         bool success = (@customSpringSprite = anim).allocate(array<uint>(length * 3, 5)) !is null;
  22.         if (success) {
  23.                 uint srcSet = jjAnimSets[ANIM::SPRING];
  24.                 for (int i = 0; i < length; i++) {
  25.                         uint color = colors[i];
  26.                         uint destAnimOffset = anim + i * 3;
  27.                         for (int j = 0; j < 3; j++) {
  28.                                 uint srcAnim = jjAnimations[srcSet + j];
  29.                                 uint destAnim = jjAnimations[destAnimOffset + j];
  30.                                 for (int k = 0; k < 5; k++) {
  31.                                         jjPIXELMAP image(jjAnimFrames[destAnim + k] = jjAnimFrames[srcAnim + k]);
  32.                                         int width = image.width;
  33.                                         int height = image.height;
  34.                                         for (int l = 0; l < height; l++) {
  35.                                                 for (int m = 0; m < width; m++) {
  36.                                                         int pixel = image[m, l];
  37.                                                         if (pixel >= 32 && pixel < 40)
  38.                                                                 image[m, l] = color + (pixel & 7);
  39.                                                 }
  40.                                         }
  41.                                         if (!image.save(jjAnimFrames[destAnim + k]))
  42.                                                 return false;
  43.                                 }
  44.                         }
  45.                 }
  46.         }
  47.         return success;
  48. }
  49. void initializeCustomSpring(jjOBJ@ obj) {
  50.         int anim = obj.curAnim;
  51.         obj.behave(obj.behavior = BEHAVIOR::SPRING, false);
  52.         if (obj.curAnim != anim) {
  53.                 obj.curAnim = anim + 2;
  54.                 obj.determineCurFrame();
  55.         }
  56.         obj.draw();
  57. }
  58. void turnIntoCustomSpring(jjOBJ@ obj, uint color, float power, bool horizontal) {
  59.         if (horizontal) {
  60.                 obj.xSpeed = power;
  61.                 obj.ySpeed = 0.f;
  62.         } else {
  63.                 obj.xSpeed = 0.f;
  64.                 obj.ySpeed = -power;
  65.                 if (obj.state == STATE::START && obj.creatorType == CREATOR::LEVEL) {
  66.                         int x = int(obj.xPos) >> 5;
  67.                         int y = int(obj.yPos) >> 5;
  68.                         if (jjParameterGet(x, y, 0, 1) != 0) {
  69.                                 jjParameterSet(x, y, 0, 1, 0);
  70.                                 obj.yPos -= 4.f;
  71.                                 obj.ySpeed = power;
  72.                         }
  73.                 }
  74.         }
  75.         obj.behavior = initializeCustomSpring;
  76.         obj.curAnim = customSpringSprite + color * 3 + (horizontal ? 1 : 0);
  77.         obj.energy = obj.frameID = obj.freeze = obj.justHit = obj.light = obj.points = 0;
  78.         obj.causesRicochet = obj.isBlastable = obj.isTarget = obj.scriptedCollisions = obj.triggersTNT = false;
  79.         obj.deactivates = obj.isFreezable = true;
  80.         obj.bulletHandling = HANDLING::IGNOREBULLET;
  81.         obj.playerHandling = HANDLING::SPECIAL;
  82.         obj.lightType = LIGHT::NORMAL;
  83.         obj.determineCurFrame();
  84. }
  85.  
  86. se::DefaultWeaponHook weaponHook;
  87. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  88.        
  89.         return weaponHook.drawAmmo(player, canvas);
  90. }
  91. void onMain() {
  92.         weaponHook.processMain();
  93. }
  94. void onPlayer(jjPLAYER@ player) {
  95.         weaponHook.processPlayer(player);
  96. }
  97. void onPlayerInput(jjPLAYER@ player) {
  98.         if (player.yPos > jjWaterLevel && player.currWeapon == 4)
  99.                 player.keyFire = false;
  100.         weaponHook.processPlayerInput(player);
  101. }
  102. void onReceive(jjSTREAM &in packet, int clientID) {
  103.         weaponHook.processPacket(packet, clientID);
  104. }
  105. void onLevelLoad() {
  106.         jjWaterLighting = WATERLIGHT::GLOBAL;
  107.         jjSetWaterLevel(61*32, true);
  108.        
  109.         se::firework.loadAnims(jjAnimSets[ANIM::CUSTOM[0]]);
  110.         se::firework.loadSamples(array<SOUND::Sample> = {SOUND::INTRO_BOEM1, SOUND::INTRO_BOEM2});
  111.         se::firework.setAsWeapon(6, weaponHook);
  112.         se::energyBlast.loadAnims(jjAnimSets[ANIM::CUSTOM[1]]);
  113.         se::energyBlast.loadSamples(array<SOUND::Sample> = {SOUND::INTRO_BLOW});
  114.         se::energyBlast.setAsWeapon(4, weaponHook);
  115.         se::roller.loadAnims(jjAnimSets[ANIM::CUSTOM[2]]);
  116.         se::roller.loadSamples(array<SOUND::Sample> = {SOUND::INTRO_END});
  117.         se::roller.setAsWeapon(2, weaponHook);
  118.         generateCustomSpringSprites(jjAnimSets[ANIM::CUSTOM[3]], array<uint> = {40});
  119.         turnIntoCustomSpring(jjObjectPresets[OBJECT::GREENSPRING], 0, 19.f, false);
  120.         jjObjectPresets[OBJECT::SEEKERAMMO3].behavior = StaticPickup(jjObjectPresets[OBJECT::SEEKERAMMO3].behavior);
  121.         jjObjectPresets[OBJECT::CARROT].behavior = StaticPickup(jjObjectPresets[OBJECT::CARROT].behavior);
  122.        
  123.         jjAnimSets[ANIM::CUSTOM[40]].load(0, "BubbleGun.j2a");
  124.         jjAnimSets[ANIM::CUSTOM[41]].load(1, "BubbleGun.j2a");
  125.         jjAnimSets[ANIM::CUSTOM[42]].load(2, "BubbleGun.j2a");
  126.         jjAnimations[jjAnimSets[ANIM::AMMO] + 29] = jjAnimations[jjAnimSets[ANIM::AMMO] + 8];
  127.         jjAnimations[jjAnimSets[ANIM::AMMO] + 28] = jjAnimations[jjAnimSets[ANIM::CUSTOM[40]] + 0];
  128.        
  129.         jjObjectPresets[OBJECT::ICEBULLET].special = jjObjectPresets[OBJECT::ICEBULLET].determineCurAnim(ANIM::AMMO, 8);
  130.         jjObjectPresets[OBJECT::ICEBULLET].behavior = BubbleGun;
  131.         jjObjectPresets[OBJECT::ICEBULLET].xSpeed = 1.5;
  132.         jjObjectPresets[OBJECT::ICEBULLET].counterEnd = 105;
  133.         jjObjectPresets[OBJECT::ICEBULLET].var[6] = 0;
  134.         jjObjectPresets[OBJECT::ICEBULLET].freeze = 0;
  135.         jjObjectPresets[OBJECT::ICEBULLET].lightType = jjObjectPresets[OBJECT::BLASTERBULLET].lightType;
  136.  
  137.         jjObjectPresets[OBJECT::ICEBULLETPU].special = jjObjectPresets[OBJECT::ICEBULLETPU].determineCurAnim(ANIM::CUSTOM[40], 0);
  138.         jjObjectPresets[OBJECT::ICEBULLETPU].behavior = BubbleGunPU;
  139.         jjObjectPresets[OBJECT::ICEBULLETPU].xSpeed = 2;
  140.         jjObjectPresets[OBJECT::ICEBULLETPU].counterEnd = 105;
  141.         jjObjectPresets[OBJECT::ICEBULLETPU].var[6] = 8;
  142.         jjObjectPresets[OBJECT::ICEBULLETPU].freeze = 0;
  143.         jjObjectPresets[OBJECT::ICEBULLETPU].lightType = jjObjectPresets[OBJECT::BLASTERBULLET].lightType;
  144.        
  145.         jjObjectPresets[OBJECT::ICEPOWERUP].determineCurAnim(ANIM::CUSTOM[41], 0, true);
  146.         jjObjectPresets[OBJECT::ICEPOWERUP].determineCurFrame();
  147.        
  148.         jjWeapons[WEAPON::ICE].spread = SPREAD::NORMAL;
  149.         jjWeapons[WEAPON::ICE].defaultSample = false;
  150.  
  151.         jjANIMATION@ anim = jjAnimations[jjAnimSets[ANIM::AMMO] + 82];
  152.         for (uint i = 0; i < anim.frameCount; ++i) {
  153.                 jjANIMFRAME@ frame = jjAnimFrames[anim + i];
  154.                 jjPIXELMAP sprite(frame);
  155.                 for (uint x = 0; x < sprite.width; ++x) {
  156.                         for (uint y = 0; y < sprite.height; ++y) {
  157.                                 if (sprite[x, y] != 0 && sprite[x, y] != 15)
  158.                                         sprite[x, y] += 33;
  159.                         }
  160.                 }
  161.                 sprite.save(frame);
  162.         }
  163.        
  164.         jjAnimSets[ANIM::CUSTOM[25]].load(0, "Nail.j2a");
  165.        
  166.         jjAnimations[jjAnimSets[ANIM::AMMO] + 49] = jjAnimations[jjAnimSets[ANIM::CUSTOM[25]] + 4];
  167.         jjAnimations[jjAnimSets[ANIM::AMMO] + 48] = jjAnimations[jjAnimSets[ANIM::CUSTOM[25]] + 5];
  168.        
  169.         jjSampleLoad(SOUND::WIND_WIND2A, "f_ar3.wav");
  170.        
  171.         jjObjectPresets[OBJECT::RFBULLET].behavior = jjObjectPresets[OBJECT::RFBULLETPU].behavior = Nailgun();
  172.         jjObjectPresets[OBJECT::RFBULLET].var[6] = 16;
  173.         jjObjectPresets[OBJECT::RFBULLET].counterEnd = 60;
  174.         jjObjectPresets[OBJECT::RFBULLET].killAnim = jjObjectPresets[OBJECT::BLASTERBULLET].killAnim;
  175.         jjObjectPresets[OBJECT::RFBULLET].special = jjObjectPresets[OBJECT::RFBULLET].determineCurAnim(ANIM::CUSTOM[25], 0);
  176.         jjObjectPresets[OBJECT::RFBULLETPU].var[6] = 8 + 16;
  177.         jjObjectPresets[OBJECT::RFBULLETPU].counterEnd = 55;
  178.         jjObjectPresets[OBJECT::RFBULLETPU].killAnim = jjObjectPresets[OBJECT::BLASTERBULLET].killAnim;
  179.         jjObjectPresets[OBJECT::RFBULLETPU].special = jjObjectPresets[OBJECT::RFBULLETPU].determineCurAnim(ANIM::CUSTOM[25], 1);
  180.         jjObjectPresets[OBJECT::RFBULLET].lightType = jjObjectPresets[OBJECT::RFBULLETPU].lightType = LIGHT::POINT;
  181.        
  182.         jjObjectPresets[OBJECT::RFAMMO3].lightType = LIGHT::POINT;
  183.        
  184.         jjObjectPresets[OBJECT::RFAMMO15].determineCurAnim(ANIM::CUSTOM[25], 2);
  185.         jjObjectPresets[OBJECT::RFAMMO15].determineCurFrame();
  186.        
  187.         jjObjectPresets[OBJECT::RFPOWERUP].determineCurAnim(ANIM::CUSTOM[25], 3);
  188.         jjObjectPresets[OBJECT::RFPOWERUP].determineCurFrame();
  189.        
  190.         jjWeapons[WEAPON::RF].spread = SPREAD::NORMAL;
  191.         jjWeapons[WEAPON::RF].style = WEAPON::NORMAL;
  192.         jjWeapons[WEAPON::RF].defaultSample = false;
  193.        
  194.         jjANIMATION@ anim2 = jjAnimations[jjAnimSets[ANIM::AMMO] + 71];
  195.         for (uint i = 0; i < anim2.frameCount; ++i) {
  196.                 jjANIMFRAME@ frame2 = jjAnimFrames[anim2 + i];
  197.                 jjPIXELMAP sprite2(frame2);
  198.                 for (uint x = 0; x < sprite2.width; ++x)
  199.                         for (uint y = 0; y < sprite2.height; ++y)
  200.                         if (sprite2[x,y] != 0) sprite2[x,y] = 0;
  201.                 sprite2.save(frame2);
  202.         }
  203.        
  204.         for (int i = 0; i < 2; i++) {
  205.                 auto@ frame = jjAnimFrames[jjAnimations[jjAnimSets[ANIM::GRASSPLAT] + i]];
  206.                 jjPIXELMAP image(frame);
  207.                 for (uint j = 0; j < image.height; j++) {
  208.                         for (uint k = 0; k < image.width; k++) {
  209.                                 uint8 color = image[k, j];
  210.                                 if (color >= 16 && color < 24)
  211.                                         image[k, j] = color | 128;
  212.                         }
  213.                 }
  214.                 image.save(frame);
  215.         }
  216. }
  217.  
  218. void onLevelBegin() {
  219.         jjANIMATION@ anim = jjAnimations[jjAnimSets[ANIM::CUSTOM[10]] + 4];
  220.         for (uint i = 0; i < anim.frameCount; ++i) {
  221.                 jjANIMFRAME@ frame = jjAnimFrames[anim + i];
  222.                 jjPIXELMAP sprite(frame);
  223.                 for (uint x = 0; x < sprite.width; ++x)
  224.                         for (uint y = 0; y < sprite.height; ++y)
  225.                         if (sprite[x,y] < 8 && x <= 16 && y >= 2) sprite[x,y] = 71;
  226.                 sprite.save(frame);
  227.         }
  228. }
  229.  
  230. void BubbleGun(jjOBJ@ bubble) {
  231.     if (bubble.state == STATE::START) {
  232.                 bubble.state = STATE::FLY;
  233.                 jjSample(bubble.xPos, bubble.yPos, SOUND::COMMON_PLOP2, 0, 0);
  234.         }
  235.        
  236.         if (jjMaskedPixel(int(bubble.xPos) + int(bubble.xSpeed), int(bubble.yPos)) || jjMaskedPixel(int(bubble.xPos) - int(bubble.xSpeed), int(bubble.yPos)) || jjMaskedPixel(int(bubble.xPos), int(bubble.yPos) + int(bubble.ySpeed)) || jjMaskedPixel(int(bubble.xPos), int(bubble.yPos) - int(bubble.ySpeed))) {
  237.                 jjSample(bubble.xPos, bubble.yPos, SOUND::P2_SPLOUT, 0, 0);
  238.         }
  239.        
  240.         bubble.behave(BEHAVIOR::WATERSHIELDBULLET);
  241.         bubble.killAnim = jjObjectPresets[OBJECT::WATERSHIELDBULLET].killAnim;
  242. }
  243.  
  244. void BubbleGunPU(jjOBJ@ bubble) {
  245.         if (bubble.state == STATE::START) {
  246.                 bubble.state = STATE::FLY;
  247.                 jjSample(bubble.xPos, bubble.yPos, SOUND::COMMON_PLOP2, 0, 0);
  248.         }
  249.  
  250.         if (jjMaskedPixel(int(bubble.xPos) + int(bubble.xSpeed), int(bubble.yPos)) || jjMaskedPixel(int(bubble.xPos) - int(bubble.xSpeed), int(bubble.yPos)) || jjMaskedPixel(int(bubble.xPos), int(bubble.yPos) + int(bubble.ySpeed)) || jjMaskedPixel(int(bubble.xPos), int(bubble.yPos) - int(bubble.ySpeed))) {
  251.                 jjSample(bubble.xPos, bubble.yPos, SOUND::P2_SPLOUT, 0, 0);
  252.         }
  253.        
  254.         bubble.behave(BEHAVIOR::WATERSHIELDBULLET);
  255.        
  256.         if (bubble.state == STATE::FLY && bubble.counter > 0) {
  257.                 switch (bubble.direction) {
  258.                         case 1: bubble.xSpeed = bubble.xSpeed - 0.08; bubble.ySpeed = bubble.ySpeed - 0.08; break;
  259.                         case -1: bubble.xSpeed = bubble.xSpeed + 0.08; bubble.ySpeed = bubble.ySpeed - 0.08; break;
  260.                 }
  261.         }
  262.        
  263.         bubble.killAnim = jjObjectPresets[OBJECT::WATERSHIELDBULLET].killAnim;
  264. }
  265.  
  266. class Nailgun : jjBEHAVIORINTERFACE {
  267.         void onBehave(jjOBJ@ obj) override {
  268.                 obj.behave(obj.state == STATE::EXPLODE? BEHAVIOR::BULLET : BEHAVIOR::RFBULLET, obj.state == STATE::EXPLODE? true:false);
  269.                 jjPLAYER@ creator = jjPlayers[obj.creatorID];
  270.                
  271.                 obj.var[0] = int(atan2(-obj.ySpeed, obj.xSpeed) * (512.f * 0.318309886142228f));
  272.                
  273.                 obj.xAcc = (obj.eventID == OBJECT::RFBULLETPU? 0.4:0.35) * obj.direction;
  274.                 if (obj.ySpeed < 0 && obj.direction == 0 && obj.xSpeed == 0) obj.yAcc = -0.5;
  275.                
  276.                
  277.                 if (obj.state != STATE::EXPLODE) {
  278.                         if (obj.counter == 1 && creator.isLocal) {
  279.                                 jjSample(creator.xPos, creator.yPos, SOUND::WIND_WIND2A, 48, obj.eventID == OBJECT::RFBULLETPU? 19000:17500);
  280.                                 obj.var[2] = 0;
  281.                                 obj.playerHandling = HANDLING::PLAYERBULLET;
  282.                         }
  283.                        
  284.                         jjDrawRotatedSprite(obj.xPos, obj.yPos, ANIM::CUSTOM[25], obj.eventID == OBJECT::RFBULLETPU? 1:0, 0, obj.var[0], 1, 1, SPRITE::NORMAL);
  285.                        
  286.                         if (jjMaskedPixel(int(obj.xPos + obj.xSpeed + obj.var[7] / 65536.f), int(obj.yPos))) {
  287.                                 obj.xSpeed = 0;
  288.                                 obj.var[7] = 0;
  289.                                 obj.playerHandling = HANDLING::PARTICLE;
  290.                                 obj.bePlatform(obj.xPos, obj.yPos, 48, 8);
  291.                                 if (obj.var[2] == 0) {
  292.                                         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 0, 0);
  293.                                         obj.counter = 1;
  294.                                         if (obj.eventID == OBJECT::RFBULLETPU) obj.counterEnd = 90;
  295.                                         obj.var[2] = 1;
  296.                                 }
  297.                         }
  298.                         else if (jjMaskedPixel(int(obj.xPos), int(obj.yPos + obj.ySpeed))) {
  299.                                 obj.ySpeed = 0;
  300.                                 obj.playerHandling = HANDLING::PARTICLE;
  301.                                 if (obj.var[2] == 0) {
  302.                                         jjSample(obj.xPos, obj.yPos, SOUND::COMMON_METALHIT, 0, 0);
  303.                                         obj.counter = 1;
  304.                                         if (obj.eventID == OBJECT::RFBULLETPU) obj.counterEnd = 90;
  305.                                         obj.var[2] = 1;
  306.                                 }
  307.                         }
  308.                 } else {
  309.                         obj.clearPlatform();
  310.                         obj.var[2] = 0;
  311.                         obj.counterEnd = obj.eventID == OBJECT::RFBULLETPU? 55:60;
  312.                 }
  313.         }
  314. }
  315.  
  316. class StaticPickup : jjBEHAVIORINTERFACE {
  317.         StaticPickup(const jjBEHAVIOR &in behavior) {
  318.                 originalBehavior = behavior;
  319.         }
  320.         void onBehave(jjOBJ@ obj) override {
  321.                 obj.behave(originalBehavior);
  322.                 if (obj.state == STATE::FLOATFALL)
  323.                         obj.state = STATE::FLOAT;
  324.         }
  325.         bool onObjectHit(jjOBJ@ obj, jjOBJ@ bullet, jjPLAYER@ player, int force) {
  326.                 if (bullet is null) {
  327.                         obj.behavior = originalBehavior;
  328.                         if (player.objectHit(obj, force, obj.playerHandling))
  329.                                 return true;
  330.                         obj.behavior = this;
  331.                 }
  332.                 return false;
  333.         }
  334.         private jjBEHAVIOR originalBehavior;
  335. }
  336.