Downloads containing ab22btl11.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(array<MLLEWeaponApply@> = {null, null, se::FireworkMLLEWrapper(), null, null, null, null, null, null}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "lhfrogav.j2l" ///@MLLE-Generated
  4. #include "SEfirework-mlle.asc" ///@MLLE-Generated
  5. #pragma require "SEfirework-mlle.asc" ///@MLLE-Generated
  6. class CustomWeaponHook : se::DefaultWeaponHook {
  7.         bool drawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) override {
  8.                 int x, y;
  9.                 STRING::Size font;
  10.                 string text;
  11.                 const jjWEAPON@ weapon = jjWeapons[player.currWeapon];
  12.                 if (jjSubscreenWidth > 400) {
  13.                         x = jjSubscreenWidth - 88;
  14.                         y = jjSubscreenHeight - 14;
  15.                         font = STRING::MEDIUM;
  16.                 } else {
  17.                         x = jjSubscreenWidth - 48;
  18.                         y = jjSubscreenHeight - 9;
  19.                         font = STRING::SMALL;
  20.                 }
  21.                 if (weapon.infinite || weapon.replacedByShield && player.shieldTime > 0) {
  22.                         text = "x^";
  23.                 } else {
  24.                         int ammo = player.ammo[WEAPON::CURRENT];
  25.                         text = "x" + (ammo > 0 ? ammo : 0);
  26.                 }
  27.                 drawAmmoSprite(canvas, x, y, getWeaponAnimation(player.currWeapon, player.powerup[WEAPON::CURRENT]));
  28.                 canvas.drawString(x + 8, y, text, font);
  29.                 return true;
  30.         }
  31. }
  32. array<int> lastFired(jjLocalPlayerCount);
  33. array<int> lenientLastFired(jjLocalPlayerCount);
  34. array<bool> missileFired(jjLocalPlayerCount);
  35. array<bool> selectPressed(jjLocalPlayerCount);
  36. array<bool> tongueUsed(jjLocalPlayerCount);
  37. bool canFire(const jjPLAYER@ player) {
  38.         switch (jjWeapons[player.currWeapon].style) {
  39.                 case WEAPON::MISSILE:
  40.                         return !missileFired[player.localPlayerID];
  41.                 case WEAPON::POPCORN:
  42.                         return jjGameTicks - lenientLastFired[player.localPlayerID] >= 6;
  43.                 case WEAPON::CAPPED:
  44.                         return jjGameTicks - lastFired[player.localPlayerID] >= player.fastfire;
  45.         }
  46.         return jjGameTicks - lenientLastFired[player.localPlayerID] >= player.fastfire;
  47. }
  48. void processFiring(const jjPLAYER@ player) {
  49.         if (jjWeapons[player.currWeapon].style == WEAPON::MISSILE)
  50.                 missileFired[player.localPlayerID] = true;
  51.         lastFired[player.localPlayerID] = jjGameTicks;
  52.         lenientLastFired[player.localPlayerID] = jjGameTicks;
  53. }
  54. void processNotFiring(const jjPLAYER@ player) {
  55.         missileFired[player.localPlayerID] = false;
  56.         lenientLastFired[player.localPlayerID] = -252000;
  57. }
  58. void cycleWeapon(jjPLAYER@ player) {
  59.         auto initial = player.currWeapon;
  60.         do {
  61.                 player.currWeapon = player.currWeapon % 9 + 1;
  62.         } while (player.currWeapon != initial && getRealAmmo(player, WEAPON::CURRENT) == 0);
  63. }
  64. jjANIMATION@ getWeaponAnimation(int weapon, bool powerup) {
  65.         int modifier = powerup ? 1 : 0;
  66.         switch (weapon) {
  67.                 case WEAPON::BLASTER:
  68.                         return jjAnimations[powerup ? jjAnimSets[ANIM::AMMO] + 18 : jjAnimSets[ANIM::PICKUPS] + 29];
  69.                 case WEAPON::BOUNCER:
  70.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 25 - modifier];
  71.                 case WEAPON::ICE:
  72.                         return jjAnimations[jjAnimSets[ANIM::CUSTOM[0]] + modifier];
  73.                 case WEAPON::SEEKER:
  74.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 34 - modifier];
  75.                 case WEAPON::RF:
  76.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 49 - modifier];
  77.                 case WEAPON::TOASTER:
  78.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 57 - modifier];
  79.                 case WEAPON::TNT:
  80.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 59];
  81.                 case WEAPON::GUN8:
  82.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 62 - modifier];
  83.                 case WEAPON::GUN9:
  84.                         return jjAnimations[jjAnimSets[ANIM::AMMO] + 68 - modifier];
  85.         }
  86.         return null;
  87. }
  88. int getWeaponEventID(int weapon, bool powerup, bool &out pepper) {
  89.         auto spread = jjWeapons[weapon].spread;
  90.         if (spread == SPREAD::PEPPERSPRAY || spread == SPREAD::GUN8 && !jjAllowsFireball) {
  91.                 pepper = true;
  92.                 return OBJECT::BULLET;
  93.         }
  94.         pepper = false;
  95.         int modifier = powerup ? 8 : 0;
  96.         switch (weapon) {
  97.                 case WEAPON::BLASTER:
  98.                         return OBJECT::BLASTERBULLET + modifier;
  99.                 case WEAPON::BOUNCER:
  100.                         return OBJECT::BOUNCERBULLET + modifier;
  101.                 case WEAPON::ICE:
  102.                         return OBJECT::ICEBULLET + modifier;
  103.                 case WEAPON::SEEKER:
  104.                         return OBJECT::SEEKERBULLET + modifier;
  105.                 case WEAPON::RF:
  106.                         return OBJECT::RFBULLET + modifier;
  107.                 case WEAPON::TOASTER:
  108.                         return OBJECT::TOASTERBULLET + modifier;
  109.                 case WEAPON::TNT:
  110.                         return OBJECT::TNT;
  111.                 case WEAPON::GUN8:
  112.                         return OBJECT::FIREBALLBULLET + modifier;
  113.                 case WEAPON::GUN9:
  114.                         return OBJECT::ELECTROBULLET + modifier;
  115.         }
  116.         return 0;
  117. }
  118. void drawAmmoSprite(jjCANVAS@ canvas, int x, int y, const jjANIMATION@ anim) {
  119.         if (anim !is null)
  120.                 canvas.drawSpriteFromCurFrame(x, y, anim + (::jjGameTicks >> 2) % anim.frameCount);
  121. }
  122. void fireBullet(const jjPLAYER@ player, int angle, float x, float y) {
  123.         bool pepper;
  124.         auto eventID = getWeaponEventID(player.currWeapon, player.powerup[WEAPON::CURRENT], pepper);
  125.         int id = jjAddObject(eventID, x, y, player.playerID, CREATOR::PLAYER, pepper ? BEHAVIOR::PEPPERBULLET : BEHAVIOR::DEFAULT);
  126.         if (id > 0) {
  127.                 auto@ obj = jjObjects[id];
  128.                 if (pepper) {
  129.                         bool powerup = jjStrongPowerups && player.powerup[WEAPON::CURRENT];
  130.                         obj.playerHandling = HANDLING::PLAYERBULLET;
  131.                         obj.determineCurAnim(ANIM::AMMO, powerup ? 10 : 9);
  132.                         obj.determineCurFrame();
  133.                         obj.animSpeed = player.powerup[WEAPON::CURRENT] ? 2 : 1;
  134.                         obj.var[3] = 8;
  135.                         obj.xSpeed = 4.f;
  136.                         if (powerup) {
  137.                                 obj.lightType = LIGHT::POINT2;
  138.                                 obj.state = STATE::FLY;
  139.                                 obj.var[6] = obj.var[6] | 8;
  140.                         }
  141.                 }
  142.                 float speed = obj.xSpeed;
  143.                 float acc = obj.xAcc;
  144.                 obj.xSpeed = jjCos(angle << 7) * speed;
  145.                 obj.ySpeed -= jjSin(angle << 7) * speed;
  146.                 obj.xAcc = jjCos(angle << 7) * acc;
  147.                 obj.yAcc -= jjSin(angle << 7) * acc;
  148.                 obj.direction = angle < 2 ? 1 : angle > 2 ? -1 : 0;
  149.         }
  150. }
  151. int getRealAmmo(const jjPLAYER@ player, int weapon) {
  152.         if (weapon == WEAPON::CURRENT)
  153.                 weapon = player.currWeapon;
  154.         auto@ preset = jjWeapons[weapon];
  155.         int multiplier = preset.multiplier;
  156.         preset.multiplier = 1;
  157.         int result = player.ammo[weapon];
  158.         preset.multiplier = multiplier;
  159.         return result;
  160. }
  161. void decrementRealAmmo(jjPLAYER@ player, int weapon) {
  162.         if (weapon == WEAPON::CURRENT)
  163.                 weapon = player.currWeapon;
  164.         auto@ preset = jjWeapons[weapon];
  165.         int multiplier = preset.multiplier;
  166.         preset.multiplier = 1;
  167.         player.ammo[weapon] = player.ammo[weapon] - 1;
  168.         preset.multiplier = multiplier;
  169. }
  170. void coinMorph(jjOBJ@ obj) {
  171.         if (obj.state == STATE::DEACTIVATE) {
  172.                 obj.deactivate();
  173.                 return;
  174.         }
  175.         if (obj.state == STATE::START) {
  176.                 int x = int(obj.xOrg) >>> 5;
  177.                 int y = int(obj.yOrg) >>> 5;
  178.                 if (jjParameterGet(x, y, 17, 1) == 0) {
  179.                         obj.delete();
  180.                         return;
  181.                 }
  182.                 obj.state = STATE::STILL;
  183.                 obj.var[0] = jjParameterGet(x, y, 8, 8);
  184.                 obj.var[1] = jjParameterGet(x, y, 0, 8);
  185.                 obj.var[2] = jjParameterGet(x, y, 16, 1);
  186.                 obj.var[3] = jjParameterGet(x, y, 18, 1);
  187.                 obj.xPos -= 16.f;
  188.                 obj.yPos -= 16.f;
  189.                 obj.putOnGround(true);
  190.                 return;
  191.         }
  192.         auto@ bunny = jjAnimations[obj.curAnim];
  193.         auto@ booth = jjAnimations[obj.special];
  194.         obj.counter++;
  195.         if (obj.counter & 7 == 0) {
  196.                 obj.frameID++;
  197.                 if (obj.frameID >= int(bunny.frameCount))
  198.                         obj.frameID = 0;
  199.                 obj.determineCurFrame();
  200.         }
  201.         jjDrawSpriteFromCurFrame(obj.xPos - 1.f, obj.yPos + 3.f, booth + (obj.counter >> 3) % booth.frameCount, obj.direction, SPRITE::PALSHIFT, 16);
  202.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame + bunny.frameCount, obj.direction);
  203.         jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, obj.direction, SPRITE::PALSHIFT, 40);
  204.         if (obj.var[0] != 0) {
  205.                 jjTEXTAPPEARANCE style(STRING::BOUNCE);
  206.                 style.align = STRING::CENTER;
  207.                 jjDrawString(obj.xPos - 4.f, obj.yPos - 12.f, formatInt(obj.var[0]), STRING::SMALL, style, 0, SPRITE::PALSHIFT, 224);
  208.         }
  209.         for (int i = 0; i < jjLocalPlayerCount; i++) {
  210.                 auto@ player = jjLocalPlayers[i];
  211.                 float dx = player.xPos - obj.xPos;
  212.                 float dy = player.yPos - obj.yPos;
  213.                 if (dx * dx + dy * dy < 1024.f && player.charCurr != CHAR::BIRD && player.testForCoins(obj.var[0])) {
  214.                         player.morphTo(CHAR::BIRD);
  215.                         jjSample(player.xPos, player.yPos, SOUND::COMMON_BUBBLGN1);
  216.                 }
  217.         }
  218. }
  219. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  220.         return MLLE::WeaponHook.drawAmmo(player, canvas);
  221. }
  222. void onLevelLoad() {
  223.         @MLLE::WeaponHook = CustomWeaponHook();
  224.         MLLE::Setup(array<MLLEWeaponApply@> = {null, null, se::FireworkMLLEWrapper(), null, null, null, null, null, null});
  225.         jjCharacters[CHAR::FROG].canHurt = true;
  226.         jjCharacters[CHAR::BIRD].canHurt = true;
  227.         jjObjectPresets[OBJECT::WARP].behavior = coinMorph;
  228. }
  229. void onPlayerInput(jjPLAYER@ player) {
  230.         auto@ weapon = jjWeapons[player.currWeapon];
  231.         auto style = weapon.style;
  232.         if (player.charCurr == CHAR::FROG || player.charCurr == CHAR::BIRD) {
  233.                 if (player.keySelect) {
  234.                         if (!selectPressed[player.localPlayerID]) {
  235.                                 selectPressed[player.localPlayerID] = true;
  236.                                 cycleWeapon(player);
  237.                         }
  238.                 } else {
  239.                         selectPressed[player.localPlayerID] = false;
  240.                 }
  241.         }
  242.         if (player.charCurr == CHAR::BIRD) {
  243.                 if (player.keyFire) {
  244.                         player.keyFire = false;
  245.                         if (canFire(player) && player.currWeapon != WEAPON::BLASTER) {
  246.                                 int anim = player.curAnim - jjAnimSets[ANIM::BIRD];
  247.                                 if (anim >= 9 && anim != 10 && anim != 19) {
  248.                                         if (anim != 9)
  249.                                                 player.keyUp = true;
  250.                                         player.fireBullet();
  251.                                         processFiring(player);
  252.                                         if (getRealAmmo(player, WEAPON::CURRENT) == 0 && !weapon.infinite)
  253.                                                 cycleWeapon(player);
  254.                                 }
  255.                         }
  256.                 } else {
  257.                         processNotFiring(player);
  258.                 }
  259.                 if (player.keyJump) {
  260.                         player.keyFire = true;
  261.                         player.keyJump = false;
  262.                 }
  263.         }
  264. }
  265. void onPlayer(jjPLAYER@ player) {
  266.         if (player.charCurr == CHAR::FROG) {
  267.                 int anim = player.curAnim - jjAnimSets[ANIM::FROG] + (jjIsTSF ? 0 : 1);
  268.                 if (anim >= 8 && anim <= 10 && player.frameID == 6) {
  269.                         if (!tongueUsed[player.localPlayerID]) {
  270.                                 tongueUsed[player.localPlayerID] = true;
  271.                                 if (player.currWeapon != WEAPON::BLASTER) {
  272.                                         if (getRealAmmo(player, WEAPON::CURRENT) > 0) {
  273.                                                 decrementRealAmmo(player, WEAPON::CURRENT);
  274.                                                 int angle = anim == 10 ? 2 : player.direction < 0 ? anim - 5 : 9 - anim;
  275.                                                 float x = player.xPos + jjCos(angle << 7) * 76.f + (player.direction < 0 ? 4.f : -4.f);
  276.                                                 float y = player.yPos - jjSin(angle << 7) * 76.f + 8.f;
  277.                                                 jjSTREAM packet;
  278.                                                 packet.push(uint8(player.playerID));
  279.                                                 packet.push(uint8(player.currWeapon));
  280.                                                 packet.push(bool(player.powerup[WEAPON::CURRENT]));
  281.                                                 packet.push(uint(player.ammo[WEAPON::CURRENT]));
  282.                                                 packet.push(uint8(angle));
  283.                                                 packet.push(float(x));
  284.                                                 packet.push(float(y));
  285.                                                 jjSendPacket(packet);
  286.                                                 fireBullet(player, angle, x, y);
  287.                                         }
  288.                                         if (getRealAmmo(player, WEAPON::CURRENT) == 0 && !jjWeapons[player.currWeapon].infinite)
  289.                                                 cycleWeapon(player);
  290.                                 }
  291.                         }
  292.                 } else {
  293.                         tongueUsed[player.localPlayerID] = false;
  294.                 }
  295.         } else if (player.charCurr != CHAR::BIRD) {
  296.                 player.morphTo(CHAR::FROG);
  297.         }
  298. }
  299. void onReceive(jjSTREAM &in packet, int clientID) {
  300.         jjSTREAM backup = packet;
  301.         uint8 playerID, weapon, angle;
  302.         uint ammo;
  303.         bool powerup;
  304.         float x, y;
  305.         if (!packet.pop(playerID) || !packet.pop(weapon) || !packet.pop(powerup) || !packet.pop(ammo) || !packet.pop(angle) || !packet.pop(x) || !packet.pop(y))
  306.                 return;
  307.         if (playerID >= 32 || weapon <= 1 || weapon >= 10 || angle >= 5)
  308.                 return;
  309.         auto@ player = jjPlayers[playerID];
  310.         if (jjIsServer && player.clientID != clientID || player.isLocal)
  311.                 return;
  312.         if (jjIsServer)
  313.                 jjSendPacket(backup, -clientID);
  314.         player.currWeapon = weapon;
  315.         player.powerup[weapon] = powerup;
  316.         player.ammo[weapon] = ammo;
  317.         fireBullet(player, angle, x, y);
  318. }
  319.