Downloads containing petrolBomb.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 23 levels Jazz2Online Multiple N/A Download file
JJ2+ Only: violetclm DOM Episodes I... Violet CLM Custom / Concept N/A Download file
TSF with JJ2+ Only: street fight!!!!!!! cooba Battle N/A Download file
Custom Weapons...Featured Download Violet CLM Other 10 Download file

File preview

  1. #pragma require "petrolBomb.asc"
  2. #pragma require "petrolBomb.j2a"
  3. #pragma offer "glass_shatter.wav"
  4. #include "MLLE-Weapons.asc"
  5.  
  6. /**Petrol Bomb**/
  7. /**Author: szmol96**/
  8.  
  9. namespace SzmolWeaponPack {
  10.         namespace PetrolBomb {
  11.                 class PlayerX {
  12.                         int prevClosest = 0;
  13.                         int missileCounter = 0;
  14.                         uint mCounterDelay = 0;
  15.                 }
  16.                 array<PlayerX> PlayersX(jjLocalPlayerCount);
  17.                 array<int> closestPlayers(32); //needed even for non-local players
  18.                
  19.                 class Weapon : MLLEWeapons::WeaponInterface {
  20.                         Weapon() {
  21.                                 super(
  22.                                         regularObjectTemplate: MLLEWeapons::ObjectTemplate(
  23.                                                 xSpeed: 5,
  24.                                                 ySpeed: -5,
  25.                                                 curAnim: 0,
  26.                                                 killAnim: jjAnimSets[ANIM::AMMO] + 77,
  27.                                                 counterEnd: 255
  28.                                         ),
  29.                                         sampleFilenames: array<string> = {"glass_shatter.wav"},
  30.                                         animSetFilename: "petrolBomb.j2a",
  31.                                         pickupAnimation: 3,
  32.                                         poweredUpPickupAnimation: 3,
  33.                                         style: WEAPON::MISSILE,
  34.                                         roundsPerPickup: 1,
  35.                                         generateSupplementalAnimations: false,
  36.                                         traits: (se::weapon_default_traits | se::weapon_causes_splash_damage | se::weapon_may_harm_user | se::weapon_melts_ice) & ~(se::weapon_has_powerup_monitors | se::weapon_has_distinct_powerup | se::weapon_has_ammo_crates),
  37.                                         onDrawAmmo: se::DrawingCallback(DrawAmmo),
  38.                                         onReceive: se::PacketCallback(DoBombPackets),
  39.                                         weaponHookRequired: true,
  40.                                         behavior: MLLEWeapons::behaviorFunction(DetermineBehavior)
  41.                                 );
  42.                         }
  43.                
  44.                         uint getMaxDamage(bool) const override { return 2; }
  45.                        
  46.                         bool DrawAmmo(jjPLAYER@ p, jjCANVAS@ canvas, const jjANIMATION@) const {
  47.                                 if (jjWeapons[p.currWeapon].maximum != -1 && jjWeapons[p.currWeapon].maximum <= 6) { //otherwise this would just look silly
  48.                                         for (int8 i = 0; i < p.ammo[WEAPON::CURRENT]; ++i)
  49.                                                 canvas.drawSprite(jjSubscreenWidth - 80 + i * 14, jjSubscreenHeight - 16, SetID,0,1);
  50.                                         return true;
  51.                                 }
  52.                                 return false;
  53.                         }
  54.                         void DoBombPackets(jjSTREAM& packet, int clientID) const {
  55.                                 int16 posX;
  56.                                 int16 posY;
  57.                                 int32 playNum;
  58.                                 packet.pop(posX);
  59.                                 packet.pop(posY);
  60.                                 packet.pop(playNum);
  61.                                 addFlames(posX, posY, playNum, CREATOR::PLAYER, jjIsServer);
  62.                         }
  63.                         void sendBombPacket(int16 posX, int16 posY, int32 playNum) const {
  64.                                 jjSTREAM packet = ConstructPacket();
  65.                                 packet.push(posX);
  66.                                 packet.push(posY);
  67.                                 packet.push(playNum);
  68.                                 jjSendPacket(packet);
  69.                         }
  70.                         void addFlames(float x, float y, uint16 crID, CREATOR::Type crType, bool send) const {
  71.                                 for (uint dir = 0; dir < 10; ++dir) {
  72.                                         jjOBJ@ flame1 = jjObjects[jjAddObject(OBJECT::TOASTERBULLET, x, y, crID, crType, BEHAVIOR::INACTIVE)];
  73.                                         flame1.xSpeed = jjSin(102 * dir + 128) * 2;
  74.                                         flame1.ySpeed = jjCos(102 * dir + 128) * 2;
  75.                                         flame1.determineCurAnim(SetID, 1, true);
  76.                                         flame1.killAnim = flame1.determineCurAnim(SetID, 2, false);
  77.                                         flame1.playerHandling = HANDLING::PARTICLE; //will handle its own collision
  78.                                         flame1.lightType = LIGHT::NONE;
  79.                                         //flame1.var[6] = 16;
  80.                                         flame1.age = 0;
  81.                                         flame1.animSpeed = 1;
  82.                                         flame1.behavior = bombFlame;
  83.                                         flame1.freeze = 0;
  84.                                         flame1.state = STATE::FLY;
  85.                                 }
  86.                                
  87.                                 if (send)
  88.                                         sendBombPacket(int16(x),int16(y),crID);
  89.                         }
  90.                        
  91.                         void DetermineBehavior(jjOBJ@ obj, bool powerup) const { obj.behavior = jjVOIDFUNCOBJ(Behavior); obj.var[6] = 8; }
  92.                         void Behavior(jjOBJ@ bomb) const {
  93.                                 if (bomb.state == STATE::START) {
  94.                                         bomb.xSpeed += bomb.var[7] / 98302.5; //1.5
  95.                                         if (bomb.creatorType == CREATOR::PLAYER)
  96.                                                 bomb.ySpeed += jjPlayers[bomb.creatorID].ySpeed / 2.2;
  97.                                         jjSample(bomb.xPos, bomb.yPos, SOUND::COMMON_FOEW1, 63, 0);
  98.                                         bomb.state = STATE::FLOATFALL;
  99.                                 }
  100.                                
  101.                                 bomb.xPos += bomb.xSpeed;
  102.                                 bomb.yPos += bomb.ySpeed;
  103.                                 if (bomb.ySpeed < 8) bomb.ySpeed += 0.25;
  104.                                
  105.                                 if (bomb.state == STATE::EXPLODE || jjMaskedPixel(int(bomb.xPos + bomb.xSpeed), int(bomb.yPos + bomb.ySpeed))) {
  106.                                         if (bomb.creatorType != CREATOR::PLAYER || jjIsServer || jjGameConnection == GAME::LOCAL)
  107.                                                 addFlames(bomb.xPos, bomb.yPos, bomb.creatorID, bomb.creatorType, bomb.creatorType == CREATOR::PLAYER);
  108.                                         if (SamplesLoaded[0])
  109.                                                 jjSample(bomb.xPos, bomb.yPos, Samples[0]);
  110.                                         bomb.particlePixelExplosion(0);
  111.                                         bomb.delete();
  112.                                 }
  113.                                
  114.                                 if (++bomb.age % 3 == 1) bomb.frameID += 1;
  115.                                 bomb.determineCurFrame(true);
  116.                                 bomb.draw();
  117.                         }
  118.                 }
  119.  
  120.                 void bombFlame(jjOBJ@ flame) {
  121.                         flame.xPos += flame.xSpeed;
  122.                         flame.yPos += flame.ySpeed;
  123.  
  124.                         if (!jjMaskedPixel(int(flame.xPos + flame.xSpeed), int(flame.yPos + flame.ySpeed))) {
  125.                                 if (flame.ySpeed < 4) flame.ySpeed += 0.1;
  126.                         } else {
  127.                                 if (flame.ySpeed < 0) {
  128.                                         flame.ySpeed = ((jjRandom() % 0.999));
  129.                                 } else {
  130.                                         flame.xSpeed = 0;
  131.                                         flame.ySpeed = 0;
  132.                                 }
  133.                         }
  134.                        
  135.                         if (jjGameTicks & 3 == 0) {
  136.                                 for (int lpid = 0; lpid < jjLocalPlayerCount; ++lpid) {
  137.                                         jjPLAYER@ lp = jjLocalPlayers[lpid];
  138.                                         if (flame.doesCollide(lp, false))
  139.                                                 lp.hurt(1, false, flame.creatorType == CREATOR::PLAYER ? jjPlayers[flame.creatorID] : null);
  140.                                 }
  141.                                 if (flame.creatorType == CREATOR::PLAYER)
  142.                                         for (int objectID = jjObjectCount; --objectID != 0; ) {
  143.                                                 jjOBJ@ obj = jjObjects[objectID];
  144.                                                 if (obj.isTarget && obj.state != STATE::KILL && flame.doesCollide(obj, false)) {
  145.                                                         flame.playerHandling = HANDLING::PLAYERBULLET;
  146.                                                         flame.objectHit(obj, obj.playerHandling);
  147.                                                         flame.state = STATE::EXPLODE;
  148.                                                         break;
  149.                                                 } else if (obj.behavior == BEHAVIOR::SPRING && flame.doesCollide(obj, false)) {
  150.                                                         obj.freeze = 0;
  151.                                                         obj.noHit = 1;
  152.                                                 }
  153.                                         }
  154.                         }
  155.                        
  156.                         if (flame.age++ > int((jjRandom() % 750) + 650))
  157.                                 flame.state = STATE::EXPLODE;
  158.                        
  159.                         if (flame.state == STATE::EXPLODE) {
  160.                                 flame.behavior = BEHAVIOR::EXPLOSION2;
  161.                                 flame.frameID = 0;
  162.                         }
  163.                        
  164.                         if (jjGameTicks % 5 == 0) flame.frameID += 1;
  165.                         flame.determineCurFrame(true);
  166.                         flame.draw();
  167.                 }
  168.         }
  169. }