Downloads containing AntiGravBouncers.asc

Downloads
Name Author Game Mode Rating
JJ2+ Only: violetclm DOM Episodes I... Violet CLM Custom / Concept N/A Download file

File preview

  1. #pragma require "AntiGravBouncers.asc"
  2. #include "MLLE-Weapons.asc"
  3. #pragma require "AntiGravBouncer.j2a"
  4.  
  5. namespace NapsWeapons {
  6.         class AntiGravityBouncer : MLLEWeapons::WeaponInterface {
  7.                 bool ReverseBehaviors = false;
  8.                 bool BounceThroughWalls = true;
  9.                 bool ReverseUpwardFire = true;
  10.                 AntiGravityBouncer() {
  11.                         super(
  12.                                 regularObjectTemplate: MLLEWeapons::ObjectTemplate(
  13.                                         xSpeed: 5,
  14.                                         ySpeed: -1,
  15.                                         xAcc: 0.25,
  16.                                         yAcc: -0.0915527344f,
  17.                                         killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 4,
  18.                                         curAnim: 0,
  19.                                         lightType: LIGHT::POINT2,
  20.                                         counterEnd: (70*3)/2
  21.                                 ),
  22.                                 powerupObjectTemplate: MLLEWeapons::ObjectTemplate(
  23.                                         xSpeed: 5,
  24.                                         ySpeed: -1,
  25.                                         xAcc: 0.25,
  26.                                         yAcc: -0.0915527344f,
  27.                                         animSpeed: 2,
  28.                                         killAnim: jjAnimSets[ANIM::AMMO].firstAnim + 4,
  29.                                         curAnim: 1,
  30.                                         lightType: LIGHT::POINT2,
  31.                                         counterEnd: (70*3)/2
  32.                                 ),
  33.                                 animSetFilename: "AntiGravBouncer.j2a",
  34.                                 pickupAnimation: 3,
  35.                                 poweredUpPickupAnimation: 2,
  36.                                 powerupAnimation: 4,
  37.                                 ammoCrateAnimation: 5,
  38.                                 traits: se::weapon_default_traits | se::weapon_goes_through_thin_walls,
  39.                                 behavior: MLLEWeapons::behaviorFunction(DetermineBehavior),
  40.                                 apply: MLLEWeapons::applyFunction(DetermineReversedness)
  41.                         );
  42.                 }
  43.                 void DetermineBehavior(jjOBJ@ obj, bool powerup) const {
  44.                         DefaultWeapons::DefaultSample(obj, WEAPON::BOUNCER);
  45.                         obj.behavior = jjVOIDFUNCOBJ(Behavior);
  46.                 }
  47.                 void Behavior(jjOBJ@ obj) const {
  48.                         bool goUp,goDown,goLeft,goRight;
  49.                         int frame;
  50.                         if (obj.state == STATE::START) {
  51.                                 if (obj.creatorType == CREATOR::OBJECT) {
  52.                                         jjOBJ@ enemyCreator = jjObjects[obj.creatorID];
  53.                                         obj.direction = enemyCreator.direction;
  54.                                         obj.xSpeed = (obj.direction*obj.xSpeed) + enemyCreator.xSpeed;
  55.                                         obj.xAcc=(obj.direction*obj.xAcc);
  56.                                 }
  57.                                 if (ReverseUpwardFire && obj.xAcc == 0) {
  58.                                         obj.yAcc = -obj.yAcc;
  59.                                         obj.ySpeed = -obj.ySpeed;
  60.                                 }
  61.                                 if (obj.eventID == OBJECT::ICEBULLET)
  62.                                         obj.eventID = OBJECT::BLASTERBULLET; //just in case...
  63.                                 obj.state = STATE::BOUNCE;
  64.                         } else
  65.                         if (obj.state == STATE::EXPLODE) {
  66.                                 obj.behavior = BEHAVIOR::EXPLOSION2;
  67.                                 obj.frameID = 0;
  68.                         } else
  69.                         if ((obj.state == STATE::KILL) || (obj.state == STATE::DEACTIVATE)) {
  70.                                 obj.delete();
  71.                         }
  72.                        
  73.                         obj.xPos += obj.xSpeed + (obj.var[7] / 65536.0);
  74.                         obj.yPos += obj.ySpeed;
  75.                        
  76.                         if (obj.var[7] > 8192)
  77.                                 obj.var[7] =  obj.var[7] - 8192;
  78.                         else
  79.                         if (obj.var[7] < -8192)
  80.                                 obj.var[7] = obj.var[7] + 8192 ;
  81.                         else
  82.                                 obj.var[7] = 0;
  83.                                
  84.                         obj.xSpeed += obj.xAcc;
  85.                        
  86.                         if (obj.yPos > jjWaterLevel)
  87.                                 obj.ySpeed +=obj.yAcc - 0.125/4;
  88.                         else
  89.                                 obj.ySpeed+=obj.yAcc - 0.125;
  90.                        
  91.                         if (obj.counter > int(obj.counterEnd)) {
  92.                                 obj.state = STATE::EXPLODE;
  93.                                 obj.curFrame = 0;
  94.                                 obj.counter = 0;
  95.                                 obj.lightType = 0;
  96.                         }
  97.                
  98.                         goUp=jjMaskedPixel(int(obj.xPos),int(obj.yPos) - 4);
  99.                         goDown=jjMaskedPixel(int(obj.xPos),int(obj.yPos) + 4);
  100.                         goLeft=jjMaskedPixel(int(obj.xPos) - 2,int(obj.yPos));
  101.                         goRight=jjMaskedPixel(int(obj.xPos) + 2,int(obj.yPos));
  102.                        
  103.                         obj.counter++;
  104.                         if ((obj.counter&3)==0) {
  105.                                 obj.frameID++;
  106.                                 if (obj.frameID >= int(jjAnimations[obj.curAnim].frameCount))
  107.                                         obj.frameID = 0;
  108.                                 obj.curFrame = jjAnimations[obj.curAnim].firstFrame + obj.frameID;
  109.                         }
  110.                         //
  111.                         if (obj.var[6] == (!ReverseBehaviors? 0 : 8)) {
  112.                                 if (obj.xSpeed>8) obj.xSpeed=8;
  113.                                 else
  114.                                 if (obj.xSpeed<-8) obj.xSpeed=-8;
  115.  
  116.                                 if (obj.ySpeed>4) obj.ySpeed=4;
  117.                                 else
  118.                                 if (obj.ySpeed<-4) obj.ySpeed=-4;
  119.                        
  120.                                 if ((obj.ySpeed < 0) && (goUp == true)) {
  121.                                         obj.var[0] = obj.var[0] + 1;
  122.                                         obj.yPos += obj.ySpeed;
  123.                                         obj.ySpeed = -(obj.ySpeed*7)/8;
  124.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,40,0);
  125.                                 } else
  126.                                 if ((obj.ySpeed > 0) && (goDown == true)) {
  127.                                         obj.var[0] = obj.var[0] + 1;
  128.                                         obj.ySpeed = -(obj.ySpeed*7)/8;
  129.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,40,0);
  130.                                 }
  131.                                
  132.                                 if (obj.xSpeed < 0 && goLeft == true) {
  133.                                         obj.var[0] = obj.var[0] + 1;
  134.                                         obj.xSpeed = -(obj.xSpeed*7)/8;
  135.                                         obj.xAcc = -obj.xAcc;
  136.                                         if (!BounceThroughWalls) {
  137.                                                 obj.var[7] = -obj.var[7];
  138.                                         }
  139.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,40,0);
  140.                                 } else
  141.                                 if ((obj.xSpeed >0 ) && (goRight == true)) {
  142.                                         obj.var[0] = obj.var[0] + 1;
  143.                                         obj.xSpeed = -(obj.xSpeed*7)/8;
  144.                                         obj.xAcc = -obj.xAcc;
  145.                                         if (!BounceThroughWalls) {
  146.                                                 obj.var[7] = -obj.var[7];
  147.                                         }
  148.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,40,0);
  149.                                 }
  150.                                
  151.                                 if (obj.var[0] > 16) {
  152.                                         obj.state = STATE::EXPLODE;
  153.                                         obj.frameID = 0;
  154.                                         obj.counter=-1;
  155.                                         obj.lightType=0;
  156.                                 }
  157.                         } else
  158.                         if (obj.var[6] == (!ReverseBehaviors? 8 : 0)) {
  159.                                 if (obj.xSpeed>6) obj.xSpeed=6;
  160.                                 else
  161.                                 if (obj.xSpeed<-6) obj.xSpeed=-6;
  162.  
  163.                                 if (obj.ySpeed>6) obj.ySpeed=6;
  164.                                 else
  165.                                 if (obj.ySpeed<-6) obj.ySpeed=-6;
  166.                
  167.                                 if ((obj.ySpeed < 0) && (goUp == true)) {
  168.                                         obj.var[0] = obj.var[0] + 1;
  169.                                         obj.ySpeed = -(obj.ySpeed*9)/8;
  170.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,0,0);
  171.                                 } else
  172.                                 if ((obj.ySpeed > 0) && (goDown == true)) {
  173.                                         obj.var[0] = obj.var[0] + 1;
  174.                                         obj.ySpeed = -(obj.ySpeed*(9+int(jjRandom() & 7)))/8;
  175.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,0,0);
  176.                                 }
  177.                        
  178.                                 if (obj.xSpeed < 0 && goLeft == true) {
  179.                                         obj.var[0] = obj.var[0] + 1;
  180.                                         obj.xSpeed = -(obj.xSpeed*9)/8;
  181.                                         if (int(jjRandom() & (3)) == 0) obj.xAcc = -obj.xAcc;
  182.                                         if (!BounceThroughWalls) {
  183.                                                 obj.var[7] = -obj.var[7];
  184.                                         }
  185.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,0,0);
  186.                                 } else
  187.                                 if ((obj.xSpeed >0 ) && (goRight == true)) {
  188.                                         obj.var[0] = obj.var[0] + 1;
  189.                                         obj.xSpeed = -(obj.xSpeed*9)/8;
  190.                                         if (int(jjRandom() & (3)) == 0) obj.xAcc = -obj.xAcc;
  191.                                         if (!BounceThroughWalls) {
  192.                                                 obj.var[7] = -obj.var[7];
  193.                                         }
  194.                                         jjSample(obj.xPos,obj.yPos,SOUND::COMMON_BLOKPLOP,0,0);
  195.                                 }
  196.                                 if (obj.var[0] > 32) {
  197.                                         obj.state = STATE::EXPLODE;
  198.                                         obj.frameID = 0;
  199.                                         obj.counter=-1;
  200.                                         obj.lightType=0;
  201.                                 }
  202.                         }
  203.                         if (obj.counter > 4)
  204.                         obj.draw();
  205.                 }
  206.                 bool DetermineReversedness(uint, se::WeaponHook@, jjSTREAM@ parameter) {
  207.                         if (parameter !is null && parameter.getSize() >= 3) {
  208.                                 parameter.pop(ReverseBehaviors);
  209.                                 parameter.pop(BounceThroughWalls);
  210.                                 parameter.pop(ReverseUpwardFire);
  211.                         }
  212.                         return true;
  213.                 }
  214.         }
  215. }