Downloads containing hornetgun.asc

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 24 Battle PurpleJazz Battle N/A Download file

File preview

  1. #pragma require "HornetGun.asc" //Scripted by Naps
  2. #include "MLLE-Weapons.asc"
  3. #pragma require "HornetGun.j2a" //Spritework by Lynx and Naps
  4. #pragma offer "HornetGun.wav" //https://elements.envato.com/knife-stab-9RLRTRP
  5.  
  6. namespace NapsWeapons {
  7.         class HornetGun : MLLEWeapons::WeaponInterface {
  8.                 bool PierceFlies = true;
  9.                 bool AttackCaterpillars = true;
  10.                 bool SPBehavior = true;
  11.                 HornetGun() {
  12.                         super(
  13.                                 regularObjectTemplate: MLLEWeapons::ObjectTemplate(
  14.                                         xSpeed: 2,
  15.                                         xAcc: 0.25,
  16.                                         yAcc: 0.00390625f,
  17.                                         animSpeed: 2,
  18.                                         killAnim: 6,
  19.                                         curAnim: 0,
  20.                                         lightType: LIGHT::POINT2,
  21.                                         counterEnd: 105
  22.                                 ),
  23.                                 powerupObjectTemplate: MLLEWeapons::ObjectTemplate(
  24.                                         xSpeed: 1.5,
  25.                                         xAcc: 0.25,
  26.                                         yAcc: -0.0915527344f,
  27.                                         animSpeed: 3,
  28.                                         killAnim: 7,
  29.                                         curAnim: 1,
  30.                                         lightType: LIGHT::POINT2,
  31.                                         counterEnd: 105
  32.                                 ),
  33.                                 style: WEAPON::MISSILE,
  34.                                 animSetFilename: "HornetGun.j2a",
  35.                                 sampleFilenames: array<string> = {"HornetGun.wav"},
  36.                                 pickupAnimation: 2,
  37.                                 poweredUpPickupAnimation: 3,
  38.                                 ammoCrateAnimation: 4,
  39.                                 powerupAnimation: 5,
  40.                                 traits: se::weapon_default_traits | se::weapon_goes_through_thin_walls | se::weapon_works_in_all_modes | se::weapon_fails_underwater,
  41.                                 behavior: MLLEWeapons::behaviorFunction(DetermineBehavior),
  42.                                 apply: MLLEWeapons::applyFunction(ApplyCustomParameters)
  43.                         );
  44.                 }
  45.                 void DetermineBehavior(jjOBJ@ obj, bool powerup) const {
  46.                         if (obj.creatorType == CREATOR::PLAYER && jjPlayers[obj.creatorID].isLocal)
  47.                                 jjSample(obj.xPos, obj.yPos, Samples[0],64, powerup? 15000 : 18000);
  48.                                 obj.var[8] = powerup? 1 : 0;
  49.                         obj.behavior = jjVOIDFUNCOBJ(Behavior);
  50.                 }
  51.                 void Behavior(jjOBJ@ obj) const {
  52.                         const float PI = 3.1415927f;
  53.                         int destination;
  54.                         const bool goUp =jjMaskedPixel(int(obj.xPos),int(obj.yPos) - 8);
  55.                         const bool detectSafeEvents = checkForUnsolidEvents(int(obj.xPos/32),int(obj.yPos/32));
  56.                         const bool goDown =jjMaskedPixel(int(obj.xPos),int(obj.yPos) + 8);
  57.                         const bool aboveWaterLevel = (obj.yPos < (jjWaterLevel - 8))? false : true;
  58.                         const bool goLeft =jjMaskedPixel(int(obj.xPos) - 8,int(obj.yPos));
  59.                         const bool goRight =jjMaskedPixel(int(obj.xPos) + 8,int(obj.yPos));
  60.                         const bool isPowerup = MLLEWeapons::HelpfulBulletFunctions::IsPowerup(obj);
  61.                         obj.var[9] = 1;
  62.                         obj.var[10] = 1;
  63.                         if (obj.state == STATE::START) {
  64.                                 obj.var[1] = -1;
  65.                                 obj.xSpeed += obj.var[7] / 65536.f;
  66.                                 obj.state = STATE::FLY;
  67.                                 if ((jjGameMode <= GAME::COOP || SPBehavior) && checkForSPParameters() && obj.creatorType == CREATOR::PLAYER ) {
  68.                                         checkObjectCollision(obj);
  69.                                         obj.var[6] = 16;
  70.                                 }
  71.                         } else if (obj.state == STATE::FLY) {
  72.                                 if (obj.var[1] < 0) {
  73.                                         if ((jjGameMode <= GAME::COOP || SPBehavior) && obj.creatorType == CREATOR::PLAYER) {
  74.                                                 if (obj.counter >= 20) {
  75.                                                         int targetID = GetNearestWaspEnemyObject(obj,isPowerup? 220 : 180);
  76.                                                         if (targetID > -1) {
  77.                                                                 obj.var[1] = targetID;
  78.                                                                 obj.var[2] = 1;
  79.                                                         }
  80.                                                 }
  81.                                                 if (checkForSPParameters())
  82.                                                         checkObjectCollision(obj);
  83.                                         }
  84.                                         if ((jjGameMode > GAME::COOP || obj.creatorType != CREATOR::PLAYER)) {
  85.                                                 if (obj.counter >= 20) {
  86.                                                         int targetID = MLLEWeapons::HelpfulBulletFunctions::GetNearestEnemyPlayer(obj,isPowerup? 220 : 180);
  87.                                                         if (targetID > -1) {
  88.                                                                 obj.var[1] = targetID;
  89.                                                                 obj.var[2] = 2;
  90.                                                         }
  91.                                                 }
  92.                                         }
  93.                                         obj.draw();
  94.                                 } else {
  95.                        
  96.                                 if ((jjGameMode <= GAME::COOP || SPBehavior)) {
  97.                                         if (obj.var[2] == 1) {
  98.                                                 jjOBJ@ enemy = jjObjects[obj.var[1]];
  99.                                                 destination = int(atan2(enemy.yPos - obj.yPos ,enemy.xPos - obj.xPos) * (512 / PI));
  100.                                                 if (enemy.energy < 1 || !enemy.isActive) {
  101.                                                         obj.var[1] = -1;
  102.                                                 }
  103.                                         }
  104.                                         if (checkForSPParameters())
  105.                                                 checkObjectCollision(obj);
  106.                                 }
  107.                                 if ((jjGameMode > GAME::COOP || obj.creatorType != CREATOR::PLAYER)) {
  108.                                         if (obj.var[1] < 32) {
  109.                                                 if (obj.var[2] == 2) {
  110.                                                         jjPLAYER@ play = jjPlayers[obj.var[1]];
  111.                                                         destination = int(atan2(play.yPos - obj.yPos ,play.xPos - obj.xPos) * (512 / PI));
  112.                                                         float distance = sqrt(pow(play.xPos - obj.xPos,2) + pow(play.yPos - obj.yPos,2));
  113.                                                        
  114.                                                         if (play.health < 1 || !play.isInGame || distance > 400) {
  115.                                                                 obj.var[1] = -1;
  116.                                                         }
  117.                                                 }
  118.                                         }
  119.                                 }
  120.                                         obj.xSpeed += 0.7 * jjCos(destination);
  121.                                         obj.ySpeed += 0.7 * jjSin(destination);
  122.                                         float maxSpeed = (isPowerup? 3 : 4);
  123.                                         if (obj.xSpeed > maxSpeed) {
  124.                                                 obj.xSpeed = maxSpeed;
  125.                                         }
  126.                                         if (obj.xSpeed < -maxSpeed) {
  127.                                                 obj.xSpeed = -maxSpeed;
  128.                                         }
  129.                                         if (obj.ySpeed > maxSpeed) {
  130.                                                 obj.ySpeed = maxSpeed;
  131.                                         }
  132.                                         if (obj.ySpeed < -maxSpeed) {
  133.                                                 obj.ySpeed = -maxSpeed;
  134.                                         }
  135.                                         if ((obj.ySpeed < 0) && (goUp == true && !detectSafeEvents)) {
  136.                                                 obj.ySpeed = 0;
  137.                                         } else
  138.                                         if ((obj.ySpeed > 0) && ((goDown == true && !detectSafeEvents) || aboveWaterLevel == true)) {
  139.                                                 obj.ySpeed = 0;
  140.                                         }
  141.                                        
  142.                                         if (obj.xSpeed < 0 && goLeft == true) {
  143.                                                 obj.xSpeed = 0;
  144.                                         } else
  145.                                         if ((obj.xSpeed > 0 ) && (goRight == true)) {
  146.                                                 obj.xSpeed = 0;
  147.                                         }
  148.                                         jjDrawRotatedSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, 128 - destination, 1, 1);
  149.                                 }
  150.                                
  151.                                 obj.xPos += obj.xSpeed;
  152.                                 obj.yPos += obj.ySpeed;
  153.                                 obj.counter += 1;
  154.                                 if ((obj.counter&3)==0) {
  155.                                         obj.frameID++;
  156.                                         if (obj.frameID >= int(jjAnimations[obj.curAnim].frameCount))
  157.                                                 obj.frameID = 0;
  158.                                         obj.curFrame = jjAnimations[obj.curAnim].firstFrame + obj.frameID;
  159.                                 }
  160.                                 if (obj.counter > int(obj.counterEnd) || (obj.var[1] < 0 && (MLLEWeapons::HelpfulBulletFunctions::MaskedPixel(obj))) || obj.yPos > jjWaterLevel) {
  161.                                         obj.state = STATE::EXPLODE;
  162.                                         obj.curFrame = 0;
  163.                                         obj.counter = 0;
  164.                                         obj.lightType = 0;
  165.                                 }
  166.                                
  167.                         }
  168.                         if (obj.state == STATE::EXPLODE) {
  169.                                 obj.draw();
  170.                                 obj.behavior = BEHAVIOR::EXPLOSION2;
  171.                                 obj.frameID = 0;
  172.                         }
  173.                 }
  174.                 int GetNearestWaspEnemyObject(jjOBJ@ obj, uint maxDistance) {
  175.                         if (obj.creatorType != CREATOR::PLAYER)
  176.                                 return -1;
  177.                         int nearestObjectID = -1;
  178.                         uint minDistance = maxDistance * maxDistance;
  179.                         for (int i = 1; i < jjObjectCount; ++i) {
  180.                                 const jjOBJ@ potentialWaspEnemy = jjObjects[i];
  181.                                 if (!potentialWaspEnemy.isActive)
  182.                                         continue;
  183.                                 if (!potentialWaspEnemy.isTarget && !(potentialWaspEnemy.eventID == OBJECT::CATERPILLAR && AttackCaterpillars))
  184.                                         continue;
  185.                                 const float dx = potentialWaspEnemy.xPos - obj.xPos, dy = potentialWaspEnemy.yPos - obj.yPos;
  186.                                 const uint distance = uint(dx * dx + dy * dy);
  187.                                 if (distance < minDistance) {
  188.                                         minDistance = distance;
  189.                                         nearestObjectID = i;
  190.                                 }
  191.                         }
  192.                         return nearestObjectID;
  193.                 }
  194.                 void checkObjectCollision(jjOBJ@ obj) {
  195.                         for (int i = 0; i < jjObjectCount;i++) {
  196.                                 jjOBJ@ obj2 = jjObjects[i];
  197.                                 if (!obj2.isActive || obj2 is obj)
  198.                                         continue;
  199.                                 if (!obj.doesCollide(obj2,true))
  200.                                         continue;
  201.                                 if (obj2.eventID == OBJECT::CATERPILLAR && AttackCaterpillars) {
  202.                                         obj2.particlePixelExplosion(0);
  203.                                         obj2.state = STATE::KILL;
  204.                                         if (obj.creatorType == CREATOR::PLAYER)
  205.                                                 jjPlayers[obj.creatorID].setScore(jjPlayers[obj.creatorID].score + obj2.points);
  206.                                 }
  207.                                 if (obj.var[6] == 16 && (obj2.behavior == BEHAVIOR::MONITOR || (obj2.eventID >= OBJECT::BOMBCRATE && obj2.eventID <= OBJECT::TOASTERAMMO15) || obj2.eventID == OBJECT::GUNCRATE || obj2.eventID == OBJECT::GEMCRATE || obj2.eventID == OBJECT::CARROTCRATE || (obj2.isTarget && !checkForBees(obj2)) || obj2.eventID == OBJECT::DESTRUCTSCENERY || (((obj2.bulletHandling == HANDLING::HURTBYBULLET && obj2.energy > 0) || obj2.bulletHandling == HANDLING::DETECTBULLET) && !checkForBees(obj2) && !obj.causesRicochet))) {
  208.                                         obj.state = STATE::EXPLODE;
  209.                                 }
  210.                         }
  211.                 }
  212.                 bool checkForBees(jjOBJ@ target) {
  213.                         if (!PierceFlies) return false;
  214.                         if (target.eventID == OBJECT::BEES || target.eventID == OBJECT::BEEBOY || target.eventID == OBJECT::BUMBEE || target.eventID == OBJECT::DRAGONFLY || target.eventID == OBJECT::BUTTERFLY) return true;
  215.                         return false;
  216.                 }
  217.                
  218.                 bool checkForSPParameters() {
  219.                         if (PierceFlies || AttackCaterpillars) return true;
  220.                         return false;
  221.                 }
  222.                 bool checkForUnsolidEvents(int xPos,int yPos) {
  223.                         if (jjEventGet(xPos, yPos) == AREA::ONEWAY) return true;
  224.                         if (jjEventGet(xPos, yPos) == AREA::VINE) return true;
  225.                         return false;
  226.                 }
  227.                 bool ApplyCustomParameters(uint, se::WeaponHook@, jjSTREAM@ parameter) {
  228.                         if (parameter !is null && parameter.getSize() >= 3) {
  229.                                 parameter.pop(PierceFlies);
  230.                                 parameter.pop(AttackCaterpillars);
  231.                                 parameter.pop(SPBehavior);
  232.                         }
  233.                         return true;
  234.                 }
  235.         }
  236. }